Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.9
| @@ -1078,6 +1078,13 @@ typedef struct AVFormatContext { | |||||
| */ | */ | ||||
| int ts_id; | 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 | * All fields below this line are not part of the public API. They | ||||
| @@ -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"}, | {"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"}, | {"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}, | {"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}, | {NULL}, | ||||
| }; | }; | ||||
| @@ -3308,6 +3308,16 @@ static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacke | |||||
| AVStream *st2= s->streams[ next->stream_index]; | AVStream *st2= s->streams[ next->stream_index]; | ||||
| int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts, | int comp = av_compare_ts(next->dts, st2->time_base, pkt->dts, | ||||
| st->time_base); | 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) | if (comp == 0) | ||||
| return pkt->stream_index < next->stream_index; | return pkt->stream_index < next->stream_index; | ||||
| @@ -24,7 +24,7 @@ | |||||
| #include "libavutil/avutil.h" | #include "libavutil/avutil.h" | ||||
| #define LIBAVFORMAT_VERSION_MAJOR 53 | #define LIBAVFORMAT_VERSION_MAJOR 53 | ||||
| #define LIBAVFORMAT_VERSION_MINOR 22 | |||||
| #define LIBAVFORMAT_VERSION_MINOR 23 | |||||
| #define LIBAVFORMAT_VERSION_MICRO 0 | #define LIBAVFORMAT_VERSION_MICRO 0 | ||||
| #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ | ||||