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 8834644FAF for ; Thu, 16 Mar 2023 15:50:48 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2BDF668BF61; Thu, 16 Mar 2023 17:50:46 +0200 (EET) Received: from mail-io1-f41.google.com (mail-io1-f41.google.com [209.85.166.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0230C68BF29 for ; Thu, 16 Mar 2023 17:50:39 +0200 (EET) Received: by mail-io1-f41.google.com with SMTP id g6so975566iov.13 for ; Thu, 16 Mar 2023 08:50:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1678981838; x=1681573838; 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=I7qgcE3smSgwfMLVpipxdG9B8suDb2p1l0eS2IIF5tw=; b=QfPEgpfweULuJH3NQ9XqAHesN1Q9JDLvwuG/V/hcnsegyOimrhrfGTYKETmRHSjSGZ z0clJKEfwf9rQUwxQ8bjMdEHHEKB2+7Fm3obn3LRDw6vmocSpMt/ME9TxSweNnqvUps7 nnkMTbf9EaC/B1UqJZLgzN9gPw3AzA919ONpB+0v1nXja/yhTpSF0noeV4XIGOYBiGKS +VXOInBR/TRyoo7MUKbALKQY/LjHufGG1/mV9QK97vOoagEBnGb75VSH5HlPwH9Y+iY0 1G0TiSqCSXy5mZHeZNmktZ5eaF2xUpMPkLAw6wYLAw+DENB9zExT5QvKmHtRwEdZaYLd ZPzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678981838; x=1681573838; 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=I7qgcE3smSgwfMLVpipxdG9B8suDb2p1l0eS2IIF5tw=; b=sQj5pI8BHgDfIkiqjPKbLWo5c+PrHuSZzQSUeAeBIDIn/UtM033P3cFd32jP5i/R8Z PjKRmh2IBcJ6xe0AxEIMXtt/OtZdMsj12bbkfUuAK4SrE7EXJeNzd1gpDk6pua21LZlu 76ERWH3mEbu+WS6oHlWMi1y5+8wBdYRRS9g48XIYlLHh+igJwVXJ8GV/B7qOi7BDvFz3 NVunFtzE1Ay98/+FYY0Lt2a4lJgN+l47dtzA4BnYsFs/f4UqppTPMiwsA1qhIJSUNotN Pot0V3MfXla1gvx4+mhCUuXh/rSdnaY0uqo3vvzC9praUBA6D0aDfIdF74dXZroHQIj1 XaMA== X-Gm-Message-State: AO0yUKVpz4OONM6bEkQgfpUX+U+1Cqb7xJbaZNx0RYQblPU2qLkt/kWh xP5cw6QR8K2R/9srLvxdukbtiGWW+ogrvg== X-Google-Smtp-Source: AK7set8QOqHdwef9bwb7cf7kmVSfAGtlqZmBD1AQqiu6egKjgoshTU+011J8s0sSA1nRdamX0Lmvag== X-Received: by 2002:a6b:3c0a:0:b0:719:6a2:99d8 with SMTP id k10-20020a6b3c0a000000b0071906a299d8mr3627190iob.0.1678981838231; Thu, 16 Mar 2023 08:50:38 -0700 (PDT) Received: from [192.168.1.35] (c-98-224-219-15.hsd1.mi.comcast.net. [98.224.219.15]) by smtp.gmail.com with ESMTPSA id k8-20020a6b4008000000b0074ca38eb11fsm2629962ioa.8.2023.03.16.08.50.37 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 16 Mar 2023 08:50:37 -0700 (PDT) Message-ID: <7959223f-8fad-8c8e-2131-9386441a5733@gmail.com> Date: Thu, 16 Mar 2023 11:50:36 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 To: ffmpeg-devel@ffmpeg.org References: <20230314200337.230799-1-leo.izen@gmail.com> Content-Language: en-US-large From: Leo Izen In-Reply-To: Subject: Re: [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 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 3/15/23 23:11, Andreas Rheinhardt wrote: > Leo Izen: >> 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; >> + } >> + } >> + } > > Is there a reason you are not just swapping the pointers? No particular reason, other than I tried that and messed it up when testing (probably because I didn't do it properly). I'll send a v2 and swap these. - Leo Izen (thebombzen) _______________________________________________ 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".