From patchwork Tue Mar 14 20:03:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 40676 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp2876493pzb; Tue, 14 Mar 2023 13:04:17 -0700 (PDT) X-Google-Smtp-Source: AK7set97qQL0FXAwVrGVs6/C093QbHvilIsyTi0uRPFleBPOCbfvv9F2slL6oN2NcwYkXnmRhgfL X-Received: by 2002:aa7:d441:0:b0:4a2:588f:b3c5 with SMTP id q1-20020aa7d441000000b004a2588fb3c5mr333331edr.21.1678824256928; Tue, 14 Mar 2023 13:04:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1678824256; cv=none; d=google.com; s=arc-20160816; b=NpCDfoRByrAiZnta3DFon37S5Ns+ebW3vkbd4sSltZkzHWI3BS242aT/JL3R9O1P4X wkJkdgiXs94kCLKmHam2mXr0pVxJO5Fqp54SZma2FMsuKgd4Cx59VDEVvTSVGGqUuVab JgLr9KOiSyDMpMEXSgtBL8eeyF2KAWeDRo7tYnAFMsg6zRl54Gpyiw0vy5DVCWCvx281 7GtNeRla4QoxTqy+MvVOiA9FKn3IM2BwPjPFbx8o6MymInWJdUyG/QIk0Ocq39XaEVVz To2DH9WRcxn02liPlPQ/Quu/linbfAaUw3LEPhfAq0sNvlVuo+9r1wUWrcROd0DRjHeR 05KA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=/pZt6Ksg/UsLoyKXbA8fqoEaizr5ale9yGBn4/C2iaU=; b=XWgFBJdWclgn+RHE7X8TK4Hq3xFaApe6+G0vKUgHJSJq4YuqM0NbVlETy9wgQycRBM ejAhs0/Py7PSSO+vquKCTLpC3VLL56ji+HGfqGW0Hl+9vOxUUaDEQG2ST+F9BeVHSH4j qY6ptXR3j7VdITo14HBXYNFbcl7+rgblxy5qydvvGbKCi1roLOkvS1JtDwHwP6fbTcqq S+1VSkfuOIHZ7eVLNQNTVusT10Qjxk10b1Z7eD/13VY5nTB+Q/sBOCniq2tizK7bcjC6 BE1JximhSE9tFHszpWXiiPojSfwB8c2y+95LFOF0uxIyjgtTk4h4ed3YMWFstxRHnUFr hC5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=LvPpa7mf; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q25-20020aa7da99000000b004acd080ecc5si3144827eds.98.2023.03.14.13.03.53; Tue, 14 Mar 2023 13:04:16 -0700 (PDT) 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=@gmail.com header.s=20210112 header.b=LvPpa7mf; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7CCB368BC49; Tue, 14 Mar 2023 22:03:49 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io1-f51.google.com (mail-io1-f51.google.com [209.85.166.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5840B68BC6E for ; Tue, 14 Mar 2023 22:03:42 +0200 (EET) Received: by mail-io1-f51.google.com with SMTP id f14so6917716iow.5 for ; Tue, 14 Mar 2023 13:03:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1678824221; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=lNVRWhPjBGWq+ldEHNNX6YjRm7+JfTi39oV6CsJeIts=; b=LvPpa7mfP+Vob9OuLVIHicdtEI/3bGRJsFT2qc/5qzI7SmCPGUZ23b2KttJyKOO9xN oAcYtU7B1O2FtWQBnO1CJPFmsFEJkq798L/wJdosKvcTqPHY7IldJ+hbTi0rLpaLOk6y hRiGnBQ8hPB4EMxQqcgM0G37Ivk/Y+FjgtZa/qEB8R/vRObSjgxxmjaHjxKL2QqeClF2 DfjBXqQHtf3dYxoNJ62LvLY0M8GcfnqT3H/337zFKZE/a2JNyw2V/GobYp3t5tZC/ZiM Q7Tn3RKjgVCz6IWQ0wSGdYAJbFJfOmOXCzzil1SKhi+VNC/vQxgFkpoRW/ZBaPYM4Epl loCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678824221; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=lNVRWhPjBGWq+ldEHNNX6YjRm7+JfTi39oV6CsJeIts=; b=iM/YzYJP8L0Wb/31xXYEyL2yrdp48m98pwhPvaFKH0slWYAWJyabG42Mty6gnTYaTD lmV0KWkhagY4vXWLKnXS0NllhM3ViK2hFDmq0lHp4t4MPDWUE3H8adMf9Wma9hufStyy 57Sc1Yfa6Kn/KynKo4ZDvlEydNGjgRL0CpvjNZovA27zM8ifkCrdHksAiFERv3v56Ca3 tZcMZky6Jajgm3ceSS2QJ3sXdzTD0rPkYhrV49Se/5qgbJ+Q5eUtvU7tDKqqNjkzigR/ t7WsadW9Y0ADaFwqN+91rLJaS7OzoxC5AcZVh8iX3giBADZo/s54dG2CuJozes2bFUs3 6dow== X-Gm-Message-State: AO0yUKVXfOQL3/aS3E/BtmUknob0mycJMifim8/iIMcxl+4f1bjua1dr wKsweowdjTapI883Xuj4Zp7O6XylT7P2lA== X-Received: by 2002:a5d:9257:0:b0:740:7d21:d96f with SMTP id e23-20020a5d9257000000b007407d21d96fmr9001257iol.1.1678824220738; Tue, 14 Mar 2023 13:03:40 -0700 (PDT) Received: from gauss.local (c-98-224-219-15.hsd1.mi.comcast.net. [98.224.219.15]) by smtp.gmail.com with ESMTPSA id i17-20020a02cc51000000b003aef8fded9asm1026082jaq.127.2023.03.14.13.03.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Mar 2023 13:03:40 -0700 (PDT) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Tue, 14 Mar 2023 16:03:37 -0400 Message-Id: <20230314200337.230799-1-leo.izen@gmail.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/mjpegdec: support weird RGB subsampling with progressive 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 Cc: Leo Izen Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: f0pFCiv+bUVW This allows weird subsampling with progressive JPEGs to be decoded, such as full-RG and only B subsampled. --- libavcodec/mjpegdec.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index c833d66c4d..062730f3e1 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -571,10 +571,15 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) case 0x22221100: case 0x22112200: case 0x11222200: - if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P; - else + if (s->bits > 8) goto unk_pixfmt; - s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; + if (s->adobe_transform == 0 || s->component_id[0] == 'R' && + s->component_id[1] == 'G' && s->component_id[2] == 'B') { + s->avctx->pix_fmt = AV_PIX_FMT_GBRP; + } else { + s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P; + s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG; + } break; case 0x11000000: case 0x13000000: @@ -673,10 +678,6 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling"); return AVERROR_PATCHWELCOME; } - if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->progressive && s->avctx->pix_fmt == AV_PIX_FMT_GBRP) { - avpriv_report_missing_feature(s->avctx, "progressive for weird subsampling"); - return AVERROR_PATCHWELCOME; - } if (s->ls) { memset(s->upscale_h, 0, sizeof(s->upscale_h)); memset(s->upscale_v, 0, sizeof(s->upscale_v)); @@ -1697,9 +1698,6 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, s->h_scount[i] = s->h_count[index]; s->v_scount[i] = s->v_count[index]; - if((nb_components == 1 || nb_components == 3) && s->nb_components == 3 && s->avctx->pix_fmt == AV_PIX_FMT_GBR24P) - index = (index+2)%3; - s->comp_index[i] = index; s->dc_index[i] = get_bits(&s->gb, 4); @@ -2745,6 +2743,26 @@ the_end: } } } + + if (s->avctx->pix_fmt == AV_PIX_FMT_GBRP) { + int w = s->picture_ptr->width; + int h = s->picture_ptr->height; + av_assert0(s->nb_components == 3); + for (int i = 0; i < h; i++) { + uint8_t *dst[3]; + for (int index = 0; index < 3; index++) + dst[index] = s->picture_ptr->data[index] + i * s->picture_ptr->linesize[index]; + for (int j = 0; j < w; j++) { + uint8_t r = dst[0][j]; + uint8_t g = dst[1][j]; + uint8_t b = dst[2][j]; + dst[0][j] = g; + dst[1][j] = b; + dst[2][j] = r; + } + } + } + if (s->adobe_transform == 2 && s->avctx->pix_fmt == AV_PIX_FMT_YUVA444P) { int w = s->picture_ptr->width; int h = s->picture_ptr->height;