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;
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;
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");
/* 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, },
};
extern "C" {
#endif
-#define LIBAVFORMAT_BUILD 4619
+#define LIBAVFORMAT_BUILD 4620
#define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVFORMAT_VERSION FFMPEG_VERSION
int mux_rate;
int packet_size;
+ int preload;
+ int max_delay;
} AVFormatContext;
typedef struct AVPacketList {
#include "avformat.h"
#define MAX_PAYLOAD_SIZE 4096
-#define PRELOAD 45000 //0.5sec
//#define DEBUG_SEEK
#undef NDEBUG
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++){
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;
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;
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));
./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