Getting QualComm encoders to work via MediaCodec API

前端 未结 2 1659
感动是毒
感动是毒 2020-12-28 23:44

I am trying to do hardware encoding (avc) of NV12 stream using Android MediaCodec API.

When using OMX.qcom.video.encoder.avc, resolutions 1280x720 and 640x480 work

2条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-29 00:33

    Yep, the OMX.qcom.video.encoder.avc does that but not on all devices/android version. On my Nexus 4 with Android 4.3 the encoder works fine, but not on my S3 (running 4.1)

    The solution for an S3 running 4.1 with the OMX.qcom.video.encoder.avc (it seems that some S3 have another encoder) is to add 1024 bytes just before the Chroma pane.

    // The encoder may need some padding before the Chroma pane
    int padding = 1024;                     
    if ((mWidth==640 && mHeight==480) || mWidth==1280 && mHeight==720) padding = 0;
    
    // Interleave the U and V channel
    System.arraycopy(buffer, 0, tmp, 0, mYSize); // Y
    for (i = 0; i < mUVSize; i++) {
       tmp[mYSize + i*2 + padding] = buffer[mYSize + i + mUVSize]; // Cb (U)
       tmp[mYSize + i*2+1 + padding] = buffer[mYSize + i]; // Cr (V)
    }
    return tmp;
    

    The camera is using YV12 and the encoder COLOR_FormatYUV420SemiPlanar.

    Your snapshot shows the same kind of artefacts I had, you may need a similar hack for some resolutions, maybe with another padding length

    You should also avoid resolutions that are not a multiple of 16, even on 4.3 apparently (http://code.google.com/p/android/issues/detail?id=37769) !

提交回复
热议问题