[vlc-commits] ci_filters: rework CVPX to CVPX conversions
Thomas Guillem
git at videolan.org
Fri Feb 9 17:22:17 CET 2018
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | 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, &filter->p_sys->vttransfer)
+ if (VTPixelTransferSessionCreate(NULL, &p_sys->vttransfer)
!= noErr)
{
- free(filter->p_sys);
+ free(p_sys);
return VLC_EGENERIC;
}
- filter->pf_video_filter = Filter;
+ if ((p_sys->pool = cvpxpool_create(&filter->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
CVPixelBufferPoolRef outconv_cvpx_pool;
CIContext * ci_ctx;
struct filter_chain * fchain;
+ filter_t * src_converter;
filter_t * dst_converter;
};
@@ -377,6 +378,13 @@ Filter(filter_t *filter, picture_t *src)
}
CFRelease(cvpx);
+ if (ctx->src_converter)
+ {
+ src = ctx->dst_converter->pf_video_filter(ctx->src_converter, src);
+ if (!src)
+ return NULL;
+ }
+
@autoreleasepool {
CIImage *ci_img = [CIImage imageWithCVImageBuffer: cvpxpic_get_ref(src)];
if (!ci_img)
@@ -515,80 +523,59 @@ Open_CreateFilters(filter_t *filter, struct filter_chain **p_last_filter,
return VLC_SUCCESS;
}
-static picture_t *
-CVPX_buffer_new(filter_t *converter)
-{
- CVPixelBufferPoolRef pool = converter->owner.sys;
- CVPixelBufferRef cvpx = cvpxpool_new_cvpx(pool);
- if (!cvpx)
- return NULL;
-
- picture_t *pic = picture_NewFromFormat(&converter->fmt_out.video);
- if (!pic || cvpxpic_attach(pic, cvpx))
- {
- CFRelease(cvpx);
- return NULL;
- }
- CFRelease(cvpx);
-
- return pic;
-}
-
static void
Close_RemoveConverters(filter_t *filter, struct ci_filters_ctx *ctx)
{
VLC_UNUSED(filter);
+ if (ctx->src_converter)
+ {
+ module_unneed(ctx->src_converter, ctx->src_converter->p_module);
+ vlc_object_release(ctx->src_converter);
+ }
if (ctx->dst_converter)
{
module_unneed(ctx->dst_converter, ctx->dst_converter->p_module);
vlc_object_release(ctx->dst_converter);
- CVPixelBufferPoolRelease(ctx->outconv_cvpx_pool);
}
}
-static int
-Open_AddConverter(filter_t *filter, struct ci_filters_ctx *ctx)
+static picture_t *CVPX_to_CVPX_converter_BufferNew(filter_t *p_filter)
{
- ctx->cvpx_pool_fmt = filter->fmt_in.video;
- ctx->cvpx_pool_fmt.i_chroma = VLC_CODEC_CVPX_BGRA;
- ctx->cvpx_pool = cvpxpool_create(&ctx->cvpx_pool_fmt, 3);
- if (!ctx->cvpx_pool)
- goto error;
-
- ctx->dst_converter = vlc_object_create(filter, sizeof(filter_t));
- if (!ctx->dst_converter)
- goto error;
+ return picture_NewFromFormat(&p_filter->fmt_out.video);
+}
- ctx->dst_converter->fmt_in = filter->fmt_out;
- ctx->dst_converter->fmt_out = filter->fmt_out;
- ctx->dst_converter->fmt_in.video.i_chroma =
- ctx->dst_converter->fmt_in.i_codec = VLC_CODEC_CVPX_BGRA;
+static filter_t *
+CVPX_to_CVPX_converter_Create(filter_t *filter, bool to_rgba)
+{
+ filter_t *converter = vlc_object_create(filter, sizeof(filter_t));
+ if (!converter)
+ return NULL;
- ctx->outconv_cvpx_pool =
- cvpxpool_create(&filter->fmt_out.video, 2);
- if (!ctx->outconv_cvpx_pool)
- goto error;
+ converter->fmt_in = filter->fmt_out;
+ converter->fmt_out = filter->fmt_out;
- ctx->dst_converter->owner.sys = ctx->outconv_cvpx_pool;
- ctx->dst_converter->owner.video.buffer_new = CVPX_buffer_new;
+ if (to_rgba)
+ {
+ converter->fmt_out.video.i_chroma =
+ converter->fmt_out.i_codec = VLC_CODEC_CVPX_BGRA;
+ }
+ else
+ {
+ converter->fmt_in.video.i_chroma =
+ converter->fmt_in.i_codec = VLC_CODEC_CVPX_BGRA;
+ }
- ctx->dst_converter->p_module =
- module_need(ctx->dst_converter, "video converter", NULL, false);
- if (!ctx->dst_converter->p_module)
- goto error;
+ converter->owner.video.buffer_new = CVPX_to_CVPX_converter_BufferNew;
- return VLC_SUCCESS;
-error:
- if (ctx->dst_converter)
+ converter->p_module = module_need(converter, "video converter", NULL, false);
+ if (!converter->p_module)
{
- if (ctx->dst_converter->p_module)
- module_unneed(ctx->dst_converter, ctx->dst_converter->p_module);
- vlc_object_release(ctx->dst_converter);
- if (ctx->outconv_cvpx_pool)
- CVPixelBufferPoolRelease(ctx->outconv_cvpx_pool);
+ vlc_object_release(converter);
+ return NULL;
}
- return VLC_EGENERIC;
+
+ return converter;
}
static int
@@ -626,10 +613,19 @@ Open(vlc_object_t *obj, char const *psz_filter)
if (!ctx)
goto error;
+ ctx->cvpx_pool_fmt = filter->fmt_out.video;
+
if (filter->fmt_in.video.i_chroma != VLC_CODEC_CVPX_NV12
- && filter->fmt_in.video.i_chroma != VLC_CODEC_CVPX_BGRA
- && Open_AddConverter(filter, ctx))
- goto error;
+ && filter->fmt_in.video.i_chroma != VLC_CODEC_CVPX_BGRA)
+ {
+ ctx->src_converter =
+ CVPX_to_CVPX_converter_Create(filter, true);
+ ctx->dst_converter = ctx->src_converter ?
+ CVPX_to_CVPX_converter_Create(filter, false) : NULL;
+ if (!ctx->src_converter || !ctx->dst_converter)
+ goto error;
+ ctx->cvpx_pool_fmt.i_chroma = VLC_CODEC_CVPX_BGRA;
+ }
#if !TARGET_OS_IPHONE
CGLContextObj glctx = var_InheritAddress(filter, "macosx-glcontext");
@@ -654,13 +650,9 @@ Open(vlc_object_t *obj, char const *psz_filter)
if (!ctx->ci_ctx)
goto error;
+ ctx->cvpx_pool = cvpxpool_create(&ctx->cvpx_pool_fmt, 2);
if (!ctx->cvpx_pool)
- {
- ctx->cvpx_pool_fmt = filter->fmt_out.video;
- ctx->cvpx_pool = cvpxpool_create(&ctx->cvpx_pool_fmt, 2);
- if (!ctx->cvpx_pool)
- goto error;
- }
+ goto error;
if (Open_CreateFilters(filter, &ctx->fchain, filter_types))
goto error;
More information about the vlc-commits
mailing list