[FFmpeg-devel] [RFC] mpegts: Provide a monotonic timestamp to the outside world

Harald Axmann harald.axmann at hotmail.com
Thu Nov 15 23:27:56 CET 2012


On 15.11.2012 14:35, Michael Niedermayer wrote:
> [...]
> Actually 3 fate tests fail with this patch, not just one
> make: *** [fate-bfi] Error 1
> make: *** [fate-bmv-video] Error 1
> make: *** [fate-nuv-rtjpeg-fh] Error 1
>
> you can run "all" tests with make -k fate
>
> ("all" is except some dependant tests like seektests)
>
> [...]

Thanks, "-k" helps a lot! I have fixed "fate-bfi" and "fate-bmv-video". The new patch (still with debugging output) is attached.

Now all tests except "fate-nuv-rtjpeg-fh" work (because of the intended wrapping behaviour).

--- ./tests/ref/fate/nuv-rtjpeg-fh      2012-10-21 19:15:38.477160546 +0200
+++ tests/data/fate/nuv-rtjpeg-fh       2012-11-15 22:30:06.145216588 +0100
@@ -1,51 +1,51 @@
  #tb 0: 1/50
-0,          0,          0,        1,   221184, 0xf48c94f6
[...]
-0,         51,         51,        1,   221184, 0x10a59eb5
+0,         80,         80,        1,   221184, 0xf48c94f6
[...]
+0,        131,        131,        1,   221184, 0x10a59eb5
Test nuv-rtjpeg-fh failed. Look at tests/data/fate/nuv-rtjpeg-fh.err for details.

nuv-rtjpeg-fh.err with debug output is also attached.

[...]




-------------- next part --------------
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 61bc4a6..dcbe04e 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -847,6 +847,20 @@ typedef struct AVStream {
      */
     int64_t mux_ts_offset;
 
+    /**
+     * Internal data to check for wrapping of the time stamp
+     */
+    int64_t pts_wrap_reference;
+
+    /**
+     * Add or subtract the offset for wrap correction
+     *
+     * If the first time stamp is near the wrap point, the wrap offset
+     * will be subtracted, which will create negative time stamps.
+     * Otherwise the offset will be added.
+     */
+    int pts_wrap_add_offset;
+
 } AVStream;
 
 #define AV_PROGRAM_RUNNING 1
@@ -878,6 +892,9 @@ typedef struct AVProgram {
      */
     int64_t start_time;
     int64_t end_time;
+
+    int64_t pts_wrap_reference;    ///< reference dts for wrap detection
+    int pts_wrap_add_offset;       ///< add or subtract the offset for wrap correction
 } AVProgram;
 
 #define AVFMTCTX_NOHEADER      0x0001 /**< signal that no header is present
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 0240b0c..97f22e4 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -78,6 +78,25 @@ static int is_relative(int64_t ts) {
     return ts > (RELATIVE_TS_BASE - (1LL<<48));
 }
 
+/**
+ * Wrap a given time stamp, if there is an indication for an overflow
+ *
+ * @param st stream
+ * @param timestamp the time stamp to wrap
+ * @return resulting time stamp
+ */
+static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
+{
+    if (st->pts_wrap_bits != 64 && st->pts_wrap_reference != AV_NOPTS_VALUE &&
+        timestamp != AV_NOPTS_VALUE) {
+        if (st->pts_wrap_add_offset && timestamp < st->pts_wrap_reference)
+            return timestamp + (1LL<<st->pts_wrap_bits);
+        else if (!st->pts_wrap_add_offset && timestamp >= st->pts_wrap_reference)
+            return timestamp - (1LL<<st->pts_wrap_bits);
+    }
+    return timestamp;
+}
+
 /** head of registered input format linked list */
 static AVInputFormat *first_iformat = NULL;
 /** head of registered output format linked list */
@@ -739,6 +758,10 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
         }
 
         st= s->streams[pkt->stream_index];
+        av_log(s, AV_LOG_INFO, "stream %d: pts %lld -> ", pkt->stream_index, pkt->pts);
+        pkt->dts = wrap_timestamp(st, pkt->dts);
+        pkt->pts = wrap_timestamp(st, pkt->pts);
+        av_log(s, AV_LOG_INFO, "%lld\n", pkt->pts);
 
         force_codec_ids(s, st);
 
