From patchwork Thu Mar 16 19:32:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Izen X-Patchwork-Id: 40702 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:d046:b0:cd:afd7:272c with SMTP id hv6csp4582988pzb; Thu, 16 Mar 2023 12:32:30 -0700 (PDT) X-Google-Smtp-Source: AK7set/sFONfgnUOQxNpTBhYNxIFdElWmir+auzGPRFOwcNSpmNvoIYWCxxVaZrPOH32LPRpwjJ+ X-Received: by 2002:a17:907:746:b0:931:8ad4:a586 with SMTP id xc6-20020a170907074600b009318ad4a586mr374945ejb.30.1678995149879; Thu, 16 Mar 2023 12:32:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1678995149; cv=none; d=google.com; s=arc-20160816; b=hxjIaU4Pfk8iVGpjdbIFTOIiK2nUYfTjp9fePdRIEFQ5Z+6HWYnkqD6+kBZCLhDguj ZWGY7zot629DQzK39xUxKWIChQdio8KOv4TI0bxWatSf5WP3CCz4OeG4LNEWbLOAbj2w VrYScborqBX2XRiMcpHRolx/iLEAW8s9/1qXH5N2RnXoSTqa4AYgVrfhc+is0vuTR5f+ /gyeK4qlFG9JzGBC9EBpX2x34Hyd3rrqXKEI4wMBmunPVBOp3l4i6VB8KcYxOj6ndcNG fllEggAkBR19mOOZMTuXygkdTUS4Ics+DicKmdkTz6XRLhx9EL94lwIGK4n/Rkfei5py /7Hg== 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=oT+iIE0j76SARDLDoEgxrfhsxgNtyxxMkQgOv+3AFLI=; b=ieUA+rVSqv7qjf+ZWsOL8NtepYIZTANM0g2vNgtCyXK4g96rDEhzKLqYOlqU2LP5ID AAkvTFPmhcHU6gSTgXDg4oqSDcY2sjFCS3H0zAFLOTqbHBryOCRCJMRm0ujn12ZPvoiu 8KQT5ZO4A/35oeeR5XONOX3MU7dFIaN19p9MDY69U5pIBmfw2LWI97qCFXQDCm7v7IwP YcOtSoVqkAKKpYpsHr7Ts7gfNVNhVLKP9OSd1IT0U530eqSb5+tA2UTzP5zMpyo0wzZF 8EXqrn7wO1V8DuY46H4cZdMILLi301ndanJ+Hn86xmPGxqN1dwIBFUXE91CftFMujYjB dM0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Q6U15o9j; 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 lz18-20020a170906fb1200b009238a205577si78105ejb.190.2023.03.16.12.32.28; Thu, 16 Mar 2023 12:32:29 -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=Q6U15o9j; 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 AB24668C088; Thu, 16 Mar 2023 21:32:25 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-il1-f174.google.com (mail-il1-f174.google.com [209.85.166.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2AF7468BF8B for ; Thu, 16 Mar 2023 21:32:19 +0200 (EET) Received: by mail-il1-f174.google.com with SMTP id a13so1588474ilr.9 for ; Thu, 16 Mar 2023 12:32:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1678995137; x=1681587137; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=isgzpXCRphghlAUcrdPoOqRc9MtJ5k7WV4Icnjl9b58=; b=Q6U15o9jeaPkF+ypHh6kUjo+/xWftp2nBcGDpIdpAnIVraI8k07b1QbiBts19q4xXU MSY7+JFks/UI28d9w3H3X/IXbue2kzrdusA9C9LQAeJ5uPIZn5QFcDpJ86fTO4ArhsYU 9wTV6T0VxFWadyPi8qCnahp+5+tgyJn7m1VzT1y+mvSYq3VRRUZJzP2kVwIPMjbsJLV2 HMCXjS5TFjAwz7TZFASKc1kNHE5HI+h895r0kaF5+Mlmu01whOyJd4Fwh4aCNXWBjLcT ICRZx3HY0UWwSr5RxAo5VIwtxn6yjZKOU1Ivb35JUCqDP/H1rK2jQnponHdkW4S4G915 8pIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678995137; x=1681587137; 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=isgzpXCRphghlAUcrdPoOqRc9MtJ5k7WV4Icnjl9b58=; b=nC8o64YgUQe8wcpWYXDfX/6lmH0dSAYj91TceJyA7+VoIBkIZ91cvPF/VhrS4zJWDS dWHgCdhWRBVOKMk5ONjenEyJiRN/t8MiH1sc8thHgarZocnNaaGmcyVJY/RxaNBSVtPp o0GJfooeTrB+GKzeobA3KHo4NN+G1eZTstBYwQ2yLapFz1lZCGP1Ev4w628DCWSPoOnR 7xDsmzGo9+FoIzoR+W6W9Qot3Agpl5GmKXOtLRoSlfj8m8PNNLsqBEjqD9lc+erulijQ euLbl0eUhOo3N08rnB00YLLDfgnB7w7O/jcdccDgJusJ5jKr/V/DNjeMJdIVuIhiGI97 3JNQ== X-Gm-Message-State: AO0yUKVmR7Igdbwg+QVpS1wAjK02IHZkhav/8YawpP1SKsD78tjRezY+ 41paSF7VPt+cwBb2+RlpmmM7vqiiNb39ig== X-Received: by 2002:a92:d309:0:b0:317:16bc:dc97 with SMTP id x9-20020a92d309000000b0031716bcdc97mr4375674ila.3.1678995137583; Thu, 16 Mar 2023 12:32:17 -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 b9-20020a926709000000b0031bb6b7c72fsm60863ilc.33.2023.03.16.12.32.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 16 Mar 2023 12:32:17 -0700 (PDT) From: Leo Izen To: ffmpeg-devel@ffmpeg.org Date: Thu, 16 Mar 2023 15:32:14 -0400 Message-Id: <20230316193214.24025-1-leo.izen@gmail.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] 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: DsfOrHC4dxL8 This allows weird subsampling with progressive JPEGs to be decoded, such as full-RG and only B subsampled. --- libavcodec/mjpegdec.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index c833d66c4d..3fc18aac73 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); @@ -2722,6 +2720,15 @@ the_end: } } } + + if (s->avctx->pix_fmt == AV_PIX_FMT_GBRP) { + av_assert0(s->nb_components == 3); + FFSWAP(uint8_t *, frame->data[0], frame->data[2]); + FFSWAP(uint8_t *, frame->data[0], frame->data[1]); + FFSWAP(int, frame->linesize[0], frame->linesize[2]); + FFSWAP(int, frame->linesize[0], frame->linesize[1]); + } + if (s->adobe_transform == 0 && s->avctx->pix_fmt == AV_PIX_FMT_GBRAP) { int w = s->picture_ptr->width; int h = s->picture_ptr->height;