From 571efd972986c857c50f2ddc6e3cfb320f06450f Mon Sep 17 00:00:00 2001 From: Vignesh Venkatasubramanian Date: Fri, 16 Aug 2013 11:08:06 -0700 Subject: [PATCH] lavf/matroska: Adding the new SeekPreRoll element In order to encapsuate Opus in Matroska, there is a new element that has been added to the Matroska Spec, SeekPreRoll. It has the duration in nanoseconds that has to be decoded before every seek. Spec: http://matroska.org/technical/specs/index.html#SeekPreRoll Proposal for encapsulateing Opus in Matroska: http://wiki.xiph.org/MatroskaOpus Signed-off-by: Vignesh Venkatasubramanian Reviewed-by: Paul B Mahol Signed-off-by: Michael Niedermayer --- libavformat/matroska.h | 1 + libavformat/matroskaenc.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/libavformat/matroska.h b/libavformat/matroska.h index 2eb2fe6fe3..9c8071adaf 100644 --- a/libavformat/matroska.h +++ b/libavformat/matroska.h @@ -91,6 +91,7 @@ #define MATROSKA_ID_CODECINFOURL 0x3B4040 #define MATROSKA_ID_CODECDOWNLOADURL 0x26B240 #define MATROSKA_ID_CODECDECODEALL 0xAA +#define MATROSKA_ID_SEEKPREROLL 0x56BB #define MATROSKA_ID_TRACKNAME 0x536E #define MATROSKA_ID_TRACKLANGUAGE 0x22B59C #define MATROSKA_ID_TRACKFLAGENABLED 0xB9 diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index c201d5e640..18e96c3b11 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -121,6 +121,9 @@ typedef struct MatroskaMuxContext { /** per-cuepoint - 2 1-byte EBML IDs, 2 1-byte EBML sizes, 8-byte uint max */ #define MAX_CUEPOINT_SIZE(num_tracks) 12 + MAX_CUETRACKPOS_SIZE*num_tracks +/** Seek preroll value for opus */ +#define OPUS_SEEK_PREROLL 80000000 + static int ebml_id_size(unsigned int id) { @@ -642,6 +645,10 @@ static int mkv_write_tracks(AVFormatContext *s) } } + if (codec->codec_id == AV_CODEC_ID_OPUS) { + put_ebml_uint(pb, MATROSKA_ID_SEEKPREROLL, OPUS_SEEK_PREROLL); + } + if (mkv->mode == MODE_WEBM && !(codec->codec_id == AV_CODEC_ID_VP8 || codec->codec_id == AV_CODEC_ID_VP9 || ((codec->codec_id == AV_CODEC_ID_OPUS)&&(codec->strict_std_compliance <= FF_COMPLIANCE_EXPERIMENTAL)) ||