[FFmpeg-devel] [PATCH 1/7] avformat/utils: Add ff_stream_encode_params_copy()

Marton Balint cus at passwd.hu
Mon Jul 11 03:23:30 EEST 2016


On Mon, 4 Jul 2016, sebechlebskyjan at gmail.com wrote:

> From: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
>
> Signed-off-by: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
> ---
> libavformat/internal.h |  9 ++++++++
> libavformat/utils.c    | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 65 insertions(+)
>
> diff --git a/libavformat/internal.h b/libavformat/internal.h
> index 647ad65..1b44bea 100644
> --- a/libavformat/internal.h
> +++ b/libavformat/internal.h
> @@ -491,6 +491,15 @@ int ff_generate_avci_extradata(AVStream *st);
> int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *args);
> 
> /**
> + * Copy encoding parameters from source to destination stream
> + *
> + * @param dst pointer to destination AVStream
> + * @param src pointer to source AVStream
> + * @return >=0 on success, AVERROR code on error
> + */
> +int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src);
> +
> +/**
>  * Wrap errno on rename() error.
>  *
>  * @param oldpath source path
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index d2a709c..8c16374 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -3951,6 +3951,62 @@ int av_read_pause(AVFormatContext *s)
>     return AVERROR(ENOSYS);
> }
> 
> +int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
> +{
> +    int ret, i;
> +
> +    dst->id                  = src->id;
> +    dst->time_base           = src->time_base;
> +    dst->nb_frames           = src->nb_frames;
> +    dst->disposition         = src->disposition;
> +    dst->sample_aspect_ratio = src->sample_aspect_ratio;
> +    dst->avg_frame_rate      = src->avg_frame_rate;
> +    dst->r_frame_rate        = src->r_frame_rate;
> +
> +    ret = av_dict_copy(&dst->metadata, src->metadata, 0);
> +    if (ret < 0)
> +        return ret;

Since you are resetting every existing field in dst, it might make sense 
to free the metadata dictionary as well, before copying items to it.

> +    /* Free existing side data*/
> +    for (i = 0; i < dst->nb_side_data; i++)
> +        av_free(dst->side_data[i].data);
> +    av_freep(&dst->side_data);
> +    dst->nb_side_data = 0;
> +
> +    /* Copy side data if present */
> +    if (src->nb_side_data) {
> +        dst->side_data = av_mallocz_array(src->nb_side_data,
> +                                          sizeof(AVPacketSideData));
> +        if (!dst->side_data)
> +            return AVERROR(ENOMEM);
> +        dst->nb_side_data = src->nb_side_data;
> +
> +        for (i = 0; i < src->nb_side_data; i++) {
> +            uint8_t *data = av_memdup(src->side_data[i].data,
> +                                      src->side_data[i].size);
> +            if (!data)
> +                return AVERROR(ENOMEM);
> +            dst->side_data[i].type = src->side_data[i].type;
> +            dst->side_data[i].size = src->side_data[i].size;
> +            dst->side_data[i].data = data;
> +        }
> +    }
> +
> +    av_freep(&dst->recommended_encoder_configuration);
> +    if (src->recommended_encoder_configuration) {
> +        const char *conf_str = src->recommended_encoder_configuration;
> +        dst->recommended_encoder_configuration = av_strdup(conf_str);
> +        if (!dst->recommended_encoder_configuration)
> +            return AVERROR(ENOMEM);
> +    }
> +
> +    return 0;
> +}
> +
> static void free_stream(AVStream **pst)
> {
>     AVStream *st = *pst;
> --

Otherwise it looks good to me, so after you send the updated patch, I plan 
to apply it in a few days.

Regards,
Marton


More information about the ffmpeg-devel mailing list