matroskadec: read the CodecDelay element
(cherry picked from commit eb3b5501e8
)
Signed-off-by: Reinhard Tartler <siretart@tauware.de>
Conflicts:
libavformat/matroskadec.c
This commit is contained in:
committed by
Reinhard Tartler
parent
c4e764aa69
commit
82cebc0e05
@@ -86,6 +86,7 @@
|
|||||||
#define MATROSKA_ID_CODECINFOURL 0x3B4040
|
#define MATROSKA_ID_CODECINFOURL 0x3B4040
|
||||||
#define MATROSKA_ID_CODECDOWNLOADURL 0x26B240
|
#define MATROSKA_ID_CODECDOWNLOADURL 0x26B240
|
||||||
#define MATROSKA_ID_CODECDECODEALL 0xAA
|
#define MATROSKA_ID_CODECDECODEALL 0xAA
|
||||||
|
#define MATROSKA_ID_CODECDELAY 0x56AA
|
||||||
#define MATROSKA_ID_TRACKNAME 0x536E
|
#define MATROSKA_ID_TRACKNAME 0x536E
|
||||||
#define MATROSKA_ID_TRACKLANGUAGE 0x22B59C
|
#define MATROSKA_ID_TRACKLANGUAGE 0x22B59C
|
||||||
#define MATROSKA_ID_TRACKFLAGENABLED 0xB9
|
#define MATROSKA_ID_TRACKFLAGENABLED 0xB9
|
||||||
|
@@ -44,6 +44,7 @@
|
|||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/lzo.h"
|
#include "libavutil/lzo.h"
|
||||||
#include "libavutil/dict.h"
|
#include "libavutil/dict.h"
|
||||||
|
#include "libavutil/mathematics.h"
|
||||||
#if CONFIG_ZLIB
|
#if CONFIG_ZLIB
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -148,6 +149,7 @@ typedef struct {
|
|||||||
MatroskaTrackVideo video;
|
MatroskaTrackVideo video;
|
||||||
MatroskaTrackAudio audio;
|
MatroskaTrackAudio audio;
|
||||||
EbmlList encodings;
|
EbmlList encodings;
|
||||||
|
uint64_t codec_delay;
|
||||||
|
|
||||||
AVStream *stream;
|
AVStream *stream;
|
||||||
int64_t end_timecode;
|
int64_t end_timecode;
|
||||||
@@ -348,6 +350,7 @@ static EbmlSyntax matroska_track[] = {
|
|||||||
{ MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, offsetof(MatroskaTrack,type) },
|
{ MATROSKA_ID_TRACKTYPE, EBML_UINT, 0, offsetof(MatroskaTrack,type) },
|
||||||
{ MATROSKA_ID_CODECID, EBML_STR, 0, offsetof(MatroskaTrack,codec_id) },
|
{ MATROSKA_ID_CODECID, EBML_STR, 0, offsetof(MatroskaTrack,codec_id) },
|
||||||
{ MATROSKA_ID_CODECPRIVATE, EBML_BIN, 0, offsetof(MatroskaTrack,codec_priv) },
|
{ 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_TRACKLANGUAGE, EBML_UTF8, 0, offsetof(MatroskaTrack,language), {.s="eng"} },
|
||||||
{ MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, offsetof(MatroskaTrack,default_duration) },
|
{ MATROSKA_ID_TRACKDEFAULTDURATION, EBML_UINT, 0, offsetof(MatroskaTrack,default_duration) },
|
||||||
{ MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT,0, offsetof(MatroskaTrack,time_scale), {.f=1.0} },
|
{ MATROSKA_ID_TRACKTIMECODESCALE, EBML_FLOAT,0, offsetof(MatroskaTrack,time_scale), {.f=1.0} },
|
||||||
@@ -1658,6 +1661,11 @@ static int matroska_read_header(AVFormatContext *s)
|
|||||||
track->time_scale = 1.0;
|
track->time_scale = 1.0;
|
||||||
avpriv_set_pts_info(st, 64, matroska->time_scale*track->time_scale, 1000*1000*1000); /* 64 bit pts in ns */
|
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->codec->codec_id = codec_id;
|
||||||
st->start_time = 0;
|
st->start_time = 0;
|
||||||
if (strcmp(track->language, "und"))
|
if (strcmp(track->language, "und"))
|
||||||
@@ -2190,7 +2198,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
|
|||||||
|
|
||||||
if (cluster_time != (uint64_t)-1
|
if (cluster_time != (uint64_t)-1
|
||||||
&& (block_time >= 0 || cluster_time >= -block_time)) {
|
&& (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
|
if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE
|
||||||
&& timecode < track->end_timecode)
|
&& timecode < track->end_timecode)
|
||||||
is_keyframe = 0; /* overlapping subtitles are not key frame */
|
is_keyframe = 0; /* overlapping subtitles are not key frame */
|
||||||
|
Reference in New Issue
Block a user