diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2004-10-16 21:27:42 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2004-10-16 21:27:42 +0000 |
commit | 17c88cb0cee80b76bd157174fbd5e6e76712bff5 (patch) | |
tree | f99feea019a2a4a811ae321b5d06671d2d14a998 | |
parent | 1f631450fd177e49141845db0989e4760689d3e5 (diff) | |
download | ffmpeg-17c88cb0cee80b76bd157174fbd5e6e76712bff5.tar.gz |
user setable preload and max_mux_delay
Originally committed as revision 3602 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | ffmpeg.c | 12 | ||||
-rw-r--r-- | libavformat/avformat.h | 4 | ||||
-rw-r--r-- | libavformat/mpeg.c | 22 | ||||
-rw-r--r-- | tests/libav.regression.ref | 2 |
4 files changed, 25 insertions, 15 deletions
@@ -205,6 +205,8 @@ static int audio_codec_tag = 0; static int mux_rate= 0; static int mux_packet_size= 0; +static float mux_preload= 0.5; +static float mux_max_delay= 0.7; static int64_t recording_time = 0; static int64_t start_time = 0; @@ -3328,6 +3330,8 @@ static void opt_output_file(const char *filename) oc->packet_size= mux_packet_size; oc->mux_rate= mux_rate; + oc->preload= (int)(mux_preload*AV_TIME_BASE); + oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE); /* reset some options */ file_oformat = NULL; @@ -3692,6 +3696,12 @@ static void opt_target(const char *arg) mux_packet_size= 2324; mux_rate= 2352 * 75 * 8; + /* We have to offset the PTS, so that it is consistent with the SCR. + SCR starts at 36000, but the first two packs contain only padding + and the first pack from the other stream, respectively, may also have + been written before. + So the real data starts at SCR 36000+3*1200. */ + mux_preload= (36000+3*1200) / 90000.0; //0.44 } else if(!strcmp(arg, "svcd")) { opt_video_codec("mpeg2video"); @@ -3916,6 +3926,8 @@ const OptionDef options[] = { /* muxer options */ { "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" }, { "packetsize", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_packet_size}, "set packet size", "size" }, + { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" }, + { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" }, { NULL, }, }; diff --git a/libavformat/avformat.h b/libavformat/avformat.h index f12ad04077..a17778ea51 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -5,7 +5,7 @@ extern "C" { #endif -#define LIBAVFORMAT_BUILD 4619 +#define LIBAVFORMAT_BUILD 4620 #define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT #define LIBAVFORMAT_VERSION FFMPEG_VERSION @@ -310,6 +310,8 @@ typedef struct AVFormatContext { int mux_rate; int packet_size; + int preload; + int max_delay; } AVFormatContext; typedef struct AVPacketList { diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 772a4df30e..707bd8204f 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -19,7 +19,6 @@ #include "avformat.h" #define MAX_PAYLOAD_SIZE 4096 -#define PRELOAD 45000 //0.5sec //#define DEBUG_SEEK #undef NDEBUG @@ -904,6 +903,7 @@ static int output_packet(AVFormatContext *ctx, int flush){ int ignore_constraints=0; int64_t scr= s->last_scr; PacketDesc *timestamp_packet; + const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE); retry: for(i=0; i<ctx->nb_streams; i++){ @@ -912,6 +912,7 @@ retry: const int avail_data= fifo_size(&stream->fifo, stream->fifo.rptr); const int space= stream->max_buffer_size - stream->buffer_index; int rel_space= 1024*space / stream->max_buffer_size; + PacketDesc *next_pkt= stream->premux_packet; if(s->packet_size > avail_data && !flush) return 0; @@ -922,6 +923,9 @@ retry: if(space < s->packet_size && !ignore_constraints) continue; + if(next_pkt && next_pkt->dts - scr > max_delay) + continue; + if(rel_space > best_score){ best_score= rel_space; best_i = i; @@ -1019,22 +1023,14 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt) StreamInfo *stream = st->priv_data; int64_t pts, dts; PacketDesc *pkt_desc; + const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE); pts= pkt->pts; dts= pkt->dts; - if(s->is_vcd) { - /* We have to offset the PTS, so that it is consistent with the SCR. - SCR starts at 36000, but the first two packs contain only padding - and the first pack from the other stream, respectively, may also have - been written before. - So the real data starts at SCR 36000+3*1200. */ - if(pts != AV_NOPTS_VALUE) pts += 36000 + 3600; - if(dts != AV_NOPTS_VALUE) dts += 36000 + 3600; - }else{ - if(pts != AV_NOPTS_VALUE) pts += PRELOAD; - if(dts != AV_NOPTS_VALUE) dts += PRELOAD; - } + if(pts != AV_NOPTS_VALUE) pts += preload; + if(dts != AV_NOPTS_VALUE) dts += preload; + //av_log(ctx, AV_LOG_DEBUG, "dts:%f pts:%f flags:%d stream:%d nopts:%d\n", dts/90000.0, pts/90000.0, pkt->flags, pkt->stream_index, pts != AV_NOPTS_VALUE); *stream->next_packet= pkt_desc= av_mallocz(sizeof(PacketDesc)); diff --git a/tests/libav.regression.ref b/tests/libav.regression.ref index 5d777f0373..ed58e24af6 100644 --- a/tests/libav.regression.ref +++ b/tests/libav.regression.ref @@ -7,7 +7,7 @@ ffmpeg regression test ./data/b-libav.asf CRC=750f18c7 1cbf838e659d7fc3d3e33f4187b91f6c *./data/b-libav.rm 360251 ./data/b-libav.rm -7aeebe6bf43c0c1219e41ce082a47051 *./data/b-libav.mpg +90784a1b9589095f20fc6bcc0cc23cc4 *./data/b-libav.mpg 387072 ./data/b-libav.mpg ./data/b-libav.mpg CRC=16c74225 57a8dfc7926802bb337a9d8918de94a8 *./data/b-libav.swf |