@@ -885,8 +908,65 @@ static AVPacketList *get_next_pkt(AVFormatContext *s, AVStream *st, AVPacketList
     return NULL;
 }
 
+static int update_wrap_reference(AVFormatContext *s, AVStream *st, int stream_index)
+{
+    if (st->pts_wrap_bits != 64 && st->pts_wrap_reference == AV_NOPTS_VALUE && st->first_dts != AV_NOPTS_VALUE) {
+        int i;
+
+        // reference time stamp should be 60 s before first time stamp
+        int64_t pts_wrap_reference = st->first_dts - av_rescale(60, st->time_base.den, st->time_base.num);
+        // if first time stamp is not more than 1/8 and 60s before the wrap point, subtract rather than add wrap offset
+        int pts_wrap_add_offset = (st->first_dts < (1LL<<st->pts_wrap_bits) - (1LL<<st->pts_wrap_bits-3)) ||
+            (st->first_dts < (1LL<<st->pts_wrap_bits) - av_rescale(60, st->time_base.den, st->time_base.num));
+
+        AVProgram *first_program = av_find_program_from_stream(s, NULL, stream_index);
+
+        if (!first_program) {
+            int default_stream_index = av_find_default_stream_index(s);
+            if (s->streams[default_stream_index]->pts_wrap_reference == AV_NOPTS_VALUE) {
+                for (i=0; i<s->nb_streams; i++) {
+                    s->streams[i]->pts_wrap_reference = pts_wrap_reference;
+                    s->streams[i]->pts_wrap_add_offset = pts_wrap_add_offset;
+                }
+            }
+            else {
+                st->pts_wrap_reference = s->streams[default_stream_index]->pts_wrap_reference;
+                st->pts_wrap_add_offset = s->streams[default_stream_index]->pts_wrap_add_offset;
+            }
+        }
+        else {
+            AVProgram *program = first_program;
+            while (program) {
+                if (program->pts_wrap_reference != AV_NOPTS_VALUE) {
+                    pts_wrap_reference = program->pts_wrap_reference;
+                    pts_wrap_add_offset = program->pts_wrap_add_offset;
+                    break;
+                }
+                program = av_find_program_from_stream(s, program, stream_index);
+            }
+
+            // update every program with differing pts_wrap_reference
+            program = first_program;
+            while(program) {
+                if (program->pts_wrap_reference != pts_wrap_reference) {
+                    for (i=0; i<program->nb_stream_indexes; i++) {
+                        s->streams[program->stream_index[i]]->pts_wrap_reference = pts_wrap_reference;
+                        s->streams[program->stream_index[i]]->pts_wrap_add_offset = pts_wrap_add_offset;
+                    }
+
+                    program->pts_wrap_reference = pts_wrap_reference;
+                    program->pts_wrap_add_offset = pts_wrap_add_offset;
+                }
+                program = av_find_program_from_stream(s, program, stream_index);
+            }
+        }
+        return 1;
+    }
+    return 0;
+}
+
 static void update_initial_timestamps(AVFormatContext *s, int stream_index,
-                                      int64_t dts, int64_t pts)
+                                      int64_t dts, int64_t pts, AVPacket *pkt)
 {
     AVStream *st= s->streams[stream_index];
     AVPacketList *pktl= s->parse_queue ? s->parse_queue : s->packet_buffer;
@@ -928,8 +1008,19 @@ static void update_initial_timestamps(AVFormatContext *s, int stream_index,
                 pktl->pkt.dts= pts_buffer[0];
         }
     }
+
+    if (update_wrap_reference(s, st, stream_index) && !st->pts_wrap_add_offset) {
+        // correct first time stamps to negative values
+        st->first_dts = wrap_timestamp(st, st->first_dts);
+        st->cur_dts = wrap_timestamp(st, st->cur_dts);
+        pkt->dts = wrap_timestamp(st, pkt->dts);
+        pkt->pts = wrap_timestamp(st, pkt->pts);
+        pts = wrap_timestamp(st, pts);
+    }
+
     if (st->start_time == AV_NOPTS_VALUE)
         st->start_time = pts;
