Use parsers for RealVideo 3/4 to determine correct PTS
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 15 Aug 2011 10:03:40 +0000 (12:03 +0200)
committerAnton Khirnov <anton@khirnov.net>
Wed, 17 Aug 2011 13:00:42 +0000 (15:00 +0200)
Signed-off-by: Anton Khirnov <anton@khirnov.net>
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/rv34_parser.c [new file with mode: 0644]
libavformat/rmdec.c
tests/ref/fate/real-rv40
tests/ref/fate/rv30

index 36e07a9..2264e86 100644 (file)
@@ -616,6 +616,8 @@ OBJS-$(CONFIG_MPEGVIDEO_PARSER)        += mpegvideo_parser.o    \
                                           mpeg12.o mpeg12data.o \
                                           mpegvideo.o error_resilience.o
 OBJS-$(CONFIG_PNM_PARSER)              += pnm_parser.o pnm.o
+OBJS-$(CONFIG_RV30_PARSER)             += rv34_parser.o
+OBJS-$(CONFIG_RV40_PARSER)             += rv34_parser.o
 OBJS-$(CONFIG_VC1_PARSER)              += vc1_parser.o vc1.o vc1data.o \
                                           msmpeg4.o msmpeg4data.o mpeg4video.o \
                                           h263.o mpegvideo.o error_resilience.o
index dcef0d6..7ba945c 100644 (file)
@@ -396,6 +396,8 @@ void avcodec_register_all(void)
     REGISTER_PARSER  (MPEGAUDIO, mpegaudio);
     REGISTER_PARSER  (MPEGVIDEO, mpegvideo);
     REGISTER_PARSER  (PNM, pnm);
+    REGISTER_PARSER  (RV30, rv30);
+    REGISTER_PARSER  (RV40, rv40);
     REGISTER_PARSER  (VC1, vc1);
     REGISTER_PARSER  (VP3, vp3);
     REGISTER_PARSER  (VP8, vp8);
diff --git a/libavcodec/rv34_parser.c b/libavcodec/rv34_parser.c
new file mode 100644 (file)
index 0000000..c2563a5
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * RV30/40 parser
+ * Copyright (c) 2011 Konstantin Shishkov
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file
+ * RV30/40 parser
+ */
+
+#include "parser.h"
+#include "libavutil/intreadwrite.h"
+
+typedef struct {
+    ParseContext pc;
+    int64_t key_dts;
+    int key_pts;
+} RV34ParseContext;
+
+static const int rv_to_av_frame_type[4] = {
+    AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B,
+};
+
+static int rv34_parse(AVCodecParserContext *s,
+                      AVCodecContext *avctx,
+                      const uint8_t **poutbuf, int *poutbuf_size,
+                      const uint8_t *buf, int buf_size)
+{
+    RV34ParseContext *pc = s->priv_data;
+    int off;
+    int type, pts, hdr;
+
+    if (buf_size < 13 + *buf * 8) {
+        *poutbuf = buf;
+        *poutbuf_size = buf_size;
+        return buf_size;
+    }
+
+    off = AV_RL32(buf + 5);
+    hdr = AV_RB32(buf + 9 + *buf * 8);
+    if (avctx->codec_id == CODEC_ID_RV30) {
+        type = (hdr >> 27) & 3;
+        pts  = (hdr >>  7) & 0x1FFF;
+    } else {
+        type = (hdr >> 29) & 3;
+        pts  = (hdr >>  6) & 0x1FFF;
+    }
+
+    if (type != 3 && s->pts != AV_NOPTS_VALUE) {
+        pc->key_dts = s->pts;
+        pc->key_pts = pts;
+    } else {
+        if (type != 3)
+            s->pts = pc->key_dts + ((pts - pc->key_pts) & 0x1FFF);
+        else
+            s->pts = pc->key_dts - ((pc->key_pts - pts) & 0x1FFF);
+    }
+    s->pict_type = rv_to_av_frame_type[type];
+
+    *poutbuf = buf;
+    *poutbuf_size = buf_size;
+    return buf_size;
+}
+
+#ifdef CONFIG_RV30_PARSER
+AVCodecParser ff_rv30_parser = {
+    { CODEC_ID_RV30 },
+    sizeof(RV34ParseContext),
+    NULL,
+    rv34_parse,
+};
+#endif
+
+#ifdef CONFIG_RV40_PARSER
+AVCodecParser ff_rv40_parser = {
+    { CODEC_ID_RV40 },
+    sizeof(RV34ParseContext),
+    NULL,
+    rv34_parse,
+};
+#endif
index 5ee75b5..cf5c46a 100644 (file)
@@ -298,6 +298,7 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, AVIOContext *pb,
         st->codec->time_base.num= 1;
         fps= avio_rb16(pb);
         st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
