From patchwork Sun Jan 27 09:36:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Muhammad Faiz X-Patchwork-Id: 11871 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 EB5CA44E111 for ; Sun, 27 Jan 2019 11:42:22 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 12C3768AE5E; Sun, 27 Jan 2019 11:42:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f196.google.com (mail-pf1-f196.google.com [209.85.210.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 312A568AE3E for ; Sun, 27 Jan 2019 11:42:05 +0200 (EET) Received: by mail-pf1-f196.google.com with SMTP id g62so6652028pfd.12 for ; Sun, 27 Jan 2019 01:42:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=J/NFW4GMuPsgp5tkCNKMcoJLGlTp2bksVYq4Mywa34I=; b=Z7UAs2jGv2TeT2cPtuyy34olVoV2J4Grn5pasQrSOG7Qrh56rxlnoA8R+VPnRZkdPP fCUe7E5caZyp7lXotOeddYs2Zeze1xxpfVmr88RAOv8pV+9z/FUQUHJR4v5kZR1LQU4Z mSC4Qn/9U1vSGVmkouH7C583CEJYBHfrIzBpZ/s9r2qSG0JcmsAWkFD4zKmarneA3gGE iTM5yrVli5S6U53Ukxo5H93KKQFLt09rGW6COT1L6uUE5PTekt2Ha26uFsXc4n0+fZfH DO+KotFgNj3UZ40rYDGybORuwmRH+aTwFhwVS3oApfQS/3nm/5H6qtSPuM2vI7YHxboi nGXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=J/NFW4GMuPsgp5tkCNKMcoJLGlTp2bksVYq4Mywa34I=; b=e5F1lPFdBbMULGH8MvQ39kf+37HlfcPu5zXGLhGyZSyS+kSzY8S6LEL+JDE0VFLNwR B90h2Vc/YdcCNZBHVUmWfxaYYClZ15QwdpGi/3YA0M3RmiJt1tn1ZVzZg+M+RFia91DS UfYS0VI1yZXsIqNaZdSFGFUMiKH3eOW1jhuAgcQMfmS+RtYQ/ogYhPi5gav3fOaC8Szj coQVRAxY4G/rW/0DzE0jxJp9E/tpFEcwZ64jPwd/3IV/9aGK11koEIOoikyyU/Yu3493 yFg9ZyOn8anlxxPIalc9DzCFTCjL+1SP01NiY0w0y7Kv8rqFL15rb9p5GQhj9651Q2/2 wiew== X-Gm-Message-State: AJcUukc34vNKUFZmthMKxlq1vHkDfdAw0hY/DqVe/R1sDA1N7RiIehvX Bf92MJGltnoIx9iD+VgSOc9g+hzR X-Google-Smtp-Source: ALg8bN5PLXwMKyBQdb1q/mIh/1sXh2KV1qZHtje59hYo5OfJndPKwmPDrwRGA9b4aMeQlcBGIx66mQ== X-Received: by 2002:a63:ea15:: with SMTP id c21mr15137151pgi.361.1548581817342; Sun, 27 Jan 2019 01:36:57 -0800 (PST) Received: from localhost.localdomain.localdomain ([182.1.64.200]) by smtp.gmail.com with ESMTPSA id h74sm43946461pfd.35.2019.01.27.01.36.55 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 27 Jan 2019 01:36:56 -0800 (PST) From: Muhammad Faiz To: ffmpeg-devel@ffmpeg.org Date: Sun, 27 Jan 2019 16:36:19 +0700 Message-Id: <20190127093619.28904-5-mfcc64@gmail.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190127093619.28904-1-mfcc64@gmail.com> References: <20190127093619.28904-1-mfcc64@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/5] avfilter/drawutils: support native-endian instead of little endian 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Muhammad Faiz --- Old thread is here: https://ffmpeg.org/pipermail/ffmpeg-devel/2016-June/195941.html Need someone test it on big-endian machine. libavfilter/drawutils.c | 48 +++++++++++++++++++++---------------- libavfilter/vf_rotate.c | 26 ++++++++++---------- libavfilter/vf_tinterlace.c | 30 +++++++++++------------ 3 files changed, 54 insertions(+), 50 deletions(-) diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c index 5f4cb548f0..12bdfcb900 100644 --- a/libavfilter/drawutils.c +++ b/libavfilter/drawutils.c @@ -175,6 +175,17 @@ void ff_copy_rectangle(uint8_t *dst[4], int dst_linesize[4], } } +static int is_native_endian(const AVPixFmtDescriptor *desc) +{ + int len = strlen(desc->name); + + if (!strcmp(desc->name + len - 2, "be")) + return HAVE_BIGENDIAN; + if (!strcmp(desc->name + len - 2, "le")) + return !HAVE_BIGENDIAN; + return 1; +} + int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(format); @@ -185,20 +196,20 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) if (!desc || !desc->name) return AVERROR(EINVAL); - if (desc->flags & ~(AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | FF_PSEUDOPAL | AV_PIX_FMT_FLAG_ALPHA)) + if (desc->flags & ~(AV_PIX_FMT_FLAG_PLANAR | AV_PIX_FMT_FLAG_RGB | FF_PSEUDOPAL | AV_PIX_FMT_FLAG_ALPHA | AV_PIX_FMT_FLAG_BE)) return AVERROR(ENOSYS); if (format == AV_PIX_FMT_P010LE || format == AV_PIX_FMT_P010BE || format == AV_PIX_FMT_P016LE || format == AV_PIX_FMT_P016BE) return AVERROR(ENOSYS); if (format == AV_PIX_FMT_YUVJ420P || format == AV_PIX_FMT_YUVJ422P || format == AV_PIX_FMT_YUVJ444P || format == AV_PIX_FMT_YUVJ411P || format == AV_PIX_FMT_YUVJ440P) full_range = 1; + if (!is_native_endian(desc)) + return AVERROR(ENOSYS); for (i = 0; i < desc->nb_components; i++) { c = &desc->comp[i]; /* for now, only 8-16 bits formats */ if (c->depth < 8 || c->depth > 16) return AVERROR(ENOSYS); - if (desc->flags & AV_PIX_FMT_FLAG_BE) - return AVERROR(ENOSYS); if (c->plane >= MAX_PLANES) return AVERROR(ENOSYS); /* strange interleaving */ @@ -268,11 +279,11 @@ void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4 EXPAND(1); EXPAND(0); } else if (draw->format == AV_PIX_FMT_GRAY8 || draw->format == AV_PIX_FMT_GRAY8A || - draw->format == AV_PIX_FMT_GRAY16LE || draw->format == AV_PIX_FMT_YA16LE || - draw->format == AV_PIX_FMT_GRAY9LE || - draw->format == AV_PIX_FMT_GRAY10LE || - draw->format == AV_PIX_FMT_GRAY12LE || - draw->format == AV_PIX_FMT_GRAY14LE) { + draw->format == AV_PIX_FMT_GRAY16 || draw->format == AV_PIX_FMT_YA16 || + draw->format == AV_PIX_FMT_GRAY9 || + draw->format == AV_PIX_FMT_GRAY10 || + draw->format == AV_PIX_FMT_GRAY12 || + draw->format == AV_PIX_FMT_GRAY14) { const AVPixFmtDescriptor *desc = draw->desc; color->comp[0].u8[0] = RGB_TO_Y_CCIR(rgba[0], rgba[1], rgba[2]); EXPAND(0); @@ -331,11 +342,6 @@ void ff_fill_rectangle(FFDrawContext *draw, FFDrawColor *color, return; p = p0; - if (HAVE_BIGENDIAN && draw->desc->comp[0].depth > 8) { - for (x = 0; 2*x < draw->pixelstep[plane]; x++) - color_tmp.comp[plane].u16[x] = av_bswap16(color_tmp.comp[plane].u16[x]); - } - /* copy first line from color */ for (x = 0; x < wp; x++) { memcpy(p, color_tmp.comp[plane].u8, draw->pixelstep[plane]); @@ -426,19 +432,19 @@ static void blend_line16(uint8_t *dst, unsigned src, unsigned alpha, if (left) { unsigned suba = (left * alpha) >> hsub; - uint16_t value = AV_RL16(dst); - AV_WL16(dst, (value * (0x10001 - suba) + src * suba) >> 16); + uint16_t value = AV_RN16A(dst); + AV_WN16A(dst, (value * (0x10001 - suba) + src * suba) >> 16); dst += dx; } for (x = 0; x < w; x++) { - uint16_t value = AV_RL16(dst); - AV_WL16(dst, (value * tau + asrc) >> 16); + uint16_t value = AV_RN16A(dst); + AV_WN16A(dst, (value * tau + asrc) >> 16); dst += dx; } if (right) { unsigned suba = (right * alpha) >> hsub; - uint16_t value = AV_RL16(dst); - AV_WL16(dst, (value * (0x10001 - suba) + src * suba) >> 16); + uint16_t value = AV_RN16A(dst); + AV_WN16A(dst, (value * (0x10001 - suba) + src * suba) >> 16); } } @@ -531,7 +537,7 @@ static void blend_pixel16(uint8_t *dst, unsigned src, unsigned alpha, unsigned xmmod = 7 >> l2depth; unsigned mbits = (1 << (1 << l2depth)) - 1; unsigned mmult = 255 / mbits; - uint16_t value = AV_RL16(dst); + uint16_t value = AV_RN16A(dst); for (y = 0; y < h; y++) { xm = xm0; @@ -543,7 +549,7 @@ static void blend_pixel16(uint8_t *dst, unsigned src, unsigned alpha, mask += mask_linesize; } alpha = (t >> shift) * alpha; - AV_WL16(dst, ((0x10001 - alpha) * value + alpha * src) >> 16); + AV_WN16A(dst, ((0x10001 - alpha) * value + alpha * src) >> 16); } static void blend_pixel(uint8_t *dst, unsigned src, unsigned alpha, diff --git a/libavfilter/vf_rotate.c b/libavfilter/vf_rotate.c index 371ff7f722..0ed8ebff5b 100644 --- a/libavfilter/vf_rotate.c +++ b/libavfilter/vf_rotate.c @@ -145,14 +145,14 @@ static int query_formats(AVFilterContext *ctx) AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUVA420P, - AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUVA420P10LE, - AV_PIX_FMT_YUV444P10LE, AV_PIX_FMT_YUVA444P10LE, - AV_PIX_FMT_YUV420P12LE, - AV_PIX_FMT_YUV444P12LE, - AV_PIX_FMT_YUV444P16LE, AV_PIX_FMT_YUVA444P16LE, - AV_PIX_FMT_YUV420P16LE, AV_PIX_FMT_YUVA420P16LE, - AV_PIX_FMT_YUV444P9LE, AV_PIX_FMT_YUVA444P9LE, - AV_PIX_FMT_YUV420P9LE, AV_PIX_FMT_YUVA420P9LE, + AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUVA420P10, + AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUVA444P10, + AV_PIX_FMT_YUV420P12, + AV_PIX_FMT_YUV444P12, + AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUVA444P16, + AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUVA420P16, + AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUVA444P9, + AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_NONE }; @@ -272,14 +272,14 @@ static uint8_t *interpolate_bilinear16(uint8_t *dst_color, int int_y1 = FFMIN(int_y+1, max_y); for (i = 0; i < src_linestep; i+=2) { - int s00 = AV_RL16(&src[src_linestep * int_x + i + src_linesize * int_y ]); - int s01 = AV_RL16(&src[src_linestep * int_x1 + i + src_linesize * int_y ]); - int s10 = AV_RL16(&src[src_linestep * int_x + i + src_linesize * int_y1]); - int s11 = AV_RL16(&src[src_linestep * int_x1 + i + src_linesize * int_y1]); + int s00 = AV_RN16A(&src[src_linestep * int_x + i + src_linesize * int_y ]); + int s01 = AV_RN16A(&src[src_linestep * int_x1 + i + src_linesize * int_y ]); + int s10 = AV_RN16A(&src[src_linestep * int_x + i + src_linesize * int_y1]); + int s11 = AV_RN16A(&src[src_linestep * int_x1 + i + src_linesize * int_y1]); int s0 = (((1<<16) - frac_x)*s00 + frac_x*s01); int s1 = (((1<<16) - frac_x)*s10 + frac_x*s11); - AV_WL16(&dst_color[i], ((int64_t)((1<<16) - frac_y)*s0 + (int64_t)frac_y*s1) >> 32); + AV_WN16A(&dst_color[i], ((int64_t)((1<<16) - frac_y)*s0 + (int64_t)frac_y*s1) >> 32); } return dst_color; diff --git a/libavfilter/vf_tinterlace.c b/libavfilter/vf_tinterlace.c index 22746ebfb1..9a579211d3 100644 --- a/libavfilter/vf_tinterlace.c +++ b/libavfilter/vf_tinterlace.c @@ -92,12 +92,12 @@ static int query_formats(AVFilterContext *ctx) AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P, - AV_PIX_FMT_YUV420P10LE, AV_PIX_FMT_YUV422P10LE, - AV_PIX_FMT_YUV440P10LE, AV_PIX_FMT_YUV444P10LE, - AV_PIX_FMT_YUV420P12LE, AV_PIX_FMT_YUV422P12LE, - AV_PIX_FMT_YUV440P12LE, AV_PIX_FMT_YUV444P12LE, + AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, + AV_PIX_FMT_YUV440P10, AV_PIX_FMT_YUV444P10, + AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, + AV_PIX_FMT_YUV440P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P, - AV_PIX_FMT_YUVA420P10LE, AV_PIX_FMT_YUVA422P10LE, AV_PIX_FMT_YUVA444P10LE, + AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_GRAY8, FULL_SCALE_YUVJ_FORMATS, AV_PIX_FMT_NONE }; @@ -134,9 +134,8 @@ static void lowpass_line_c_16(uint8_t *dst8, ptrdiff_t width, const uint8_t *src // this calculation is an integer representation of // '0.5 * current + 0.25 * above + 0.25 * below' // '1 +' is for rounding. - src_x = av_le2ne16(srcp[i]) << 1; - dstp[i] = av_le2ne16((1 + src_x + av_le2ne16(srcp_above[i]) - + av_le2ne16(srcp_below[i])) >> 2); + src_x = srcp[i] << 1; + dstp[i] = (1 + src_x + srcp_above[i] + srcp_below[i]) >> 2; } } @@ -181,24 +180,23 @@ static void lowpass_line_complex_c_16(uint8_t *dst8, ptrdiff_t width, const uint // this calculation is an integer representation of // '0.75 * current + 0.25 * above + 0.25 * below - 0.125 * above2 - 0.125 * below2' // '4 +' is for rounding. - src_le = av_le2ne16(srcp[i]); + src_le = srcp[i]; src_x = src_le << 1; - src_ab = av_le2ne16(srcp_above[i]) + av_le2ne16(srcp_below[i]); + src_ab = srcp_above[i] + srcp_below[i]; dst_le = av_clip((4 + ((src_le + src_x + src_ab) << 1) - - av_le2ne16(srcp_above2[i]) - - av_le2ne16(srcp_below2[i])) >> 3, 0, clip_max); + - srcp_above2[i] - srcp_below2[i]) >> 3, 0, clip_max); // Prevent over-sharpening: // dst must not exceed src when the average of above and below // is less than src. And the other way around. if (src_ab > src_x) { if (dst_le < src_le) - dstp[i] = av_le2ne16(src_le); + dstp[i] = src_le; else - dstp[i] = av_le2ne16(dst_le); + dstp[i] = dst_le; } else if (dst_le > src_le) { - dstp[i] = av_le2ne16(src_le); + dstp[i] = src_le; } else - dstp[i] = av_le2ne16(dst_le); + dstp[i] = dst_le; } }