[FFmpeg-cvslog] vqa: set time base to frame rate as coded in the header.

Justin Ruggles git at videolan.org
Tue Jan 24 23:12:53 CET 2012


ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Mon Jan 23 11:38:00 2012 -0500| [5b4c5628973d212ecaa1aabaeebd0205738ceddd] | committer: Justin Ruggles

vqa: set time base to frame rate as coded in the header.

According to Multimedia Wiki documentation, the frame rate is not always 15,
and the actual value can be found in the header.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5b4c5628973d212ecaa1aabaeebd0205738ceddd
---

 libavformat/westwood_vqa.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/libavformat/westwood_vqa.c b/libavformat/westwood_vqa.c
index 9a48263..a99a816 100644
--- a/libavformat/westwood_vqa.c
+++ b/libavformat/westwood_vqa.c
@@ -51,7 +51,6 @@
 #define CMDS_TAG MKBETAG('C', 'M', 'D', 'S')
 
 #define VQA_HEADER_SIZE 0x2A
-#define VQA_FRAMERATE 15
 #define VQA_PREAMBLE_SIZE 8
 
 typedef struct WsVqaDemuxContext {
@@ -87,13 +86,13 @@ static int wsvqa_read_header(AVFormatContext *s,
     unsigned char scratch[VQA_PREAMBLE_SIZE];
     unsigned int chunk_tag;
     unsigned int chunk_size;
+    int fps;
 
     /* initialize the video decoder stream */
     st = avformat_new_stream(s, NULL);
     if (!st)
         return AVERROR(ENOMEM);
     st->start_time = 0;
-    avpriv_set_pts_info(st, 33, 1, VQA_FRAMERATE);
     wsvqa->video_stream_index = st->index;
     st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
     st->codec->codec_id = CODEC_ID_WS_VQA;
@@ -113,6 +112,12 @@ static int wsvqa_read_header(AVFormatContext *s,
     }
     st->codec->width = AV_RL16(&header[6]);
     st->codec->height = AV_RL16(&header[8]);
+    fps = header[12];
+    if (fps < 1 || fps > 30) {
+        av_log(s, AV_LOG_ERROR, "invalid fps: %d\n", fps);
+        return AVERROR_INVALIDDATA;
+    }
+    avpriv_set_pts_info(st, 64, 1, fps);
 
     /* initialize the audio decoder stream for VQA v1 or nonzero samplerate */
     if (AV_RL16(&header[24]) || (AV_RL16(&header[0]) == 1 && AV_RL16(&header[2]) == 1)) {



More information about the ffmpeg-cvslog mailing list