[FFmpeg-devel] [PATCHv4 3/7] ogg: allow streams to update metadata

wm4 nfxjfg at googlemail.com
Mon Nov 18 11:13:00 CET 2013


On Sun, 17 Nov 2013 20:36:27 -0500
Ben Boeckel <mathstuf at gmail.com> wrote:

> Signed-off-by: Ben Boeckel <mathstuf at gmail.com>
> ---
>  libavformat/oggdec.c | 26 +++++++++++++++++++++-----
>  libavformat/oggdec.h |  2 ++
>  2 files changed, 23 insertions(+), 5 deletions(-)
> 
> diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
> index a099eb3..da76d2f 100644
> --- a/libavformat/oggdec.c
> +++ b/libavformat/oggdec.c
> @@ -77,6 +77,8 @@ static int ogg_save(AVFormatContext *s)
>          struct ogg_stream *os = ogg->streams + i;
>          os->buf = av_mallocz(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
>          memcpy(os->buf, ost->streams[i].buf, os->bufpos);
> +        os->new_metadata      = NULL;
> +        os->new_metadata_size = 0;
>      }
>  
>      ogg->state = ost;
> @@ -142,6 +144,8 @@ static int ogg_reset(AVFormatContext *s)
>          if (start_pos <= s->data_offset) {
>              os->lastpts = 0;
>          }
> +        av_freep(&os->new_metadata);
> +        os->new_metadata_size = 0;
>      }
>  
>      ogg->page_pos = -1;
> @@ -243,11 +247,13 @@ static int ogg_new_stream(AVFormatContext *s, uint32_t serial)
>      ogg->streams = os;
>      os           = ogg->streams + idx;
>      memset(os, 0, sizeof(*os));
> -    os->serial        = serial;
> -    os->bufsize       = DECODER_BUFFER_SIZE;
> -    os->buf           = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
> -    os->header        = -1;
> -    os->start_granule = OGG_NOGRANULE_VALUE;
> +    os->serial            = serial;
> +    os->bufsize           = DECODER_BUFFER_SIZE;
> +    os->buf               = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
> +    os->header            = -1;
> +    os->start_granule     = OGG_NOGRANULE_VALUE;
> +    os->new_metadata      = NULL;
> +    os->new_metadata_size = 0;
>      if (!os->buf)
>          return AVERROR(ENOMEM);
>  
> @@ -639,6 +645,7 @@ static int ogg_read_close(AVFormatContext *s)
>              ogg->streams[i].codec->cleanup(s, i);
>          }
>          av_freep(&ogg->streams[i].private);
> +        av_freep(&ogg->streams[i].new_metadata);
>      }
>      av_freep(&ogg->streams);
>      return 0;
> @@ -786,6 +793,15 @@ retry:
>          AV_WL32(side_data + 4, os->end_trimming);
>      }
>  
> +    if (os->new_metadata) {
> +        uint8_t *side_data = av_packet_new_side_data(pkt,
> +                                                     AV_PKT_DATA_METADATA_UPDATE,
> +                                                     os->new_metadata_size);

This should check the return value in case of memory exhaustion.

> +        memcpy(side_data, os->new_metadata, os->new_metadata_size);
> +        av_freep(&os->new_metadata);
> +        os->new_metadata_size = 0;
> +    }
> +
>      return psize;
>  }
>  
> diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h
> index c31859f..cad1950 100644
> --- a/libavformat/oggdec.h
> +++ b/libavformat/oggdec.h
> @@ -85,6 +85,8 @@ struct ogg_stream {
>      int got_data;   ///< 1 if the stream got some data (non-initial packets), 0 otherwise
>      int nb_header; ///< set to the number of parsed headers
>      int end_trimming; ///< set the number of packets to drop from the end
> +    uint8_t *new_metadata;
> +    unsigned int new_metadata_size;
>      void *private;
>  };
>  



More information about the ffmpeg-devel mailing list