+        st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
         avio_rb32(pb);
         avio_skip(pb, 2);
         avio_rb16(pb);
index 990a530..22cc731 100644 (file)
 0, 112500, 276480, 0x5f7a0d4f
 0, 120000, 276480, 0x5f7a0d4f
 0, 127500, 276480, 0x5f7a0d4f
-0, 135000, 276480, 0x75641594
-0, 142500, 276480, 0x32ee3526
-0, 150000, 276480, 0x5ce39368
-0, 157500, 276480, 0x4ec1e418
-0, 165000, 276480, 0x85cbc3b5
-0, 172500, 276480, 0x377c7b46
-0, 180000, 276480, 0x756a4a2e
-0, 187500, 276480, 0xcb379547
-0, 195000, 276480, 0x99c085be
-0, 202500, 276480, 0xe479ffed
-0, 210000, 276480, 0x1e4fae19
-0, 217500, 276480, 0x776412ef
-0, 225000, 276480, 0x58ce0f38
-0, 232500, 276480, 0x5ab69b27
-0, 240000, 276480, 0xc3db9706
-0, 247500, 276480, 0xc9c57884
-0, 255000, 276480, 0x000b5269
-0, 262500, 276480, 0x27ff7a5d
-0, 270000, 276480, 0x70647530
-0, 277500, 276480, 0x97612c4b
-0, 285000, 276480, 0xdf4e04d7
-0, 292500, 276480, 0xbd98f57c
-0, 300000, 276480, 0x5163b29b
-0, 307500, 276480, 0x99170e64
-0, 315000, 276480, 0x8a4e991f
-0, 322500, 276480, 0x6a45425f
-0, 330000, 276480, 0x7bf6b1ef
-0, 337500, 276480, 0x6de1e34b
-0, 345000, 276480, 0xdcaaa99a
-0, 352500, 276480, 0xd1e98808
-0, 360000, 276480, 0x6e2d524e
-0, 367500, 276480, 0x22c50a3d
-0, 375000, 276480, 0x62b76407
-0, 382500, 276480, 0x51e9b3eb
-0, 390000, 276480, 0x441f7afd
-0, 397500, 276480, 0xfb01efc6
-0, 405000, 276480, 0x294bb441
-0, 412500, 276480, 0xe04ac45e
-0, 420000, 276480, 0x58f275ea
-0, 427500, 276480, 0xf0b3b71b
-0, 435000, 276480, 0x674e34e4
-0, 442500, 276480, 0x41dda2d9
-0, 450000, 276480, 0xf46ba7fb
-0, 457500, 276480, 0x28b54815
-0, 465000, 276480, 0xaf2b5d89
-0, 472500, 276480, 0x8facba58
-0, 480000, 276480, 0x28a63236
-0, 487500, 276480, 0x1ad43fd7
-0, 495000, 276480, 0x71507bd2
-0, 502500, 276480, 0x35626022
-0, 510000, 276480, 0x7c1139b3
-0, 517500, 276480, 0x7fd73a99
-0, 525000, 276480, 0xb52e1aa2
-0, 532500, 276480, 0xd6f82cae
-0, 540000, 276480, 0xf88f75d4
-0, 547500, 276480, 0x04a8e3ee
-0, 555000, 276480, 0xa29f5b01
-0, 562500, 276480, 0x754ceaf5
-0, 570000, 276480, 0x5a38b4af
-0, 577500, 276480, 0xfcebc261
-0, 585000, 276480, 0x3d3ca985
-0, 592500, 276480, 0x94a03c75
-0, 600000, 276480, 0x2f98911c
-0, 607500, 276480, 0x923b9937
-0, 615000, 276480, 0xefab7ffd
-0, 622500, 276480, 0x6b9fbc80
-0, 630000, 276480, 0xe4bdbd1e
-0, 637500, 276480, 0x225a56c0
-0, 645000, 276480, 0xf58b1b7c
-0, 652500, 276480, 0xbaffcdcc
-0, 660000, 276480, 0xeb6eb88f
-0, 667500, 276480, 0xdb753d35
-0, 675000, 276480, 0xea80a82e
-0, 682500, 276480, 0x2aae902a
-0, 690000, 276480, 0x9b9ee961
-0, 697500, 276480, 0xaa12b6fd
-0, 705000, 276480, 0x50c31e73
-0, 712500, 276480, 0xdd9fb89f
-0, 720000, 276480, 0xaf82399a
-0, 727500, 276480, 0x7ce5f23c
-0, 735000, 276480, 0x5aaa7519
-0, 742500, 276480, 0xe45a5599
-0, 750000, 276480, 0x704411fb
-0, 757500, 276480, 0x9d7430a1
-0, 765000, 276480, 0x2c230702
-0, 772500, 276480, 0x4a4f76cd
-0, 780000, 276480, 0x27f54854
-0, 787500, 276480, 0x694d76e3
-0, 795000, 276480, 0x525463e2
-0, 802500, 276480, 0x819898f9
-0, 810000, 276480, 0xeeed00fc
-0, 817500, 276480, 0xb6f99ee3
-0, 825000, 276480, 0xefc83107
-0, 832500, 276480, 0xbb22e024
-0, 840000, 276480, 0x300f922a
-0, 847500, 276480, 0x826fc3bd
-0, 855000, 276480, 0x679a53f8
-0, 862500, 276480, 0x976c9e93
-0, 870000, 276480, 0xb194656e
-0, 877500, 276480, 0xf002c5ca
-0, 885000, 276480, 0xb243dda5
-0, 892500, 276480, 0x1700efbb
-0, 900000, 276480, 0x8f316c66
+0, 135000, 276480, 0x32ee3526
+0, 142500, 276480, 0x7ca9658e
+0, 150000, 276480, 0x4ec1e418
+0, 157500, 276480, 0xa9f1506f
+0, 165000, 276480, 0x377c7b46
+0, 172500, 276480, 0xe1de7f0a
+0, 180000, 276480, 0xcb379547
+0, 187500, 276480, 0x8e12331c
+0, 195000, 276480, 0xe479ffed
+0, 202500, 276480, 0xac7672dd
+0, 210000, 276480, 0x776412ef
+0, 217500, 276480, 0x1cd1ab29
+0, 225000, 276480, 0x5ab69b27
+0, 232500, 276480, 0x9eca3f11
+0, 240000, 276480, 0xc9c57884
+0, 247500, 276480, 0xdc07f3c9
+0, 255000, 276480, 0x27ff7a5d
+0, 262500, 276480, 0x18d4b27d
+0, 270000, 276480, 0x97612c4b
+0, 277500, 276480, 0x4ec4d57f
+0, 285000, 276480, 0xbd98f57c
+0, 292500, 276480, 0xa5d670ec
+0, 300000, 276480, 0x99170e64
+0, 307500, 276480, 0x7a4f2561
+0, 315000, 276480, 0x6a45425f
+0, 322500, 276480, 0xd75482c6
+0, 330000, 276480, 0x6de1e34b
+0, 337500, 276480, 0xf964e18e
+0, 345000, 276480, 0xd1e98808
+0, 352500, 276480, 0x0cf65540
+0, 360000, 276480, 0x22c50a3d
+0, 367500, 276480, 0xf4b1c461
+0, 375000, 276480, 0x51e9b3eb
+0, 382500, 276480, 0x6dd14ca6
+0, 390000, 276480, 0xfb01efc6
+0, 397500, 276480, 0x5ac8e06f
+0, 405000, 276480, 0xe04ac45e
+0, 412500, 276480, 0xf688a3ed
+0, 420000, 276480, 0xf0b3b71b
+0, 427500, 276480, 0x01840548
+0, 435000, 276480, 0x41dda2d9
+0, 442500, 276480, 0x9b209f41
+0, 450000, 276480, 0x28b54815
+0, 457500, 276480, 0x34484aff
+0, 465000, 276480, 0x8facba58
+0, 472500, 276480, 0x02162c7c
+0, 480000, 276480, 0x1ad43fd7
+0, 487500, 276480, 0x2b8a89c5
+0, 495000, 276480, 0x35626022
+0, 502500, 276480, 0xce5af1ec
+0, 510000, 276480, 0x7fd73a99
+0, 517500, 276480, 0xcb60725a
+0, 525000, 276480, 0xd6f82cae
+0, 532500, 276480, 0xfa88a483
+0, 540000, 276480, 0x04a8e3ee
+0, 547500, 276480, 0x0b41f0d7
+0, 555000, 276480, 0x754ceaf5
+0, 562500, 276480, 0xde084059
+0, 570000, 276480, 0xfcebc261
+0, 577500, 276480, 0x046394ae
+0, 585000, 276480, 0x94a03c75
+0, 592500, 276480, 0x6a841f41
+0, 600000, 276480, 0x923b9937
+0, 607500, 276480, 0xee82d657
+0, 615000, 276480, 0x6b9fbc80
+0, 622500, 276480, 0x6d4b49d7
+0, 630000, 276480, 0x225a56c0
+0, 637500, 276480, 0xff4e1a8c
+0, 645000, 276480, 0xbaffcdcc
+0, 652500, 276480, 0x3d861ae6
+0, 660000, 276480, 0xdb753d35
+0, 667500, 276480, 0xb24c8016
+0, 675000, 276480, 0x2aae902a
+0, 682500, 276480, 0x5c6e97a9
+0, 690000, 276480, 0xaa12b6fd
+0, 697500, 276480, 0xbf09053c
+0, 705000, 276480, 0xdd9fb89f
+0, 712500, 276480, 0x0b752d28
+0, 720000, 276480, 0x7ce5f23c
+0, 727500, 276480, 0x55dadd30
+0, 735000, 276480, 0xe45a5599
+0, 742500, 276480, 0x2f447fd3
+0, 750000, 276480, 0x9d7430a1
+0, 757500, 276480, 0x51cb657c
+0, 765000, 276480, 0x4a4f76cd
+0, 772500, 276480, 0x87160f99
+0, 780000, 276480, 0x694d76e3
+0, 787500, 276480, 0x50742e1b
+0, 795000, 276480, 0x819898f9
+0, 802500, 276480, 0x35c46927
+0, 810000, 276480, 0xb6f99ee3
+0, 817500, 276480, 0xde97d9fd
+0, 825000, 276480, 0xbb22e024
+0, 832500, 276480, 0xbe1fbb19
+0, 840000, 276480, 0x826fc3bd
+0, 847500, 276480, 0x5497097b
+0, 855000, 276480, 0x976c9e93
+0, 862500, 276480, 0xdc2d7c6c
+0, 870000, 276480, 0xf002c5ca
+0, 877500, 276480, 0xf62d8581
+0, 885000, 276480, 0x1700efbb
+0, 892500, 276480, 0x8f316c66
index 867151b..8777367 100644 (file)
@@ -2,45 +2,44 @@
 0, 7500, 126720, 0xa416ece5
 0, 15000, 126720, 0xa416ece5
 0, 22500, 126720, 0x259af497
