From patchwork Mon Aug 2 22:59:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 29207 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6c0f:0:0:0:0:0 with SMTP id a15csp1963004ioh; Mon, 2 Aug 2021 15:59:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzOamCA0DzydzMAdHZBeKw9NnN5w6+m/FqnEFVkspoxYRKrQUDojJ1MI361LUn/yvMaKnVc X-Received: by 2002:a05:6402:28a4:: with SMTP id eg36mr22468200edb.84.1627945175221; Mon, 02 Aug 2021 15:59:35 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b10si12867366ejj.523.2021.08.02.15.59.34; Mon, 02 Aug 2021 15:59:35 -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=@outlook.com header.s=selector1 header.b=BHNjZBfO; 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 5072B6898DF; Tue, 3 Aug 2021 01:59:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-oln040092070013.outbound.protection.outlook.com [40.92.70.13]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 13EBF6880AA for ; Tue, 3 Aug 2021 01:59:22 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TTVsAuBfyR4/gCcEh2Ou5RfkJo8g3NI730eu7/+KkdLipnkL5kO9++xxdfKtusgWViP5QYW0sKTKj5EYZnvd0tEchf38U6sxvYMrHL+TRo8MCqNEU6zaxkOTU8rGnGdiKBm5sHdA6cZgdTGQpJ+erluQp3RFsTrpdLqladpAz1HHwn9lfT79DDYxWpIvsNjfLUiJ3o36I/iblwyoLEVFy0cROQfyOlfZqF5603USWWF5B0MVpAjQFYLzlbVw8oJidaYPPdTYHyvBrtdwW6JAPD2NYuVmlJVoRiRGGwH5eZwvMo18WHH5Ac4UwIz2w0a+WosgWlC9QBNQm1BWPUn02A== 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-SenderADCheck; bh=XqqhYh1TQl1orDemhYE9wReK7R0bobdmFWaTv76m8M8=; b=dSwvbMTIkCkqzo76OL21Yrlf5nMEEp3RT5i3CNtm9XBjcGQ6PLNkqRalIiOD/RwXGkRe894KqBqwHtaJaiMGJKQt17xYdU8NX5fg9GOTX9A1rk4GHyvWW+l9RDWLbxlvP0eMsRX9UGXIj4Yz3ybm0qjFk0KEQHtDVPm+pLKHqmVOjGuPm4Odihljiof+50lVkixgQtmj3aZn3KIF7Yc4VPR7Vdv3kllT2lvhjGxuUAwWLqLZEONIYYKzFBhmKgvv5QAcnNpzzy6Fsx8EdQQrm8bfCFlfVUt0Ojv7lADdN5q5qW+e9m5T0JLvWw1h0wqbhXGi0z/agBemcyj9EadiNw== 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=XqqhYh1TQl1orDemhYE9wReK7R0bobdmFWaTv76m8M8=; b=BHNjZBfOrD3Je19EX0jydxg+cX3+PVkMDI6brfWi6htoaA/nrT0C3xeQ320JkzoEqWSK9UcbaiS+sCQo4HdICp9TfXG45nBPjL+S1KPLO3xtc69l1TDsMsfxO1u6fvU118DvgbH4CWHMXgmyOQkCpFXh8Yt1bRcTQlcyWx0/Am4DjsJAm6g/PXxkkijcQCbLMWlzfCIswdkIWU0l0GnXLURsixqzi0w7CDXT3btTTeKSN+0SHNBcCxyceLhK+rA1oeBOkaycmaP9iUvVFq2E2J00HJrZfM+v0ivXcopptrjSniD4TS8kqDX1KuRaW6MlNMcza0y9KSA/sTzVjJ1xRA== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR03MB4822.eurprd03.prod.outlook.com (2603:10a6:20b:81::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.25; Mon, 2 Aug 2021 22:59:21 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::c9b2:14f8:d555:6f2d]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::c9b2:14f8:d555:6f2d%8]) with mapi id 15.20.4373.026; Mon, 2 Aug 2021 22:59:21 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 3 Aug 2021 00:59:07 +0200 Message-ID: X-Mailer: git-send-email 2.30.2 X-TMN: [OEqgHDD+GSvXqIRtLJbbBpVnkrSwBEsg] X-ClientProxiedBy: AM0PR02CA0117.eurprd02.prod.outlook.com (2603:10a6:20b:28c::14) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20210802225907.1558044-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.94.230) by AM0PR02CA0117.eurprd02.prod.outlook.com (2603:10a6:20b:28c::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4373.21 via Frontend Transport; Mon, 2 Aug 2021 22:59:20 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 643bcd43-e430-4376-947e-08d956092a15 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiT7FzPiew9v5FGt/+c0qJ1ZXPvuhGj1EcUTLxZz5UepYkx1qrKKMjcq//sCqdQ3IfJ7almDMtzERSDFPMcg7nhC+Gh7Am3X2WIFsmND//BPmEOxQsFmD6KjpgLDkNGo/9HiwQ35u3+5kUDCSJZepVsktgOMc10+dhvoLIXf5ge+DCg3yA9DWM35V6ggCzO/czLbDkq6I9LUo23EL+78jLwGBBTudpZT6gUq5vmlSvYqnFv9VMW27InNlLEJVOZ4y/ggMCgcVAZxelQchI6vV/mk9u7fG3Ii+/oK2Rb0T92tRmIFHqzWemkDHry/TDgqXCGDXp1UaZFkUtNCYO3tBte5rlEggNzJoJWJbUrQ4w7yPcpa7Y6HM/yJ6dUvQup1UiglNDhJdUJwOE7FqbqlYEECeADvLHQ77IOl5nXTIsoXOQBavNzmqGllbGlBoR14jgU+ejSxpD0a/jbVPOoW36MsskXxH3AjM5l9UVImToCa6QnyEaulaIYSNnrFEEdBMR7faAph29E6CgHaB/IQUXE9qnSeOW72oDsS6HKX9j4hzgcKvkB0ZVnTJN7NfPdZu8sZyUUfxwVUrNdf5M3sRhr4DkEQ2MdrJUUSjjHqOnm766qYCqyFQo1fxqBjlAb+1gB64M4WDpOqE/DrH27cVRo5njVhGHAMVnmcfg8uXpiu5ioSE8BD90bAratGphy8ZKCFGidju0+kzhaCGK9yY/QK+MSGtsWoKDoji4f6AWqY7dplcykuQiYJq58A4G7iwKI= X-MS-TrafficTypeDiagnostic: AM6PR03MB4822: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4GHGlE6T+omRZ0wZRNeyW9DOEfpKxJQNH0Q+SA2dp2xCjz8OKdAROl9EmWu4vH6U+dbxm0x0zyDIn7ZB8NkU9qRMjcvSQ+b+efxxyrV+qO/if5XhTUC2AAvQ1sK7itODXQ8Nno+Kh4zQjSq/WIewughwBoZCGWNKO2nRhYMKgmOkhoW9nIOktQ7FGghyCRB1Czqb08PbPaqrrwxG2Vt/2tWnQslVdLbfpv1fm978KNVXCa5PkTOD4pVEwKxfYjkS9ab28pLcBB1JUFMhumYq0DA9fqWgmvN4HSFTji+EFefxDf+rw0UgiAB63Iv5i6E6FTt+bhcJDyifIJfL2dFBLqp+BJcwbJNqzc79+bD8n5aoNJloNSN5WraZH4xFLfF9/9NN32j2ArQoU7/rC6KEVOzkrHE47pp0Fk3jU5s78RaA1wNM7fgh86g2IO/5rxIv X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: TygT3PtuApUJURP0zDncM4/IGePclijFqN7++aZ+F/XbSNnVzv9G8rLiAxyfHFzNiELaF1JFVHJJAOMzsRv7tbjnOdyZOSePZbqAfE4reK9p0KUNRCjzCh+lwzGmcMfBsomdu1jbL3Rn1sJ8NIvOmw== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 643bcd43-e430-4376-947e-08d956092a15 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Aug 2021 22:59:21.4599 (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: AM6PR03MB4822 Subject: [FFmpeg-devel] [PATCH] avformat/yuv4mpegenc: Write data generically via AVPixFmtDescriptor 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: Z6vwNWBcA8qk Signed-off-by: Andreas Rheinhardt --- libavformat/yuv4mpegenc.c | 87 +++++++-------------------------------- 1 file changed, 14 insertions(+), 73 deletions(-) diff --git a/libavformat/yuv4mpegenc.c b/libavformat/yuv4mpegenc.c index efa05133d5..fca0ee3120 100644 --- a/libavformat/yuv4mpegenc.c +++ b/libavformat/yuv4mpegenc.c @@ -181,9 +181,8 @@ static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt) AVStream *st = s->streams[pkt->stream_index]; AVIOContext *pb = s->pb; const AVFrame *frame = (const AVFrame *)pkt->data; - int width, height, h_chroma_shift, v_chroma_shift; - int i; - const uint8_t *ptr, *ptr1, *ptr2; + int width, height; + const AVPixFmtDescriptor *desc; /* construct frame header */ @@ -191,79 +190,21 @@ static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt) width = st->codecpar->width; height = st->codecpar->height; + desc = av_pix_fmt_desc_get(st->codecpar->format); - ptr = frame->data[0]; + /* The following code presumes all planes to be non-interleaved. */ + for (int k = 0; k < desc->nb_components; k++) { + int plane_height = height, plane_width = width * desc->comp[k].step; + const uint8_t *ptr = frame->data[k]; - switch (st->codecpar->format) { - case AV_PIX_FMT_GRAY8: - case AV_PIX_FMT_YUV411P: - case AV_PIX_FMT_YUV420P: - case AV_PIX_FMT_YUV422P: - case AV_PIX_FMT_YUV444P: - case AV_PIX_FMT_YUVA444P: - // TODO: remove YUVJ pixel formats when they are completely removed from the codebase. - case AV_PIX_FMT_YUVJ420P: - case AV_PIX_FMT_YUVJ422P: - case AV_PIX_FMT_YUVJ444P: - break; - case AV_PIX_FMT_GRAY9: - case AV_PIX_FMT_GRAY10: - case AV_PIX_FMT_GRAY12: - case AV_PIX_FMT_GRAY16: - case AV_PIX_FMT_YUV420P9: - case AV_PIX_FMT_YUV422P9: - case AV_PIX_FMT_YUV444P9: - case AV_PIX_FMT_YUV420P10: - case AV_PIX_FMT_YUV422P10: - case AV_PIX_FMT_YUV444P10: - case AV_PIX_FMT_YUV420P12: - case AV_PIX_FMT_YUV422P12: - case AV_PIX_FMT_YUV444P12: - case AV_PIX_FMT_YUV420P14: - case AV_PIX_FMT_YUV422P14: - case AV_PIX_FMT_YUV444P14: - case AV_PIX_FMT_YUV420P16: - case AV_PIX_FMT_YUV422P16: - case AV_PIX_FMT_YUV444P16: - width *= 2; - break; - default: - av_log(s, AV_LOG_ERROR, "The pixel format '%s' is not supported.\n", - av_get_pix_fmt_name(st->codecpar->format)); - return AVERROR(EINVAL); - } - - for (i = 0; i < height; i++) { - avio_write(pb, ptr, width); - ptr += frame->linesize[0]; - } - - if (st->codecpar->format != AV_PIX_FMT_GRAY8 && st->codecpar->format != AV_PIX_FMT_GRAY9 && - st->codecpar->format != AV_PIX_FMT_GRAY10 && st->codecpar->format != AV_PIX_FMT_GRAY12 && - st->codecpar->format != AV_PIX_FMT_GRAY16) { - // Adjust for smaller Cb and Cr planes - av_pix_fmt_get_chroma_sub_sample(st->codecpar->format, &h_chroma_shift, - &v_chroma_shift); - // Shift right, rounding up - width = AV_CEIL_RSHIFT(width, h_chroma_shift); - height = AV_CEIL_RSHIFT(height, v_chroma_shift); - - ptr1 = frame->data[1]; - ptr2 = frame->data[2]; - for (i = 0; i < height; i++) { /* Cb */ - avio_write(pb, ptr1, width); - ptr1 += frame->linesize[1]; + if (desc->nb_components >= 3 && (k == 1 || k == 2)) { /* chroma? */ + plane_width = AV_CEIL_RSHIFT(plane_width, desc->log2_chroma_w); + plane_height = AV_CEIL_RSHIFT(plane_height, desc->log2_chroma_h); } - for (i = 0; i < height; i++) { /* Cr */ - avio_write(pb, ptr2, width); - ptr2 += frame->linesize[2]; - } - if (st->codecpar->format == AV_PIX_FMT_YUVA444P) { - ptr = frame->data[3]; - for (i = 0; i < height; i++) { /* A */ - avio_write(pb, ptr, width); - ptr += frame->linesize[3]; - } + + for (int i = 0; i < plane_height; i++) { + avio_write(pb, ptr, plane_width); + ptr += frame->linesize[k]; } }