[vlc-devel] [PATCH] avcodec: pass a dummy picture_sys_t to the va decoder Open()
Steve Lhomme
robux4 at videolabs.io
Mon Apr 27 14:00:05 CEST 2015
On Mon, Apr 27, 2015 at 1:41 PM, Rémi Denis-Courmont <remi at remlab.net> wrote:
> Le 2015-04-27 14:22, Steve Lhomme a écrit :
>>
>> may share some resources between the decoder pool pictures and the va.
>> ---
>> modules/codec/avcodec/dxva2.c | 4 ++--
>> modules/codec/avcodec/va.c | 10 ++++++----
>> modules/codec/avcodec/va.h | 3 ++-
>> modules/codec/avcodec/vaapi.c | 2 +-
>> modules/codec/avcodec/vda.c | 4 ++--
>> modules/codec/avcodec/video.c | 7 ++++++-
>> modules/hw/vdpau/avcodec.c | 2 +-
>> 7 files changed, 20 insertions(+), 12 deletions(-)
>>
>> diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
>> index 05dff18..8c78132 100644
>> --- a/modules/codec/avcodec/dxva2.c
>> +++ b/modules/codec/avcodec/dxva2.c
>> @@ -53,7 +53,7 @@
>> #include "../../video_chroma/copy.h"
>>
>> static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat,
>> - const es_format_t *);
>> + const es_format_t *, const picture_sys_t *p_sys);
>> static void Close(vlc_va_t *, AVCodecContext *);
>>
>> vlc_module_begin()
>> @@ -546,7 +546,7 @@ static void Close(vlc_va_t *va, AVCodecContext *ctx)
>> }
>>
>> static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat
>> pix_fmt,
>> - const es_format_t *fmt)
>> + const es_format_t *fmt, const picture_sys_t *p_sys)
>> {
>> if (pix_fmt != AV_PIX_FMT_DXVA2_VLD)
>> return VLC_EGENERIC;
>> diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c
>> index 2da49ce..328d79f 100644
>> --- a/modules/codec/avcodec/va.c
>> +++ b/modules/codec/avcodec/va.c
>> @@ -75,10 +75,11 @@ static int vlc_va_Start(void *func, va_list ap)
>> AVCodecContext *ctx = va_arg(ap, AVCodecContext *);
>> enum PixelFormat pix_fmt = va_arg(ap, enum PixelFormat);
>> const es_format_t *fmt = va_arg(ap, const es_format_t *);
>> + const picture_sys_t *p_sys = va_arg(ap, const picture_sys_t *);
>> int (*open)(vlc_va_t *, AVCodecContext *, enum PixelFormat,
>> - const es_format_t *) = func;
>> + const es_format_t *, const picture_sys_t *) = func;
>>
>> - return open(va, ctx, pix_fmt, fmt);
>> + return open(va, ctx, pix_fmt, fmt, p_sys);
>> }
>>
>> static void vlc_va_Stop(void *func, va_list ap)
>> @@ -91,14 +92,15 @@ static void vlc_va_Stop(void *func, va_list ap)
>> }
>>
>> vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *avctx,
>> - enum PixelFormat pix_fmt, const es_format_t *fmt)
>> + enum PixelFormat pix_fmt, const es_format_t *fmt,
>> + const picture_sys_t *p_sys)
>> {
>> vlc_va_t *va = vlc_object_create(obj, sizeof (*va));
>> if (unlikely(va == NULL))
>> return NULL;
>>
>> va->module = vlc_module_load(va, "hw decoder", "$avcodec-hw", true,
>> - vlc_va_Start, va, avctx, pix_fmt, fmt);
>> + vlc_va_Start, va, avctx, pix_fmt,
>> fmt, p_sys);
>> if (va->module == NULL)
>> {
>> vlc_object_release(va);
>> diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h
>> index fe5b947..ae385eb 100644
>> --- a/modules/codec/avcodec/va.h
>> +++ b/modules/codec/avcodec/va.h
>> @@ -58,7 +58,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 *,
>> - enum PixelFormat, const es_format_t *fmt);
>> + enum PixelFormat, const es_format_t *fmt,
>> + const picture_sys_t *p_sys);
>
>
> const does not seem like a good idea here. What if a mutex or a reference
> counter is stored?
Indeed.
>> /**
>> * Initializes the acceleration video decoding back-end for libavcodec.
>> diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
>> index abc452f..63182ce 100644
>> --- a/modules/codec/avcodec/vaapi.c
>> +++ b/modules/codec/avcodec/vaapi.c
>> @@ -291,7 +291,7 @@ static int FindFormat(vlc_va_sys_t *sys)
>> }
>>
>> static int Create( vlc_va_t *va, AVCodecContext *ctx, enum
>> PixelFormat pix_fmt,
>> - const es_format_t *fmt )
>> + const es_format_t *fmt, const picture_sys_t *p_sys )
>
>
> Missing void cast. Ditto below.
You mean replace picture_sys_t by void ? Even though we know it's some
kind of picture_sys_t (that's tied to that particular pixel format).
>> {
>> if( pix_fmt != AV_PIX_FMT_VAAPI_VLD )
>> return VLC_EGENERIC;
>> diff --git a/modules/codec/avcodec/vda.c b/modules/codec/avcodec/vda.c
>> index 58173c7..0161ebf 100644
>> --- a/modules/codec/avcodec/vda.c
>> +++ b/modules/codec/avcodec/vda.c
>> @@ -45,7 +45,7 @@
>> #pragma mark prototypes and definitions
>>
>> static int Open( vlc_va_t *, AVCodecContext *, enum PixelFormat,
>> - const es_format_t * );
>> + const es_format_t *, const picture_sys_t * );
>> static void Close( vlc_va_t * , AVCodecContext *);
>> static int Setup( vlc_va_t *, AVCodecContext *, vlc_fourcc_t *);
>> static int Get( vlc_va_t *, picture_t *, uint8_t ** );
>> @@ -117,7 +117,7 @@ static vlc_va_vda_t *vlc_va_vda_Get( vlc_va_t *va )
>> #pragma mark - module handling
>>
>> static int Open( vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat
>> pix_fmt,
>> - const es_format_t *fmt )
>> + const es_format_t *fmt, const picture_sys_t *p_sys )
>> {
>> if( pix_fmt != AV_PIX_FMT_VDA_VLD )
>> return VLC_EGENERIC;
>> diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
>> index 75f1132..29af2ee 100644
>> --- a/modules/codec/avcodec/video.c
>> +++ b/modules/codec/avcodec/video.c
>> @@ -1132,8 +1132,13 @@ static enum PixelFormat ffmpeg_GetFormat(
>> AVCodecContext *p_context,
>> if (lavc_UpdateVideoFormat(p_dec, p_context, true))
>> continue; /* Unsupported brand of hardware acceleration */
>>
>> + picture_t *test_pic = decoder_NewPicture(p_dec);
>> + assert(!test_pic || test_pic->format.i_chroma ==
>> p_dec->fmt_out.video.i_chroma);
>> vlc_va_t *va = vlc_va_New(VLC_OBJECT(p_dec), p_context, hwfmt,
>> - &p_dec->fmt_in);
>> + &p_dec->fmt_in,
>> + test_pic ? test_pic->p_sys : NULL);
>> + if (test_pic)
>> + picture_Release(test_pic);
>> if (va == NULL)
>> continue; /* Unsupported codec profile or such */
>>
>> diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
>> index 910d742..c25c45a 100644
>> --- a/modules/hw/vdpau/avcodec.c
>> +++ b/modules/hw/vdpau/avcodec.c
>> @@ -172,7 +172,7 @@ static int Setup(vlc_va_t *va, AVCodecContext
>> *avctx, vlc_fourcc_t *chromap)
>> }
>>
>> static int Open(vlc_va_t *va, AVCodecContext *avctx, enum
>> PixelFormat pix_fmt,
>> - const es_format_t *fmt)
>> + const es_format_t *fmt, const picture_sys_t *p_sys)
>> {
>> if (pix_fmt != AV_PIX_FMT_VDPAU)
>> return VLC_EGENERIC;
>
>
> --
> Rémi Denis-Courmont
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list