-0, 30000, 126720, 0x5e6ff4d7
-0, 37500, 126720, 0xeb6fb8d7
+0, 30000, 126720, 0x763ab817
+0, 37500, 126720, 0xda71b917
 0, 45000, 126720, 0xbb1abbb7
-0, 52500, 126720, 0x273fbc37
-0, 60000, 126720, 0x7fa3ae27
-0, 67500, 126720, 0x722e99f7
-0, 75000, 126720, 0x29d6a887
+0, 52500, 126720, 0x16eebbd7
+0, 60000, 126720, 0x722e99f7
+0, 67500, 126720, 0x07beba77
+0, 75000, 126720, 0x9ca7aac7
 0, 82500, 126720, 0xd115a757
-0, 90000, 126720, 0x6ddaef32
-0, 97500, 126720, 0x04e7897c
+0, 90000, 126720, 0xac6c071b
+0, 97500, 126720, 0x5eee050f
 0, 105000, 126720, 0x68cfda2b
-0, 112500, 126720, 0xe572dfc9
-0, 120000, 126720, 0xbc3cc34f
-0, 127500, 126720, 0xcf8cb0e2
-0, 135000, 126720, 0x75ae61b6
+0, 112500, 126720, 0x582fb176
+0, 120000, 126720, 0xcf8cb0e2
+0, 127500, 126720, 0xc6e10f9f
+0, 135000, 126720, 0x85597543
 0, 142500, 126720, 0x554fe3e4
