summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
Diffstat (limited to 'demux')
-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) {