[FFmpeg-devel] [PATCH] Read ogg stream language

Måns Rullgård mans
Sat Mar 1 22:44:06 CET 2008


Reimar D?ffinger <Reimar.Doeffinger at stud.uni-karlsruhe.de> writes:

> On Thu, Feb 14, 2008 at 03:31:58PM +0100, Reimar D?ffinger wrote:
>> On Thu, Feb 14, 2008 at 02:06:37PM -0000, M?ns Rullg?rd wrote:
>> > Reimar D?ffinger wrote:
>> > > On Thu, Jan 31, 2008 at 11:57:35PM +0100, Reimar D?ffinger wrote:
>> > >> attached patch makes vorbis_comment (which lacks a ff_ prefix btw) parse
>> > >> the language tag into AVStream.language (if a mapping is known).
>> > >> It also adds vorbis comment parsing to oggparseogm.c (I would apply as a
>> > >> second step).
>> > >> The code is probably improvable, the mapping list even more so.
>> > >
>> > > So is this rejected, should it be done differently or just applied?
>> > 
>> > I'd prefer if a mapping of common language names to codes were kept
>> > outside the ogg demuxer.  It could be useful to someone else.
>> 
>> Sure, where? libavformat/utils.c? A new file (seems like overkill)?
>> ff_ or av_ (i.e. just internal or public)?
>
> Updated.
>
> Greetings,
> Reimar D?ffinger
>
> Index: libavformat/oggparseflac.c
> ===================================================================
> --- libavformat/oggparseflac.c	(revision 12287)
> +++ libavformat/oggparseflac.c	(working copy)
> @@ -69,7 +69,7 @@
>          st->time_base.num = 1;
>          st->time_base.den = st->codec->sample_rate;
>      } else if (mdt == 4) {
> -        vorbis_comment (s, os->buf + os->pstart + 4, os->psize - 4);
> +        vorbis_comment (s, os->buf + os->pstart + 4, os->psize - 4, st);
>      }
>
>      return 1;

OK

> Index: libavformat/oggparseogm.c
> ===================================================================
> --- libavformat/oggparseogm.c	(revision 12287)
> +++ libavformat/oggparseogm.c	(working copy)
> @@ -43,6 +43,9 @@
>
>      if(!(*p & 1))
>          return 0;
> +    if (*p == 3)
> +        if (os->psize > 8)
> +            vorbis_comment (s, p + 7, os->psize - 8, st);
>      if(*p != 1)
>          return 1;

OK

> Index: libavformat/oggparsetheora.c
> ===================================================================
> --- libavformat/oggparsetheora.c	(revision 12287)
> +++ libavformat/oggparsetheora.c	(working copy)
> @@ -102,7 +102,7 @@
>          st->codec->codec_id = CODEC_ID_THEORA;
>
>      } else if (os->buf[os->pstart] == 0x83) {
> -        vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8);
> +        vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8, st);
>      }
>
>      st->codec->extradata = av_realloc (st->codec->extradata, cds);

OK

> Index: libavformat/oggparsevorbis.c
> ===================================================================
> --- libavformat/oggparsevorbis.c	(revision 12287)
> +++ libavformat/oggparsevorbis.c	(working copy)
> @@ -31,7 +31,7 @@
>  #include "avstring.h"
>
>  extern int
> -vorbis_comment(AVFormatContext * as, uint8_t *buf, int size)
> +vorbis_comment(AVFormatContext * as, uint8_t *buf, int size, AVStream *st)
>  {
>      const uint8_t *p = buf;
>      const uint8_t *end = buf + size;
> @@ -96,6 +96,8 @@
>                  as->track = atoi(ct);
>              else if (!strcmp(tt, "ALBUM"))
>                  av_strlcpy(as->album, ct, sizeof(as->album));
> +            else if (st && !strcmp(tt, "LANGUAGE"))
> +                av_lang_str2id(st->language, ct);

I think it might be more logical writing this as

    else if (!strcmp(tt, "LANGUAGE"))
        if (st)
            av_lang_str2id(st->language, ct);

especially if more tags are added.  It's not really important though.

>          }
>      }
>
> @@ -210,7 +212,7 @@
>          st->time_base.den = st->codec->sample_rate;
>      } else if (os->buf[os->pstart] == 3) {
>          if (os->psize > 8)
> -            vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8);
> +            vorbis_comment (s, os->buf + os->pstart + 7, os->psize - 8, st);
>      } else {
>          st->codec->extradata_size =
>              fixup_vorbis_headers(s, priv, &st->codec->extradata);
> Index: libavformat/oggdec.h
> ===================================================================
> --- libavformat/oggdec.h	(revision 12287)
> +++ libavformat/oggdec.h	(working copy)
> @@ -85,6 +85,6 @@
>  extern ogg_codec_t theora_codec;
>  extern ogg_codec_t vorbis_codec;
>
> -extern int vorbis_comment(AVFormatContext *ms, uint8_t *buf, int size);
> +extern int vorbis_comment(AVFormatContext *ms, uint8_t *buf, int size, AVStream *st);

Please break that line.

>  #endif /* FFMPEG_OGGDEC_H */
> Index: libavformat/avformat.h
> ===================================================================
> --- libavformat/avformat.h	(revision 12287)
> +++ libavformat/avformat.h	(working copy)
> @@ -871,6 +871,8 @@
>                   const char *url,
>                   int is_output);
>
> +void av_lang_str2id(char langid[4], const char *name);
> +
>  /**
>   * parses width and height out of string str.
>   * @deprecated Use av_parse_video_frame_size instead.
> Index: libavformat/utils.c
> ===================================================================
> --- libavformat/utils.c	(revision 12287)
> +++ libavformat/utils.c	(working copy)
> @@ -2666,6 +2666,22 @@
>          dump_stream_format(ic, i, index, is_output);
>  }
>
> +static const struct {
> +    const char langid[4];
> +    const char * const name;

Two of those consts are unnecessary since the entire thing is const.

> +} langmap [] = {
> +    {"eng", "English"},
> +    {"und", NULL}
> +};
> +
> +void av_lang_str2id(char langid[4], const char *name) {
> +    int i;
> +    for (i = 0; langmap[i].name; i++)
> +        if (!strcasecmp(name, langmap[i].name))

Although strcasecmp() is standard, I'm certain some systems will be
missing it.  Not that I care...

Someone else will have to OK the inclusion of this in utils.c.

-- 
M?ns Rullg?rd
mans at mansr.com




More information about the ffmpeg-devel mailing list