static void emit_frame(video_decoder_t *vd, vdec_pic_t *vp) { vd->vd_estimated_duration = vp->fi.fi_duration; // For bitrate calculations if(vp->fi.fi_pts == AV_NOPTS_VALUE && vd->vd_nextpts != AV_NOPTS_VALUE) vp->fi.fi_pts = vd->vd_nextpts; if(vp->fi.fi_pts != AV_NOPTS_VALUE) vd->vd_nextpts = vp->fi.fi_pts + vp->fi.fi_duration; #if VDEC_DETAILED_DEBUG static int64_t lastpts; TRACE(TRACE_DEBUG, "VDEC DPY", "Displaying 0x%llx (%lld) d:%lld dur=%d %d x %d", vp->order, vp->fi.fi_pts, vp->fi.fi_pts - lastpts, vp->fi.fi_duration, vp->fi.fi_width, vp->fi.fi_height); lastpts = vp->fi.fi_pts; #endif vp->fi.fi_type = 'RSX'; if(video_deliver_frame(vd, &vp->fi) == -1) // Frame not accepted, free it rsx_free(vp->vp_offset[0], vp->vp_size); #if VDEC_DETAILED_DEBUG TRACE(TRACE_DEBUG, "VDEC DPY", "Frame delivered"); #endif }
/** * yuv420 only */ static void release_picture(vdec_pic_t *vp) { rsx_free(vp->vp_offset, vp->vp_size); LIST_REMOVE(vp, link); free(vp); }
/** * gv_surface_mutex must be held */ static void surface_reset(glw_video_t *gv, glw_video_surface_t *gvs) { glw_root_t *gr = gv->w.glw_root; int i; for(i = 0; i < 3; i++) { if(gvs->gvs_offset[i]) { rsx_free(gr, gvs->gvs_offset[i], gvs->gvs_size[i]); gvs->gvs_offset[i] = 0; } } }
/** * gv_surface_mutex must be held */ static void surface_reset(glw_video_t *gv, glw_video_surface_t *gvs) { int i; for(i = 0; i < GLW_VIDEO_MAX_SURFACES; i++) if(gv->gv_surfaces[i].gvs_offset == gvs->gvs_offset && gvs != &gv->gv_surfaces[i]) return; // Memory is shared if(gvs->gvs_offset) { rsx_free(gvs->gvs_offset, gvs->gvs_size); gvs->gvs_offset = 0; gvs->gvs_size = 0; } }