+    av_log(s, AV_LOG_INFO, "st->start_time stream %d, %lld\n", stream_index, st->start_time);
 }
 
 static void update_initial_durations(AVFormatContext *s, AVStream *st,
@@ -1073,7 +1164,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
             /* PTS = presentation timestamp */
             if (pkt->dts == AV_NOPTS_VALUE)
                 pkt->dts = st->last_IP_pts;
-            update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts);
+            update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt);
             if (pkt->dts == AV_NOPTS_VALUE)
                 pkt->dts = st->cur_dts;
 
@@ -1110,7 +1201,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
             if (pkt->pts == AV_NOPTS_VALUE)
                 pkt->pts = pkt->dts;
             update_initial_timestamps(s, pkt->stream_index, pkt->pts,
-                                      pkt->pts);
+                                      pkt->pts, pkt);
             if (pkt->pts == AV_NOPTS_VALUE)
                 pkt->pts = st->cur_dts;
             pkt->dts = pkt->pts;
@@ -1127,7 +1218,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
             pkt->dts= st->pts_buffer[0];
     }
     if(st->codec->codec_id == AV_CODEC_ID_H264){ // we skipped it above so we try here
-        update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts); // this should happen on the first packet
+        update_initial_timestamps(s, pkt->stream_index, pkt->dts, pkt->pts, pkt); // this should happen on the first packet
     }
     if(pkt->dts > st->cur_dts)
         st->cur_dts = pkt->dts;
@@ -1614,6 +1705,7 @@ int ff_add_index_entry(AVIndexEntry **index_entries,
 int av_add_index_entry(AVStream *st,
                        int64_t pos, int64_t timestamp, int size, int distance, int flags)
 {
+    timestamp = wrap_timestamp(st, timestamp);
     return ff_add_index_entry(&st->index_entries, &st->nb_index_entries,
                               &st->index_entries_allocated_size, pos,
                               timestamp, size, distance, flags);
@@ -1660,6 +1752,12 @@ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
                                      wanted_timestamp, flags);
 }
 
+static int64_t ff_read_timestamp(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit,
+                                 int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ))
+{
+    return wrap_timestamp(s->streams[stream_index], read_timestamp(s, stream_index, ppos, pos_limit));
+}
+
 int ff_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags)
 {
     AVInputFormat *avif= s->iformat;
@@ -1735,7 +1833,7 @@ int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
 
     if(ts_min == AV_NOPTS_VALUE){
         pos_min = s->data_offset;
-        ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
+        ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
         if (ts_min == AV_NOPTS_VALUE)
             return -1;
     }
@@ -1751,7 +1849,7 @@ int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
         pos_max = filesize - 1;
         do{
             pos_max -= step;
-            ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step);
+            ts_max = ff_read_timestamp(s, stream_index, &pos_max, pos_max + step, read_timestamp);
             step += step;
         }while(ts_max == AV_NOPTS_VALUE && pos_max >= step);
         if (ts_max == AV_NOPTS_VALUE)
@@ -1759,7 +1857,7 @@ int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
 
         for(;;){
             int64_t tmp_pos= pos_max + 1;
-            int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);
+            int64_t tmp_ts= ff_read_timestamp(s, stream_index, &tmp_pos, INT64_MAX, read_timestamp);
             if(tmp_ts == AV_NOPTS_VALUE)
                 break;
             ts_max= tmp_ts;
@@ -1806,7 +1904,7 @@ int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
             pos= pos_limit;
         start_pos= pos;
 
-        ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1
+        ts = ff_read_timestamp(s, stream_index, &pos, INT64_MAX, read_timestamp); //may pass pos_limit instead of -1
         if(pos == pos_max)
             no_change++;
         else
@@ -1835,9 +1933,9 @@ int64_t ff_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts,
     ts  = (flags & AVSEEK_FLAG_BACKWARD) ?  ts_min :  ts_max;
 #if 0
     pos_min = pos;
-    ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
+    ts_min = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
     pos_min++;
-    ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX);
+    ts_max = ff_read_timestamp(s, stream_index, &pos_min, INT64_MAX, read_timestamp);
     av_dlog(s, "pos=0x%"PRIx64" %s<=%s<=%s\n",
             pos, av_ts2str(ts_min), av_ts2str(target_ts), av_ts2str(ts_max));
 #endif
