mirror of https://github.com/mpv-player/mpv
video: make previously added hwdec params mechanism more generic
The mechanism introduced in b135af6842
assumed AVHWFramesContext would
be enough. Apparently it's not - the intended use with Rockchip (not
Rokchip btw.) requires accessing actual frame data in order to access
the AVDRMFrameDescriptor struct.
Just pass the entire mp_image to the new function. This is more
flexible, although it slightly worries me that it will be less reusable
for things which require setting up mp_image_params before any real
frames are processed (such as filters).
This commit is contained in:
parent
0a7c5a130e
commit
1ff6a1c8c7
|
@ -138,12 +138,13 @@ AVBufferRef *d3d11_wrap_device_ref(ID3D11Device *device)
|
|||
return device_ref;
|
||||
}
|
||||
|
||||
static void d3d11_complete_image_params(struct AVHWFramesContext *hw_frames,
|
||||
struct mp_image_params *p)
|
||||
static void d3d11_complete_image_params(struct mp_image *img)
|
||||
{
|
||||
AVHWFramesContext *hw_frames = (void *)img->hwctx->data;
|
||||
|
||||
// According to hwcontex_d3d11va.h, this means DXGI_FORMAT_420_OPAQUE.
|
||||
p->hw_flags = hw_frames->sw_format == AV_PIX_FMT_YUV420P
|
||||
? MP_IMAGE_HW_FLAG_OPAQUE : 0;
|
||||
img->params.hw_flags = hw_frames->sw_format == AV_PIX_FMT_YUV420P
|
||||
? MP_IMAGE_HW_FLAG_OPAQUE : 0;
|
||||
}
|
||||
|
||||
const struct hwcontext_fns hwcontext_fns_d3d11 = {
|
||||
|
|
|
@ -121,11 +121,12 @@ struct mp_image_params;
|
|||
// For now, all entries are strictly optional.
|
||||
struct hwcontext_fns {
|
||||
int av_hwdevice_type;
|
||||
// Set any mp_image_params fields that can not be set in generic code.
|
||||
// (Generic code sets width, height, hw_subfmt, etc., but some very specific
|
||||
// flags or such might require specific code for some hwcontexts.)
|
||||
void (*complete_image_params)(struct AVHWFramesContext *hw_frames,
|
||||
struct mp_image_params *p);
|
||||
// Set any mp_image fields that require hwcontext specific code, such as
|
||||
// fields or flags not present in AVFrame or AVHWFramesContext in a
|
||||
// portable way. This is called directly after img is converted from an
|
||||
// AVFrame, with all other fields already set. img.hwctx will be set, and
|
||||
// use the correct AV_HWDEVICE_TYPE_.
|
||||
void (*complete_image_params)(struct mp_image *img);
|
||||
};
|
||||
|
||||
// The parameter is of type enum AVHWDeviceType (as in int to avoid extensive
|
||||
|
|
|
@ -855,15 +855,6 @@ struct mp_image *mp_image_from_av_frame(struct AVFrame *src)
|
|||
if (src->repeat_pict == 1)
|
||||
dst->fields |= MP_IMGFIELD_REPEAT_FIRST;
|
||||
|
||||
if (src->hw_frames_ctx) {
|
||||
AVHWFramesContext *fctx = (void *)src->hw_frames_ctx->data;
|
||||
dst->params.hw_subfmt = pixfmt2imgfmt(fctx->sw_format);
|
||||
const struct hwcontext_fns *fns =
|
||||
hwdec_get_hwcontext_fns(fctx->device_ctx->type);
|
||||
if (fns && fns->complete_image_params)
|
||||
fns->complete_image_params(fctx, &dst->params);
|
||||
}
|
||||
|
||||
dst->params.color = (struct mp_colorspace){
|
||||
.space = avcol_spc_to_mp_csp(src->colorspace),
|
||||
.levels = avcol_range_to_mp_csp_levels(src->color_range),
|
||||
|
@ -888,6 +879,15 @@ struct mp_image *mp_image_from_av_frame(struct AVFrame *src)
|
|||
dst->icc_profile = av_buffer_ref(sd->buf);
|
||||
#endif
|
||||
|
||||
if (dst->hwctx) {
|
||||
AVHWFramesContext *fctx = (void *)dst->hwctx->data;
|
||||
dst->params.hw_subfmt = pixfmt2imgfmt(fctx->sw_format);
|
||||
const struct hwcontext_fns *fns =
|
||||
hwdec_get_hwcontext_fns(fctx->device_ctx->type);
|
||||
if (fns && fns->complete_image_params)
|
||||
fns->complete_image_params(dst);
|
||||
}
|
||||
|
||||
return mp_image_new_ref(dst);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue