Browse code

ffplay: ensure that we buffer at least 1 second of content

In order to do that, we keep track of the total duration of packets in a packet
queue.

Signed-off-by: Marton Balint <cus@passwd.hu>

Marton Balint authored on 2016/06/11 19:11:11
Showing 1 changed files
... ...
@@ -117,6 +117,7 @@ typedef struct PacketQueue {
117 117
     MyAVPacketList *first_pkt, *last_pkt;
118 118
     int nb_packets;
119 119
     int size;
120
+    int64_t duration;
120 121
     int abort_request;
121 122
     int serial;
122 123
     SDL_mutex *mutex;
... ...
@@ -417,6 +418,7 @@ static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
417 417
     q->last_pkt = pkt1;
418 418
     q->nb_packets++;
419 419
     q->size += pkt1->pkt.size + sizeof(*pkt1);
420
+    q->duration += pkt1->pkt.duration;
420 421
     /* XXX: should duplicate packet data in DV case */
421 422
     SDL_CondSignal(q->cond);
422 423
     return 0;
... ...
@@ -478,6 +480,7 @@ static void packet_queue_flush(PacketQueue *q)
478 478
     q->first_pkt = NULL;
479 479
     q->nb_packets = 0;
480 480
     q->size = 0;
481
+    q->duration = 0;
481 482
     SDL_UnlockMutex(q->mutex);
482 483
 }
483 484
 
... ...
@@ -528,6 +531,7 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *seria
528 528
                 q->last_pkt = NULL;
529 529
             q->nb_packets--;
530 530
             q->size -= pkt1->pkt.size + sizeof(*pkt1);
531
+            q->duration -= pkt1->pkt.duration;
531 532
             *pkt = pkt1->pkt;
532 533
             if (serial)
533 534
                 *serial = pkt1->serial;
... ...
@@ -2800,7 +2804,7 @@ static int stream_has_enough_packets(AVStream *st, int stream_id, PacketQueue *q
2800 2800
     return stream_id < 0 ||
2801 2801
            queue->abort_request ||
2802 2802
            (st->disposition & AV_DISPOSITION_ATTACHED_PIC) ||
2803
-           queue->nb_packets > MIN_FRAMES;
2803
+           queue->nb_packets > MIN_FRAMES && (!queue->duration || av_q2d(st->time_base) * queue->duration > 1.0);
2804 2804
 }
2805 2805
 
2806 2806
 static int is_realtime(AVFormatContext *s)