vlc | branch: master | Steve Lhomme <[email protected]> | Mon Jun 17 16:06:48 2019 +0200| [2e4cd8756db3b396ddedbd7d622ebd67122a34e0] | committer: Steve Lhomme
avcodec: va: allow the VA to provide pictures directly Instead of filling the picture context during get(). We can't just allocate the picture in the generic VA code and fill the picture->context and picsys data as we need to handle the destructor for each picture and release the resources when the picture is last released. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2e4cd8756db3b396ddedbd7d622ebd67122a34e0 --- modules/codec/avcodec/d3d11va.c | 2 +- modules/codec/avcodec/dxva2.c | 2 +- modules/codec/avcodec/va.h | 11 +++++++++++ modules/codec/avcodec/vaapi.c | 2 +- modules/codec/avcodec/video.c | 5 ++++- modules/hw/vdpau/avcodec.c | 2 +- 6 files changed, 19 insertions(+), 5 deletions(-) diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c index c0e419e9b5..265408dce1 100644 --- a/modules/codec/avcodec/d3d11va.c +++ b/modules/codec/avcodec/d3d11va.c @@ -251,7 +251,7 @@ static void Close(vlc_va_t *va) vlc_video_context_Release(sys->vctx); } -static const struct vlc_va_operations ops = { Get, Close, }; +static const struct vlc_va_operations ops = { Get, NULL, Close, }; static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc, enum PixelFormat pix_fmt, diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index 6b632b28a9..d50b887cf5 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -244,7 +244,7 @@ static void Close(vlc_va_t *va) vlc_video_context_Release(sys->vctx); } -static const struct vlc_va_operations ops = { Get, Close, }; +static const struct vlc_va_operations ops = { Get, NULL, Close, }; static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc, enum PixelFormat pix_fmt, diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h index b10cab7e0b..d139d608b8 100644 --- a/modules/codec/avcodec/va.h +++ b/modules/codec/avcodec/va.h @@ -33,6 +33,7 @@ typedef struct vlc_video_context vlc_video_context; struct vlc_va_operations { int (*get)(vlc_va_t *, picture_t *pic, uint8_t **surface); + picture_t *(*get_picture)(vlc_va_t *, const video_format_t *); void (*close)(vlc_va_t *); }; @@ -97,6 +98,16 @@ static inline int vlc_va_Get(vlc_va_t *va, picture_t *pic, uint8_t **surface) return va->ops->get(va, pic, surface); } +/** + * Can be called from any thread + */ +static inline picture_t *vlc_va_GetPicture(vlc_va_t *va, const video_format_t *fmt) +{ + if (va->ops->get_picture) + return va->ops->get_picture(va, fmt); + return NULL; +} + /** * Destroys a libavcodec hardware acceleration back-end. * All allocated surfaces shall have been released beforehand. diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c index d6fd893b45..df7260a8ec 100644 --- a/modules/codec/avcodec/vaapi.c +++ b/modules/codec/avcodec/vaapi.c @@ -146,7 +146,7 @@ static void Delete(vlc_va_t *va) free(sys); } -static const struct vlc_va_operations ops = { Get, Delete, }; +static const struct vlc_va_operations ops = { Get, NULL /* TODO */, Delete, }; static int Create(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc, enum PixelFormat pix_fmt, diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c index 0c0b539cdc..d1d331800e 100644 --- a/modules/codec/avcodec/video.c +++ b/modules/codec/avcodec/video.c @@ -1471,7 +1471,10 @@ static int lavc_va_GetFrame(struct AVCodecContext *ctx, AVFrame *frame) decoder_sys_t *p_sys = dec->p_sys; vlc_va_t *va = p_sys->p_va; - picture_t *pic = decoder_NewPicture(dec); + picture_t *pic; + pic = vlc_va_GetPicture(va, &dec->fmt_out.video); + if (pic == NULL) + pic = decoder_NewPicture(dec); if (pic == NULL) return -1; diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c index ae10789249..f7cca8efa8 100644 --- a/modules/hw/vdpau/avcodec.c +++ b/modules/hw/vdpau/avcodec.c @@ -133,7 +133,7 @@ static void Close(vlc_va_t *va) free(sys); } -static const struct vlc_va_operations ops = { Lock, Close, }; +static const struct vlc_va_operations ops = { Lock, NULL, Close, }; static int Open(vlc_va_t *va, AVCodecContext *avctx, const AVPixFmtDescriptor *desc, enum PixelFormat pix_fmt, _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
