enum AVPixelFormat imgfmt2pixfmt(int fmt) { int i; enum AVPixelFormat pix_fmt; if (IMGFMT_IS_VDPAU(fmt)) return AV_PIX_FMT_VDPAU; for (i = 0; conversion_map[i].fmt; i++) if (conversion_map[i].fmt == fmt) break; pix_fmt = conversion_map[i].pix_fmt; if (pix_fmt == PIX_FMT_NONE) mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported format %s\n", vo_format_name(fmt)); return pix_fmt; }
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); } }