[FFmpeg-devel] [PATCH] avcodec/mediacodecenc: Extract configOBUs from AV1CodecConfigurationRecord
James Almer
jamrial at gmail.com
Fri Oct 4 21:15:14 EEST 2024
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.
> ---
> 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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20241004/43ba3b02/attachment.sig>
More information about the ffmpeg-devel
mailing list