Создание кодировщика OMXCodec в аппаратном режиме

Я пытаюсь внедрить 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);

person user2199593    schedule 12.11.2013    source источник


Ответы (1)


В Android ICS 4.0.4 регистрация кодеков была статической, т. е. все кодеки были зарегистрированы как часть массива KEncoderInfo, как можно найти здесь.

Методика различения кодеков hardware и software довольно проста. Если имя компонента не начинается с OMX, то он считается кодеком software, как показано в IsSoftwareCodec.

Поскольку вы пытаетесь использовать кодировщик AVC, программный кодек, если он будет создан, будет AVCEncoder, как можно узнать из его Factory.

Чтобы проверить, какой кодек был создан, вы можете включить журналы в файле OMXCodec.cpp, удалив комментарий как #define LOG_NDEBUG 0 в эту строку, сохраните и перекомпилируйте для сборки libstagefright.so, которую можно использовать для создания журналов на экране logcat.

ИЗМЕНИТЬ:

В случае потоковой передачи rtsp необходимо включить журналы в ACodec.cpp .

Нужно выяснить, присутствует ли libstagefrighthw.so в /system/lib, что зарегистрирует ядро ​​OMX в фреймворке Stagefright.

person Ganesh    schedule 19.11.2013
comment
Большое спасибо за подробное объяснение. Но проблема на самом деле была - почему нельзя создать аппаратно-ускоренный кодек. Я предполагаю, что HW-cdec не поддерживается, если файл stagefrighthw.so отсутствует в папке /system/lib. Это правильно? - person user2199593; 21.11.2013
comment
@ user2199593 .. Если libstagefrighthw.so нет, то ядро ​​OMX не инициализируется, и, следовательно, нельзя создать экземпляр аппаратных компонентов, т. Е. Компонентов OMX. Так что ваше подозрение верно. - person Ganesh; 21.11.2013
comment
@Ganesh У меня есть аналогичный вопрос об использовании h264 для декодирования потоковых кадров в формате приложенияb ... можете ли вы ответить, пожалуйста? - person nikhilelite; 24.11.2013
comment
@nikhilelite.. Я обновил свой ответ. Пожалуйста, дайте мне знать, если он отвечает на ваш запрос. В противном случае, пожалуйста, уточните немного больше о вашей проблеме. - person Ganesh; 24.11.2013