[FFmpeg-devel] [PATCH v2] movenc: Fix conversion of the first frame for extradata-less H264/HEVC

James Almer jamrial at gmail.com
Fri May 22 20:21:45 EEST 2020


On 5/21/2020 9:15 AM, Martin Storsjö wrote:
> Move the copying of the frame to vos_data further up in the function,
> so that when writing the actual frame data for the first frame, it's
> clear that the stream really is in annex b format, for the cases where
> we create extradata from the first frame.
> 
> Alternatively - we could invert the checks for bitstream format. If
> extradata is missing, we can't pretend that the bitstream is in
> mp4 form, because we can't even know the NAL unit length prefix size
> in that case.
> 
> Also avoid creating extradata for AVC intra. If the track tag is
> an AVC intra tag, don't copy the frame into vos_data - this matches
> other existing cases of how vos_data and TAG_IS_AVCI interact in
> other places.
> ---
>  libavformat/movenc.c | 37 +++++++++++++++++++------------------
>  1 file changed, 19 insertions(+), 18 deletions(-)
> 
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 4560064add..2e164a106f 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -5504,6 +5504,25 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
>          memset(trk->vos_data + trk->vos_len, 0, AV_INPUT_BUFFER_PADDING_SIZE);
>      }
>  
> +    if ((par->codec_id == AV_CODEC_ID_DNXHD ||
> +         par->codec_id == AV_CODEC_ID_H264 ||
> +         par->codec_id == AV_CODEC_ID_HEVC ||
> +         par->codec_id == AV_CODEC_ID_TRUEHD ||
> +         par->codec_id == AV_CODEC_ID_AC3 ||
> +         par->codec_id == AV_CODEC_ID_H264 ||
> +         par->codec_id == AV_CODEC_ID_HEVC) && !trk->vos_len &&
> +         !TAG_IS_AVCI(trk->tag)) {
> +        /* copy frame to create needed atoms */
> +        trk->vos_len  = size;
> +        trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
> +        if (!trk->vos_data) {
> +            ret = AVERROR(ENOMEM);
> +            goto err;
> +        }
> +        memcpy(trk->vos_data, pkt->data, size);
> +        memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> +    }
> +
>      if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 &&
>          (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
>          if (!s->streams[pkt->stream_index]->nb_frames) {
> @@ -5582,24 +5601,6 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
>          }
>      }
>  
> -    if ((par->codec_id == AV_CODEC_ID_DNXHD ||
> -         par->codec_id == AV_CODEC_ID_H264 ||
> -         par->codec_id == AV_CODEC_ID_HEVC ||
> -         par->codec_id == AV_CODEC_ID_TRUEHD ||
> -         par->codec_id == AV_CODEC_ID_AC3 ||
> -         par->codec_id == AV_CODEC_ID_H264 ||
> -         par->codec_id == AV_CODEC_ID_HEVC) && !trk->vos_len) {

This is not what's currently in the tree. Looks like you have a dirty
local tree from when you first added the h264 and hevc cases here.

> -        /* copy frame to create needed atoms */
> -        trk->vos_len  = size;
> -        trk->vos_data = av_malloc(size + AV_INPUT_BUFFER_PADDING_SIZE);
> -        if (!trk->vos_data) {
> -            ret = AVERROR(ENOMEM);
> -            goto err;
> -        }
> -        memcpy(trk->vos_data, pkt->data, size);
> -        memset(trk->vos_data + size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
> -    }
> -
>      if (trk->entry >= trk->cluster_capacity) {
>          unsigned new_capacity = trk->entry + MOV_INDEX_CLUSTER_SIZE;
>          if (av_reallocp_array(&trk->cluster, new_capacity,

LGTM with the above fixed.


More information about the ffmpeg-devel mailing list