Getting QualComm encoders to work via MediaCodec API

前端 未结 2 1658
感动是毒
感动是毒 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) !

    0 讨论(0)
  • 2020-12-29 00:35

    Decoder(MediaCodec) has its MediaFormat, it can be received using getOutputFormat. Returned instance can be printed to log. And there you can see some useful information. For example in your case value like "slice-height" could be useful. I suspect that it is equal to height for 1280x720 and 640x480 and differs for other resolutions. Probably you should use this value to get chroma offset.

    0 讨论(0)
提交回复
热议问题