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>
... | ... |
@@ -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) |