From patchwork Tue Feb 1 13:06:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33978 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp600516iov; Tue, 1 Feb 2022 05:07:48 -0800 (PST) X-Google-Smtp-Source: ABdhPJwQmnr0wNjLMNdR4HfFG2+VfnaAyxwwnBYPHMT4ZbZXcXp810PUreYytn4TPoLDjQy/lJRJ X-Received: by 2002:a17:907:3e8a:: with SMTP id hs10mr21113437ejc.767.1643720868432; Tue, 01 Feb 2022 05:07:48 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e14si8436405ejl.52.2022.02.01.05.07.47; Tue, 01 Feb 2022 05:07:48 -0800 (PST) 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=@outlook.com header.s=selector1 header.b="jyHkUh/e"; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D455E68B2B4; Tue, 1 Feb 2022 15:07:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2063.outbound.protection.outlook.com [40.92.89.63]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8B74768B2A0 for ; Tue, 1 Feb 2022 15:07:26 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kOLJzuUEPsp2bCbBVw5TkF4GN0HYWREOtpKF0UmvKLvjvz7PW86t2aMq2VYiX1sCtiFhK88umPmTgDeCTOXb4z8DHt/CrCjQxVCb96chKIa72gGJbVYnqJIKK2vvkbydO+I3CB7aaWuUoivwp5bPXUZZUOZWYf6M+IkWUj42Dwceuyxv3T1oO/aHf/CcxOF3PWaTCBopLRF2r14qWSynA7nZh52x5FMdKldZknVqS9zqiPQXjmxsmm2hpUN8MWC5xtVvsgKOGTGTMG/ooPTvewTiuJLxcb64mfypO7t55ayICF6gmAEzwBr/bsY/ph+RqMHnfnwn91Ss+nvVKazuoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=AcNBbug0fMoALEg3Hu1S56ahHm3gqkJ2iyuuwT/YgUY=; b=oDpAW++vn/DgD4WaT766XM1A7m8S3qY0LlK/r1u/LBImoBbrm4aKjZFDncSSuWIxpo0cYtH6XIRydO6TCc/1Zuv0BXgLpwFTSCsn27BnbtQfZ6FQzOK2pjpxGfjRNV/NSuHLTxTtpP/Or8vyKb3OEkuRtMNXfUy902v6mhq63wS/4h9HPl0LY67VPpvGwWBi5HEDrbp5LQeIr6Xi5C90utsTHJ4afgVAUvcaKYoS3J9i9k7KNCnqBZVL12x2irNhcjx3eFTNQhfgvS9uuBBez9NPToaya+7QHo2BfIe0xfGrUvPaNvUX0w1xrOn0C/yIEIE1rnFaj7G3puL4OIAEnA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AcNBbug0fMoALEg3Hu1S56ahHm3gqkJ2iyuuwT/YgUY=; b=jyHkUh/eaRP2jzqXPMFmvrpvbDjkF9nOtqbl/wVpAoJjFyOlMVpFI3Ty3bhd9c2A5CDJ4FhPejFF62Ggu+XkubusrHTYIHNA+f4ez841OryvYJNgehj2vi9wXYKlP4jicG24+pvnbu9/9v5HMtk+LwVjSxUcJs9inAcD2KZgeKSrp2tXvK/ujotJ5rYjpLtMyE2yGZij9QZmeXUfLWVNE1TQM7Um1+raVuZEBQuiqpfG/dOfgzCpJWd0AwSavCHsdSHFbuMGzlmivPN/4Li6Fhic+KenIFbsd93vDGNzs6BB66iTGrJT76C4A1WsZQtS3IhWreWDEsLPlW+UVr0unw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by DB6PR03MB3046.eurprd03.prod.outlook.com (2603:10a6:6:34::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4930.21; Tue, 1 Feb 2022 13:07:21 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%6]) with mapi id 15.20.4951.011; Tue, 1 Feb 2022 13:07:21 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 1 Feb 2022 14:06:01 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [qORlHzFLYTWNZwuFcK0dZnpuZIwWT7/Y] X-ClientProxiedBy: AM6P195CA0092.EURP195.PROD.OUTLOOK.COM (2603:10a6:209:86::33) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220201130706.1420875-3-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c471242d-a683-4ac1-b7b5-08d9e583c861 X-MS-TrafficTypeDiagnostic: DB6PR03MB3046:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: p3nGduP1AxrQIJC4prnetZnHEKQ7lKwYaVcmIqLGqaovZbbhwmpNo2ZHqRbzM74bfbRsEDAPN02HVpOt83yxri740cIE1cv7yyXZbXZYZ/brxNlPuF5HpfE9VpJJsSrAjBDCP/tpk8Ps/HRJV5rw95YhSMZU0jErKdg8nBn3RGg4hx3LrKoM971B/m4q6fLm7w0U+JyH9/jaIhHoRRU6DRK11Z+JCqV63SnVMTOqf814wyC3f9SxqUzPEaOaLp1ugvgLEe/gtfffGrdcrfzSoK2m6OV7NdYuCPidjNgYYRYGbGl/Xcljdh/k9UXoRWtSMdY1gWFmE/beNavvRhzQVkftD44M696BTW9TmXblDbLCbxfX1mcz6SnoswCna4FLsWk/1G80pTTZoMbsFfElkuPWocmZdkw8LsIclcuGpc03Yitt4H3Wo2DNQqXlKLQ8t3sWxKgOp36HUD32qPF3JocbfO0tiivXsAE+jFtzACYEC5dhwI1qfLUtR+SV0VNDZ6CIm1uf0XlhT4WrDETMaUzoPkAveEnpeZIjRJ5QY+qNn9ipewxN0n9mJsbwNixP X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 2ZWpb+w/CBJYz1Njzz6Yri/z6HHRGJ3FEY35Vl860Pyok4x1ELgZiM8AaAC/d9bNdMKat6iaNmnbo6spIGkF0WbW55kwTT/qYPCd67+6LEeBfxkImEXz6rAGwx3NLzPV0oIHE00i0aRWHHgjC+jQfrAw0m7RzPlSX3tBVZx3oiLg3ka46WFGZRVwnfr8krTgMxpHCiXA7WXMPUwPb7wFFO7Rh5QTpHwh35fsJe7WKCruopHLZMISrvTG3jTlAqL47ycROnAln1LnHnx9TYvadNh1Clyu/2udbq4SKhXNJ8HQsYHrXH0ig1nD5fCmaNE+JhxEV17dQ+F2+87B8eSxf3bEdpEjwhIhPypf93+5iGj2ZpgYVlYfgy9pqz8zMI7TejdPGLK3A2Nb9Ab047/Sp6mhjKQl/V6P8tw3a7XljwcOqS1QKZZ2mEW39Cd9QSRvKzbLelbTrgqVXIJK8tOw3XaNjVMK4TJVtaJmzfp7U157MWQIfkg9T+z/D2gmZ5JOzvo0ctBerLLd0mM27dAZpgC0WZC9Rj/+ng5ljML/8vPUWiuvDOWrC2Rm1LgKMuMmnJKTzWGzNyWJvE+qtZ0w+GgATtGjIyihS/Ng2SWdjergmkwxasDus7Ej9i5VG09THiP1A8GZzvcArK1SfLE76QQpTzy9+jxMytz/vN4Qv5zOyqq57kLMV7uwBssyHKvWPGuEDKxL3nHuppBAm6w8rOG87cImmWBNDOz6kN5Bd3ytLhMshUo86xbi0IXsDsJNWIREtHqXTkGfMqBVpubJ36afn0Ci3778U1pGosnBho0SDrXB4R4DrXVve86wIPY1AeDrAlX6uZD9vxrnIFuHHIVsFmgppyKkf/Uhgind+AjhFcyRqOIMGqA7GLuBvwDRL9owzMFkVX2JLbLqRieVQ5tl+cCgkjycUB8lIY0u7CAKmDg+TkGgldXrwLnmzoipSoSlOFU6D08S3WtqtigwEw== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: c471242d-a683-4ac1-b7b5-08d9e583c861 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Feb 2022 13:07:21.6378 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR03MB3046 Subject: [FFmpeg-devel] [PATCH v2 04/69] avcodec/mjpegenc: Fix files with slices > 1, but threads == 1 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: wT88k2w+cQsA In the aforementioned case mpegvideo_enc.c calls ff_mjpeg_encode_stuffing() at the end of every line which pads the output to byte-alignment and escapes it; yet it does not write the restart-markers (and also not the DRI marker when writing the header) and so the output files are broken. Fix this by writing these markers depending upon the number of slices and not the number of threads in use; this also makes the output of the encoder reproducible given a slice count and is therefore important if encoder tests that actually use -threads auto are added in the future. Signed-off-by: Andreas Rheinhardt --- libavcodec/ljpegenc.c | 2 +- libavcodec/mjpegenc.c | 12 ++++++++---- libavcodec/mjpegenc_common.c | 10 ++++++---- libavcodec/mjpegenc_common.h | 3 ++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/libavcodec/ljpegenc.c b/libavcodec/ljpegenc.c index e15f448f90..7c53da7bc3 100644 --- a/libavcodec/ljpegenc.c +++ b/libavcodec/ljpegenc.c @@ -239,7 +239,7 @@ static int ljpeg_encode_frame(AVCodecContext *avctx, AVPacket *pkt, init_put_bits(&pb, pkt->data, pkt->size); ff_mjpeg_encode_picture_header(avctx, &pb, NULL, &s->scantable, - s->pred, s->matrix, s->matrix); + s->pred, s->matrix, s->matrix, 0); header_bits = put_bits_count(&pb); diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c index 022f171c9e..6a47503ab4 100644 --- a/libavcodec/mjpegenc.c +++ b/libavcodec/mjpegenc.c @@ -78,7 +78,8 @@ static void mjpeg_encode_picture_header(MpegEncContext *s) { ff_mjpeg_encode_picture_header(s->avctx, &s->pb, s->mjpeg_ctx, &s->intra_scantable, 0, - s->intra_matrix, s->chroma_intra_matrix); + s->intra_matrix, s->chroma_intra_matrix, + s->slice_context_count > 1); s->esc_pos = put_bytes_count(&s->pb, 0); for (int i = 1; i < s->slice_context_count; i++) @@ -247,7 +248,7 @@ int ff_mjpeg_encode_stuffing(MpegEncContext *s) ff_mjpeg_escape_FF(pbc, s->esc_pos); - if ((s->avctx->active_thread_type & FF_THREAD_SLICE) && mb_y < s->mb_height - 1) + if (s->slice_context_count > 1 && mb_y < s->mb_height - 1) put_marker(pbc, RST0 + (mb_y&7)); s->esc_pos = put_bytes_count(pbc, 0); @@ -289,11 +290,14 @@ static int alloc_huffman(MpegEncContext *s) av_cold int ff_mjpeg_encode_init(MpegEncContext *s) { MJpegContext *const m = &((MJPEGEncContext*)s)->mjpeg; - int ret; + int ret, use_slices; s->mjpeg_ctx = m; + use_slices = s->avctx->slices > 0 ? s->avctx->slices > 1 : + (s->avctx->active_thread_type & FF_THREAD_SLICE) && + s->avctx->thread_count > 1; - if (s->codec_id == AV_CODEC_ID_AMV || (s->avctx->active_thread_type & FF_THREAD_SLICE)) + if (s->codec_id == AV_CODEC_ID_AMV || use_slices) m->huffman = HUFFMAN_TABLE_DEFAULT; if (s->mpv_flags & FF_MPV_FLAG_QP_RD) { diff --git a/libavcodec/mjpegenc_common.c b/libavcodec/mjpegenc_common.c index 995e2b7670..86b6568902 100644 --- a/libavcodec/mjpegenc_common.c +++ b/libavcodec/mjpegenc_common.c @@ -60,7 +60,7 @@ static void jpeg_table_header(AVCodecContext *avctx, PutBitContext *p, ScanTable *intra_scantable, uint16_t luma_intra_matrix[64], uint16_t chroma_intra_matrix[64], - int hsample[3]) + int hsample[3], int use_slices) { int i, j, size; uint8_t *ptr; @@ -91,7 +91,7 @@ static void jpeg_table_header(AVCodecContext *avctx, PutBitContext *p, } } - if(avctx->active_thread_type & FF_THREAD_SLICE){ + if (use_slices) { put_marker(p, DRI); put_bits(p, 16, 4); put_bits(p, 16, (avctx->width-1)/(8*hsample[0]) + 1); @@ -216,7 +216,8 @@ void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb, MJpegContext *m, ScanTable *intra_scantable, int pred, uint16_t luma_intra_matrix[64], - uint16_t chroma_intra_matrix[64]) + uint16_t chroma_intra_matrix[64], + int use_slices) { const int lossless = !m; int hsample[4], vsample[4]; @@ -236,7 +237,8 @@ void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb, jpeg_put_comments(avctx, pb); jpeg_table_header(avctx, pb, m, intra_scantable, - luma_intra_matrix, chroma_intra_matrix, hsample); + luma_intra_matrix, chroma_intra_matrix, hsample, + use_slices); switch (avctx->codec_id) { case AV_CODEC_ID_MJPEG: put_marker(pb, SOF0 ); break; diff --git a/libavcodec/mjpegenc_common.h b/libavcodec/mjpegenc_common.h index ac753bf153..ba7c4f93fa 100644 --- a/libavcodec/mjpegenc_common.h +++ b/libavcodec/mjpegenc_common.h @@ -33,7 +33,8 @@ void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb, struct MJpegContext *m, ScanTable *intra_scantable, int pred, uint16_t luma_intra_matrix[64], - uint16_t chroma_intra_matrix[64]); + uint16_t chroma_intra_matrix[64], + int use_slices); void ff_mjpeg_encode_picture_trailer(PutBitContext *pb, int header_bits); void ff_mjpeg_escape_FF(PutBitContext *pb, int start); void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,