Use parsers for RealVideo 3/4 to determine correct PTS

Signed-off-by: Anton Khirnov <anton@khirnov.net>
This commit is contained in:
Kostya Shishkov 2011-08-15 12:03:40 +02:00 committed by Anton Khirnov
parent 7c1f6df4b5
commit 48ce8b8da7
6 changed files with 235 additions and 135 deletions

View File

@ -616,6 +616,8 @@ OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \
mpeg12.o mpeg12data.o \ mpeg12.o mpeg12data.o \
mpegvideo.o error_resilience.o mpegvideo.o error_resilience.o
OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.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 \ OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o vc1.o vc1data.o \
msmpeg4.o msmpeg4data.o mpeg4video.o \ msmpeg4.o msmpeg4data.o mpeg4video.o \
h263.o mpegvideo.o error_resilience.o h263.o mpegvideo.o error_resilience.o

View File

@ -396,6 +396,8 @@ void avcodec_register_all(void)
REGISTER_PARSER (MPEGAUDIO, mpegaudio); REGISTER_PARSER (MPEGAUDIO, mpegaudio);
REGISTER_PARSER (MPEGVIDEO, mpegvideo); REGISTER_PARSER (MPEGVIDEO, mpegvideo);
REGISTER_PARSER (PNM, pnm); REGISTER_PARSER (PNM, pnm);
REGISTER_PARSER (RV30, rv30);
REGISTER_PARSER (RV40, rv40);
REGISTER_PARSER (VC1, vc1); REGISTER_PARSER (VC1, vc1);
REGISTER_PARSER (VP3, vp3); REGISTER_PARSER (VP3, vp3);
REGISTER_PARSER (VP8, vp8); REGISTER_PARSER (VP8, vp8);

97
libavcodec/rv34_parser.c Normal file
View File

@ -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

View File

@ -298,6 +298,7 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, AVIOContext *pb,
st->codec->time_base.num= 1; st->codec->time_base.num= 1;
fps= avio_rb16(pb); fps= avio_rb16(pb);
st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
avio_rb32(pb); avio_rb32(pb);
avio_skip(pb, 2); avio_skip(pb, 2);
avio_rb16(pb); avio_rb16(pb);

View File

