From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 18CD4410D5 for ; Sat, 12 Nov 2022 15:33:58 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3AD7668B59A; Sat, 12 Nov 2022 17:33:54 +0200 (EET) Received: from mail-oa1-f41.google.com (mail-oa1-f41.google.com [209.85.160.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BF17368AEFD for ; Sat, 12 Nov 2022 17:33:47 +0200 (EET) Received: by mail-oa1-f41.google.com with SMTP id 586e51a60fabf-13ba86b5ac0so8343925fac.1 for ; Sat, 12 Nov 2022 07:33:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id:from :to:cc:subject:date:message-id:reply-to; bh=U1pKVEhzO18PHQfefBzEtWqlTnaTTPUHdxJWXc7UE50=; b=jaFo9gpY9S1MqRKmO1XtYpTTabypRVOtw2FtgPwZOpjq9DQA8jJShLAV2Ui56aQqiH dgKWKJqZpohPelTb5/bqO0gcRxOyB63lTE45pRddVT5DNpgwWY9zqYT6CB6pArA9QXUy eGa/nAlYFAZESlSsRD2S7K60+ZXULwBXw2EXEaWukovDq+P6pY26srTLrEP/B2shAQGD cHcoB1BkOqRPXjJND+nrPmpb7wWGyQh94+ADepvrBVQx62Rc36EuL7BT9oQUdMFjmRb5 +84Ug1yI4xb97dDFWxgNVHMfOaZwFCq9yJQ+mUsVkpdZ1Jt+4UZA3W9w7fo4Ap9KDnA/ 5t/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:from:content-language :references:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=U1pKVEhzO18PHQfefBzEtWqlTnaTTPUHdxJWXc7UE50=; b=4wzspDNqKv+8GQ7/YRmD3rMNsO0/3wotu4bCKXi7ew4dYMba/Ptr9h+iKI2wJSXLOK 7AqliMhGNoTCG0nfNxiReCefLzkPgxTtqMi9uFJaz6M8vlVXgl45ejzYbcOutv3CNN89 92Ae58sekgpxnp0hAucCchQoBExsnduXZPQb7Bsm7UFTSNjOJ6Orp6iC9NLOFBZf2q28 VcR2N9YRikujLm+8mWCGkcDrM5M5s8KvzyPlGcwZQMLwhYe+V7+M2SLF2wjadmvey+zJ C8rUsIipkfvbRqfWulDUyp9BtI03mGF8blTg3IPm3Eyf2kEBbhyLA1ifTzDFrQ/75tVt rqZQ== X-Gm-Message-State: ANoB5pl4hQqjoN6x/SydIoGx09KiVJEqiNNv6sULFjaZc+RfYiJARpv5 SxttA4XospZ+hjMCRp5vBL0senML3Gs= X-Google-Smtp-Source: AA0mqf51TIUrnyzEfVnem7+s56fcFFQPg3pmomP7x61ON4twaEuhWTo5IIxhI1nE8LOjHK3Q6RymKw== X-Received: by 2002:a05:6870:280c:b0:13d:2a0b:5a50 with SMTP id gz12-20020a056870280c00b0013d2a0b5a50mr3559713oab.57.1668267224762; Sat, 12 Nov 2022 07:33:44 -0800 (PST) Received: from [192.168.0.15] ([181.85.72.69]) by smtp.gmail.com with ESMTPSA id z12-20020a05683010cc00b0066bb73cce68sm2140601oto.69.2022.11.12.07.33.43 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 12 Nov 2022 07:33:44 -0800 (PST) Message-ID: <45c26847-6bb5-21f9-bc48-4ad381d06e1a@gmail.com> Date: Sat, 12 Nov 2022 12:33:59 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 To: ffmpeg-devel@ffmpeg.org References: <1d90cbd18bffe5fc8d99ce361dec253c1728e19d.1668213509.git.pross@xvid.org> Content-Language: en-US From: James Almer In-Reply-To: <1d90cbd18bffe5fc8d99ce361dec253c1728e19d.1668213509.git.pross@xvid.org> Subject: Re: [FFmpeg-devel] [PATCH] avcodec: LEAD MCMP decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 11/11/2022 9:39 PM, Peter Ross wrote: > +static int lead_decode_frame(AVCodecContext *avctx, AVFrame * frame, > + int * got_frame, AVPacket * avpkt) > +{ > + LeadContext *s = avctx->priv_data; > + const uint8_t * buf = avpkt->data; > + int ret, format, yuv20p_half = 0, fields = 1, q, size; > + GetBitContext gb; > + int16_t dc_pred[3] = {0, 0, 0}; > + uint16_t dequant[2][64]; > + > + if (avpkt->size < 8) > + return AVERROR_INVALIDDATA; > + > + format = AV_RL16(buf + 4); > + switch(format) { > + case 0x1000: > + avctx->pix_fmt = AV_PIX_FMT_YUV420P; > + break; > + case 0x2000: > + avctx->pix_fmt = AV_PIX_FMT_YUV444P; > + break; > + case 0x2006: > + avctx->pix_fmt = AV_PIX_FMT_YUV444P; > + fields = 2; > + break; > + case 0x8000: > + avctx->pix_fmt = AV_PIX_FMT_YUV420P; > + yuv20p_half = 1; nit: maybe do switch(format) { case 0x8000: yuv20p_half = 1; // fall-through case 0x1000: avctx->pix_fmt = AV_PIX_FMT_YUV420P; break; > + break; > + default: > + avpriv_request_sample(avctx, "unsupported format 0x%x", format); > + return AVERROR_PATCHWELCOME; > + } > + > + q = AV_RL16(buf + 6); > + calc_dequant(dequant[0], ff_mjpeg_std_luminance_quant_tbl, q); > + calc_dequant(dequant[1], ff_mjpeg_std_chrominance_quant_tbl, q); > + > + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) > + return ret; > + > + frame->key_frame = 1; > + frame->pict_type = AV_PICTURE_TYPE_I; Shouldn't the codec have the prop AV_CODEC_PROP_INTRA_ONLY then? Or do some formats not yet supported have inter frames? [...] > + if (yuv20p_half) { > + for (int mb_y = 0; mb_y < avctx->height / 16; mb_y++) > + for (int mb_x = 0; mb_x < avctx->width / 16; mb_x++) > + for (int b = 0; b < 4; b++) { > + const VLCElem * dc_vlc = b < 2 ? luma_dc_vlc.table : chroma_dc_vlc.table; > + int dc_bits = b < 2 ? LUMA_DC_BITS : CHROMA_DC_BITS; > + const VLCElem * ac_vlc = b < 2 ? luma_ac_vlc.table : chroma_ac_vlc.table; > + int ac_bits = b < 2 ? LUMA_AC_BITS : CHROMA_AC_BITS; > + int plane = b < 2 ? 0 : b - 1; > + int x, y; > + > + if (b < 2) { > + y = 16*mb_y + 8*(b >> 1); > + x = 16*mb_x + 8*(b & 1); > + } else { > + y = 8*mb_y; > + x = 8*mb_x; > + } > + > + ret = decode_block(s, &gb, dc_vlc, dc_bits, ac_vlc, ac_bits, > + dc_pred + plane, dequant[!(b < 4)], > + frame->data[plane] + y*frame->linesize[plane] + x, > + (b < 2 ? 2 : 1) * frame->linesize[plane]); > + if (ret < 0) > + return ret; > + > + if (b < 2) > + copy_block8(frame->data[plane] + (y + 1)*frame->linesize[plane] + x, > + frame->data[plane] + y*frame->linesize[plane] + x, > + 2*frame->linesize[plane], 2*frame->linesize[plane], 8); > + } > + } else if (avctx->pix_fmt == AV_PIX_FMT_YUV420P) { > + for (int mb_y = 0; mb_y < avctx->height / 16; mb_y++) > + for (int mb_x = 0; mb_x < avctx->width / 16; mb_x++) > + for (int b = 0; b < 6; b++) { > + const VLCElem * dc_vlc = b < 4 ? luma_dc_vlc.table : chroma_dc_vlc.table; > + int dc_bits = b < 4 ? LUMA_DC_BITS : CHROMA_DC_BITS; > + const VLCElem * ac_vlc = b < 4 ? luma_ac_vlc.table : chroma_ac_vlc.table; > + int ac_bits = b < 4 ? LUMA_AC_BITS : CHROMA_AC_BITS; > + int plane = b < 4 ? 0 : b - 3; > + int x, y; > + > + if (b < 4) { > + y = 16*mb_y + 8*(b>>1); > + x = 16*mb_x + 8*(b&1); > + } else { > + y = 8*mb_y; > + x = 8*mb_x; > + } > + > + ret = decode_block(s, &gb, dc_vlc, dc_bits, ac_vlc, ac_bits, > + dc_pred + plane, dequant[!(b < 4)], > + frame->data[plane] + y*frame->linesize[plane] + x, > + frame->linesize[plane]); > + if (ret < 0) > + return ret; > + } You should be able to combine these two blocks, doing things like b < (4 >> yuv20p_half), b - (3 >> yuv20p_half) and such. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".