From patchwork Mon Oct 29 05:18:00 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ruiling Song X-Patchwork-Id: 10830 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A455C44DD2C for ; Mon, 29 Oct 2018 07:20:36 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2501968A118; Mon, 29 Oct 2018 07:20:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0C97A689B90 for ; Mon, 29 Oct 2018 07:20:00 +0200 (EET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Oct 2018 22:20:29 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,438,1534834800"; d="scan'208";a="276433738" Received: from ruiling-skl2.sh.intel.com ([10.239.160.154]) by fmsmga006.fm.intel.com with ESMTP; 28 Oct 2018 22:20:28 -0700 From: Ruiling Song To: ffmpeg-devel@ffmpeg.org Date: Mon, 29 Oct 2018 13:18:00 +0800 Message-Id: <1540790282-29764-2-git-send-email-ruiling.song@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1540790282-29764-1-git-send-email-ruiling.song@intel.com> References: <1540790282-29764-1-git-send-email-ruiling.song@intel.com> Subject: [FFmpeg-devel] [PATCH 2/4] lavfi/opencl: Handle overlay input formats correctly. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Ruiling Song MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The main input may have alpha channel, we just ignore it. Also add some checks for incompatible input formats. Signed-off-by: Ruiling Song --- libavfilter/vf_overlay_opencl.c | 58 ++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/libavfilter/vf_overlay_opencl.c b/libavfilter/vf_overlay_opencl.c index e9c8532..320c1a5 100644 --- a/libavfilter/vf_overlay_opencl.c +++ b/libavfilter/vf_overlay_opencl.c @@ -37,7 +37,7 @@ typedef struct OverlayOpenCLContext { FFFrameSync fs; - int nb_planes; + int nb_color_planes; int x_subsample; int y_subsample; int alpha_separate; @@ -46,6 +46,22 @@ typedef struct OverlayOpenCLContext { int y_position; } OverlayOpenCLContext; +static int has_planar_alpha(const AVPixFmtDescriptor *fmt) { + int nb_components; + int has_alpha = !!(fmt->flags & AV_PIX_FMT_FLAG_ALPHA); + if (!has_alpha) return 0; + + nb_components = fmt->nb_components; + // PAL8 + if (nb_components < 2) return 0; + + if (fmt->comp[nb_components - 1].plane > + fmt->comp[nb_components - 2].plane) + return 1; + else + return 0; +} + static int overlay_opencl_load(AVFilterContext *avctx, enum AVPixelFormat main_format, enum AVPixelFormat overlay_format) @@ -55,10 +71,13 @@ static int overlay_opencl_load(AVFilterContext *avctx, const char *source = ff_opencl_source_overlay; const char *kernel; const AVPixFmtDescriptor *main_desc, *overlay_desc; - int err, i, main_planes, overlay_planes; + int err, i, main_planes, overlay_planes, overlay_alpha, + main_planar_alpha, overlay_planar_alpha; main_desc = av_pix_fmt_desc_get(main_format); overlay_desc = av_pix_fmt_desc_get(overlay_format); + overlay_alpha = !!(overlay_desc->flags & AV_PIX_FMT_FLAG_ALPHA); + main_planar_alpha = has_planar_alpha(main_desc); main_planes = overlay_planes = 0; for (i = 0; i < main_desc->nb_components; i++) @@ -68,7 +87,7 @@ static int overlay_opencl_load(AVFilterContext *avctx, overlay_planes = FFMAX(overlay_planes, overlay_desc->comp[i].plane + 1); - ctx->nb_planes = main_planes; + ctx->nb_color_planes = main_planar_alpha ? (main_planes - 1) : main_planes; ctx->x_subsample = 1 << main_desc->log2_chroma_w; ctx->y_subsample = 1 << main_desc->log2_chroma_h; @@ -80,15 +99,30 @@ static int overlay_opencl_load(AVFilterContext *avctx, ctx->x_subsample, ctx->y_subsample); } - if (main_planes == overlay_planes) { - if (main_desc->nb_components == overlay_desc->nb_components) - kernel = "overlay_no_alpha"; - else - kernel = "overlay_internal_alpha"; + if ((main_desc->flags & AV_PIX_FMT_FLAG_RGB) != + (overlay_desc->flags & AV_PIX_FMT_FLAG_RGB)) { + av_log(avctx, AV_LOG_ERROR, "mixed YUV/RGB input formats.\n"); + return AVERROR(EINVAL); + } + + if (main_desc->log2_chroma_w != overlay_desc->log2_chroma_w || + main_desc->log2_chroma_h != overlay_desc->log2_chroma_h) { + av_log(avctx, AV_LOG_ERROR, "incompatible chroma sub-sampling.\n"); + return AVERROR(EINVAL); + } + + if (!overlay_alpha) { ctx->alpha_separate = 0; + kernel = "overlay_no_alpha"; } else { - kernel = "overlay_external_alpha"; - ctx->alpha_separate = 1; + overlay_planar_alpha = has_planar_alpha(overlay_desc); + if (overlay_planar_alpha) { + ctx->alpha_separate = 1; + kernel = "overlay_external_alpha"; + } else { + ctx->alpha_separate = 0; + kernel = "overlay_internal_alpha"; + } } av_log(avctx, AV_LOG_DEBUG, "Using kernel %s.\n", kernel); @@ -155,7 +189,7 @@ static int overlay_opencl_blend(FFFrameSync *fs) goto fail; } - for (plane = 0; plane < ctx->nb_planes; plane++) { + for (plane = 0; plane < ctx->nb_color_planes; plane++) { kernel_arg = 0; mem = (cl_mem)output->data[plane]; @@ -171,7 +205,7 @@ static int overlay_opencl_blend(FFFrameSync *fs) kernel_arg++; if (ctx->alpha_separate) { - mem = (cl_mem)input_overlay->data[ctx->nb_planes]; + mem = (cl_mem)input_overlay->data[ctx->nb_color_planes]; CL_SET_KERNEL_ARG(ctx->kernel, kernel_arg, cl_mem, &mem); kernel_arg++; }