vlc | branch: master | Steve Lhomme <[email protected]> | Mon Jul 22 13:25:39 2019 +0200| [9c5c6d212fc60e887579357f86d50537d512c2d3] | committer: Steve Lhomme
avcodec: va: get the output video format from the VA module Fill the proper i_width/i_height corresponding to the padded decoder surfaces. We don't need to pass the lavc pixel format anymore > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9c5c6d212fc60e887579357f86d50537d512c2d3 --- modules/codec/avcodec/d3d11va.c | 17 +++++++++-------- modules/codec/avcodec/directx_va.c | 1 - modules/codec/avcodec/dxva2.c | 17 +++++++++-------- modules/codec/avcodec/va.c | 11 ++++++----- modules/codec/avcodec/va.h | 8 ++++---- modules/codec/avcodec/vaapi.c | 6 +++--- modules/codec/avcodec/video.c | 6 +++--- modules/hw/vdpau/avcodec.c | 7 ++++--- 8 files changed, 38 insertions(+), 35 deletions(-) diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c index 1297068c82..87e427958e 100644 --- a/modules/codec/avcodec/d3d11va.c +++ b/modules/codec/avcodec/d3d11va.c @@ -61,8 +61,8 @@ struct d3d11va_pic_context #include "directx_va.h" -static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *, enum PixelFormat, - const es_format_t *, vlc_decoder_device *, vlc_video_context **); +static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *, + const es_format_t *, vlc_decoder_device *, video_format_t *, vlc_video_context **); vlc_module_begin() set_description(N_("Direct3D11 Video Acceleration")) @@ -250,15 +250,15 @@ static void Close(vlc_va_t *va) static const struct vlc_va_operations ops = { Get, Close, }; static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc, - enum PixelFormat pix_fmt, const es_format_t *fmt_in, vlc_decoder_device *dec_device, - vlc_video_context **vtcx_out) + video_format_t *fmt_out, vlc_video_context **vtcx_out) { int err = VLC_EGENERIC; ctx->hwaccel_context = NULL; - if (pix_fmt != AV_PIX_FMT_D3D11VA_VLD) + if ( fmt_out->i_chroma != VLC_CODEC_D3D11_OPAQUE && + fmt_out->i_chroma != VLC_CODEC_D3D11_OPAQUE_10B ) return VLC_EGENERIC; d3d11_decoder_device_t *d3d11_device = GetD3D11OpaqueDevice( dec_device ); @@ -320,17 +320,17 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *des goto error; } - video_format_t fmt_out; + video_format_t final_fmt = *fmt_out; static const directx_sys_t dx_sys = { DxGetInputList, DxSetupOutput }; sys->selected_decoder = directx_va_Setup(va, &dx_sys, ctx, desc, fmt_in, isXboxHardware(sys->d3d_dev.d3ddevice), - &fmt_out, &sys->hw.surface_count); + &final_fmt, &sys->hw.surface_count); if (sys->selected_decoder == NULL) { err = VLC_EGENERIC; goto error; } - err = va_pool_SetupDecoder(va, sys->va_pool, ctx, &fmt_out, sys->hw.surface_count); + err = va_pool_SetupDecoder(va, sys->va_pool, ctx, &final_fmt, sys->hw.surface_count); if (err != VLC_SUCCESS) goto error; @@ -351,6 +351,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *des ID3D11DeviceContext_Release(priv->device); va->ops = &ops; + *fmt_out = final_fmt; *vtcx_out = sys->vctx; return VLC_SUCCESS; diff --git a/modules/codec/avcodec/directx_va.c b/modules/codec/avcodec/directx_va.c index 61ad7f7986..d7a1e7edea 100644 --- a/modules/codec/avcodec/directx_va.c +++ b/modules/codec/avcodec/directx_va.c @@ -335,7 +335,6 @@ const directx_va_mode_t *directx_va_Setup(vlc_va_t *va, const directx_sys_t *dx_ surface_width, surface_height, avctx->coded_width, avctx->coded_height); - *fmt_out = fmt->video; fmt_out->i_width = surface_width; fmt_out->i_height = surface_height; diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index 4a802ef13e..15ec799063 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -48,8 +48,8 @@ struct dxva2_pic_context #include "directx_va.h" -static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *, enum PixelFormat, - const es_format_t *, vlc_decoder_device *, vlc_video_context **); +static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *, + const es_format_t *, vlc_decoder_device *, video_format_t *, vlc_video_context **); vlc_module_begin() set_description(N_("DirectX Video Acceleration (DXVA) 2.0")) @@ -248,13 +248,13 @@ static void Close(vlc_va_t *va) static const struct vlc_va_operations ops = { Get, Close, }; static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc, - enum PixelFormat pix_fmt, const es_format_t *fmt_in, vlc_decoder_device *dec_device, - vlc_video_context **vtcx_out) + video_format_t *fmt_out, vlc_video_context **vtcx_out) { int err = VLC_EGENERIC; - if (pix_fmt != AV_PIX_FMT_DXVA2_VLD) + if ( fmt_out->i_chroma != VLC_CODEC_D3D9_OPAQUE && + fmt_out->i_chroma != VLC_CODEC_D3D9_OPAQUE_10B ) return VLC_EGENERIC; d3d9_decoder_device_t *d3d9_decoder = GetD3D9OpaqueDevice( dec_device ); @@ -317,17 +317,17 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *des goto error; } - video_format_t fmt_out; + video_format_t final_fmt = *fmt_out; static const directx_sys_t dx_sys = { DxGetInputList, DxSetupOutput }; sys->selected_decoder = directx_va_Setup(va, &dx_sys, ctx, desc, fmt_in, 0, - &fmt_out, &sys->hw.surface_count); + &final_fmt, &sys->hw.surface_count); if (sys->selected_decoder == NULL) { err = VLC_EGENERIC; goto error; } - err = va_pool_SetupDecoder(va, sys->va_pool, ctx, &fmt_out, sys->hw.surface_count); + err = va_pool_SetupDecoder(va, sys->va_pool, ctx, &final_fmt, sys->hw.surface_count); if (err != VLC_SUCCESS) goto error; @@ -342,6 +342,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *des octx->format = sys->render; va->ops = &ops; + *fmt_out = final_fmt; *vtcx_out = sys->vctx; return VLC_SUCCESS; diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c index e500544fe0..fc3ef3fe8a 100644 --- a/modules/codec/avcodec/va.c +++ b/modules/codec/avcodec/va.c @@ -100,20 +100,20 @@ static int vlc_va_Start(void *func, bool forced, va_list ap) vlc_va_t *va = va_arg(ap, vlc_va_t *); AVCodecContext *ctx = va_arg(ap, AVCodecContext *); const AVPixFmtDescriptor *src_desc = va_arg(ap, const AVPixFmtDescriptor *); - enum PixelFormat pix_fmt = va_arg(ap, enum PixelFormat); const es_format_t *fmt_in = va_arg(ap, const es_format_t *); vlc_decoder_device *device = va_arg(ap, vlc_decoder_device *); + video_format_t *fmt_out = va_arg(ap, video_format_t *); vlc_video_context **vtcx_out = va_arg(ap, vlc_video_context **); vlc_va_open open = func; (void) forced; - return open(va, ctx, src_desc, pix_fmt, fmt_in, device, vtcx_out); + return open(va, ctx, src_desc, fmt_in, device, fmt_out, vtcx_out); } vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx, const AVPixFmtDescriptor *src_desc, - enum PixelFormat pix_fmt, const es_format_t *fmt, - vlc_decoder_device *device, vlc_video_context **vtcx_out) + const es_format_t *fmt_in, vlc_decoder_device *device, + video_format_t *fmt_out, vlc_video_context **vtcx_out) { struct vlc_va_t *va = vlc_object_create(obj, sizeof (*va)); if (unlikely(va == NULL)) @@ -121,7 +121,8 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj, if (vlc_module_load(va, "hw decoder", NULL, true, - vlc_va_Start, va, avctx, src_desc, pix_fmt, fmt, device, vtcx_out) == NULL) + vlc_va_Start, va, avctx, src_desc, fmt_in, device, + fmt_out, vtcx_out) == NULL) { vlc_object_delete(va); va = NULL; diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h index b10cab7e0b..95d1303f68 100644 --- a/modules/codec/avcodec/va.h +++ b/modules/codec/avcodec/va.h @@ -44,8 +44,8 @@ struct vlc_va_t { }; typedef int (*vlc_va_open)(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *, - enum PixelFormat, - const es_format_t *, vlc_decoder_device *, vlc_video_context **); + const es_format_t *, vlc_decoder_device *, + video_format_t *, vlc_video_context **); #define set_va_callback(activate, priority) \ { \ @@ -71,8 +71,8 @@ vlc_fourcc_t vlc_va_GetChroma(enum PixelFormat hwfmt, enum PixelFormat swfmt); * @return a new VLC object on success, NULL on error. */ vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *, const AVPixFmtDescriptor *, - enum PixelFormat, const es_format_t *fmt, - vlc_decoder_device *device, vlc_video_context **vtcx_out); + const es_format_t *fmt, vlc_decoder_device *device, + video_format_t *, vlc_video_context **vtcx_out); /** * Get a hardware video surface for a libavcodec frame. diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c index f058884ba6..daec9b4b4e 100644 --- a/modules/codec/avcodec/vaapi.c +++ b/modules/codec/avcodec/vaapi.c @@ -236,12 +236,12 @@ static void VAAPISetupAVCodecContext(void *opaque, AVCodecContext *avctx) } static int Create(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc, - enum PixelFormat pix_fmt, const es_format_t *fmt_in, vlc_decoder_device *dec_device, - vlc_video_context **vtcx_out) + video_format_t *fmt_out, vlc_video_context **vtcx_out) { VLC_UNUSED(desc); - if (pix_fmt != AV_PIX_FMT_VAAPI_VLD || dec_device == NULL || + if ( (fmt_out->i_chroma != VLC_CODEC_VAAPI_420 && + fmt_out->i_chroma != VLC_CODEC_VAAPI_420_10BPP) || dec_device == NULL || dec_device->type != VLC_DECODER_DEVICE_VAAPI) return VLC_EGENERIC; diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c index 84bd9df84b..22a5ccec65 100644 --- a/modules/codec/avcodec/video.c +++ b/modules/codec/avcodec/video.c @@ -1753,9 +1753,9 @@ no_reuse: vlc_mutex_unlock(&p_sys->lock); vlc_video_context *vctx_out; - vlc_va_t *va = vlc_va_New(VLC_OBJECT(p_dec), p_context, src_desc, hwfmt, - &p_dec->fmt_in, - init_device, &vctx_out); + vlc_va_t *va = vlc_va_New(VLC_OBJECT(p_dec), p_context, src_desc, + &p_dec->fmt_in, init_device, + &p_dec->fmt_out.video, &vctx_out); if (init_device) vlc_decoder_device_Release(init_device); vlc_mutex_lock(&p_sys->lock); diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c index dd4c754e3d..a4f1cf96d3 100644 --- a/modules/hw/vdpau/avcodec.c +++ b/modules/hw/vdpau/avcodec.c @@ -157,11 +157,12 @@ const struct vlc_video_context_operations vdpau_vctx_ops = { }; static int Open(vlc_va_t *va, AVCodecContext *avctx, const AVPixFmtDescriptor *desc, - enum PixelFormat pix_fmt, const es_format_t *fmt_in, vlc_decoder_device *dec_device, - vlc_video_context **vtcx_out) + video_format_t *fmt_out, vlc_video_context **vtcx_out) { - if (pix_fmt != AV_PIX_FMT_VDPAU|| dec_device == NULL || + if ( ( fmt_out->i_chroma != VLC_CODEC_VDPAU_VIDEO_420 && + fmt_out->i_chroma != VLC_CODEC_VDPAU_VIDEO_422 && + fmt_out->i_chroma != VLC_CODEC_VDPAU_VIDEO_444 ) || GetVDPAUOpaqueDevice(dec_device) == NULL) return VLC_EGENERIC; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
