From patchwork Sat Jan 30 09:19:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Gisquet X-Patchwork-Id: 25272 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 5992E44B489 for ; Sat, 30 Jan 2021 11:20:27 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 33F0E6891F1; Sat, 30 Jan 2021 11:20:27 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D9F74688104 for ; Sat, 30 Jan 2021 11:20:20 +0200 (EET) Received: by mail-wr1-f54.google.com with SMTP id q7so11163419wre.13 for ; Sat, 30 Jan 2021 01:20:20 -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=2SofKRLXs3ghLoKK58NwVVXOpm0/wmnKtTLgHTp8mKg=; b=htO83+7TdK8uQxoOuAD8LGEZT9Nfb/jWlIGtf9IuYm2DoLyr46Jxy91NTdk6Yy4dlN /evznogGSjc1qwVYv17tPgC3cwvOjq9mLlcYkP1ft7w8uDxj/ZtqOb3h0SfpjTNq2yu7 kD2UjE/Vvm5/T2aD4nZzvkJ+rDeOhKQhxNxOMtxpjB8UwfiSjXV5y9cR0VDi35vt9RmU GYNE5g+mxHb1UGMuW3j5USOXM+7DtmqVN815FELhOYEihA8TdCw6nG1TpIR3QlfcwpqZ oBB9t2AiMvMAE2bb7HvkgYnXAIldQ0dJ+uiUrwWX/QAsiLxXxqsBkNhJvhm8tSMF+YV/ Y/Qw== 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=2SofKRLXs3ghLoKK58NwVVXOpm0/wmnKtTLgHTp8mKg=; b=DWeN3G+FahuSBkkxG6Nq9nI7+M2p5KDW56hk/aSAlq997O4f5GPo42UU0xkZ+wTZiR DIMDPxWDVE5k3PkVMGCkb42N2j0rQhsdrHG+4BDnRkizJW6GEYZrNlgLKg8UKIrmIiJR AjWDtSV/d9aL2LP8R+tGg8PM122QCfijN23rSdgYcQ06E/ecx2xKPZXhK1sj5+tCNEQo bTtbXUs393SOF0WGI7o/OE3IlDd3gQiwd2/Qm+ZLMzZf7eUDhukp/rAMNYkCkQRa1nL+ X9FIDD6zZVHdluOUIn6GvUdBIn4I2l05PsRyh9n2/pYJuTrOhNi3x7YXqkRJiLD8f9xa na2w== X-Gm-Message-State: AOAM533qhIqQb5stPFwHRsQal+I9cowvrIxb9KX+YREkL0Sb1NZgnULr pNVUFtdOLR8S2NqIMPSww7N4tPd+fw== X-Google-Smtp-Source: ABdhPJwkx1Y1tstprI9OSo7OAIG6SpJksw405iCFswtG6uQkT5uGl4v5tDrP+q/NoB5SdlYRyUIUFQ== X-Received: by 2002:a5d:4443:: with SMTP id x3mr8970322wrr.409.1611998420422; Sat, 30 Jan 2021 01:20:20 -0800 (PST) Received: from localhost.localdomain (lfbn-ren-1-785-160.w83-197.abo.wanadoo.fr. [83.197.112.160]) by smtp.gmail.com with ESMTPSA id w14sm16657582wro.86.2021.01.30.01.20.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Jan 2021 01:20:19 -0800 (PST) From: Christophe Gisquet To: ffmpeg-devel@ffmpeg.org Date: Sat, 30 Jan 2021 09:19:03 +0000 Message-Id: <20210130091906.312-2-christophe.gisquet@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210130091906.312-1-christophe.gisquet@gmail.com> References: <20210130091906.312-1-christophe.gisquet@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] lav/dnxhd: better support 4:2:0 in DNXHR profiles 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" From: Christophe Gisquet Where they are allowed. No validation of profile + colorformat is performed, however. --- libavcodec/dnxhddec.c | 55 +++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c index c78d55aee5..359588f963 100644 --- a/libavcodec/dnxhddec.c +++ b/libavcodec/dnxhddec.c @@ -49,6 +49,13 @@ typedef struct RowContext { int format; } RowContext; +typedef enum { + DNX_CHROMAFORMAT_422 = 0, + DNX_CHROMAFORMAT_420 = 1, + DNX_CHROMAFORMAT_444 = 2, + DNX_CHROMAFORMAT_UNKNOWN = 3, +} DNXChromaFormat; + typedef struct DNXHDContext { AVCodecContext *avctx; RowContext *rows; @@ -67,7 +74,7 @@ typedef struct DNXHDContext { ScanTable scantable; const CIDEntry *cid_table; int bit_depth; // 8, 10, 12 or 0 if not initialized at all. - int is_444; + int chromafmt; int alpha; int lla; int mbaff; @@ -168,6 +175,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, const uint8_t *buf, int buf_size, int first_field) { + static const char* cfname[4] = { "4:2:2", "4:2:0", "4:4:4", "Unknown" }; int i, cid, ret; int old_bit_depth = ctx->bit_depth, bitdepth; uint64_t header_prefix; @@ -234,8 +242,8 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, av_log(ctx->avctx, AV_LOG_WARNING, "Adaptive color transform in an unsupported profile.\n"); - ctx->is_444 = (buf[0x2C] >> 6) & 1; - if (ctx->is_444) { + ctx->chromafmt = (buf[0x2C] >> 5) & 3; + if (ctx->chromafmt == DNX_CHROMAFORMAT_444) { if (bitdepth == 8) { avpriv_request_sample(ctx->avctx, "4:4:4 8 bits"); return AVERROR_INVALIDDATA; @@ -250,16 +258,16 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, } } else if (bitdepth == 12) { ctx->decode_dct_block = dnxhd_decode_dct_block_12; - ctx->pix_fmt = AV_PIX_FMT_YUV422P12; + ctx->pix_fmt = ctx->chromafmt == DNX_CHROMAFORMAT_420 ? AV_PIX_FMT_YUV420P12 : AV_PIX_FMT_YUV422P12; } else if (bitdepth == 10) { if (ctx->avctx->profile == FF_PROFILE_DNXHR_HQX) ctx->decode_dct_block = dnxhd_decode_dct_block_10_444; else ctx->decode_dct_block = dnxhd_decode_dct_block_10; - ctx->pix_fmt = AV_PIX_FMT_YUV422P10; + ctx->pix_fmt = ctx->chromafmt == DNX_CHROMAFORMAT_420 ? AV_PIX_FMT_YUV420P10 : AV_PIX_FMT_YUV422P10; } else { ctx->decode_dct_block = dnxhd_decode_dct_block_8; - ctx->pix_fmt = AV_PIX_FMT_YUV422P; + ctx->pix_fmt = ctx->chromafmt == DNX_CHROMAFORMAT_420 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUV422P; } ctx->avctx->bits_per_raw_sample = ctx->bit_depth = bitdepth; @@ -292,8 +300,8 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, if ((ctx->height + 15) >> 4 == ctx->mb_height && frame->interlaced_frame) ctx->height <<= 1; - av_log(ctx->avctx, AV_LOG_VERBOSE, "%dx%d, 4:%s %d bits, MBAFF=%d ACT=%d\n", - ctx->width, ctx->height, ctx->is_444 ? "4:4" : "2:2", + av_log(ctx->avctx, AV_LOG_VERBOSE, "%dx%d, %s %d bits, MBAFF=%d ACT=%d\n", + ctx->width, ctx->height, cfname[ctx->chromafmt], ctx->bit_depth, ctx->mbaff, ctx->act); // Newer format supports variable mb_scan_index sizes @@ -360,7 +368,7 @@ static av_always_inline int dnxhd_decode_dct_block(const DNXHDContext *ctx, ctx->bdsp.clear_block(block); - if (!ctx->is_444) { + if (ctx->chromafmt != DNX_CHROMAFORMAT_444) { if (n & 2) { component = 1 + (n & 1); scale = row->chroma_scale; @@ -478,6 +486,9 @@ static int dnxhd_decode_dct_block_12_444(const DNXHDContext *ctx, static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, AVFrame *frame, int x, int y) { + static const char yoff[4] = { 1, 0, 1, 0 }; + static const char xoff[4] = { 0, 0, 1, 0 }; + static const uint8_t num_blocks[4] = { 8, 6, 12, 0 }; int shift1 = ctx->bit_depth >= 10; int dct_linesize_luma = frame->linesize[0]; int dct_linesize_chroma = frame->linesize[1]; @@ -516,7 +527,7 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, row->last_qscale = qscale; } - for (i = 0; i < 8 + 4 * ctx->is_444; i++) { + for (i = 0; i < num_blocks[ctx->chromafmt]; i++) { if (ctx->decode_dct_block(ctx, row, i) < 0) return AVERROR_INVALIDDATA; } @@ -526,9 +537,9 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, dct_linesize_chroma <<= 1; } - dest_y = frame->data[0] + ((y * dct_linesize_luma) << 4) + (x << (4 + shift1)); - dest_u = frame->data[1] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->is_444)); - dest_v = frame->data[2] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->is_444)); + dest_y = frame->data[0] + ((y * dct_linesize_luma) << 4) + (x << (4 + shift1)); + dest_u = frame->data[1] + ((y * dct_linesize_chroma) << (3 + yoff[ctx->chromafmt])) + (x << (3 + shift1 + xoff[ctx->chromafmt])); + dest_v = frame->data[2] + ((y * dct_linesize_chroma) << (3 + yoff[ctx->chromafmt])) + (x << (3 + shift1 + xoff[ctx->chromafmt])); if (frame->interlaced_frame && ctx->cur_field) { dest_y += frame->linesize[0]; @@ -542,7 +553,8 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, dct_y_offset = interlaced_mb ? frame->linesize[0] : (dct_linesize_luma << 3); dct_x_offset = 8 << shift1; - if (!ctx->is_444) { + switch (ctx->chromafmt) { + case DNX_CHROMAFORMAT_422: ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]); ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]); ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[4]); @@ -555,7 +567,8 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, row->blocks[6]); ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, row->blocks[7]); } - } else { + break; + case DNX_CHROMAFORMAT_444: ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]); ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]); ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[6]); @@ -572,6 +585,18 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, row->blocks[10]); ctx->idsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, row->blocks[11]); } + break; + case DNX_CHROMAFORMAT_420: + ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]); + ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]); + ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[4]); + ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[5]); + + if (!(ctx->avctx->flags & AV_CODEC_FLAG_GRAY)) { + ctx->idsp.idct_put(dest_u, dct_linesize_chroma, row->blocks[2]); + ctx->idsp.idct_put(dest_v, dct_linesize_chroma, row->blocks[3]); + } + break; } return 0; From patchwork Sat Jan 30 09:19:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Gisquet X-Patchwork-Id: 25274 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 350D244B489 for ; Sat, 30 Jan 2021 11:20:31 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 24A6268A78A; Sat, 30 Jan 2021 11:20:31 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 99141688104 for ; Sat, 30 Jan 2021 11:20:21 +0200 (EET) Received: by mail-wr1-f44.google.com with SMTP id c4so8487275wru.9 for ; Sat, 30 Jan 2021 01:20:21 -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=OkJDgYjHvMSMIxLggofJgLb8Ixk0Bbyzp0QOqj7jlPw=; b=Y4A96SQAqakrWwYABpwdOqYfEQoaEKnY19M73dcGjjN/qw9e06wMwbXA7c2Vsvt0Pp KVvDyCUfLxsi8hCQ7UcdHywsUmHBt3/w7qM/xqyMuFfnmxnUz7VS/Fvjg4YOg1jB2tse HxkTwhN1mNpxR5lT6UejPHw/tJ/kB+MNuYzwEBvQn9wmSFQK2ea5w+SS/2kSHSsi5cD7 eqDrRoNBsPXLIttjK/kUSY7k/crvIcolAztbjs/6UZe11xbnXc/S8L6yFNOAyFJ+nl+S HuKO/kny4t6N0o/fDlmMmPUgz5zpmEmmsaRGL4Y1/3qXAjrnuBeiXPV1NGpcMW63MYyw aVbA== 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=OkJDgYjHvMSMIxLggofJgLb8Ixk0Bbyzp0QOqj7jlPw=; b=gDEplL3FC+Q0T3QAwVYxHIGlJGsXrB9SERSNDCEmV1lK5KXFSJ0IjpWj/3Nl/+Cgf/ H4AGzBmNL/RfeQXaBMeLTkfJoSO6oV8UX+FZFHf/cZ10Q8sTVXqZkyLhZs85w2ZD8N3U Ws+n/DSNGzvqaUoHeKB3uX9tNuTx/1cvV3XtZEzT0Lm4YMIPoBcol6i1Ndtix08WI5vd lb0fWGNi/pYHEzk2aMqeQpeIHeARaFTrSwwKducO58kHDVg6ZGJI/IRx9kazFvHqr7sA bBMF5x7MKOhhjXx7PgE+KlBuqmtlKwcwSVoIwR+sB15gf4PFrFTYpduihBjCLFnRgAE5 G2Yg== X-Gm-Message-State: AOAM532oS47UOdO5Y1iTlSdq1YryVp/O5ErBVfI6rHU//1GM9kwPifQS fX4w/S4Bv9qtb7Zrc+FVpwtEL3oQIg== X-Google-Smtp-Source: ABdhPJwCQBMPCIaQtzf4RejXo7f18y6hps8+FpTHYM9+rulNND0kAl/19hsjDyILWC94VkyMP1iT4Q== X-Received: by 2002:a5d:5502:: with SMTP id b2mr8739659wrv.245.1611998421139; Sat, 30 Jan 2021 01:20:21 -0800 (PST) Received: from localhost.localdomain (lfbn-ren-1-785-160.w83-197.abo.wanadoo.fr. [83.197.112.160]) by smtp.gmail.com with ESMTPSA id w14sm16657582wro.86.2021.01.30.01.20.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Jan 2021 01:20:20 -0800 (PST) From: Christophe Gisquet To: ffmpeg-devel@ffmpeg.org Date: Sat, 30 Jan 2021 09:19:04 +0000 Message-Id: <20210130091906.312-3-christophe.gisquet@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210130091906.312-1-christophe.gisquet@gmail.com> References: <20210130091906.312-1-christophe.gisquet@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/4] lav/dnxhd: CID 1256 is RGB, not BGR or YUV444 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" From: Christophe Gisquet Fix the logic around checking the ACT flag per MB and row. This also requires adding a 444 path to swap channels into the ffmpeg formats, as they are GBR, and not RGB. --- libavcodec/dnxhddec.c | 64 +++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c index 359588f963..11da1c286c 100644 --- a/libavcodec/dnxhddec.c +++ b/libavcodec/dnxhddec.c @@ -249,12 +249,10 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, return AVERROR_INVALIDDATA; } else if (bitdepth == 10) { ctx->decode_dct_block = dnxhd_decode_dct_block_10_444; - ctx->pix_fmt = ctx->act ? AV_PIX_FMT_YUV444P10 - : AV_PIX_FMT_GBRP10; + ctx->pix_fmt = ctx->act ? AV_PIX_FMT_GBRP10 : AV_PIX_FMT_YUV444P10; } else { ctx->decode_dct_block = dnxhd_decode_dct_block_12_444; - ctx->pix_fmt = ctx->act ? AV_PIX_FMT_YUV444P12 - : AV_PIX_FMT_GBRP12; + ctx->pix_fmt = ctx->act ? AV_PIX_FMT_GBRP12 : AV_PIX_FMT_YUV444P12; } } else if (bitdepth == 12) { ctx->decode_dct_block = dnxhd_decode_dct_block_12; @@ -504,19 +502,19 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, qscale = get_bits(&row->gb, 11); } act = get_bits1(&row->gb); - if (act) { - if (!ctx->act) { - static int act_warned; - if (!act_warned) { - act_warned = 1; - av_log(ctx->avctx, AV_LOG_ERROR, - "ACT flag set, in violation of frame header.\n"); - } - } else if (row->format == -1) { + if (ctx->act) { + if (row->format == -1) { row->format = act; } else if (row->format != act) { row->format = 2; // Variable } + } else if (act) { + static int act_warned; + if (!act_warned) { + act_warned = 1; + av_log(ctx->avctx, AV_LOG_ERROR, + "ACT flag set, in violation of frame header.\n"); + } } if (qscale != row->last_qscale) { @@ -569,6 +567,21 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, } break; case DNX_CHROMAFORMAT_444: + if (ctx->avctx->profile == FF_PROFILE_DNXHD) { + ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[2]); + ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[3]); + ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[8]); + ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[9]); + + ctx->idsp.idct_put(dest_u, dct_linesize_luma, row->blocks[4]); + ctx->idsp.idct_put(dest_u + dct_x_offset, dct_linesize_luma, row->blocks[5]); + ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_luma, row->blocks[10]); + ctx->idsp.idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[11]); + ctx->idsp.idct_put(dest_v, dct_linesize_luma, row->blocks[0]); + ctx->idsp.idct_put(dest_v + dct_x_offset, dct_linesize_luma, row->blocks[1]); + ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_luma, row->blocks[6]); + ctx->idsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[7]); + } else { ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]); ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]); ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[6]); @@ -585,6 +598,7 @@ static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, row->blocks[10]); ctx->idsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, row->blocks[11]); } + } break; case DNX_CHROMAFORMAT_420: ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]); @@ -610,6 +624,8 @@ static int dnxhd_decode_row(AVCodecContext *avctx, void *data, RowContext *row = ctx->rows + threadnb; int x, ret; + row->format = -1; + row->last_dc[0] = row->last_dc[1] = row->last_dc[2] = 1 << (ctx->bit_depth + 2); // for levels +2^(bitdepth-1) @@ -694,14 +710,21 @@ decode_coding_unit: static int act_warned; int format = ctx->rows[0].format; for (i = 1; i < avctx->thread_count; i++) { - if (ctx->rows[i].format != format && - ctx->rows[i].format != -1 /* not run */) { + if (ctx->rows[i].format == -1) + continue; + if (format == -1) { + format = ctx->rows[i].format; + continue; + } + if (ctx->rows[i].format != format) { + av_log(ctx->avctx, AV_LOG_ERROR, + "Format changed from %d to %d.\n", format, ctx->rows[i].format); format = 2; break; } } + switch (format) { - case -1: case 2: if (!act_warned) { act_warned = 1; @@ -709,6 +732,7 @@ decode_coding_unit: "Unsupported: variable ACT flag.\n"); } break; + case -1: case 0: ctx->pix_fmt = ctx->bit_depth==10 ? AV_PIX_FMT_GBRP10 : AV_PIX_FMT_GBRP12; @@ -719,12 +743,18 @@ decode_coding_unit: break; } } - avctx->pix_fmt = ctx->pix_fmt; if (ret) { av_log(ctx->avctx, AV_LOG_ERROR, "%d lines with errors\n", ret); return AVERROR_INVALIDDATA; } + if (avctx->pix_fmt != ctx->pix_fmt) { + picture->format = avctx->pix_fmt = ctx->pix_fmt; + ret = ff_set_dimensions(avctx, ctx->width, ctx->height); + if (ret < 0) + return ret; + } + *got_frame = 1; return avpkt->size; } From patchwork Sat Jan 30 09:19:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Gisquet X-Patchwork-Id: 25275 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 3EBBB44B489 for ; Sat, 30 Jan 2021 11:20:32 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 217BE68A78B; Sat, 30 Jan 2021 11:20:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 405F36897C2 for ; Sat, 30 Jan 2021 11:20:22 +0200 (EET) Received: by mail-wr1-f54.google.com with SMTP id q7so11163445wre.13 for ; Sat, 30 Jan 2021 01:20:22 -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=LgsacMBaHtU+zUsjM56m1uaW6WGB8iMhrTj6LLyXgJY=; b=i0nPzzjU7OKOV2NmAEecg6NS1vzDBEjY5YSqsYnI7lyu3h6kSPv2EmcfkNKF+HRCEQ Y+PGxLxmFDpprHwAIDYr7sEMakJzme4GBRZTdM4jk2OrZnmHU422jAApDSCPeKFqw/7M e3VsKsgXMyFc5cxhdTGT1Xk8W4tKPJdgbhFpSKI5I72fq5g/115P97Cusk0FLZ+4b+Qj ZdjDKHlOKkV7vejrrO8VRYqtEcFZRJlszMez1WI+OHteuvo0kAxOuGWQWepAZih94EW4 wVHaiBXwCeR6thm3b6WmFtcMDOH5E7iMxDaDIn7O94jdPMsYm+tmXbizGuyJDEOajKdr eI/w== 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=LgsacMBaHtU+zUsjM56m1uaW6WGB8iMhrTj6LLyXgJY=; b=sHp21cNGY1ba2MYq2B8KaQmWKVVXGVX8Ihr3ln5eC35jRjd1TACcdSMLGlepgtHoy5 7ywXXXWZs3R4xu9wgweFKFavdCVWewNvHnTkd2CG+QLhHFXBzTCQHqDD9Ghf+W/dSjyH n8rkkkzrXwCw1CGwDv2NGXQHLkm2K1bGwuyYuDsIdtpQlnbPGG9bOEQt5kB7Np1E9h8l igqtNlI3f5hN80k1bQzxBASdcFguK3/YzAq0Ft5Aaw1wyGYPk1vjfIGraGadnqJ25CH3 UJZqNatXf/TMSrJHzYK7i0FnEADa65e6ZOYlzL7Z2vXKh/l8mHdsoYdvAqCrIFgye2JS 5oNA== X-Gm-Message-State: AOAM532KjyItwxb5EEeWEd2jC9Ai8kpxpp+cQnqlon+eUegntQBsTDq9 Mg7ymlOHB83Ip4QRaZM+3zymcaSwZA== X-Google-Smtp-Source: ABdhPJx8qzKx0M3x2Dess0P4qkr0F15xTwe9ILyKhIodcQmsJwyfbXaMtD7zbzTugr1KQyhBmeD/Gg== X-Received: by 2002:a5d:4574:: with SMTP id a20mr8438141wrc.201.1611998421692; Sat, 30 Jan 2021 01:20:21 -0800 (PST) Received: from localhost.localdomain (lfbn-ren-1-785-160.w83-197.abo.wanadoo.fr. [83.197.112.160]) by smtp.gmail.com with ESMTPSA id w14sm16657582wro.86.2021.01.30.01.20.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Jan 2021 01:20:21 -0800 (PST) From: Christophe Gisquet To: ffmpeg-devel@ffmpeg.org Date: Sat, 30 Jan 2021 09:19:05 +0000 Message-Id: <20210130091906.312-4-christophe.gisquet@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210130091906.312-1-christophe.gisquet@gmail.com> References: <20210130091906.312-1-christophe.gisquet@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] dnxhd: add partial alpha support for parsing 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" From: Christophe Gisquet This multiplies the framesize by 1.5 when there is alpha, for the CIDs allowing alpha. In addition, a new header is checked, because the alpha marking seems to be different. --- libavcodec/dnxhd_parser.c | 7 ++++--- libavcodec/dnxhddata.c | 17 ++++++++++++----- libavcodec/dnxhddata.h | 6 ++++-- libavcodec/dnxhdenc.c | 2 +- libavformat/mxfenc.c | 7 ++++--- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/libavcodec/dnxhd_parser.c b/libavcodec/dnxhd_parser.c index 63b4ff89e1..726fb2f5de 100644 --- a/libavcodec/dnxhd_parser.c +++ b/libavcodec/dnxhd_parser.c @@ -31,7 +31,7 @@ typedef struct { ParseContext pc; int cur_byte; int remaining; - int w, h; + int w, h, alpha; } DNXHDParserContext; static int dnxhd_find_frame_end(DNXHDParserContext *dctx, @@ -58,6 +58,7 @@ static int dnxhd_find_frame_end(DNXHDParserContext *dctx, if (pic_found && !dctx->remaining) { if (!buf_size) /* EOF considered as end of frame */ return 0; + dctx->alpha = (state >> 8) & 5; for (; i < buf_size; i++) { dctx->cur_byte++; state = (state << 8) | buf[i]; @@ -73,9 +74,9 @@ static int dnxhd_find_frame_end(DNXHDParserContext *dctx, if (cid <= 0) continue; - remaining = avpriv_dnxhd_get_frame_size(cid); + remaining = avpriv_dnxhd_get_frame_size(cid, dctx->alpha); if (remaining <= 0) { - remaining = avpriv_dnxhd_get_hr_frame_size(cid, dctx->w, dctx->h); + remaining = avpriv_dnxhd_get_hr_frame_size(cid, dctx->w, dctx->h, dctx->alpha); if (remaining <= 0) continue; } diff --git a/libavcodec/dnxhddata.c b/libavcodec/dnxhddata.c index 3a69a0f501..54663aa432 100644 --- a/libavcodec/dnxhddata.c +++ b/libavcodec/dnxhddata.c @@ -1083,15 +1083,19 @@ const CIDEntry *ff_dnxhd_get_cid_table(int cid) return NULL; } -int avpriv_dnxhd_get_frame_size(int cid) +int avpriv_dnxhd_get_frame_size(int cid, int alpha) { const CIDEntry *entry = ff_dnxhd_get_cid_table(cid); + int result; if (!entry) return -1; - return entry->frame_size; + result = entry->frame_size; + if (alpha && (entry->flags & DNXHD_444)) + result = (result * 3) >> 1; + return result; } -int avpriv_dnxhd_get_hr_frame_size(int cid, int w, int h) +int avpriv_dnxhd_get_hr_frame_size(int cid, int w, int h, int alpha) { const CIDEntry *entry = ff_dnxhd_get_cid_table(cid); int result; @@ -1099,8 +1103,11 @@ int avpriv_dnxhd_get_hr_frame_size(int cid, int w, int h) if (!entry) return -1; - result = ((h + 15) / 16) * ((w + 15) / 16) * (int64_t)entry->packet_scale.num / entry->packet_scale.den; - result = (result + 2048) / 4096 * 4096; + result = AV_CEIL_RSHIFT(h, 4) * AV_CEIL_RSHIFT(w, 4) + * (int64_t)entry->packet_scale.num / entry->packet_scale.den; + if (alpha && (entry->flags & DNXHD_444)) + result = (result * 3) >> 1; + result = (result + 2048) & -4096; return FFMAX(result, 8192); } diff --git a/libavcodec/dnxhddata.h b/libavcodec/dnxhddata.h index 898079cffc..21738af453 100644 --- a/libavcodec/dnxhddata.h +++ b/libavcodec/dnxhddata.h @@ -35,6 +35,7 @@ /** Frame headers, extra 0x00 added to end for parser */ #define DNXHD_HEADER_INITIAL 0x000002800100 #define DNXHD_HEADER_444 0x000002800200 +#define DNXHD_HEADER_RGBA 0x000002800400 /** Indicate that a CIDEntry value must be read in the bitstream */ #define DNXHD_VARIABLE 0 @@ -76,6 +77,7 @@ static av_always_inline uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix) { if (prefix == DNXHD_HEADER_INITIAL || prefix == DNXHD_HEADER_444 || + prefix == DNXHD_HEADER_RGBA || ff_dnxhd_check_header_prefix_hr(prefix)) return prefix; return 0; @@ -88,8 +90,8 @@ static av_always_inline uint64_t ff_dnxhd_parse_header_prefix(const uint8_t *buf return ff_dnxhd_check_header_prefix(prefix); } -int avpriv_dnxhd_get_frame_size(int cid); -int avpriv_dnxhd_get_hr_frame_size(int cid, int w, int h); +int avpriv_dnxhd_get_frame_size(int cid, int alpha); +int avpriv_dnxhd_get_hr_frame_size(int cid, int w, int h, int alpha); int avpriv_dnxhd_get_interlaced(int cid); #endif /* AVCODEC_DNXHDDATA_H */ diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c index 2461c51727..fb059060aa 100644 --- a/libavcodec/dnxhdenc.c +++ b/libavcodec/dnxhdenc.c @@ -467,7 +467,7 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx) if (ctx->cid_table->frame_size == DNXHD_VARIABLE) { ctx->frame_size = avpriv_dnxhd_get_hr_frame_size(ctx->cid, - avctx->width, avctx->height); + avctx->width, avctx->height, 0); av_assert0(ctx->frame_size >= 0); ctx->coding_unit_size = ctx->frame_size; } else { diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index 0c464d4cfd..653060ae75 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -2025,7 +2025,7 @@ static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt { MXFContext *mxf = s->priv_data; MXFStreamContext *sc = st->priv_data; - int i, cid, frame_size = 0; + int i, alpha, cid, frame_size = 0; if (mxf->header_written) return 1; @@ -2034,6 +2034,7 @@ static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt return 0; sc->codec_ul = NULL; + alpha = pkt->data[0x7] & 1; cid = AV_RB32(pkt->data + 0x28); for (i = 0; i < FF_ARRAY_ELEMS(mxf_dnxhd_codec_uls); i++) { if (cid == mxf_dnxhd_codec_uls[i].cid) { @@ -2053,8 +2054,8 @@ static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st, AVPacket *pkt if (!sc->component_depth) return 0; - if ((frame_size = avpriv_dnxhd_get_frame_size(cid)) == DNXHD_VARIABLE) { - frame_size = avpriv_dnxhd_get_hr_frame_size(cid, st->codecpar->width, st->codecpar->height); + if ((frame_size = avpriv_dnxhd_get_frame_size(cid, alpha)) == DNXHD_VARIABLE) { + frame_size = avpriv_dnxhd_get_hr_frame_size(cid, st->codecpar->width, st->codecpar->height, alpha); } if (frame_size < 0) return 0; From patchwork Sat Jan 30 09:19:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Gisquet X-Patchwork-Id: 25276 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 AB8D044B05A for ; Sat, 30 Jan 2021 12:18:33 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 87B6468A6F0; Sat, 30 Jan 2021 12:18:33 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EED866880C4 for ; Sat, 30 Jan 2021 12:18:26 +0200 (EET) Received: by mail-wr1-f50.google.com with SMTP id 7so11320135wrz.0 for ; Sat, 30 Jan 2021 02:18:26 -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=KEI6wcI/cwp9F2ZWMN/xS+UXmxuwcbkUgvW12kd/aFM=; b=LOfK9EcCQRntdZnCj14b+C0OsyScS2imwVZ6IjSFMfzzpU5adHaMny5U8vJ0tZEWMy Kof5QFRNWI5181m7lqzxaf2vRdx9Tt+4d17yj3q4L79X10P7ymEzcWjPzyMPgmmOk/oL IjOP29a7gQr7N90eeJ1rf3tNZ7a1JCM9JNp987ZKfNXGJWfqZzn7Dy+kSZYHijp9wnyJ ZRJjEpnh9ybl59T5apQlAgO+5TRH0OUp6QUAnHIi6mvnzHcUshwSylwDjPkgSfbHQGqi dvL2a74WY8Z9jKvKQfcIK+hAISv0niaTN3eFCod7Ef3xu/xQnG3knH7pZ7Az2zVPphZ7 NUag== 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=KEI6wcI/cwp9F2ZWMN/xS+UXmxuwcbkUgvW12kd/aFM=; b=lgcWwrVlUSsJGeVhwYd2sWWXanccSpWjNKWPJYOJa+C0TWmacPMzaKf1FFI0ouH74X TBsUFVN2ou4rbwH5NJxPmFAbaqD16sBZvMaL3WHBuLcKyookfU5p2dQZtasw4/Sq0Rv8 hyia3KxuLwNE08SN7zjJxClME8NtGibKQg8xo52ccYqLnIBAQ4E4CDpssPEqy/+Cl24m 3VtcdcE13udkX3b0RiTURHzAhDsnIhL6UfSOQ5ujEl6AIECDS9vGRSVC4s/8jFnCR06g E4Il+ITzr+g0sQ8EPwSRWdVxZevADcie8LL2cH3R7vlc7kI7+k+4l+qTnEC6YkVtAMlT 4NQg== X-Gm-Message-State: AOAM531hsdtp4LC1QAt79OAtQmYbvJcmrF15Ruc15a8TlXSftXuBO8l/ oR5zAL8UbvpsBETyNg7tiLo7MzTaDg== X-Google-Smtp-Source: ABdhPJwXFOw3be1NWBrpPebVNl+sqmIVjL1sgeD2ApzgEVnM7dUuZpGrjj53pFfAibVCRf4aLTMtGQ== X-Received: by 2002:a05:6000:1543:: with SMTP id 3mr8799203wry.254.1611998422324; Sat, 30 Jan 2021 01:20:22 -0800 (PST) Received: from localhost.localdomain (lfbn-ren-1-785-160.w83-197.abo.wanadoo.fr. [83.197.112.160]) by smtp.gmail.com with ESMTPSA id w14sm16657582wro.86.2021.01.30.01.20.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Jan 2021 01:20:21 -0800 (PST) From: Christophe Gisquet To: ffmpeg-devel@ffmpeg.org Date: Sat, 30 Jan 2021 09:19:06 +0000 Message-Id: <20210130091906.312-5-christophe.gisquet@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210130091906.312-1-christophe.gisquet@gmail.com> References: <20210130091906.312-1-christophe.gisquet@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] dnxhddec: partial alpha support 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" From: Christophe Gisquet This consists in just ignoring the alpha at the end of the bitstream --- libavcodec/dnxhddec.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c index 11da1c286c..1de95996cf 100644 --- a/libavcodec/dnxhddec.c +++ b/libavcodec/dnxhddec.c @@ -202,7 +202,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, ctx->cur_field = 0; } ctx->mbaff = (buf[0x6] >> 5) & 1; - ctx->alpha = buf[0x7] & 1; + ctx->alpha = buf[0x7] & 5; ctx->lla = (buf[0x7] >> 1) & 1; if (ctx->alpha) avpriv_request_sample(ctx->avctx, "alpha"); @@ -249,10 +249,14 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, return AVERROR_INVALIDDATA; } else if (bitdepth == 10) { ctx->decode_dct_block = dnxhd_decode_dct_block_10_444; - ctx->pix_fmt = ctx->act ? AV_PIX_FMT_GBRP10 : AV_PIX_FMT_YUV444P10; + ctx->pix_fmt = ctx->act + ? (/*ctx->alpha ? AV_PIX_FMT_GBRAP10LE :*/ AV_PIX_FMT_GBRP10) + : (/*ctx->alpha ? AV_PIX_FMT_YUVA444P10LE :*/ AV_PIX_FMT_YUV444P10); } else { ctx->decode_dct_block = dnxhd_decode_dct_block_12_444; - ctx->pix_fmt = ctx->act ? AV_PIX_FMT_GBRP12 : AV_PIX_FMT_YUV444P12; + ctx->pix_fmt = ctx->act + ? (/*ctx->alpha ? AV_PIX_FMT_GBRAP12LE :*/ AV_PIX_FMT_GBRP12) + : (/*ctx->alpha ? AV_PIX_FMT_YUVA444P12LE :*/ AV_PIX_FMT_YUV444P12); } } else if (bitdepth == 12) { ctx->decode_dct_block = dnxhd_decode_dct_block_12; @@ -337,7 +341,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, i, 0x170 + (i << 2), ctx->mb_scan_index[i]); if (buf_size - ctx->data_offset < ctx->mb_scan_index[i]) { av_log(ctx->avctx, AV_LOG_ERROR, - "invalid mb scan index (%"PRIu32" vs %u).\n", + "invalid mb %i scan index (%"PRIu32" vs %u).\n", i, ctx->mb_scan_index[i], buf_size - ctx->data_offset); return AVERROR_INVALIDDATA; } @@ -642,6 +646,12 @@ static int dnxhd_decode_row(AVCodecContext *avctx, void *data, } } + /* alpha decoding goes there */ + if (ctx->alpha) { + ff_dlog(ctx->avctx, "Row %d: %d left\n", rownb, + ((rownb < ctx->mb_height-1 ? ctx->mb_scan_index[rownb+1] : ctx->buf_size) - offset) * 8 - get_bits_count(&row->gb)); + } + return 0; } @@ -735,11 +745,13 @@ decode_coding_unit: case -1: case 0: ctx->pix_fmt = ctx->bit_depth==10 - ? AV_PIX_FMT_GBRP10 : AV_PIX_FMT_GBRP12; + ? (/*ctx->alpha ? AV_PIX_FMT_GBRAP10 :*/ AV_PIX_FMT_GBRP10) + : (/*ctx->alpha ? AV_PIX_FMT_GBRAP12 :*/ AV_PIX_FMT_GBRP12); break; case 1: ctx->pix_fmt = ctx->bit_depth==10 - ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV444P12; + ? (/*ctx->alpha ? AV_PIX_FMT_YUVA444P10 :*/ AV_PIX_FMT_YUV444P10) + : (/*ctx->alpha ? AV_PIX_FMT_YUVA444P12 :*/ AV_PIX_FMT_YUV444P12); break; } }