rmdec: correct DTS calculation in RealMedia container.
authorKostya Shishkov <kostya.shishkov@gmail.com>
Thu, 11 Aug 2011 12:44:05 +0000 (14:44 +0200)
committerAnton Khirnov <anton@khirnov.net>
Wed, 17 Aug 2011 13:00:42 +0000 (15:00 +0200)
First, container stores only DTS and not PTS as it was believed.
Second, multiple frames in a packet store timestamp instead of position
after the frame length.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
libavformat/rmdec.c
tests/ref/fate/rv30

index 5426748..5ee75b5 100644 (file)
@@ -568,7 +568,8 @@ skip:
 
 static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb,
                                    RMDemuxContext *rm, RMStream *vst,
 
 static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb,
                                    RMDemuxContext *rm, RMStream *vst,
-                                   AVPacket *pkt, int len, int *pseq)
+                                   AVPacket *pkt, int len, int *pseq,
+                                   int64_t *timestamp)
 {
     int hdr, seq, pic_num, len2, pos;
     int type;
 {
     int hdr, seq, pic_num, len2, pos;
     int type;
@@ -588,8 +589,10 @@ static int rm_assemble_video_frame(AVFormatContext *s, AVIOContext *pb,
         return -1;
     rm->remaining_len = len;
     if(type&1){     // frame, not slice
         return -1;
     rm->remaining_len = len;
     if(type&1){     // frame, not slice
-        if(type == 3)  // frame as a part of packet
+        if(type == 3){  // frame as a part of packet
             len= len2;
             len= len2;
+            *timestamp = pos;
+        }
         if(rm->remaining_len < len)
             return -1;
         rm->remaining_len -= len;
         if(rm->remaining_len < len)
             return -1;
         rm->remaining_len -= len;
@@ -697,7 +700,7 @@ ff_rm_parse_packet (AVFormatContext *s, AVIOContext *pb,
 
     if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
         rm->current_stream= st->id;
 
     if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
         rm->current_stream= st->id;
-        if(rm_assemble_video_frame(s, pb, rm, ast, pkt, len, seq))
+        if(rm_assemble_video_frame(s, pb, rm, ast, pkt, len, seq, &timestamp))
             return -1; //got partial frame
     } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
         if ((st->codec->codec_id == CODEC_ID_RA_288) ||
             return -1; //got partial frame
     } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
         if ((st->codec->codec_id == CODEC_ID_RA_288) ||
@@ -772,7 +775,7 @@ ff_rm_parse_packet (AVFormatContext *s, AVIOContext *pb,
     }
 #endif
 
     }
 #endif
 
-    pkt->pts= timestamp;
+    pkt->pts = timestamp;
     if (flags & 2)
         pkt->flags |= AV_PKT_FLAG_KEY;
 
     if (flags & 2)
         pkt->flags |= AV_PKT_FLAG_KEY;
 
index 6c99871..867151b 100644 (file)
@@ -1,16 +1,16 @@
 0, 0, 126720, 0xcefaec47
 0, 7500, 126720, 0xa416ece5
 0, 15000, 126720, 0xa416ece5
 0, 0, 126720, 0xcefaec47
 0, 7500, 126720, 0xa416ece5
 0, 15000, 126720, 0xa416ece5
-0, 22500, 126720, 0xa416ece5
-0, 30000, 126720, 0xcc10f4b7
+0, 22500, 126720, 0x259af497
+0, 30000, 126720, 0x5e6ff4d7
 0, 37500, 126720, 0xeb6fb8d7
 0, 37500, 126720, 0xeb6fb8d7
-0, 45000, 126720, 0xda71b917
-0, 52500, 126720, 0xbb1abbb7
-0, 60000, 126720, 0x273fbc37
-0, 67500, 126720, 0x16eebbd7
-0, 75000, 126720, 0x105eb927
-0, 82500, 126720, 0x7fa3ae27
-0, 90000, 126720, 0xd115a757
+0, 45000, 126720, 0xbb1abbb7
+0, 52500, 126720, 0x273fbc37
+0, 60000, 126720, 0x7fa3ae27
+0, 67500, 126720, 0x722e99f7
+0, 75000, 126720, 0x29d6a887
+0, 82500, 126720, 0xd115a757
+0, 90000, 126720, 0x6ddaef32
 0, 97500, 126720, 0x04e7897c
 0, 105000, 126720, 0x68cfda2b
 0, 112500, 126720, 0xe572dfc9
 0, 97500, 126720, 0x04e7897c
 0, 105000, 126720, 0x68cfda2b
 0, 112500, 126720, 0xe572dfc9
 0, 180000, 126720, 0x72f2a47d
 0, 187500, 126720, 0x4f639ebe
 0, 195000, 126720, 0x534a10cc
 0, 180000, 126720, 0x72f2a47d
 0, 187500, 126720, 0x4f639ebe
 0, 195000, 126720, 0x534a10cc
-0, 202500, 126720, 0xfdca11d3
+0, 202500, 126720, 0x5fd753d8
 0, 210000, 126720, 0x0c735615
 0, 217500, 126720, 0x0eaf0c1b
 0, 210000, 126720, 0x0c735615
 0, 217500, 126720, 0x0eaf0c1b
-0, 225000, 126720, 0xce5e6794
-0, 232500, 126720, 0x14cf7974
+0, 225000, 126720, 0x14cf7974
+0, 232500, 126720, 0x1c2a513d
 0, 240000, 126720, 0xbc513f2a
 0, 247500, 126720, 0xbc303fae
 0, 255000, 126720, 0xd9f67585
 0, 240000, 126720, 0xbc513f2a
 0, 247500, 126720, 0xbc303fae
 0, 255000, 126720, 0xd9f67585