[SCM] libav/experimental: user setable preload and max_mux_delay

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:41:55 UTC 2013


The following commit has been merged in the experimental branch:
commit 17c88cb0cee80b76bd157174fbd5e6e76712bff5
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Sat Oct 16 21:27:42 2004 +0000

    user setable preload and max_mux_delay
    
    Originally committed as revision 3602 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/ffmpeg.c b/ffmpeg.c
index 1738cc4..e37fc96 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -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 f12ad04..a17778e 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 772a4df..707bd82 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 5d777f0..ed58e24 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

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list