vlc | branch: master | Steve Lhomme <rob...@videolabs.io> | Mon Apr 27 14:26:35 2015 +0200| [810104cae0ad4e33f547a8a015defa9a13cc974e] | committer: Jean-Baptiste Kempf
avcodec: pass a dummy picture_sys_t to the va decoder Open() may share some resources between the decoder pool pictures and the va. Signed-off-by: RĂ©mi Denis-Courmont <r...@remlab.net> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=810104cae0ad4e33f547a8a015defa9a13cc974e --- modules/codec/avcodec/dxva2.c | 6 ++++-- modules/codec/avcodec/va.c | 10 ++++++---- modules/codec/avcodec/va.h | 3 ++- modules/codec/avcodec/vaapi.c | 3 ++- modules/codec/avcodec/vda.c | 8 +++++--- modules/codec/avcodec/video.c | 7 ++++++- modules/hw/vdpau/avcodec.c | 3 ++- 7 files changed, 27 insertions(+), 13 deletions(-) diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index cbdda7f..81c2a9c 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -54,7 +54,7 @@ #include "../h264_nal.h" static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat, - const es_format_t *); + const es_format_t *, picture_sys_t *p_sys); static void Close(vlc_va_t *, AVCodecContext *); vlc_module_begin() @@ -575,11 +575,13 @@ 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, picture_sys_t *p_sys) { if (pix_fmt != AV_PIX_FMT_DXVA2_VLD) return VLC_EGENERIC; + (void) p_sys; + vlc_va_sys_t *sys = calloc(1, sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c index 2da49ce..413574d 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 *); + picture_sys_t *p_sys = va_arg(ap, picture_sys_t *); int (*open)(vlc_va_t *, AVCodecContext *, enum PixelFormat, - const es_format_t *) = func; + const es_format_t *, 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, + 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..5c4b11d 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, + picture_sys_t *p_sys); /** * 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..4683648 100644 --- a/modules/codec/avcodec/vaapi.c +++ b/modules/codec/avcodec/vaapi.c @@ -291,12 +291,13 @@ 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, picture_sys_t *p_sys ) { if( pix_fmt != AV_PIX_FMT_VAAPI_VLD ) return VLC_EGENERIC; (void) fmt; + (void) p_sys; #ifdef VLC_VA_BACKEND_XLIB if( !vlc_xlib_init( VLC_OBJECT(va) ) ) { diff --git a/modules/codec/avcodec/vda.c b/modules/codec/avcodec/vda.c index 58173c7..6f8105d 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 *, 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,11 +117,13 @@ 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, picture_sys_t *p_sys ) { if( pix_fmt != AV_PIX_FMT_VDA_VLD ) return VLC_EGENERIC; + (void) p_sys; + msg_Dbg( va, "opening VDA module" ); if( ctx->codec_id != AV_CODEC_ID_H264 ) { @@ -312,7 +314,7 @@ vlc_module_begin () vlc_module_end () static int Open( vlc_va_t *va, AVCodecContext *avctx, - enum PixelFormat pix_fmt, const es_format_t *fmt ) + enum PixelFormat pix_fmt, const es_format_t *fmt, picture_sys_t *p_sys ) { if( pix_fmt != AV_PIX_FMT_VDA ) return VLC_EGENERIC; diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c index 89bdbcb..5c4e192 100644 --- a/modules/codec/avcodec/video.c +++ b/modules/codec/avcodec/video.c @@ -1134,8 +1134,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..6a3b67e 100644 --- a/modules/hw/vdpau/avcodec.c +++ b/modules/hw/vdpau/avcodec.c @@ -172,11 +172,12 @@ 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, picture_sys_t *p_sys) { if (pix_fmt != AV_PIX_FMT_VDPAU) return VLC_EGENERIC; + (void) p_sys; void *func; VdpStatus err; #if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56, 2, 0)) _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits