static void flip_page(struct vo *vo) { struct vo_priv *p = vo->priv; pthread_mutex_lock(&p->ctx->lock); while (p->ctx->queued_frames >= p->frame_queue_size) { switch (p->frame_drop_mode) { case FRAME_DROP_CLEAR: frame_queue_drop_all(p->ctx); break; case FRAME_DROP_POP: frame_queue_shrink(p->ctx, p->frame_queue_size - 1); break; case FRAME_DROP_BLOCK: ; struct timespec ts = mp_rel_time_to_timespec(0.2); if (p->ctx->frozen || pthread_cond_timedwait(&p->ctx->wakeup, &p->ctx->lock, &ts)) { frame_queue_drop_all(p->ctx); p->ctx->frozen = true; } break; } } frame_queue_push(p->ctx, p->ctx->waiting_frame); p->ctx->waiting_frame = NULL; update(p); pthread_mutex_unlock(&p->ctx->lock); }
static void flip_page(struct vo *vo) { struct vo_priv *p = vo->priv; pthread_mutex_lock(&p->ctx->lock); if (p->ctx->queued_frames >= p->frame_queue_size) { if (p->frame_drop_mode == FRAME_DROP_CLEAR) frame_queue_drop_all(p->ctx); else // FRAME_DROP_POP mode frame_queue_shrink(p->ctx, p->frame_queue_size - 1); } frame_queue_push(p->ctx, p->ctx->waiting_frame); p->ctx->waiting_frame = NULL; update(p); pthread_mutex_unlock(&p->ctx->lock); }