properly set AVStream.language according to Matroska track header
authorAurelien Jacobs <aurel@gnuage.org>
Mon, 9 Jul 2007 13:33:34 +0000 (13:33 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Mon, 9 Jul 2007 13:33:34 +0000 (13:33 +0000)
Originally committed as revision 9557 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/matroskadec.c

index fc447316e65e43e0f6ddb590698313a6b2a27afa..b1785294b64c3be96a0fe9a3c6515decdac9ce9a 100644 (file)
@@ -44,7 +44,7 @@ typedef struct Track {
     int stream_index;
 
     char *name;
     int stream_index;
 
     char *name;
-    char *language;
+    char language[4];
 
     char *codec_id;
     char *codec_name;
 
     char *codec_id;
     char *codec_name;
@@ -994,6 +994,7 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
     /* Allocate a generic track. As soon as we know its type we'll realloc. */
     track = av_mallocz(MAX_TRACK_SIZE);
     matroska->num_tracks++;
     /* Allocate a generic track. As soon as we know its type we'll realloc. */
     track = av_mallocz(MAX_TRACK_SIZE);
     matroska->num_tracks++;
+    strcpy(track->language, "eng");
 
     /* start with the master */
     if ((res = ebml_read_master(matroska, &id)) < 0)
 
     /* start with the master */
     if ((res = ebml_read_master(matroska, &id)) < 0)
@@ -1353,10 +1354,14 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
 
                 /* language (matters for audio/subtitles, mostly) */
             case MATROSKA_ID_TRACKLANGUAGE: {
 
                 /* language (matters for audio/subtitles, mostly) */
             case MATROSKA_ID_TRACKLANGUAGE: {
-                char *text;
+                char *text, *end;
                 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
                     break;
                 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
                     break;
-                track->language = text;
+                if ((end = strchr(text, '-')))
+                    *end = '\0';
+                if (strlen(text) == 3)
+                    strcpy(track->language, text);
+                av_free(text);
                 break;
             }
 
                 break;
             }
 
@@ -2158,6 +2163,8 @@ matroska_read_header (AVFormatContext    *s,
 
             st->codec->codec_id = codec_id;
             st->start_time = 0;
 
             st->codec->codec_id = codec_id;
             st->start_time = 0;
+            if (strcmp(track->language, "und"))
+                strcpy(st->language, track->language);
 
             if (track->default_duration)
                 av_reduce(&st->codec->time_base.num, &st->codec->time_base.den,
 
             if (track->default_duration)
                 av_reduce(&st->codec->time_base.num, &st->codec->time_base.den,
@@ -2702,7 +2709,6 @@ matroska_read_close (AVFormatContext *s)
         av_free(track->codec_name);
         av_free(track->codec_priv);
         av_free(track->name);
         av_free(track->codec_name);
         av_free(track->codec_priv);
         av_free(track->name);
-        av_free(track->language);
 
         if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
             MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track;
 
         if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
             MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track;