summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-02-05 21:52:21 +0100
committerwm4 <wm4@nowhere>2015-02-05 21:52:21 +0100
commit5e9ba816cf554b67c41ef3c56c55d9b44f949ca3 (patch)
treec3ef4af738c9b2944e5580a8398b58fcbe464e27
parent1f2a370a03fff9f1156f3cafa2255c27b61cc35d (diff)
downloadmpv-5e9ba816cf554b67c41ef3c56c55d9b44f949ca3.tar.bz2
mpv-5e9ba816cf554b67c41ef3c56c55d9b44f949ca3.tar.xz
demux_mkv: retrieve timestamps from libavcodec parser
Fixes vp9 missing timestamps. This requires a brand new libavcodec (the patch for this was just applied to FFmpeg git master). The timestamp mangling is applied to VP9 only. It'd probably work with other codecs, but it's not needed. It could break in various ways, so it has to be explicitly checked for every enabled codec.
-rw-r--r--demux/demux_mkv.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index a476ee0f6e..326d4361f9 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -119,7 +119,7 @@ typedef struct mkv_track {
unsigned char *private_data;
unsigned int private_size;
- bool parse;
+ bool parse, parse_timestamps;
void *parser_tmp;
AVCodecParserContext *av_parser;
AVCodecContext *av_parser_codec;
@@ -1277,8 +1277,10 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
}
}
- if (sh->format == MP_FOURCC('V', 'P', '9', '0'))
+ if (sh->format == MP_FOURCC('V', 'P', '9', '0')) {
track->parse = true;
+ track->parse_timestamps = true;
+ }
if (extradata_size > 0x1000000) {
MP_WARN(demuxer, "Invalid CodecPrivate\n");
@@ -2298,12 +2300,16 @@ static void mkv_parse_and_add_packet(demuxer_t *demuxer, mkv_track_t *track,
return;
}
+ double tb = 1e9;
+ int64_t pts = dp->pts == MP_NOPTS_VALUE ? AV_NOPTS_VALUE : dp->pts * tb;
+ int64_t dts = dp->dts == MP_NOPTS_VALUE ? AV_NOPTS_VALUE : dp->dts * tb;
+
while (dp->len) {
uint8_t *data = NULL;
int size = 0;
int len = av_parser_parse2(track->av_parser, track->av_parser_codec,
&data, &size, dp->buffer, dp->len,
- AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
+ pts, dts, 0);
if (len < 0 || len > dp->len)
break;
dp->buffer += len;
@@ -2313,8 +2319,15 @@ static void mkv_parse_and_add_packet(demuxer_t *demuxer, mkv_track_t *track,
if (!new)
break;
demux_packet_copy_attribs(new, dp);
+ if (track->parse_timestamps) {
+ new->pts = track->av_parser->pts == AV_NOPTS_VALUE
+ ? MP_NOPTS_VALUE : track->av_parser->pts / tb;
+ new->dts = track->av_parser->dts == AV_NOPTS_VALUE
+ ? MP_NOPTS_VALUE : track->av_parser->dts / tb;
+ }
demux_add_packet(stream, new);
}
+ pts = dts = AV_NOPTS_VALUE;
}
if (dp->len) {