Creating an OMXCodec encoder in HW mode

I am trying to implement HW-accelerated H264 video encoding on Android ICS 4.0.4. Since the MediaCodec class is not available, I need to use the stagefright API. But when I put the HardwareCodecsOnly flag , OMXCodec :: Create always returns NULL. If I call OMXCodec :: findMatchingCodecs () with the kHardwareCodecsOnly flag, I have the following list:
- 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

therefore, I assume that this means that HW encoding is supported by hardware.

When I put flags in OMXCodec :: Create , the codec is created well, but I think it is in program mode (By the way, how can I check which codec was created?)

Browse OMXCodec sources I found interesting lines:

if (createEncoder) {            
sp<MediaSource> softwareCodec =
 InstantiateSoftwareEncoder(componentName, source, meta);
    if (softwareCodec != NULL) {   
    LOGV("Successfully allocated software codec '%s'", componentName);
    return softwareCodec;            
}        
}

it looks like for Encoder he always tries to use the software codec first. What am I doing wrong? Any help would be greatly appreciated. Thanks

Here is the OMXCodec creation code:

         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);
+4
source share
1 answer

The Android ICS 4.0.4registration codec was static, i.e. all codecs were registered as part of the array KEncoderInfo, as can be found here .

hardware software . OMX, software, IsSoftwareCodec .

AVC, , , AVCEncoder, Factory .

, , OMXCodec.cpp, #define LOG_NDEBUG 0 , , libstagefright.so, logcat.

EDIT:

rtsp ACodec.cpp.

, libstagefrighthw.so /system/lib, ​​OMX Stagefright.

+5

All Articles