@ -16,106 +16,105 @@
0, 112500, 276480, 0x5f7a0d4f 0, 112500, 276480, 0x5f7a0d4f
0, 120000, 276480, 0x5f7a0d4f 0, 120000, 276480, 0x5f7a0d4f
0, 127500, 276480, 0x5f7a0d4f 0, 127500, 276480, 0x5f7a0d4f
0, 135000, 276480, 0x75641594 0, 135000, 276480, 0x32ee3526
0, 142500, 276480, 0x32ee3526 0, 142500, 276480, 0x7ca9658e
0, 150000, 276480, 0x5ce39368 0, 150000, 276480, 0x4ec1e418
0, 157500, 276480, 0x4ec1e418 0, 157500, 276480, 0xa9f1506f
0, 165000, 276480, 0x85cbc3b5 0, 165000, 276480, 0x377c7b46
0, 172500, 276480, 0x377c7b46 0, 172500, 276480, 0xe1de7f0a
0, 180000, 276480, 0x756a4a2e 0, 180000, 276480, 0xcb379547
0, 187500, 276480, 0xcb379547 0, 187500, 276480, 0x8e12331c
0, 195000, 276480, 0x99c085be 0, 195000, 276480, 0xe479ffed
0, 202500, 276480, 0xe479ffed 0, 202500, 276480, 0xac7672dd
0, 210000, 276480, 0x1e4fae19 0, 210000, 276480, 0x776412ef
0, 217500, 276480, 0x776412ef 0, 217500, 276480, 0x1cd1ab29
0, 225000, 276480, 0x58ce0f38 0, 225000, 276480, 0x5ab69b27
0, 232500, 276480, 0x5ab69b27 0, 232500, 276480, 0x9eca3f11
0, 240000, 276480, 0xc3db9706 0, 240000, 276480, 0xc9c57884
0, 247500, 276480, 0xc9c57884 0, 247500, 276480, 0xdc07f3c9
0, 255000, 276480, 0x000b5269 0, 255000, 276480, 0x27ff7a5d
0, 262500, 276480, 0x27ff7a5d 0, 262500, 276480, 0x18d4b27d
0, 270000, 276480, 0x70647530 0, 270000, 276480, 0x97612c4b
0, 277500, 276480, 0x97612c4b 0, 277500, 276480, 0x4ec4d57f
0, 285000, 276480, 0xdf4e04d7 0, 285000, 276480, 0xbd98f57c
0, 292500, 276480, 0xbd98f57c 0, 292500, 276480, 0xa5d670ec
0, 300000, 276480, 0x5163b29b 0, 300000, 276480, 0x99170e64
0, 307500, 276480, 0x99170e64 0, 307500, 276480, 0x7a4f2561
0, 315000, 276480, 0x8a4e991f 0, 315000, 276480, 0x6a45425f
0, 322500, 276480, 0x6a45425f 0, 322500, 276480, 0xd75482c6
0, 330000, 276480, 0x7bf6b1ef 0, 330000, 276480, 0x6de1e34b
0, 337500, 276480, 0x6de1e34b 0, 337500, 276480, 0xf964e18e
0, 345000, 276480, 0xdcaaa99a 0, 345000, 276480, 0xd1e98808
0, 352500, 276480, 0xd1e98808 0, 352500, 276480, 0x0cf65540
0, 360000, 276480, 0x6e2d524e 0, 360000, 276480, 0x22c50a3d
0, 367500, 276480, 0x22c50a3d 0, 367500, 276480, 0xf4b1c461
0, 375000, 276480, 0x62b76407 0, 375000, 276480, 0x51e9b3eb
0, 382500, 276480, 0x51e9b3eb 0, 382500, 276480, 0x6dd14ca6
0, 390000, 276480, 0x441f7afd 0, 390000, 276480, 0xfb01efc6
0, 397500, 276480, 0xfb01efc6 0, 397500, 276480, 0x5ac8e06f
0, 405000, 276480, 0x294bb441 0, 405000, 276480, 0xe04ac45e
0, 412500, 276480, 0xe04ac45e 0, 412500, 276480, 0xf688a3ed
0, 420000, 276480, 0x58f275ea 0, 420000, 276480, 0xf0b3b71b
0, 427500, 276480, 0xf0b3b71b 0, 427500, 276480, 0x01840548
0, 435000, 276480, 0x674e34e4 0, 435000, 276480, 0x41dda2d9
0, 442500, 276480, 0x41dda2d9 0, 442500, 276480, 0x9b209f41
0, 450000, 276480, 0xf46ba7fb 0, 450000, 276480, 0x28b54815
0, 457500, 276480, 0x28b54815 0, 457500, 276480, 0x34484aff
0, 465000, 276480, 0xaf2b5d89 0, 465000, 276480, 0x8facba58
0, 472500, 276480, 0x8facba58 0, 472500, 276480, 0x02162c7c
0, 480000, 276480, 0x28a63236 0, 480000, 276480, 0x1ad43fd7
0, 487500, 276480, 0x1ad43fd7 0, 487500, 276480, 0x2b8a89c5
0, 495000, 276480, 0x71507bd2 0, 495000, 276480, 0x35626022
0, 502500, 276480, 0x35626022 0, 502500, 276480, 0xce5af1ec
0, 510000, 276480, 0x7c1139b3 0, 510000, 276480, 0x7fd73a99
0, 517500, 276480, 0x7fd73a99 0, 517500, 276480, 0xcb60725a
0, 525000, 276480, 0xb52e1aa2 0, 525000, 276480, 0xd6f82cae
0, 532500, 276480, 0xd6f82cae 0, 532500, 276480, 0xfa88a483
0, 540000, 276480, 0xf88f75d4 0, 540000, 276480, 0x04a8e3ee
0, 547500, 276480, 0x04a8e3ee 0, 547500, 276480, 0x0b41f0d7
0, 555000, 276480, 0xa29f5b01 0, 555000, 276480, 0x754ceaf5
0, 562500, 276480, 0x754ceaf5 0, 562500, 276480, 0xde084059
0, 570000, 276480, 0x5a38b4af 0, 570000, 276480, 0xfcebc261
0, 577500, 276480, 0xfcebc261 0, 577500, 276480, 0x046394ae
0, 585000, 276480, 0x3d3ca985 0, 585000, 276480, 0x94a03c75
0, 592500, 276480, 0x94a03c75 0, 592500, 276480, 0x6a841f41
0, 600000, 276480, 0x2f98911c 0, 600000, 276480, 0x923b9937
0, 607500, 276480, 0x923b9937 0, 607500, 276480, 0xee82d657
0, 615000, 276480, 0xefab7ffd 0, 615000, 276480, 0x6b9fbc80
0, 622500, 276480, 0x6b9fbc80 0, 622500, 276480, 0x6d4b49d7
0, 630000, 276480, 0xe4bdbd1e 0, 630000, 276480, 0x225a56c0
0, 637500, 276480, 0x225a56c0 0, 637500, 276480, 0xff4e1a8c
0, 645000, 276480, 0xf58b1b7c 0, 645000, 276480, 0xbaffcdcc
0, 652500, 276480, 0xbaffcdcc 0, 652500, 276480, 0x3d861ae6
0, 660000, 276480, 0xeb6eb88f 0, 660000, 276480, 0xdb753d35
0, 667500, 276480, 0xdb753d35 0, 667500, 276480, 0xb24c8016
0, 675000, 276480, 0xea80a82e 0, 675000, 276480, 0x2aae902a
0, 682500, 276480, 0x2aae902a 0, 682500, 276480, 0x5c6e97a9
0, 690000, 276480, 0x9b9ee961 0, 690000, 276480, 0xaa12b6fd
0, 697500, 276480, 0xaa12b6fd 0, 697500, 276480, 0xbf09053c
0, 705000, 276480, 0x50c31e73 0, 705000, 276480, 0xdd9fb89f
0, 712500, 276480, 0xdd9fb89f 0, 712500, 276480, 0x0b752d28
0, 720000, 276480, 0xaf82399a 0, 720000, 276480, 0x7ce5f23c
0, 727500, 276480, 0x7ce5f23c 0, 727500, 276480, 0x55dadd30
0, 735000, 276480, 0x5aaa7519 0, 735000, 276480, 0xe45a5599
0, 742500, 276480, 0xe45a5599 0, 742500, 276480, 0x2f447fd3
0, 750000, 276480, 0x704411fb 0, 750000, 276480, 0x9d7430a1
0, 757500, 276480, 0x9d7430a1 0, 757500, 276480, 0x51cb657c
0, 765000, 276480, 0x2c230702 0, 765000, 276480, 0x4a4f76cd
0, 772500, 276480, 0x4a4f76cd 0, 772500, 276480, 0x87160f99
0, 780000, 276480, 0x27f54854 0, 780000, 276480, 0x694d76e3
0, 787500, 276480, 0x694d76e3 0, 787500, 276480, 0x50742e1b
0, 795000, 276480, 0x525463e2 0, 795000, 276480, 0x819898f9
0, 802500, 276480, 0x819898f9 0, 802500, 276480, 0x35c46927
0, 810000, 276480, 0xeeed00fc 0, 810000, 276480, 0xb6f99ee3
0, 817500, 276480, 0xb6f99ee3 0, 817500, 276480, 0xde97d9fd
0, 825000, 276480, 0xefc83107 0, 825000, 276480, 0xbb22e024
0, 832500, 276480, 0xbb22e024 0, 832500, 276480, 0xbe1fbb19
0, 840000, 276480, 0x300f922a 0, 840000, 276480, 0x826fc3bd
0, 847500, 276480, 0x826fc3bd 0, 847500, 276480, 0x5497097b
0, 855000, 276480, 0x679a53f8 0, 855000, 276480, 0x976c9e93
0, 862500, 276480, 0x976c9e93 0, 862500, 276480, 0xdc2d7c6c
0, 870000, 276480, 0xb194656e 0, 870000, 276480, 0xf002c5ca
0, 877500, 276480, 0xf002c5ca 0, 877500, 276480, 0xf62d8581
0, 885000, 276480, 0xb243dda5 0, 885000, 276480, 0x1700efbb
0, 892500, 276480, 0x1700efbb 0, 892500, 276480, 0x8f316c66
0, 900000, 276480, 0x8f316c66

