matroskadec: read TrackTimecodeScale and set timebase accordingly
authorAnton Khirnov <wyskas@gmail.com>
Sun, 1 Jun 2008 13:54:11 +0000 (13:54 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Sun, 1 Jun 2008 13:54:11 +0000 (13:54 +0000)
patch by Anton Khirnov   wyskas _at_ gmail _dot_ com

Originally committed as revision 13601 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/matroska.h
libavformat/matroskadec.c

index 630a824..f8e9fb3 100644 (file)
@@ -94,6 +94,7 @@
 #define MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383
 #define MATROSKA_ID_TRACKCONTENTENCODINGS 0x6D80
 #define MATROSKA_ID_TRACKCONTENTENCODING 0x6240
+#define MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
 
 /* IDs in the trackvideo master */
 #define MATROSKA_ID_VIDEOFRAMERATE 0x2383E3
index 37c1140..cff5d67 100644 (file)
@@ -60,6 +60,7 @@ typedef struct Track {
     unsigned char *codec_priv;
     int codec_priv_size;
 
+    double time_scale;
     uint64_t default_duration;
     MatroskaTrackFlags flags;
 
@@ -1589,6 +1590,14 @@ matroska_add_stream (MatroskaDemuxContext *matroska)
                 break;
             }
 
+            case MATROSKA_ID_TRACKTIMECODESCALE: {
+                double num;
+                if ((res = ebml_read_float(matroska, &id, &num)) < 0)
+                    break;
+                track->time_scale = num;
+                break;
+            }
+
             default:
                 av_log(matroska->ctx, AV_LOG_INFO,
                        "Unknown track header entry 0x%x - ignoring\n", id);
@@ -2615,7 +2624,7 @@ matroska_read_header (AVFormatContext    *s,
             st = av_new_stream(s, track->stream_index);
             if (st == NULL)
                 return AVERROR(ENOMEM);
-            av_set_pts_info(st, 64, matroska->time_scale, 1000*1000*1000); /* 64 bit pts in ns */
+            av_set_pts_info(st, 64, matroska->time_scale*track->time_scale, 1000*1000*1000); /* 64 bit pts in ns */
 
             st->codec->codec_id = codec_id;
             st->start_time = 0;