From patchwork Wed Sep 11 19:29:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Baptiste Coudurier X-Patchwork-Id: 15029 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 AE20644A476 for ; Wed, 11 Sep 2019 22:29:40 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8C09D687F0B; Wed, 11 Sep 2019 22:29:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EBC566805FB for ; Wed, 11 Sep 2019 22:29:33 +0300 (EEST) Received: by mail-pf1-f181.google.com with SMTP id b13so14308865pfo.8 for ; Wed, 11 Sep 2019 12:29:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xSpkgbMcoescYraaq6X99YeDXWckcXTAO50+jr3SpNI=; b=A8m5Yyi1WCdJ5VdF/ng96OKVfZ3sk4GfbZGouUhJKEysI1XhcazvziyRYXjZORT8/l ivKpl3mEgsyEyInw6QD0C/agmUR1IkTBHbriQKNvWSIbJybXdAW1tAPJemz6dUKpZxsM aablfb5KYilZ4C7CGtIo5tQAIr1qx2792lJE8eWtJs0c6MG1MujEg6q4x03tdim79fyW JsZAd6071j6BrjHuo+GFYmDPXGSqwe99i1hX+UOoijdh9+jCqzc+awhbcpViTysBt7JP yHZd8fTN/wWS8PZezRXEqdeGlUsGeenjViX+YFkIrQotFW8VU1TTOkhjHqkyA/Qe61PP loPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=xSpkgbMcoescYraaq6X99YeDXWckcXTAO50+jr3SpNI=; b=Ni3Kl11c3Aeaucq32fF8vHIhd5gEhbkZNcKS1SALurvReQN5eZ4ZbGMTVwfAXHOovV d5V6IAJ8caM4pHQCPOprkrVQwGCOu9hN5LgrEQ6lggwou0ffnIFNb2Vyh4MlK51xGRIk RCbc59BDwPCUMTeQp6Z/XCBe4v98MsYEINgGhQeicNh7CnnS66CDu8dv4tQ1aSYOBKgi 3PkZrjXHZFZI0WyALYrWDSSBQ1TmpQUVht9duGDr65iGy4hiLG0Agl5kLXOx+1KYISK2 CSLi9/8IoEF42Eh+YtAVxnwBsoSiXUYlHeVtP9guCQs0SJStUP9Eg7swEp0m3NvxWlmA 3rEA== X-Gm-Message-State: APjAAAVpfmWfK7TDPN3WxhBVMRLHEQSiZruw6+Xh8JMdWGqCWOBhsg7w p9DOPan3MCDdsIZFEuDw/EuFBACt X-Google-Smtp-Source: APXvYqxPKbNXEIaoNebUXOufqOVTBC3DD1tlibmQwyMMVK2/kTO0zSGZxBurdVBmKRlpNHyq825FiQ== X-Received: by 2002:a62:7f11:: with SMTP id a17mr40834684pfd.193.1568230172010; Wed, 11 Sep 2019 12:29:32 -0700 (PDT) Received: from baptiste.quibi.com ([64.124.32.234]) by smtp.gmail.com with ESMTPSA id x20sm42660111pfp.120.2019.09.11.12.29.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Sep 2019 12:29:31 -0700 (PDT) From: Baptiste Coudurier To: ffmpeg-devel@ffmpeg.org Date: Wed, 11 Sep 2019 12:29:22 -0700 Message-Id: <20190911192922.34720-1-baptiste.coudurier@gmail.com> X-Mailer: git-send-email 2.20.1 (Apple Git-117) MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/dvdec: correctly decode bottom mb row in 1080i field mode 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: Baptiste Coudurier Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/dv.h | 2 ++ libavcodec/dvdec.c | 90 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/libavcodec/dv.h b/libavcodec/dv.h index 0e97bb200e..7ef5b7c552 100644 --- a/libavcodec/dv.h +++ b/libavcodec/dv.h @@ -31,6 +31,7 @@ #include "dv_profile.h" #include "me_cmp.h" #include "vlc.h" +#include "idctdsp.h" typedef struct DVwork_chunk { uint16_t buf_offset; @@ -52,6 +53,7 @@ typedef struct DVVideoContext { me_cmp_func ildct_cmp; DVwork_chunk work_chunks[4 * 12 * 27]; uint32_t idct_factor[2 * 4 * 16 * 64]; + IDCTDSPContext idsp; int quant_deadzone; } DVVideoContext; diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c index 89864f2edc..4345cd9e29 100644 --- a/libavcodec/dvdec.c +++ b/libavcodec/dvdec.c @@ -45,7 +45,6 @@ #include "dv_profile_internal.h" #include "dvdata.h" #include "get_bits.h" -#include "idctdsp.h" #include "internal.h" #include "put_bits.h" #include "simple_idct.h" @@ -177,24 +176,22 @@ static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d) static av_cold int dvvideo_decode_init(AVCodecContext *avctx) { DVVideoContext *s = avctx->priv_data; - IDCTDSPContext idsp; int i; - memset(&idsp,0, sizeof(idsp)); - ff_idctdsp_init(&idsp, avctx); + ff_idctdsp_init(&s->idsp, avctx); for (i = 0; i < 64; i++) - s->dv_zigzag[0][i] = idsp.idct_permutation[ff_zigzag_direct[i]]; + s->dv_zigzag[0][i] = s->idsp.idct_permutation[ff_zigzag_direct[i]]; if (avctx->lowres){ for (i = 0; i < 64; i++){ int j = ff_dv_zigzag248_direct[i]; - s->dv_zigzag[1][i] = idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2]; + s->dv_zigzag[1][i] = s->idsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2]; } }else memcpy(s->dv_zigzag[1], ff_dv_zigzag248_direct, sizeof(s->dv_zigzag[1])); - s->idct_put[0] = idsp.idct_put; + s->idct_put[0] = s->idsp.idct_put; s->idct_put[1] = ff_simple_idct248_put; return ff_dvvideo_init(avctx); @@ -272,6 +269,49 @@ static inline void bit_copy(PutBitContext *pb, GetBitContext *gb) put_bits(pb, bits_left, get_bits(gb, bits_left)); } +static av_always_inline void put_block_8x4(int16_t *block, uint8_t *restrict p, int stride) +{ + int i, j; + const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 8; j++) + p[j] = cm[block[j]]; + block += 8; + p += stride; + } +} + +static void dv100_idct_put_last_row_field_chroma(DVVideoContext *s, uint8_t *data, + int stride, int16_t *blocks) +{ + s->idsp.idct(blocks + 0*64); + s->idsp.idct(blocks + 1*64); + + put_block_8x4(blocks+0*64, data, stride<<1); + put_block_8x4(blocks+0*64 + 4*8, data + 8, stride<<1); + put_block_8x4(blocks+1*64, data + stride, stride<<1); + put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1); +} + +static void dv100_idct_put_last_row_field_luma(DVVideoContext *s, uint8_t *data, + int stride, int16_t *blocks) +{ + s->idsp.idct(blocks + 0*64); + s->idsp.idct(blocks + 1*64); + s->idsp.idct(blocks + 2*64); + s->idsp.idct(blocks + 3*64); + + put_block_8x4(blocks+0*64, data, stride<<1); + put_block_8x4(blocks+0*64 + 4*8, data + 16, stride<<1); + put_block_8x4(blocks+1*64, data + 8, stride<<1); + put_block_8x4(blocks+1*64 + 4*8, data + 24, stride<<1); + put_block_8x4(blocks+2*64, data + stride, stride<<1); + put_block_8x4(blocks+2*64 + 4*8, data + 16 + stride, stride<<1); + put_block_8x4(blocks+3*64, data + 8 + stride, stride<<1); + put_block_8x4(blocks+3*64 + 4*8, data + 24 + stride, stride<<1); +} + /* mb_x and mb_y are in units of 8 pixels */ static int dv_decode_video_segment(AVCodecContext *avctx, void *arg) { @@ -443,14 +483,18 @@ retry: } y_ptr = s->frame->data[0] + ((mb_y * s->frame->linesize[0] + mb_x) << log2_blocksize); - linesize = s->frame->linesize[0] << is_field_mode[mb_index]; - mb[0].idct_put(y_ptr, linesize, block + 0 * 64); - if (s->sys->video_stype == 4) { /* SD 422 */ - mb[2].idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 2 * 64); + if (mb_y == 134 && is_field_mode[mb_index]) { + dv100_idct_put_last_row_field_luma(s, y_ptr, s->frame->linesize[0], block); } else { - mb[1].idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 1 * 64); - mb[2].idct_put(y_ptr + y_stride, linesize, block + 2 * 64); - mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3 * 64); + linesize = s->frame->linesize[0] << is_field_mode[mb_index]; + mb[0].idct_put(y_ptr, linesize, block + 0 * 64); + if (s->sys->video_stype == 4) { /* SD 422 */ + mb[2].idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 2 * 64); + } else { + mb[1].idct_put(y_ptr + (1 << log2_blocksize), linesize, block + 1 * 64); + mb[2].idct_put(y_ptr + y_stride, linesize, block + 2 * 64); + mb[3].idct_put(y_ptr + (1 << log2_blocksize) + y_stride, linesize, block + 3 * 64); + } } mb += 4; block += 4 * 64; @@ -478,13 +522,19 @@ retry: mb++; } else { y_stride = (mb_y == 134) ? (1 << log2_blocksize) : - s->frame->linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize); - linesize = s->frame->linesize[j] << is_field_mode[mb_index]; - (mb++)->idct_put(c_ptr, linesize, block); - block += 64; - if (s->sys->bpm == 8) { - (mb++)->idct_put(c_ptr + y_stride, linesize, block); + s->frame->linesize[j] << ((!is_field_mode[mb_index]) * log2_blocksize); + if (mb_y == 134 && is_field_mode[mb_index]) { + dv100_idct_put_last_row_field_chroma(s, c_ptr, s->frame->linesize[j], block); + mb += 2; + block += 2*64; + } else { + linesize = s->frame->linesize[j] << is_field_mode[mb_index]; + (mb++)->idct_put(c_ptr, linesize, block); block += 64; + if (s->sys->bpm == 8) { + (mb++)->idct_put(c_ptr + y_stride, linesize, block); + block += 64; + } } } }