On 10/4/2024 2:54 PM, Zhao Zhili wrote:
From: Zhao Zhili <zhiliz...@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.
--- 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;
OpenPGP_signature.asc
Description: OpenPGP digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".