mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-04-10 11:13:01 +00:00
user setable preload and max_mux_delay
Originally committed as revision 3602 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
1f631450fd
commit
17c88cb0ce
12
ffmpeg.c
12
ffmpeg.c
@ -205,6 +205,8 @@ static int audio_codec_tag = 0;
|
|||||||
|
|
||||||
static int mux_rate= 0;
|
static int mux_rate= 0;
|
||||||
static int mux_packet_size= 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 recording_time = 0;
|
||||||
static int64_t start_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->packet_size= mux_packet_size;
|
||||||
oc->mux_rate= mux_rate;
|
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 */
|
/* reset some options */
|
||||||
file_oformat = NULL;
|
file_oformat = NULL;
|
||||||
@ -3692,6 +3696,12 @@ static void opt_target(const char *arg)
|
|||||||
mux_packet_size= 2324;
|
mux_packet_size= 2324;
|
||||||
mux_rate= 2352 * 75 * 8;
|
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")) {
|
} else if(!strcmp(arg, "svcd")) {
|
||||||
|
|
||||||
opt_video_codec("mpeg2video");
|
opt_video_codec("mpeg2video");
|
||||||
@ -3916,6 +3926,8 @@ const OptionDef options[] = {
|
|||||||
/* muxer options */
|
/* muxer options */
|
||||||
{ "muxrate", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&mux_rate}, "set mux rate", "rate" },
|
{ "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" },
|
{ "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, },
|
{ NULL, },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LIBAVFORMAT_BUILD 4619
|
#define LIBAVFORMAT_BUILD 4620
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT
|
#define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT
|
||||||
#define LIBAVFORMAT_VERSION FFMPEG_VERSION
|
#define LIBAVFORMAT_VERSION FFMPEG_VERSION
|
||||||
@ -310,6 +310,8 @@ typedef struct AVFormatContext {
|
|||||||
|
|
||||||
int mux_rate;
|
int mux_rate;
|
||||||
int packet_size;
|
int packet_size;
|
||||||
|
int preload;
|
||||||
|
int max_delay;
|
||||||
} AVFormatContext;
|
} AVFormatContext;
|
||||||
|
|
||||||
typedef struct AVPacketList {
|
typedef struct AVPacketList {
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
|
|
||||||
#define MAX_PAYLOAD_SIZE 4096
|
#define MAX_PAYLOAD_SIZE 4096
|
||||||
#define PRELOAD 45000 //0.5sec
|
|
||||||
//#define DEBUG_SEEK
|
//#define DEBUG_SEEK
|
||||||
|
|
||||||
#undef NDEBUG
|
#undef NDEBUG
|
||||||
@ -904,6 +903,7 @@ static int output_packet(AVFormatContext *ctx, int flush){
|
|||||||
int ignore_constraints=0;
|
int ignore_constraints=0;
|
||||||
int64_t scr= s->last_scr;
|
int64_t scr= s->last_scr;
|
||||||
PacketDesc *timestamp_packet;
|
PacketDesc *timestamp_packet;
|
||||||
|
const int64_t max_delay= av_rescale(ctx->max_delay, 90000, AV_TIME_BASE);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
for(i=0; i<ctx->nb_streams; i++){
|
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 avail_data= fifo_size(&stream->fifo, stream->fifo.rptr);
|
||||||
const int space= stream->max_buffer_size - stream->buffer_index;
|
const int space= stream->max_buffer_size - stream->buffer_index;
|
||||||
int rel_space= 1024*space / stream->max_buffer_size;
|
int rel_space= 1024*space / stream->max_buffer_size;
|
||||||
|
PacketDesc *next_pkt= stream->premux_packet;
|
||||||
|
|
||||||
if(s->packet_size > avail_data && !flush)
|
if(s->packet_size > avail_data && !flush)
|
||||||
return 0;
|
return 0;
|
||||||
@ -922,6 +923,9 @@ retry:
|
|||||||
if(space < s->packet_size && !ignore_constraints)
|
if(space < s->packet_size && !ignore_constraints)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if(next_pkt && next_pkt->dts - scr > max_delay)
|
||||||
|
continue;
|
||||||
|
|
||||||
if(rel_space > best_score){
|
if(rel_space > best_score){
|
||||||
best_score= rel_space;
|
best_score= rel_space;
|
||||||
best_i = i;
|
best_i = i;
|
||||||
@ -1019,22 +1023,14 @@ static int mpeg_mux_write_packet(AVFormatContext *ctx, AVPacket *pkt)
|
|||||||
StreamInfo *stream = st->priv_data;
|
StreamInfo *stream = st->priv_data;
|
||||||
int64_t pts, dts;
|
int64_t pts, dts;
|
||||||
PacketDesc *pkt_desc;
|
PacketDesc *pkt_desc;
|
||||||
|
const int preload= av_rescale(ctx->preload, 90000, AV_TIME_BASE);
|
||||||
|
|
||||||
pts= pkt->pts;
|
pts= pkt->pts;
|
||||||
dts= pkt->dts;
|
dts= pkt->dts;
|
||||||
|
|
||||||
if(s->is_vcd) {
|
if(pts != AV_NOPTS_VALUE) pts += preload;
|
||||||
/* We have to offset the PTS, so that it is consistent with the SCR.
|
if(dts != AV_NOPTS_VALUE) dts += preload;
|
||||||
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;
|
|
||||||
}
|
|
||||||
//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);
|
//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=
|
*stream->next_packet=
|
||||||
pkt_desc= av_mallocz(sizeof(PacketDesc));
|
pkt_desc= av_mallocz(sizeof(PacketDesc));
|
||||||
|
@ -7,7 +7,7 @@ ffmpeg regression test
|
|||||||
./data/b-libav.asf CRC=750f18c7
|
./data/b-libav.asf CRC=750f18c7
|
||||||
1cbf838e659d7fc3d3e33f4187b91f6c *./data/b-libav.rm
|
1cbf838e659d7fc3d3e33f4187b91f6c *./data/b-libav.rm
|
||||||
360251 ./data/b-libav.rm
|
360251 ./data/b-libav.rm
|
||||||
7aeebe6bf43c0c1219e41ce082a47051 *./data/b-libav.mpg
|
90784a1b9589095f20fc6bcc0cc23cc4 *./data/b-libav.mpg
|
||||||
387072 ./data/b-libav.mpg
|
387072 ./data/b-libav.mpg
|
||||||
./data/b-libav.mpg CRC=16c74225
|
./data/b-libav.mpg CRC=16c74225
|
||||||
57a8dfc7926802bb337a9d8918de94a8 *./data/b-libav.swf
|
57a8dfc7926802bb337a9d8918de94a8 *./data/b-libav.swf
|
||||||
|
Loading…
Reference in New Issue
Block a user