View File

@ -2,45 +2,44 @@
0, 7500, 126720, 0xa416ece5 0, 7500, 126720, 0xa416ece5
0, 15000, 126720, 0xa416ece5 0, 15000, 126720, 0xa416ece5
0, 22500, 126720, 0x259af497 0, 22500, 126720, 0x259af497
0, 30000, 126720, 0x5e6ff4d7 0, 30000, 126720, 0x763ab817
0, 37500, 126720, 0xeb6fb8d7 0, 37500, 126720, 0xda71b917
0, 45000, 126720, 0xbb1abbb7 0, 45000, 126720, 0xbb1abbb7
0, 52500, 126720, 0x273fbc37 0, 52500, 126720, 0x16eebbd7
0, 60000, 126720, 0x7fa3ae27 0, 60000, 126720, 0x722e99f7
0, 67500, 126720, 0x722e99f7 0, 67500, 126720, 0x07beba77
0, 75000, 126720, 0x29d6a887 0, 75000, 126720, 0x9ca7aac7
0, 82500, 126720, 0xd115a757 0, 82500, 126720, 0xd115a757
0, 90000, 126720, 0x6ddaef32 0, 90000, 126720, 0xac6c071b
0, 97500, 126720, 0x04e7897c 0, 97500, 126720, 0x5eee050f
0, 105000, 126720, 0x68cfda2b 0, 105000, 126720, 0x68cfda2b
0, 112500, 126720, 0xe572dfc9 0, 112500, 126720, 0x582fb176
0, 120000, 126720, 0xbc3cc34f 0, 120000, 126720, 0xcf8cb0e2
0, 127500, 126720, 0xcf8cb0e2 0, 127500, 126720, 0xc6e10f9f
0, 135000, 126720, 0x75ae61b6 0, 135000, 126720, 0x85597543
0, 142500, 126720, 0x554fe3e4 0, 142500, 126720, 0x554fe3e4
0, 150000, 126720, 0x72ecea95 0, 150000, 126720, 0x9bf6a605
0, 157500, 126720, 0x5d00b5fe 0, 157500, 126720, 0x93f7b040
0, 165000, 126720, 0xe39bba0d 0, 165000, 126720, 0xe39bba0d
0, 172500, 126720, 0x9c21bad8 0, 172500, 126720, 0xa567f25b
0, 180000, 126720, 0x72f2a47d 0, 180000, 126720, 0x4f639ebe
0, 187500, 126720, 0x4f639ebe 0, 187500, 126720, 0x6cf87d39
0, 195000, 126720, 0x534a10cc 0, 195000, 126720, 0xfdca11d3
0, 202500, 126720, 0x5fd753d8 0, 202500, 126720, 0x5fd753d8
0, 210000, 126720, 0x0c735615 0, 210000, 126720, 0xeaf3dd0b
0, 217500, 126720, 0x0eaf0c1b 0, 217500, 126720, 0xce5e6794
0, 225000, 126720, 0x14cf7974 0, 225000, 126720, 0x14cf7974
0, 232500, 126720, 0x1c2a513d 0, 232500, 126720, 0xa3f515ab
0, 240000, 126720, 0xbc513f2a 0, 240000, 126720, 0xbc303fae
0, 247500, 126720, 0xbc303fae 0, 247500, 126720, 0x0a22cc69
0, 255000, 126720, 0xd9f67585 0, 255000, 126720, 0xf92b2a25
0, 262500, 126720, 0x3378251f 0, 262500, 126720, 0x3378251f
0, 270000, 126720, 0xb3ed5911 0, 270000, 126720, 0x8da30275
0, 277500, 126720, 0xc15a3577 0, 277500, 126720, 0xf2942f53
0, 285000, 126720, 0x0a24f256 0, 285000, 126720, 0x0a24f256
0, 292500, 126720, 0xfab9c45d 0, 292500, 126720, 0x10e939ce
0, 300000, 126720, 0x45464610 0, 300000, 126720, 0xfe2e057d
0, 307500, 126720, 0xfe2e057d 0, 307500, 126720, 0x5284da7b
0, 315000, 126720, 0x23efdc35 0, 315000, 126720, 0xc9e92bf1
0, 322500, 126720, 0x4d888b2e 0, 322500, 126720, 0x4d888b2e
0, 330000, 126720, 0xdd0d74df 0, 330000, 126720, 0x08382b8e
0, 337500, 126720, 0x08382b8e