diff options
author | Anton Khirnov <anton@khirnov.net> | 2014-04-29 12:03:13 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2014-04-30 21:00:01 +0200 |
commit | eb3b5501e8b85bfea09d533314cb6920efc42639 (patch) | |
tree | f039b3fd0f047f9ef87227870b9e7f7db36c2fa2 /libavformat | |
parent | 7d027b9d6d6290557cc5d4fc56f4b9ed630a7feb (diff) | |
download | ffmpeg-eb3b5501e8b85bfea09d533314cb6920efc42639.tar.gz |
matroskadec: read the CodecDelay element
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/matroska.h | 1 | ||||
-rw-r--r-- | libavformat/matroskadec.c | 10 |
2 files changed, 10 insertions, 1 deletions
diff --git a/libavformat/matroska.h b/libavformat/matroska.h index 0dbc724d56..667f92a720 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -86,6 +86,7 @@ #define MATROSKA_ID_CODECINFOURL 0x3B4040 #define MATROSKA_ID_CODECDOWNLOADURL 0x26B240 #define MATROSKA_ID_CODECDECODEALL 0xAA +#define MATROSKA_ID_CODECDELAY 0x56AA #define MATROSKA_ID_TRACKNAME 0x536E #define MATROSKA_ID_TRACKLANGUAGE 0x22B59C #define MATROSKA_ID_TRACKFLAGENABLED 0xB9 diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index d82d94ced5..7c6ae8050e 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -44,6 +44,7 @@ #include "libavutil/intfloat.h" #include "libavutil/intreadwrite.h" #include "libavutil/lzo.h" +#include "libavutil/mathematics.h" #include "libavcodec/bytestream.h" #include "libavcodec/mpeg4audio.h" @@ -154,6 +155,7 @@ typedef struct { MatroskaTrackVideo video; MatroskaTrackAudio audio; EbmlList encodings; + uint64_t codec_delay; AVStream *stream; int64_t end_timecode; @@ -354,6 +356,7 @@ static EbmlSyntax matroska_track[] = { { MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, offsetof(MatroskaTrack, type) }, { MATROSKA_ID_CODECID, EBML_STR, 0, offsetof(MatroskaTrack, codec_id) }, { MATROSKA_ID_CODECPRIVATE, EBML_BIN, 0, offsetof(MatroskaTrack, codec_priv) }, + { MATROSKA_ID_CODECDELAY, EBML_UINT, 0, offsetof(MatroskaTrack, codec_delay) }, { MATROSKA_ID_TRACKLANGUAGE, EBML_UTF8, 0, offsetof(MatroskaTrack, language), { .s = "eng" } }, { MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, offsetof(MatroskaTrack, default_duration) }, { MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT, 0, offsetof(MatroskaTrack, time_scale), { .f = 1.0 } }, @@ -1730,6 +1733,11 @@ static int matroska_read_header(AVFormatContext *s) avpriv_set_pts_info(st, 64, matroska->time_scale * track->time_scale, 1000 * 1000 * 1000); /* 64 bit pts in ns */ + /* convert the delay from ns to the track timebase */ + track->codec_delay = av_rescale_q(track->codec_delay, + (AVRational){ 1, 1000000000 }, + st->time_base); + st->codec->codec_id = codec_id; st->start_time = 0; if (strcmp(track->language, "und")) @@ -2269,7 +2277,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, if (cluster_time != (uint64_t) -1 && (block_time >= 0 || cluster_time >= -block_time)) { - timecode = cluster_time + block_time; + timecode = cluster_time + block_time - track->codec_delay; if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE && timecode < track->end_timecode) is_keyframe = 0; /* overlapping subtitles are not key frame */ |