MyAVPacketList *first_pkt, *last_pkt;
int nb_packets;
int size;
+ int64_t duration;
int abort_request;
int serial;
SDL_mutex *mutex;
q->last_pkt = pkt1;
q->nb_packets++;
q->size += pkt1->pkt.size + sizeof(*pkt1);
+ q->duration += pkt1->pkt.duration;
/* XXX: should duplicate packet data in DV case */
SDL_CondSignal(q->cond);
return 0;
q->first_pkt = NULL;
q->nb_packets = 0;
q->size = 0;
+ q->duration = 0;
SDL_UnlockMutex(q->mutex);
}
q->last_pkt = NULL;
q->nb_packets--;
q->size -= pkt1->pkt.size + sizeof(*pkt1);
+ q->duration -= pkt1->pkt.duration;
*pkt = pkt1->pkt;
if (serial)
*serial = pkt1->serial;
SDL_UnlockMutex(f->mutex);
}
-/* jump back to the previous frame if available by resetting rindex_shown */
-static int frame_queue_prev(FrameQueue *f)
-{
- int ret = f->rindex_shown;
- f->rindex_shown = 0;
- return ret;
-}
-
/* return the number of undisplayed frames in the queue */
static int frame_queue_nb_remaining(FrameQueue *f)
{
SDL_Rect rect;
int i;
- vp = frame_queue_peek(&is->pictq);
+ vp = frame_queue_peek_last(&is->pictq);
if (vp->bmp) {
if (is->subtitle_st) {
if (frame_queue_nb_remaining(&is->subpq) > 0) {
}
if (is->video_st) {
- int redisplay = 0;
- if (is->force_refresh)
- redisplay = frame_queue_prev(&is->pictq);
retry:
if (frame_queue_nb_remaining(&is->pictq) == 0) {
// nothing to do, no picture to display in the queue
if (vp->serial != is->videoq.serial) {
frame_queue_next(&is->pictq);
- redisplay = 0;
goto retry;
}
- if (lastvp->serial != vp->serial && !redisplay)
+ if (lastvp->serial != vp->serial)
is->frame_timer = av_gettime_relative() / 1000000.0;
if (is->paused)
/* compute nominal last_duration */
last_duration = vp_duration(is, lastvp, vp);
- if (redisplay)
- delay = 0.0;
- else
- delay = compute_target_delay(last_duration, is);
+ delay = compute_target_delay(last_duration, is);
time= av_gettime_relative()/1000000.0;
- if (time < is->frame_timer + delay && !redisplay) {
+ if (time < is->frame_timer + delay) {
*remaining_time = FFMIN(is->frame_timer + delay - time, *remaining_time);
- return;
+ goto display;
}
is->frame_timer += delay;
is->frame_timer = time;
SDL_LockMutex(is->pictq.mutex);
- if (!redisplay && !isnan(vp->pts))
+ if (!isnan(vp->pts))
update_video_pts(is, vp->pts, vp->pos, vp->serial);
SDL_UnlockMutex(is->pictq.mutex);
if (frame_queue_nb_remaining(&is->pictq) > 1) {
Frame *nextvp = frame_queue_peek_next(&is->pictq);
duration = vp_duration(is, vp, nextvp);
- if(!is->step && (redisplay || framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
- if (!redisplay)
- is->frame_drops_late++;
+ if(!is->step && (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
+ is->frame_drops_late++;
frame_queue_next(&is->pictq);
- redisplay = 0;
goto retry;
}
}
}
}
-display:
- /* display picture */
- if (!display_disable && is->show_mode == SHOW_MODE_VIDEO)
- video_display(is);
-
frame_queue_next(&is->pictq);
+ is->force_refresh = 1;
if (is->step && !is->paused)
stream_toggle_pause(is);
}
+display:
+ /* display picture */
+ if (!display_disable && is->force_refresh && is->show_mode == SHOW_MODE_VIDEO && is->pictq.rindex_shown)
+ video_display(is);
}
is->force_refresh = 0;
if (show_status) {
/* init averaging filter */
is->audio_diff_avg_coef = exp(log(0.01) / AUDIO_DIFF_AVG_NB);
is->audio_diff_avg_count = 0;
- /* since we do not have a precise anough audio fifo fullness,
+ /* since we do not have a precise anough audio FIFO fullness,
we correct audio sync only if larger than this threshold */
is->audio_diff_threshold = (double)(is->audio_hw_buf_size) / is->audio_tgt.bytes_per_sec;
return is->abort_request;
}
+static int stream_has_enough_packets(AVStream *st, int stream_id, PacketQueue *queue) {
+ return stream_id < 0 ||
+ queue->abort_request ||
+ (st->disposition & AV_DISPOSITION_ATTACHED_PIC) ||
+ queue->nb_packets > MIN_FRAMES && (!queue->duration || av_q2d(st->time_base) * queue->duration > 1.0);
+}
+
static int is_realtime(AVFormatContext *s)
{
if( !strcmp(s->iformat->name, "rtp")
/* if the queue are full, no need to read more */
if (infinite_buffer<1 &&
(is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE
- || ( (is->audioq .nb_packets > MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
- && (is->videoq .nb_packets > MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request
- || (is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC))
- && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0 || is->subtitleq.abort_request)))) {
+ || (stream_has_enough_packets(is->audio_st, is->audio_stream, &is->audioq) &&
+ stream_has_enough_packets(is->video_st, is->video_stream, &is->videoq) &&
+ stream_has_enough_packets(is->subtitle_st, is->subtitle_stream, &is->subtitleq)))) {
/* wait 10 ms */
SDL_LockMutex(wait_mutex);
SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);