-0, 150000, 126720, 0x72ecea95
-0, 157500, 126720, 0x5d00b5fe
+0, 150000, 126720, 0x9bf6a605
+0, 157500, 126720, 0x93f7b040
 0, 165000, 126720, 0xe39bba0d
-0, 172500, 126720, 0x9c21bad8
-0, 180000, 126720, 0x72f2a47d
-0, 187500, 126720, 0x4f639ebe
-0, 195000, 126720, 0x534a10cc
+0, 172500, 126720, 0xa567f25b
+0, 180000, 126720, 0x4f639ebe
+0, 187500, 126720, 0x6cf87d39
+0, 195000, 126720, 0xfdca11d3
 0, 202500, 126720, 0x5fd753d8
-0, 210000, 126720, 0x0c735615
-0, 217500, 126720, 0x0eaf0c1b
+0, 210000, 126720, 0xeaf3dd0b
+0, 217500, 126720, 0xce5e6794
 0, 225000, 126720, 0x14cf7974
-0, 232500, 126720, 0x1c2a513d
-0, 240000, 126720, 0xbc513f2a
-0, 247500, 126720, 0xbc303fae
-0, 255000, 126720, 0xd9f67585
+0, 232500, 126720, 0xa3f515ab
+0, 240000, 126720, 0xbc303fae
+0, 247500, 126720, 0x0a22cc69
+0, 255000, 126720, 0xf92b2a25
 0, 262500, 126720, 0x3378251f
-0, 270000, 126720, 0xb3ed5911
-0, 277500, 126720, 0xc15a3577
+0, 270000, 126720, 0x8da30275
+0, 277500, 126720, 0xf2942f53
 0, 285000, 126720, 0x0a24f256
-0, 292500, 126720, 0xfab9c45d
-0, 300000, 126720, 0x45464610
-0, 307500, 126720, 0xfe2e057d
-0, 315000, 126720, 0x23efdc35
+0, 292500, 126720, 0x10e939ce
+0, 300000, 126720, 0xfe2e057d
+0, 307500, 126720, 0x5284da7b
+0, 315000, 126720, 0xc9e92bf1
 0, 322500, 126720, 0x4d888b2e
-0, 330000, 126720, 0xdd0d74df
-0, 337500, 126720, 0x08382b8e
+0, 330000, 126720, 0x08382b8e