From patchwork Tue Nov 29 11:52:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Darnley X-Patchwork-Id: 1601 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.90.1 with SMTP id o1csp2387872vsb; Tue, 29 Nov 2016 03:55:06 -0800 (PST) X-Received: by 10.28.111.70 with SMTP id k67mr23271068wmc.32.1480420506220; Tue, 29 Nov 2016 03:55:06 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id yr4si59048237wjc.210.2016.11.29.03.55.04; Tue, 29 Nov 2016 03:55:06 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ob-encoder-com.20150623.gappssmtp.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DA8F7689E48; Tue, 29 Nov 2016 13:54:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6369E689E3F for ; Tue, 29 Nov 2016 13:54:38 +0200 (EET) Received: by mail-wm0-f66.google.com with SMTP id g23so23962722wme.1 for ; Tue, 29 Nov 2016 03:54:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ob-encoder-com.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=7U2gTEqdAHJ2iNg/t/QzEVzUaaOiREYehwAXzGG6ZpI=; b=d7IVJadf5PW2TxPi4TjxvZZaE7PCFYhK3vLSBB4mgeadlOED6Kcu7wLQY4NuftXTts k/kPrN63u0vte2sH4dGAIFwXpKzEVDK9a8wLnAQo4JBCNOVvk9A11xzq0zsS3t1wVea2 BlZuzbnJNGMQFl/khBSaUdTNmqVLKgBTM/s0Lw+guFgtx42pskdY41UGbQjpg5FOaCUR BbmMFiWUPZbb+D+uGAV9Gb94wyfrA2b0TP6/XjR+gVFILuwVOExwqwFHLkS5aw/8rvHn wZa1Jw/EelETNSsvIFRiljKnEx3HIejE/vUoEk5gLSumvx/YBy+74hH2lkrlhPwqieiL KWeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=7U2gTEqdAHJ2iNg/t/QzEVzUaaOiREYehwAXzGG6ZpI=; b=ZKZ3iNqNtKIca0La+ntxdaaIaX4be+VsHq2Uv1Nh1wvL0reRBjSBNTEsZPuYkSLyvu YoDMgYj0sQyT0HSg9AwJZIzT80ukP3wfKsNo2jQ29Y+JXqAwqLzFFuudIrU0z48nC1VT PCvzW/8NiSucOfOJ+TRP+alsgGX8lcxb+Ley4tD1wWG2BeoDL1rucx+lzwANJETHzYQe qUlhxT64/FoReW6DsSIzgqHtEDY0gM3/G5RlzCbqNXu2ktQHQ+SUn8hRZkakIHblqVRW dSHlxZWy7LwRg8hstaU6QewWyxGzOGeB65PIqQqq8oMM/utmgHScFWnOSNhiJxaqK+YJ kvsQ== X-Gm-Message-State: AKaTC02Y+iOz/TaJKxYQYN0gRZp7kgaxBhjOKKr/ZQBnNhhnRrGOpdOAvdoYsXUbG/jDpw== X-Received: by 10.28.236.83 with SMTP id k80mr22692129wmh.0.1480420484179; Tue, 29 Nov 2016 03:54:44 -0800 (PST) Received: from Ifrit.systemlords.lan (d51A44418.access.telenet.be. [81.164.68.24]) by smtp.gmail.com with ESMTPSA id 63sm2445688wmg.2.2016.11.29.03.54.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 29 Nov 2016 03:54:43 -0800 (PST) From: James Darnley To: FFmpeg development discussions and patches Date: Tue, 29 Nov 2016 12:52:35 +0100 Message-Id: <20161129115235.8937-4-jdarnley@obe.tv> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20161129115235.8937-1-jdarnley@obe.tv> References: <20161129115235.8937-1-jdarnley@obe.tv> Subject: [FFmpeg-devel] [PATCH 3/3] avcodec/h264: sse2 and avx 4:2:2 idct add8 10-bit functions 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: James Darnley MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" sse2: complex: 4.13x faster (1514 vs. 367 cycles) simple: 4.38x faster (1836 vs. 419 cycles) avx: complex: 1.07x faster (260 vs. 244 cycles) simple: 1.03x faster (284 vs. 274 cycles) --- libavcodec/x86/h264_idct_10bit.asm | 53 ++++++++++++++++++++++++++++++++++++++ libavcodec/x86/h264dsp_init.c | 13 ++++++++-- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/libavcodec/x86/h264_idct_10bit.asm b/libavcodec/x86/h264_idct_10bit.asm index 4f7491d..9fd05ab 100644 --- a/libavcodec/x86/h264_idct_10bit.asm +++ b/libavcodec/x86/h264_idct_10bit.asm @@ -351,6 +351,59 @@ IDCT_ADD8 %endif ;----------------------------------------------------------------------------- +; void ff_h264_idct_add8_422_10(pixel **dst, const int *block_offset, +; int16_t *block, int stride, +; const uint8_t nnzc[6*8]) +;----------------------------------------------------------------------------- +%assign last_block 44 + +%macro IDCT_ADD8_422 0 + +cglobal h264_idct_add8_422_10, 5, 8, 7 + movsxdifnidn r3, r3d +%if ARCH_X86_64 + mov r7, r0 +%endif + + add r2, 1024 + mov r0, [r0] + ADD16_OP_INTRA 16, 4+ 6*8 + ADD16_OP_INTRA 18, 4+ 7*8 + ADD16_OP_INTRA 24, 4+ 8*8 ; i+4 + ADD16_OP_INTRA 26, 4+ 9*8 ; i+4 + add r2, 1024-128*4 + +%if ARCH_X86_64 + mov r0, [r7+gprsize] +%else + mov r0, r0m + mov r0, [r0+gprsize] +%endif + + ADD16_OP_INTRA 32, 4+11*8 + ADD16_OP_INTRA 34, 4+12*8 + ADD16_OP_INTRA 40, 4+13*8 ; i+4 + ADD16_OP_INTRA 42, 4+14*8 ; i+4 +REP_RET + AC 16 + AC 18 + AC 24 ; i+4 + AC 26 ; i+4 + AC 32 + AC 34 + AC 40 ; i+4 + AC 42 ; i+4 + +%endmacro + +INIT_XMM sse2 +IDCT_ADD8_422 +%if HAVE_AVX_EXTERNAL +INIT_XMM avx +IDCT_ADD8_422 +%endif + +;----------------------------------------------------------------------------- ; void ff_h264_idct8_add_10(pixel *dst, int16_t *block, int stride) ;----------------------------------------------------------------------------- %macro IDCT8_1D 2 diff --git a/libavcodec/x86/h264dsp_init.c b/libavcodec/x86/h264dsp_init.c index ed52c4d..c6c643a 100644 --- a/libavcodec/x86/h264dsp_init.c +++ b/libavcodec/x86/h264dsp_init.c @@ -80,6 +80,9 @@ IDCT_ADD_REP_FUNC2(, 8, 10, avx) IDCT_ADD_REP_FUNC2(, 8_422, 8, mmx) +IDCT_ADD_REP_FUNC2(, 8_422, 10, sse2) +IDCT_ADD_REP_FUNC2(, 8_422, 10, avx) + void ff_h264_luma_dc_dequant_idct_mmx(int16_t *output, int16_t *input, int qmul); void ff_h264_luma_dc_dequant_idct_sse2(int16_t *output, int16_t *input, int qmul); @@ -319,8 +322,11 @@ av_cold void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth, c->h264_idct8_dc_add = ff_h264_idct8_dc_add_10_sse2; c->h264_idct_add16 = ff_h264_idct_add16_10_sse2; - if (chroma_format_idc <= 1) + if (chroma_format_idc <= 1) { c->h264_idct_add8 = ff_h264_idct_add8_10_sse2; + } else { + c->h264_idct_add8 = ff_h264_idct_add8_422_10_sse2; + } c->h264_idct_add16intra = ff_h264_idct_add16intra_10_sse2; #if HAVE_ALIGNED_STACK c->h264_idct8_add = ff_h264_idct8_add_10_sse2; @@ -359,8 +365,11 @@ av_cold void ff_h264dsp_init_x86(H264DSPContext *c, const int bit_depth, c->h264_idct8_dc_add = ff_h264_idct8_dc_add_10_avx; c->h264_idct_add16 = ff_h264_idct_add16_10_avx; - if (chroma_format_idc <= 1) + if (chroma_format_idc <= 1) { c->h264_idct_add8 = ff_h264_idct_add8_10_avx; + } else { + c->h264_idct_add8 = ff_h264_idct_add8_422_10_avx; + } c->h264_idct_add16intra = ff_h264_idct_add16intra_10_avx; #if HAVE_ALIGNED_STACK c->h264_idct8_add = ff_h264_idct8_add_10_avx;