mirror of https://git.ffmpeg.org/ffmpeg.git
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>
This commit is contained in:
parent
8594a8fbf9
commit
e32857f30e
6
ffplay.c
6
ffplay.c
|
@ -117,6 +117,7 @@ typedef struct PacketQueue {
|
||||||
MyAVPacketList *first_pkt, *last_pkt;
|
MyAVPacketList *first_pkt, *last_pkt;
|
||||||
int nb_packets;
|
int nb_packets;
|
||||||
int size;
|
int size;
|
||||||
|
int64_t duration;
|
||||||
int abort_request;
|
int abort_request;
|
||||||
int serial;
|
int serial;
|
||||||
SDL_mutex *mutex;
|
SDL_mutex *mutex;
|
||||||
|
@ -417,6 +418,7 @@ static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
|
||||||
q->last_pkt = pkt1;
|
q->last_pkt = pkt1;
|
||||||
q->nb_packets++;
|
q->nb_packets++;
|
||||||
q->size += pkt1->pkt.size + sizeof(*pkt1);
|
q->size += pkt1->pkt.size + sizeof(*pkt1);
|
||||||
|
q->duration += pkt1->pkt.duration;
|
||||||
/* XXX: should duplicate packet data in DV case */
|
/* XXX: should duplicate packet data in DV case */
|
||||||
SDL_CondSignal(q->cond);
|
SDL_CondSignal(q->cond);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -478,6 +480,7 @@ static void packet_queue_flush(PacketQueue *q)
|
||||||
q->first_pkt = NULL;
|
q->first_pkt = NULL;
|
||||||
q->nb_packets = 0;
|
q->nb_packets = 0;
|
||||||
q->size = 0;
|
q->size = 0;
|
||||||
|
q->duration = 0;
|
||||||
SDL_UnlockMutex(q->mutex);
|
SDL_UnlockMutex(q->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -528,6 +531,7 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *seria
|
||||||
q->last_pkt = NULL;
|
q->last_pkt = NULL;
|
||||||
q->nb_packets--;
|
q->nb_packets--;
|
||||||
q->size -= pkt1->pkt.size + sizeof(*pkt1);
|
q->size -= pkt1->pkt.size + sizeof(*pkt1);
|
||||||
|
q->duration -= pkt1->pkt.duration;
|
||||||
*pkt = pkt1->pkt;
|
*pkt = pkt1->pkt;
|
||||||
if (serial)
|
if (serial)
|
||||||
*serial = pkt1->serial;
|
*serial = pkt1->serial;
|
||||||
|
@ -2800,7 +2804,7 @@ static int stream_has_enough_packets(AVStream *st, int stream_id, PacketQueue *q
|
||||||
return stream_id < 0 ||
|
return stream_id < 0 ||
|
||||||
queue->abort_request ||
|
queue->abort_request ||
|
||||||
(st->disposition & AV_DISPOSITION_ATTACHED_PIC) ||
|
(st->disposition & AV_DISPOSITION_ATTACHED_PIC) ||
|
||||||
queue->nb_packets > MIN_FRAMES;
|
queue->nb_packets > MIN_FRAMES && (!queue->duration || av_q2d(st->time_base) * queue->duration > 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_realtime(AVFormatContext *s)
|
static int is_realtime(AVFormatContext *s)
|
||||||
|
|
Loading…
Reference in New Issue