@@ -3138,6 +3236,7 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
     st->cur_dts = s->iformat ? RELATIVE_TS_BASE : 0;
     st->first_dts = AV_NOPTS_VALUE;
     st->probe_packets = MAX_PROBE_PACKETS;
+    st->pts_wrap_reference = AV_NOPTS_VALUE;
 
     /* default pts setting is MPEG-like */
     avpriv_set_pts_info(st, 33, 1, 90000);
@@ -3177,6 +3276,7 @@ AVProgram *av_new_program(AVFormatContext *ac, int id)
         program->discard = AVDISCARD_NONE;
     }
     program->id = id;
+    program->pts_wrap_reference = AV_NOPTS_VALUE;
 
     program->start_time =
     program->end_time   = AV_NOPTS_VALUE;

-------------- next part --------------
ffmpeg version N-46650-gbeb369b Copyright (c) 2000-2012 the FFmpeg developers
  built on Nov 13 2012 00:03:08 with gcc 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
  configuration: --enable-gpl --enable-debug
  libavutil      52.  6.100 / 52.  6.100
  libavcodec     54. 71.100 / 54. 71.100
  libavformat    54. 36.100 / 54. 36.100
  libavdevice    54.  3.100 / 54.  3.100
  libavfilter     3. 22.101 /  3. 22.101
  libswscale      2.  1.102 /  2.  1.102
  libswresample   0. 16.100 /  0. 16.100
  libpostproc    52.  1.100 / 52.  1.100
[nuv @ 0xac596e0] stream 1: pts 4294965711 -> 4294965711
[nuv @ 0xac596e0] st->start_time stream 1, -1585
[nuv @ 0xac596e0] stream 1: pts 4294965743 -> -1553
[nuv @ 0xac596e0] stream 1: pts 4294965775 -> -1521
[nuv @ 0xac596e0] stream 1: pts 4294965807 -> -1489
[nuv @ 0xac596e0] stream 1: pts 4294965839 -> -1457
[nuv @ 0xac596e0] stream 1: pts 4294965871 -> -1425
[nuv @ 0xac596e0] stream 1: pts 4294965903 -> -1393
[nuv @ 0xac596e0] stream 1: pts 4294965935 -> -1361
[nuv @ 0xac596e0] stream 1: pts 4294965967 -> -1329
[nuv @ 0xac596e0] stream 1: pts 4294965999 -> -1297
[nuv @ 0xac596e0] stream 1: pts 4294966031 -> -1265
[nuv @ 0xac596e0] stream 1: pts 4294966063 -> -1233
[nuv @ 0xac596e0] stream 1: pts 4294966095 -> -1201
[nuv @ 0xac596e0] stream 1: pts 4294966127 -> -1169
[nuv @ 0xac596e0] stream 1: pts 4294966159 -> -1137
[nuv @ 0xac596e0] stream 1: pts 4294966191 -> -1105
[nuv @ 0xac596e0] stream 1: pts 4294966223 -> -1073
[nuv @ 0xac596e0] stream 1: pts 4294966255 -> -1041
[nuv @ 0xac596e0] stream 1: pts 4294966287 -> -1009
[nuv @ 0xac596e0] stream 1: pts 4294966319 -> -977
[nuv @ 0xac596e0] stream 1: pts 4294966351 -> -945
[nuv @ 0xac596e0] stream 1: pts 4294966383 -> -913
[nuv @ 0xac596e0] stream 1: pts 4294966415 -> -881
[nuv @ 0xac596e0] stream 1: pts 4294966447 -> -849
[nuv @ 0xac596e0] stream 1: pts 4294966479 -> -817
[nuv @ 0xac596e0] stream 1: pts 4294966511 -> -785
[nuv @ 0xac596e0] stream 1: pts 4294966543 -> -753
[nuv @ 0xac596e0] stream 1: pts 4294966575 -> -721
[nuv @ 0xac596e0] stream 1: pts 4294966607 -> -689
[nuv @ 0xac596e0] stream 1: pts 4294966639 -> -657
[nuv @ 0xac596e0] stream 1: pts 4294966671 -> -625
[nuv @ 0xac596e0] stream 1: pts 4294966703 -> -593
[nuv @ 0xac596e0] stream 1: pts 4294966735 -> -561
[nuv @ 0xac596e0] stream 1: pts 4294966767 -> -529
[nuv @ 0xac596e0] stream 1: pts 4294966799 -> -497
[nuv @ 0xac596e0] stream 1: pts 4294966831 -> -465
[nuv @ 0xac596e0] stream 1: pts 4294966863 -> -433
[nuv @ 0xac596e0] stream 1: pts 4294966895 -> -401
[nuv @ 0xac596e0] stream 1: pts 4294966927 -> -369
[nuv @ 0xac596e0] stream 1: pts 4294966959 -> -337
[nuv @ 0xac596e0] stream 1: pts 4294966991 -> -305
[nuv @ 0xac596e0] stream 1: pts 4294967023 -> -273
[nuv @ 0xac596e0] stream 1: pts 4294967055 -> -241
[nuv @ 0xac596e0] stream 1: pts 4294967087 -> -209
[nuv @ 0xac596e0] stream 1: pts 4294967119 -> -177
[nuv @ 0xac596e0] stream 1: pts 4294967151 -> -145
[nuv @ 0xac596e0] stream 1: pts 4294967183 -> -113
[nuv @ 0xac596e0] stream 1: pts 4294967215 -> -81
[nuv @ 0xac596e0] stream 1: pts 4294967247 -> -49
[nuv @ 0xac596e0] stream 1: pts 4294967279 -> -17
[nuv @ 0xac596e0] stream 1: pts 15 -> 15
[nuv @ 0xac596e0] stream 0: pts 20 -> 20
[nuv @ 0xac596e0] st->start_time stream 0, 20
[nuv @ 0xac596e0] Estimating duration from bitrate, this may be inaccurate
Input #0, nuv, from 'fate-suite/nuv/rtjpeg_frameheader.nuv':
  Duration: 00:00:33.61, start: -1.585000, bitrate: 121 kb/s
    Stream #0:0: Video: nuv (RJPG / 0x47504A52), yuv420p, 512x288, SAR 1:1 DAR 16:9, 50 fps, 50 tbr, 1k tbn, 1k tbc
    Stream #0:1: Audio: mp3 (LAME / 0x454D414C), 48000 Hz, stereo, s16, 128 kb/s
