[vlc-commits] ci_filters: rework CVPX to CVPX conversions

2018-02-09 Thread Thomas Guillem
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

2018-02-09 Thread Thomas Guillem
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