[vlc-commits] ci_filters: rework CVPX to CVPX conversions
vlc/vlc-3.0 | branch: master | Thomas Guillem| Fri Feb 9 17:12:54 2018 +0100| [78eb0e166e8c82ca17da62c6cbc94f2a1a030c04] | committer: Thomas Guillem ci_filters: rework CVPX to CVPX conversions CD 155f0680-aa44-49a8-a2ec-e1a341fc55fe These 2 extra conversions (CVPX_X to CVPX_RGBA and CVPX_RGBA to CVPX_X) will be done only if ci_filters doesn't accept the input chroma. This won't happen often since videotoolbox will most likely output chromas that can be accepted by ci_filters. This was not never touched since the initial commit and was not up to date. (cherry picked from commit 4e803da88615704ab7b2ddcd581c8d33267db663) Signed-off-by: Thomas Guillem > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=78eb0e166e8c82ca17da62c6cbc94f2a1a030c04 --- modules/video_chroma/cvpx.c | 73 --- modules/video_filter/ci_filters.m | 118 ++ 2 files changed, 95 insertions(+), 96 deletions(-) diff --git a/modules/video_chroma/cvpx.c b/modules/video_chroma/cvpx.c index 88238f4020..62eb8885f4 100644 --- a/modules/video_chroma/cvpx.c +++ b/modules/video_chroma/cvpx.c @@ -45,40 +45,29 @@ static int Open_CVPX_to_CVPX(vlc_object_t *); static void Close_CVPX_to_CVPX(vlc_object_t *); #endif -vlc_module_begin () -set_description("Conversions from/to CoreVideo buffers") -set_capability("video converter", 10) -set_callbacks(Open, Close) - -#if TARGET_OS_IPHONE -vlc_module_end () - struct filter_sys_t { -filter_t *p_sw_filter; CVPixelBufferPoolRef pool; +union +{ +filter_t *p_sw_filter; +#if !TARGET_OS_IPHONE +VTPixelTransferSessionRef vttransfer; +#endif +}; }; -#else +vlc_module_begin () +set_description("Conversions from/to CoreVideo buffers") +set_capability("video converter", 10) +set_callbacks(Open, Close) +#if !TARGET_OS_IPHONE add_submodule() set_description("Conversions between CoreVideo buffers") set_callbacks(Open_CVPX_to_CVPX, Close_CVPX_to_CVPX) +#endif vlc_module_end () -struct filter_sys_t -{ -union -{ -struct -{ -filter_t *p_sw_filter; -CVPixelBufferPoolRef pool; -}; - -VTPixelTransferSessionRef vttransfer; -}; -}; -#endif / * CVPX to/from I420 conversion * @@ -334,6 +323,8 @@ error: static picture_t * Filter(filter_t *filter, picture_t *src) { +filter_sys_t *p_sys = filter->p_sys; + CVPixelBufferRef src_cvpx = cvpxpic_get_ref(src); assert(src_cvpx); @@ -344,8 +335,13 @@ Filter(filter_t *filter, picture_t *src) return NULL; } -CVPixelBufferRef dst_cvpx = cvpxpic_get_ref(dst); -assert(dst_cvpx); +CVPixelBufferRef dst_cvpx = cvpxpool_new_cvpx(p_sys->pool); +if (dst_cvpx == NULL) +{ +picture_Release(src); +picture_Release(dst); +return NULL; +} if (VTPixelTransferSessionTransferImage(filter->p_sys->vttransfer, src_cvpx, dst_cvpx) != noErr) @@ -355,6 +351,8 @@ Filter(filter_t *filter, picture_t *src) return NULL; } +cvpxpic_attach(dst, dst_cvpx); + picture_CopyProperties(dst, src); picture_Release(src); return dst; @@ -383,19 +381,26 @@ Open_CVPX_to_CVPX(vlc_object_t *obj) CHECK_CHROMA(filter->fmt_out.video.i_chroma) #undef CHECK_CHROMA -filter->p_sys = calloc(1, sizeof(filter_sys_t)); -if (!filter->p_sys) +filter_sys_t *p_sys = filter->p_sys = calloc(1, sizeof(filter_sys_t)); +if (!p_sys) return VLC_ENOMEM; -if (VTPixelTransferSessionCreate(NULL, >p_sys->vttransfer) +if (VTPixelTransferSessionCreate(NULL, _sys->vttransfer) != noErr) { -free(filter->p_sys); +free(p_sys); return VLC_EGENERIC; } -filter->pf_video_filter = Filter; +if ((p_sys->pool = cvpxpool_create(>fmt_out.video, 3)) == NULL) +{ +VTPixelTransferSessionInvalidate(p_sys->vttransfer); +CFRelease(p_sys->vttransfer); +free(p_sys); +return VLC_EGENERIC; +} +filter->pf_video_filter = Filter; return VLC_SUCCESS; } @@ -403,9 +408,11 @@ static void Close_CVPX_to_CVPX(vlc_object_t *obj) { filter_t *filter = (filter_t *)obj; +filter_sys_t *p_sys = filter->p_sys; -VTPixelTransferSessionInvalidate(filter->p_sys->vttransfer); -CFRelease(filter->p_sys->vttransfer); +VTPixelTransferSessionInvalidate(p_sys->vttransfer); +CFRelease(p_sys->vttransfer); +CVPixelBufferPoolRelease(p_sys->pool); free(filter->p_sys); } diff --git a/modules/video_filter/ci_filters.m b/modules/video_filter/ci_filters.m index 579ac81630..8a8f7a3527 100644 --- a/modules/video_filter/ci_filters.m +++ b/modules/video_filter/ci_filters.m @@ -87,6 +87,7 @@ struct ci_filters_ctx CVPixelBufferPoolRefoutconv_cvpx_pool;
[vlc-commits] ci_filters: rework CVPX to CVPX conversions
vlc | branch: master | Thomas Guillem| Fri Feb 9 17:12:54 2018 +0100| [4e803da88615704ab7b2ddcd581c8d33267db663] | committer: Thomas Guillem ci_filters: rework CVPX to CVPX conversions CD 155f0680-aa44-49a8-a2ec-e1a341fc55fe These 2 extra conversions (CVPX_X to CVPX_RGBA and CVPX_RGBA to CVPX_X) will be done only if ci_filters doesn't accept the input chroma. This won't happen often since videotoolbox will most likely output chromas that can be accepted by ci_filters. This was not never touched since the initial commit and was not up to date. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4e803da88615704ab7b2ddcd581c8d33267db663 --- modules/video_chroma/cvpx.c | 73 --- modules/video_filter/ci_filters.m | 118 ++ 2 files changed, 95 insertions(+), 96 deletions(-) diff --git a/modules/video_chroma/cvpx.c b/modules/video_chroma/cvpx.c index 88238f4020..62eb8885f4 100644 --- a/modules/video_chroma/cvpx.c +++ b/modules/video_chroma/cvpx.c @@ -45,40 +45,29 @@ static int Open_CVPX_to_CVPX(vlc_object_t *); static void Close_CVPX_to_CVPX(vlc_object_t *); #endif -vlc_module_begin () -set_description("Conversions from/to CoreVideo buffers") -set_capability("video converter", 10) -set_callbacks(Open, Close) - -#if TARGET_OS_IPHONE -vlc_module_end () - struct filter_sys_t { -filter_t *p_sw_filter; CVPixelBufferPoolRef pool; +union +{ +filter_t *p_sw_filter; +#if !TARGET_OS_IPHONE +VTPixelTransferSessionRef vttransfer; +#endif +}; }; -#else +vlc_module_begin () +set_description("Conversions from/to CoreVideo buffers") +set_capability("video converter", 10) +set_callbacks(Open, Close) +#if !TARGET_OS_IPHONE add_submodule() set_description("Conversions between CoreVideo buffers") set_callbacks(Open_CVPX_to_CVPX, Close_CVPX_to_CVPX) +#endif vlc_module_end () -struct filter_sys_t -{ -union -{ -struct -{ -filter_t *p_sw_filter; -CVPixelBufferPoolRef pool; -}; - -VTPixelTransferSessionRef vttransfer; -}; -}; -#endif / * CVPX to/from I420 conversion * @@ -334,6 +323,8 @@ error: static picture_t * Filter(filter_t *filter, picture_t *src) { +filter_sys_t *p_sys = filter->p_sys; + CVPixelBufferRef src_cvpx = cvpxpic_get_ref(src); assert(src_cvpx); @@ -344,8 +335,13 @@ Filter(filter_t *filter, picture_t *src) return NULL; } -CVPixelBufferRef dst_cvpx = cvpxpic_get_ref(dst); -assert(dst_cvpx); +CVPixelBufferRef dst_cvpx = cvpxpool_new_cvpx(p_sys->pool); +if (dst_cvpx == NULL) +{ +picture_Release(src); +picture_Release(dst); +return NULL; +} if (VTPixelTransferSessionTransferImage(filter->p_sys->vttransfer, src_cvpx, dst_cvpx) != noErr) @@ -355,6 +351,8 @@ Filter(filter_t *filter, picture_t *src) return NULL; } +cvpxpic_attach(dst, dst_cvpx); + picture_CopyProperties(dst, src); picture_Release(src); return dst; @@ -383,19 +381,26 @@ Open_CVPX_to_CVPX(vlc_object_t *obj) CHECK_CHROMA(filter->fmt_out.video.i_chroma) #undef CHECK_CHROMA -filter->p_sys = calloc(1, sizeof(filter_sys_t)); -if (!filter->p_sys) +filter_sys_t *p_sys = filter->p_sys = calloc(1, sizeof(filter_sys_t)); +if (!p_sys) return VLC_ENOMEM; -if (VTPixelTransferSessionCreate(NULL, >p_sys->vttransfer) +if (VTPixelTransferSessionCreate(NULL, _sys->vttransfer) != noErr) { -free(filter->p_sys); +free(p_sys); return VLC_EGENERIC; } -filter->pf_video_filter = Filter; +if ((p_sys->pool = cvpxpool_create(>fmt_out.video, 3)) == NULL) +{ +VTPixelTransferSessionInvalidate(p_sys->vttransfer); +CFRelease(p_sys->vttransfer); +free(p_sys); +return VLC_EGENERIC; +} +filter->pf_video_filter = Filter; return VLC_SUCCESS; } @@ -403,9 +408,11 @@ static void Close_CVPX_to_CVPX(vlc_object_t *obj) { filter_t *filter = (filter_t *)obj; +filter_sys_t *p_sys = filter->p_sys; -VTPixelTransferSessionInvalidate(filter->p_sys->vttransfer); -CFRelease(filter->p_sys->vttransfer); +VTPixelTransferSessionInvalidate(p_sys->vttransfer); +CFRelease(p_sys->vttransfer); +CVPixelBufferPoolRelease(p_sys->pool); free(filter->p_sys); } diff --git a/modules/video_filter/ci_filters.m b/modules/video_filter/ci_filters.m index 579ac81630..8a8f7a3527 100644 --- a/modules/video_filter/ci_filters.m +++ b/modules/video_filter/ci_filters.m @@ -87,6 +87,7 @@ struct ci_filters_ctx CVPixelBufferPoolRefoutconv_cvpx_pool; CIContext * ci_ctx; struct filter_chain * fchain; +filter_t * src_converter; filter_t