static int64_t yuvp_newframe(glw_video_t *gv, video_decoder_t *vd, int flags) { glw_root_t *gr = gv->w.glw_root; glw_video_surface_t *sa, *sb, *s; media_pipe_t *mp = gv->gv_mp; int output_duration; int64_t pts = AV_NOPTS_VALUE; int frame_duration = gv->w.glw_root->gr_frameduration; int epoch = 0; gv_color_matrix_update(gv); output_duration = glw_video_compute_output_duration(vd, frame_duration); /* Find new surface to display */ sa = TAILQ_FIRST(&gv->gv_decoded_queue); if(sa == NULL) { /* No frame available */ sa = TAILQ_FIRST(&gv->gv_displaying_queue); if(sa != NULL) { /* Continue to display last frame */ gv->gv_sa = sa; gv->gv_sa = NULL; } else { gv->gv_sa = NULL; gv->gv_sa = NULL; } pts = AV_NOPTS_VALUE; } else { /* There are frames available that we are going to display, push back old frames to decoder */ while((s = TAILQ_FIRST(&gv->gv_displaying_queue)) != NULL) gv_surface_pixmap_release(gv, s, &gv->gv_cfg_cur, &gv->gv_displaying_queue); /* */ sb = TAILQ_NEXT(sa, gvs_link); pts = gv_compute_blend(gv, sa, sb, output_duration); epoch = sa->gvs_epoch; if(!vd->vd_hold || sb != NULL) { if(sa != NULL && sa->gvs_duration == 0) glw_video_enqueue_for_display(gv, sa, &gv->gv_decoded_queue); } if(sb != NULL && sb->gvs_duration == 0) glw_video_enqueue_for_display(gv, sb, &gv->gv_decoded_queue); } if(pts != AV_NOPTS_VALUE) { pts -= frame_duration * 2; glw_video_compute_avdiff(gr, vd, mp, pts, epoch); } return pts; }
static int64_t video_opengl_newframe(glw_video_t *gv, video_decoder_t *vd, int flags) { hts_mutex_assert(&gv->gv_surface_mutex); glw_video_surface_t *gvs; while((gvs = TAILQ_FIRST(&gv->gv_parked_queue)) != NULL) { TAILQ_REMOVE(&gv->gv_parked_queue, gvs, gvs_link); surface_init(gv, gvs); } glw_need_refresh(gv->w.glw_root, 0); gv_color_matrix_update(gv); return glw_video_newframe_blend(gv, vd, flags, &gv_surface_pixmap_release, 1); }
static int64_t yuvp_newframe(glw_video_t *gv, video_decoder_t *vd, int flags) { gv_color_matrix_update(gv); return glw_video_newframe_blend(gv, vd, flags, &gv_surface_pixmap_release, 1); }