[FFmpeg-devel] [PATCH] avcodec/mediacodecenc: Extract configOBUs from AV1CodecConfigurationRecord

Zhao Zhili quinkblack at foxmail.com
Sat Oct 5 05:24:35 EEST 2024



> On Oct 5, 2024, at 02:15, James Almer <jamrial at gmail.com> wrote:
> 
> On 10/4/2024 2:54 PM, Zhao Zhili wrote:
>> From: Zhao Zhili <zhilizhao at tencent.com>
>> MediaCodec can generate AV1CodecConfigurationRecord, which shouldn't
>> be put into packet->data. Skip four bytes and extract configOBUs
>> if it exist.
> 
> But why are you removing them from extradata if you only want to prevent them to make it to a packet?
> You could instead make sure they are not dumped into the packet in the memcpy(pkt->data... below this chunk.

s->extradata is a temporary buffer, not avctx->extradata. I don’t know how to make
it useful with the whole AV1CodecConfigurationRecord. AV_CODEC_FLAG_GLOBAL_HEADER
is handled by extract_extradata bsf within MediaCodec wrapper, which is more reliable
than depends on OS to output extradata directly. From my test, the device output
AV1CodecConfigurationRecord with zero configOBUs.

> 
>> ---
>> I did some test on Pixel 8 Pro. AV1 hardware encoding works with a lot
>> of bugs:
>> 1. It's broken for width non-aligned to 16. For width 1080 and pixel
>> format YUV420P, MediaCodec use 1080 as stride. For pixel format NV12,
>> MediaCodec use 1088 as stride. There is no API to get the stride info.
>> AMEDIAFORMAT_KEY_STRIDE doesn't work. And set stride to MediaCodec has
>> no effect from my test, at least on that device. We know the buffer
>> size provided by MediaCodec, but we still cannot get stride by
>> buf_size / height:
>>   1) For YUV420P, buf_size = 1080 * height
>>   2) For NV12, buf_size = 1080 + 1088 * (height - 1). Yes, buf_size doesn't
>> count last line's padding :(
>> 2. After flush (which means reset for MediaCodec), it doesn't reset GOP
>> info, so it output a few non-key frames before generate a key frame.
>> This breaks what I did for AV_CODEC_FLAG_GLOBAL_HEADER: send a dummy
>> frame, send EOF, get packet and extract extra data, then reset
>> MediaCodec state by AMediaCodec_flush.
>>  libavcodec/mediacodecenc.c | 10 ++++++++++
>>  1 file changed, 10 insertions(+)
>> diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c
>> index e76ea81236..3880ea2fe9 100644
>> --- a/libavcodec/mediacodecenc.c
>> +++ b/libavcodec/mediacodecenc.c
>> @@ -429,6 +429,16 @@ static int mediacodec_receive(AVCodecContext *avctx, AVPacket *pkt)
>>      }
>>        if (out_info.flags & ff_AMediaCodec_getBufferFlagCodecConfig(codec)) {
>> +        if (avctx->codec_id == AV_CODEC_ID_AV1) {
>> +            // Skip AV1CodecConfigurationRecord without configOBUs
>> +            if (out_info.size <= 4) {
>> +                ff_AMediaCodec_releaseOutputBuffer(codec, index, false);
>> +                return mediacodec_receive(avctx, pkt);
>> +            }
>> +            out_info.size -= 4;
>> +            out_info.offset += 4;
>> +        }
>> +
>>          ret = av_reallocp(&s->extradata, out_info.size);
>>          if (ret)
>>              goto bailout;
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 



More information about the ffmpeg-devel mailing list