Я пытаюсь внедрить HW-ускоренное кодирование видео H264 на Android ICS 4.0.4. Поскольку класс MediaCodec недоступен, я должен использовать API stagefright. Но когда я устанавливаю флаг HardwareCodecsOnly, OMXCodec::Create всегда возвращает NULL. Если я вызову OMXCodec::findMatchingCodecs() с флагом kHardwareCodecsOnly, я получу следующий список:
- OMX.TI.DUCATI1.VIDEO.H264E
- OMX.qcom.7x30.video.encoder.avc
- OMX.qcom.video.encoder.avc
- OMX.TI.Video.encoder
- OMX.Nvidia.h264.encoder
- OMX.SEC.AVC.Encoder
поэтому я предполагаю, что это означает, что HW-кодирование поддерживается аппаратно.
Когда я не ставлю никаких флагов в OMXCodec::Create - кодек создан хорошо, но я предполагаю, что это в программном режиме (кстати, как я могу проверить, какой именно кодек был создан?)
Просматривая исходники OMXCodec, я нашел интересные строки:
if (createEncoder) {
sp<MediaSource> softwareCodec =
InstantiateSoftwareEncoder(componentName, source, meta);
if (softwareCodec != NULL) {
LOGV("Successfully allocated software codec '%s'", componentName);
return softwareCodec;
}
}
похоже, что для Encoder он всегда сначала пытается использовать программный кодек. Что я делаю неправильно? Любая помощь будет принята с благодарностью. Спасибо
Вот код создания OMXCodec:
mClient = new OMXClient();
mClient->connect();
logger->log("mClient.connect();");
enc_meta = new MetaData;
// frame size of target video file
int width = 640; //720;
int height = 480;
int kFramerate = 15;
int kVideoBitRate = 500000;
int kIFramesIntervalSec = 5;
int32_t colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
enc_meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); //MEDIA_MIMETYPE_VIDEO_MPEG4); //MEDIA_MIMETYPE_VIDEO_H263);//MEDIA_MIMETYPE_VIDEO_AVC);
enc_meta->setInt32(kKeyWidth, width);
enc_meta->setInt32(kKeyHeight, height);
enc_meta->setInt32(kKeyFrameRate, kFramerate);
enc_meta->setInt32(kKeySampleRate, 44100);
enc_meta->setInt32(kKeyBitRate, kVideoBitRate);
enc_meta->setInt32(kKeyStride, width);
enc_meta->setInt32(kKeySliceHeight, height);
enc_meta->setInt32(kKeyIFramesInterval, kIFramesIntervalSec);
enc_meta->setInt32(kKeyColorFormat, colorFormat);
mVideoSource = OMXCodec::Create(
mClient->interface(),
enc_meta,
true,
mSrc,
NULL,
OMXCodec::kHardwareCodecsOnly );
logger->log("OMXCodec_CREATED result: %d", (mVideoSource!=NULL) ? 1 : 0);