summaryrefslogtreecommitdiffstats
path: root/demux/demux_mkv.c
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 /demux/demux_mkv.c
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.
Diffstat (limited to 'demux/demux_mkv.c')
-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) {