[FFmpeg-devel] [PATCHv2 2/5] vorbis: handle special packets in the middle of a stream
wm4
nfxjfg at googlemail.com
Sat Oct 26 14:00:36 CEST 2013
On Fri, 25 Oct 2013 22:18:05 -0400
Ben Boeckel <mathstuf at gmail.com> wrote:
> This allows for updating metadata from new metadata packets in the
> middle of a stream (e.g., MPD streams). There still needs to be a signal
> that there *is* new metadata, but this is at least gets the data into a
> data structure.
>
> Signed-off-by: Ben Boeckel <mathstuf at gmail.com>
> ---
> libavcodec/vorbis_parser.c | 26 ++++++++++++++++++++++++--
> libavcodec/vorbis_parser.h | 17 +++++++++++++++++
> 2 files changed, 41 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/vorbis_parser.c b/libavcodec/vorbis_parser.c
> index fcbecc8..1e2cab3 100644
> --- a/libavcodec/vorbis_parser.c
> +++ b/libavcodec/vorbis_parser.c
> @@ -201,8 +201,8 @@ int avpriv_vorbis_parse_extradata(AVCodecContext *avctx, VorbisParseContext *s)
> return 0;
> }
>
> -int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf,
> - int buf_size)
> +int avpriv_vorbis_parse_frame_flags(VorbisParseContext *s, const uint8_t *buf,
> + int buf_size, int *flags)
> {
> int duration = 0;
>
> @@ -211,6 +211,22 @@ int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf,
> int previous_blocksize = s->previous_blocksize;
>
> if (buf[0] & 1) {
> + /* If the user doesn't care about special packets, it's a bad one. */
> + if (!flags)
> + goto bad_packet;
> +
> + /* Set the flag for which kind of special packet it is. */
> + if (buf[0] == 1)
> + *flags |= VORBIS_FLAG_HEADER;
> + else if (buf[0] == 3)
> + *flags |= VORBIS_FLAG_COMMENT;
> + else
> + goto bad_packet;
> +
> + /* Special packets have no duration. */
> + return 0;
> +
> +bad_packet:
> av_log(s->avctx, AV_LOG_ERROR, "Invalid packet\n");
> return AVERROR_INVALIDDATA;
> }
> @@ -234,6 +250,12 @@ int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf,
> return duration;
> }
>
> +int avpriv_vorbis_parse_frame(VorbisParseContext *s, const uint8_t *buf,
> + int buf_size)
> +{
> + return avpriv_vorbis_parse_frame_flags(s, buf, buf_size, NULL);
> +}
> +
> void avpriv_vorbis_parse_reset(VorbisParseContext *s)
> {
> if (s->valid_extradata)
> diff --git a/libavcodec/vorbis_parser.h b/libavcodec/vorbis_parser.h
> index 101df5d..13a6cf4 100644
> --- a/libavcodec/vorbis_parser.h
> +++ b/libavcodec/vorbis_parser.h
> @@ -50,6 +50,23 @@ typedef struct VorbisParseContext {
> */
> int avpriv_vorbis_parse_extradata(AVCodecContext *avctx, VorbisParseContext *s);
>
> +#define VORBIS_FLAG_HEADER 0x00000001
> +#define VORBIS_FLAG_COMMENT 0x00000002
> +
> +/**
> + * Get the duration for a Vorbis packet.
> + *
> + * avpriv_vorbis_parse_extradata() must have been successfully called prior to
> + * this in order for a correct duration to be returned.
> + *
> + * @param s Vorbis parser context
> + * @param buf buffer containing a Vorbis frame
> + * @param buf_size size of the buffer
> + * @param flags flags for special frames (NULL for "don't care")
> + */
> +int avpriv_vorbis_parse_frame_flags(VorbisParseContext *s, const uint8_t *buf,
> + int buf_size, int *flags);
> +
> /**
> * Get the duration for a Vorbis packet.
> *
Looks ok, at least it doesn't change current behavior.
If you want to be pedantic, you could criticize that setting flags to
NULL instead of a dummy changes behavior, and
that avpriv_vorbis_parse_frame() relies on this.
More information about the ffmpeg-devel
mailing list