user setable preload and max_mux_delay

Originally committed as revision 3602 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2004-10-16 21:27:42 +00:00
parent 1f631450fd
commit 17c88cb0ce
4 changed files with 25 additions and 15 deletions

View File

@ -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, },
};

View File

@ -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 {

View File

@ -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));

View File

@ -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