static int vdpau_render_wrapper(AVCodecContext *s, AVFrame *f, const VdpPictureInfo *info, uint32_t count, const VdpBitstreamBuffer *buffers) { mp_image_t *mpi = f->opaque; sh_video_t *sh = s->opaque; struct vdpau_frame_data data; uint8_t *planes[4] = {(void *)&data}; data.render_state = mpi->priv; data.info = info; data.bitstream_buffers_used = count; data.bitstream_buffers = buffers; mpcodecs_draw_slice(sh, planes, NULL, sh->disp_w, sh->disp_h, 0, 0); return 0; }
static void draw_slice(struct AVCodecContext *s, const AVFrame *src, int offset[4], int y, int type, int height){ sh_video_t *sh = s->opaque; uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; int strides[MP_MAX_PLANES] = {src->linesize[0], src->linesize[1], src->linesize[2]}; if (height < 0) { int i; height = -height; y -= height; for (i = 0; i < MP_MAX_PLANES; i++) { strides[i] = -strides[i]; source[i] -= strides[i]; } } if (y < sh->disp_h) { height = FFMIN(height, sh->disp_h-y); mpcodecs_draw_slice (sh, source, strides, sh->disp_w, height, 0, y); } }
static void draw_slice(struct AVCodecContext *s, const AVFrame *src, int offset[4], int y, int type, int height){ mp_image_t *mpi = src->opaque; sh_video_t *sh = s->opaque; vd_ffmpeg_ctx *ctx = sh->context; uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; int strides[MP_MAX_PLANES] = {src->linesize[0], src->linesize[1], src->linesize[2]}; if (!src->data[0]) { mp_msg(MSGT_DECVIDEO, MSGL_FATAL, "BUG in FFmpeg, draw_slice called with NULL pointer!\n"); return; } if (mpi && ctx->use_hwaccel) { mp_msg(MSGT_DECVIDEO, MSGL_FATAL, "BUG in FFmpeg, draw_slice called for VDPAU!\n"); return; } #if CONFIG_VDPAU if (mpi && IMGFMT_IS_VDPAU(mpi->imgfmt)) { struct vdpau_render_state *render = mpi->priv; vdpau_render_wrapper(s, src, &render->info, render->bitstream_buffers_used, render->bitstream_buffers); return; } #endif if (height < 0) { int i; height = -height; y -= height; for (i = 0; i < MP_MAX_PLANES; i++) { strides[i] = -strides[i]; source[i] -= strides[i]; } } if (y < sh->disp_h) { height = FFMIN(height, sh->disp_h-y); mpcodecs_draw_slice (sh, source, strides, sh->disp_w, height, 0, y); } }