[FFmpeg-cvslog] lavf: add audio_preload option, this allows interleaving audio earlier
Michael Niedermayer
git at videolan.org
Thu Dec 1 04:26:08 CET 2011
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Oct 26 22:17:08 2011 +0200| [31f9032b786c1788f6295f5d3fd07622229010b1] | committer: Michael Niedermayer
lavf: add audio_preload option, this allows interleaving audio earlier
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=31f9032b786c1788f6295f5d3fd07622229010b1
---
libavformat/avformat.h | 7 +++++++
libavformat/options.c | 1 +
libavformat/utils.c | 10 ++++++++++
libavformat/version.h | 2 +-
4 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 5151823..156e83c 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -1078,6 +1078,13 @@ typedef struct AVFormatContext {
*/
int ts_id;
+ /**
+ * Audio preload in microseconds.
+ * Note, not all formats support this and unpredictable things may happen if it is used when not supported.
+ * - encoding: Set by user via AVOptions (NO direct access)
+ * - decoding: unused
+ */
+ int audio_preload;
/*****************************************************************
* All fields below this line are not part of the public API. They
diff --git a/libavformat/options.c b/libavformat/options.c
index 3290f92..144aa1a 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -116,6 +116,7 @@ static const AVOption options[]={
{"careful", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = FF_ER_CAREFUL }, INT_MIN, INT_MAX, D, "fer"},
{"explode", "abort decoding on error recognition", 0, AV_OPT_TYPE_CONST, {.dbl = FF_ER_EXPLODE }, INT_MIN, INT_MAX, D, "fer"},
{"fpsprobesize", "number of frames used to probe fps", OFFSET(fps_probe_size), AV_OPT_TYPE_INT, {.dbl = -1}, -1, INT_MAX-1, D},
+{"audio_preload", "microseconds by which audio packets should be interleaved earlier", OFFSET(audio_preload), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX-1, E},
{NULL},
};
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 0ac6860..5a4b364 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -3308,6 +3308,16 @@ static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacke
AVStream *st2= s->streams[ next->stream_index];
int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts,
st->time_base);
+ if(s->audio_preload && ((st->codec->codec_type == AVMEDIA_TYPE_AUDIO) != (st2->codec->codec_type == AVMEDIA_TYPE_AUDIO))){
+ int64_t ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO);
+ int64_t ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - s->audio_preload*(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO);
+ if(ts == ts2){
+ ts= ( pkt ->dts* st->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st ->codec->codec_type == AVMEDIA_TYPE_AUDIO)* st->time_base.den)*st2->time_base.den
+ -( next->dts*st2->time_base.num*AV_TIME_BASE - s->audio_preload*(int64_t)(st2->codec->codec_type == AVMEDIA_TYPE_AUDIO)*st2->time_base.den)* st->time_base.den;
+ ts2=0;
+ }
+ comp= (ts>ts2) - (ts<ts2);
+ }
if (comp == 0)
return pkt->stream_index < next->stream_index;
diff --git a/libavformat/version.h b/libavformat/version.h
index 087fab9..73acf6c 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -24,7 +24,7 @@
#include "libavutil/avutil.h"
#define LIBAVFORMAT_VERSION_MAJOR 53
-#define LIBAVFORMAT_VERSION_MINOR 22
+#define LIBAVFORMAT_VERSION_MINOR 23
#define LIBAVFORMAT_VERSION_MICRO 0
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
More information about the ffmpeg-cvslog
mailing list