Output #0, framecrc, to 'pipe:':
  Metadata:
    encoder         : Lavf54.36.100
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 512x288 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 50 tbn, 50 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (nuv -> rawvideo)
Press [q] to stop, [?] for help
[nuv @ 0xac596e0] stream 1: pts 47 -> 47
[nuv @ 0xac596e0] stream 0: pts 60 -> 60
[nuv @ 0xac596e0] stream 1: pts 79 -> 79
[nuv @ 0xac596e0] stream 0: pts 80 -> 80
[nuv @ 0xac596e0] stream 0: pts 100 -> 100
[nuv @ 0xac596e0] stream 1: pts 111 -> 111
[nuv @ 0xac596e0] stream 0: pts 120 -> 120
[nuv @ 0xac596e0] stream 0: pts 140 -> 140
[nuv @ 0xac596e0] stream 1: pts 143 -> 143
[nuv @ 0xac596e0] stream 0: pts 160 -> 160
[nuv @ 0xac596e0] stream 1: pts 175 -> 175
[nuv @ 0xac596e0] stream 0: pts 180 -> 180
[nuv @ 0xac596e0] stream 1: pts 207 -> 207
[nuv @ 0xac596e0] stream 0: pts 220 -> 220
[nuv @ 0xac596e0] stream 1: pts 239 -> 239
[nuv @ 0xac596e0] stream 0: pts 240 -> 240
[nuv @ 0xac596e0] stream 0: pts 260 -> 260
[nuv @ 0xac596e0] stream 1: pts 271 -> 271
[nuv @ 0xac596e0] stream 0: pts 280 -> 280
[nuv @ 0xac596e0] stream 0: pts 300 -> 300
[nuv @ 0xac596e0] stream 1: pts 303 -> 303
[nuv @ 0xac596e0] stream 0: pts 320 -> 320
[nuv @ 0xac596e0] stream 1: pts 335 -> 335
[nuv @ 0xac596e0] stream 0: pts 340 -> 340
[nuv @ 0xac596e0] stream 0: pts 360 -> 360
[nuv @ 0xac596e0] stream 1: pts 367 -> 367
[nuv @ 0xac596e0] stream 0: pts 380 -> 380
[nuv @ 0xac596e0] stream 1: pts 399 -> 399
[nuv @ 0xac596e0] stream 0: pts 400 -> 400
[nuv @ 0xac596e0] stream 0: pts 420 -> 420
[nuv @ 0xac596e0] stream 1: pts 431 -> 431
[nuv @ 0xac596e0] stream 0: pts 440 -> 440
[nuv @ 0xac596e0] stream 0: pts 460 -> 460
[nuv @ 0xac596e0] stream 1: pts 463 -> 463
[nuv @ 0xac596e0] stream 0: pts 480 -> 480
[nuv @ 0xac596e0] stream 1: pts 495 -> 495
[nuv @ 0xac596e0] stream 0: pts 500 -> 500
[nuv @ 0xac596e0] stream 0: pts 520 -> 520
[nuv @ 0xac596e0] stream 1: pts 527 -> 527
[nuv @ 0xac596e0] stream 0: pts 540 -> 540
[nuv @ 0xac596e0] stream 1: pts 559 -> 559
[nuv @ 0xac596e0] stream 0: pts 560 -> 560
[nuv @ 0xac596e0] stream 0: pts 580 -> 580
[nuv @ 0xac596e0] stream 1: pts 591 -> 591
[nuv @ 0xac596e0] stream 0: pts 600 -> 600
[nuv @ 0xac596e0] stream 0: pts 620 -> 620
[nuv @ 0xac596e0] stream 1: pts 623 -> 623
[nuv @ 0xac596e0] stream 0: pts 640 -> 640
[nuv @ 0xac596e0] stream 1: pts 655 -> 655
[nuv @ 0xac596e0] stream 0: pts 660 -> 660
[nuv @ 0xac596e0] stream 0: pts 680 -> 680
[nuv @ 0xac596e0] stream 1: pts 687 -> 687
[nuv @ 0xac596e0] stream 0: pts 700 -> 700
[nuv @ 0xac596e0] stream 1: pts 719 -> 719
[nuv @ 0xac596e0] stream 0: pts 720 -> 720
[nuv @ 0xac596e0] stream 0: pts 740 -> 740
[nuv @ 0xac596e0] stream 1: pts 751 -> 751
[nuv @ 0xac596e0] stream 0: pts 760 -> 760
[nuv @ 0xac596e0] stream 0: pts 780 -> 780
[nuv @ 0xac596e0] stream 1: pts 783 -> 783
[nuv @ 0xac596e0] stream 0: pts 800 -> 800
[nuv @ 0xac596e0] stream 1: pts 815 -> 815
[nuv @ 0xac596e0] stream 0: pts 820 -> 820
[nuv @ 0xac596e0] stream 0: pts 840 -> 840
[nuv @ 0xac596e0] stream 1: pts 847 -> 847
[nuv @ 0xac596e0] stream 0: pts 860 -> 860
[nuv @ 0xac596e0] stream 1: pts 879 -> 879
[nuv @ 0xac596e0] stream 0: pts 880 -> 880
[nuv @ 0xac596e0] stream 0: pts 900 -> 900
[nuv @ 0xac596e0] stream 1: pts 911 -> 911
[nuv @ 0xac596e0] stream 0: pts 920 -> 920
[nuv @ 0xac596e0] stream 0: pts 940 -> 940
[nuv @ 0xac596e0] stream 1: pts 943 -> 943
[nuv @ 0xac596e0] stream 0: pts 960 -> 960
[nuv @ 0xac596e0] stream 1: pts 975 -> 975
[nuv @ 0xac596e0] stream 0: pts 980 -> 980
[nuv @ 0xac596e0] stream 0: pts 1000 -> 1000
[nuv @ 0xac596e0] stream 1: pts 1007 -> 1007
[nuv @ 0xac596e0] stream 0: pts 1020 -> 1020
[nuv @ 0xac596e0] stream 1: pts 1039 -> 1039
[nuv @ 0xac596e0] stream 0: pts 1040 -> 1040
frame=   50 fps=0.0 q=0.0 Lsize=       3kB time=00:00:02.64 bitrate=   8.8kbits/s    
video:10800kB audio:0kB subtitle:0 global headers:0kB muxing overhead -99.973669%


More information about the ffmpeg-devel mailing list