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 68D6E48AED for ; Sat, 2 Mar 2024 14:58:03 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4204368D2B6; Sat, 2 Mar 2024 16:58:00 +0200 (EET) Received: from EUR02-VI1-obe.outbound.protection.outlook.com (mail-vi1eur02olkn2040.outbound.protection.outlook.com [40.92.48.40]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B44F668D20A for ; Sat, 2 Mar 2024 16:57:53 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eHNQ3y8+UrpTVBhMxBlCOLXE1MQLyqO9NKTRyWfqKVYOSwP4R+6Y+a+stRaLE6rTt9XpDdgdlrsVPVwz1qh0I4H06WmBjXsMjcTHjxbRfM/n2EmhhR2vkFRHpvR8AGYTkMuQCCn7s6KDQR0HNWAUIcvm8YP2vkD5m1YD+EhKLYPeK4c/QPLRTUKweKrVVIh64zTygY91HCIsyAJWKD2DnP8IZrlyuv09q+qf0RSy/VDXgqJZXrOQs3adspFhxFkuC+GGury3nXVZhPqgS+yqV97WvkbMcILHqSw6u53HC9Wo02ZioHkW6KgS97roWFSdTJmZnmpGKOOt7k8Q6PU/ow== 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=e1vGefiZ4IFM/kZscatr8X0dUU+ikCQvvnIvdPdexNg=; b=U1hPBJ2PsGBUxUoxpKyT56TnQAF5akVwnoKttSFmR3+aVaGeJKxpN4HPtlwAJpCniWvTZiRrHD1ADxb6MXv+fXloez9hlBNlcmmbnpzMJv5ZfszGmTifXJDGRT5pRV+ndPRSjlb2fpOQJsuII4CdRGSEG2uVRVtUmgJ3Ql6sqigEqXC+d9jfGETPO0zjWdniMOmOcckmJkgF7w01R56qEep/e5rsuQQUXQ1def0u7hroPNwV0MMyyKpXaCqIcQ2ImfLr7ffhGrhkMWPNo5eadu7t1KfSYLsHwkTctaUzMDeEKBtHB0eno3grgu3onx4mQgHpIfeWXLlkuYG6Zn43UA== 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=e1vGefiZ4IFM/kZscatr8X0dUU+ikCQvvnIvdPdexNg=; b=lVef03d6ZoMrCCf4SSUw1ZgM5FS9luzJSOkwjgSeFBjGStmg3CZmUDgFrRicWfjRmfRQgMs9enROKv/iSogcsM/iWX2LatTpZQ9EJme0jvQZskpHXutlmJZjfTt8CudEDVpZ1CTaI6kc22Belv59DuRuFmxa0aS8iH1TX16g00bBiN5BMaSKEXF66O7nrBOLLCFXhLJZR+G+y0ZBbimT3F5NaIHT/VVCNd44LcgvjPmBmyaveST3sSpFb0ciYmCFfre9jnat1HlfKs3DRHflMhEDo6XOGcyyTOe4WQfRN3I2WGuJBXZdxxkCIC9bB8Rs3DJDRYjACXnfM6SGJDwcYw== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by DB9P250MB0523.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:338::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.33; Sat, 2 Mar 2024 14:57:50 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::65aa:deb0:a18e:d48d]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::65aa:deb0:a18e:d48d%5]) with mapi id 15.20.7316.023; Sat, 2 Mar 2024 14:57:50 +0000 Message-ID: Date: Sat, 2 Mar 2024 15:59:49 +0100 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <29ed7620-f60f-4f31-bc22-3f0903456c07@gmail.com> Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: X-TMN: [OUa4idFNjn1oetd4vP50InxGU/H5mO1FiLHGpZucFyE=] X-ClientProxiedBy: ZR0P278CA0185.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:44::18) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <2018abb6-8daa-49d1-a052-edc989479054@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|DB9P250MB0523:EE_ X-MS-Office365-Filtering-Correlation-Id: eaef473d-fe7e-46f3-31ed-08dc3ac9218a X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: YW37UiNFHw7fuL7rPmPK8kBmiZaV5swktYeCg4okQH63MaluBOrvxzUwC6tUAXCsSI+6aPk+OGgU7b77Jn8QZkHpzWoSWLzZPb9V8zgc4sJ0DeDVnwdQN/9XXsogOs9gD9kIcbj7ySaUi5SDmW4m6KLRORsjGeO5Knitumnd3qHpxKyyY4zmMvJ80i/27CXzYIqh9vswHYE2LQ2MTbdTp9O+hgXeLAtp0zDzUCnzoF0NZ/RiVLC7xrV+XZmBkdAN8fOpLfUtNoWNpd8hnlIYj62hjBsXhSE0Hjy1HHvWH55ndXO6FrCPoeigXPlLXifudoPkAZ+eoofgNp55jJohhf+4xE4AGmuXyduyO16xwmYWKGQRX0t/ClKceSXriCIOMCBOTaoQRmimHnoN7jMNQbp24hkSVpqkdOM8pvqqDCAS/x75j9uGwZ22JX1MszrkVEN+E6cHV42KnSnVEgAe5x3PQGNaWvpbRVwWxFp/5noIQh96dSLZsfOrJTb3YCEpWrIXPD5oM+33TjvsZrjLIP5pF/Sro1e4argEvn1Z4jJ2qTgm+mhuWOBpyh2zN7iC2yxgHlOvd06nlP8jbRfCUJEQ92ZUxXbpnROonwoHOB1zM3PmXJ9s2fdguVcmjDKTo6HhhrmFenXk/cwZzSeCXH0sN3ys5XJPlGOV6/843y8= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZUhndERYK0NBNCtvSU5xaStuOTVCeHF3Z3BUdFVQMEl6amhCVjJnYTlnVlJR?= =?utf-8?B?MXFzOTg3SEd2c1MvcndSRnRwVEZMSjJvVE9NSWJqZGMrMUQ4clV4QXMvZ2d2?= =?utf-8?B?Wjl5YVo4TGorZExxV0JqQXFqcnRiZndxYVlTZFdaT3RtSmhjRWxDcUNBZnBx?= =?utf-8?B?SFA0Vi9yelFCZHJRY2E1Mzd4MGlISVREU0R5VkQyN2FRS0ppN20rYksvWG1y?= =?utf-8?B?Yk9Pd1VFZ1NkM1FtMzd1YmxNVkZvKzUwTHBLa3BvdFBkWVREQldlaVgwM281?= =?utf-8?B?a1RLaFBjcW4zRDBjZFgzb1VRWjFUZHlJSG1JajNmZzdhVGtENW5YMEMyalBT?= =?utf-8?B?RjEvZDJkMnBCYUw1bjUvQXovbXR4WW5qZ3hGUC9VaExhWDRFck5aRlk4MEhz?= =?utf-8?B?WDlCdHpsV2xzTkVJRHRNenh0Qk9DUnVnSjVjTkhyUGh6eENId2M3N3VqM2M3?= =?utf-8?B?YWw2ZEkxKzJIWDdnaFdaV2lSRDEvTm1TYWRub0RQRjBleUJPbkI5OUJ2S3Z2?= =?utf-8?B?bXQrTDAxRHNzZ0RWWHk0d2FIcU5EUEpvZnVnUFNwRUo1dDlWZ25NczdnbFZH?= =?utf-8?B?Z01XWGhtLzZ6S3V2NTluL1hrTDBRWERrMUNSN2pFaENydEZjUWdkbUVyU2s0?= =?utf-8?B?RW92NE95MmhVdXVzbGwrZ3BsVm1WenI2R1h6bDlqbUF0dDFWVUUzSUppMzA0?= =?utf-8?B?SXhxTEh3NjZYWnU3QmxMdFl6SVRhYTRxbDk5NjZUajQrRko3bWp2aVZrczdY?= =?utf-8?B?Nm1uTTlNdDFMMS95RjE5SlBPYllaVkJrMEx1WGRkekEvZ0dSM2l3bm9JTkFP?= =?utf-8?B?aGcwNmVZVktDVHd6L1VVMXJER3k2MDZCeklrS3pvKzJMVWZDRTVOa2tyZ3Vl?= =?utf-8?B?dklwdnN2Qi9yeDdWMzA1MTFjeldxQytYbWRrVSt6V3pWeHZKem83TWxqalV4?= =?utf-8?B?RFhnSDBWM2pFbHo4eWdZK3NJdFVEWkx0M2pBRGpBdXI0V3lvOXBRbFY3MkdI?= =?utf-8?B?VW91VHh2bk9LTU94VFdkMTFHMVdWSnMydW42Y1FBRlhEanFtNjhUTDdzcTVs?= =?utf-8?B?c2VubHEza0FnbndVVHFVckxYSGJKU25FL2lMN1dRZE91WEtzS1VMMFp0QStO?= =?utf-8?B?NjA3UVp2WkxOK2R3YjRzenpaUGFYT3draUc4a1V2TFVUOEZseVRvZmdXT3Jr?= =?utf-8?B?NGlpR0pJcHBUTEZXcGc0NnZ3QUFxZnNvV3FBN1h5N29kSTRjZEFPRm04Y2ZW?= =?utf-8?B?VFVGVFB0b1M5SDRFZTZtMVNPL1A4Y2RjL2t5bHBsTytXczRZQUcveUVsZTFN?= =?utf-8?B?L21tbUZjOEV4MlJmSzIyajNZZGl6MlFZVllBSXMvVGpOV1pkLzB2Z05oNE4v?= =?utf-8?B?Q0FJSHpaaWYyZ29PRlhLVko3TTh3NTJZdW40VTJLT08wWjNHR09KZ212bDVa?= =?utf-8?B?RFpzQ2xyeW96UjRvZEJmZGhNM0hXakhzRGd5bXZmMkNrcU5qeWgzQllGWmRk?= =?utf-8?B?V2dXRWtpeDJHZFoxcHdZZnduMUQ2Qmh2UjZRWXd0aXBacEtwNUJCY1IrQm42?= =?utf-8?B?QjFXbThIRjB4L05wc0FwdkphRVRLYjdUODVmZWdOVmduNlJNeHJRa2duZEtW?= =?utf-8?B?M3g3SlovcHh3WmtIc3dhTnVLVHRwUDVxdGtleHpDTERmRStTRXliN2NDSE5q?= =?utf-8?B?azNKU1IwcHNSWUpGZHFtMDMyYzczcmVqZG5vY1RYZHBZcUdPa0ZwZnVRPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: eaef473d-fe7e-46f3-31ed-08dc3ac9218a X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Mar 2024 14:57:50.7524 (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: DB9P250MB0523 Subject: Re: [FFmpeg-devel] [PATCH v4 2/3] avformat/flvenc: support enhanced flv PacketTypeMetadata 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-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: zhupengfei via ffmpeg-devel: > From: Zhu Pengfei <411294962@qq.com> > > Signed-off-by: Zhu Pengfei <411294962@qq.com> > --- > libavformat/flvenc.c | 142 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 142 insertions(+) > > diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c > index f6d10f331c..ae7ea84bad 100644 > --- a/libavformat/flvenc.c > +++ b/libavformat/flvenc.c > @@ -24,6 +24,7 @@ > #include "libavutil/intfloat.h" > #include "libavutil/avassert.h" > #include "libavutil/mathematics.h" > +#include "libavutil/mastering_display_metadata.h" > #include "libavcodec/codec_desc.h" > #include "libavcodec/mpeg4audio.h" > #include "avio.h" > @@ -124,6 +125,7 @@ typedef struct FLVContext { > > int flags; > int64_t last_ts[FLV_STREAM_TYPE_NB]; > + int write_metadata_pkt; Should be metadata_pkt_written to be consistent with its semantics. > } FLVContext; > > static int get_audio_flags(AVFormatContext *s, AVCodecParameters *par) > @@ -478,6 +480,145 @@ static void write_metadata(AVFormatContext *s, unsigned int ts) > avio_wb32(pb, flv->metadata_totalsize + 11); > } > > +static void flv_write_metadata_packet(AVFormatContext *s, AVCodecParameters *par, unsigned int ts) > +{ > + AVIOContext *pb = s->pb; > + FLVContext *flv = s->priv_data; > + AVContentLightMetadata *lightMetadata = NULL; > + AVMasteringDisplayMetadata *displayMetadata = NULL; Can be constified. > + const int flags_size = 5; > + int64_t metadata_size_pos = 0; > + int64_t total_size = 0; > + const AVPacketSideData *side_data = NULL; > + > + if (par->codec_id == AV_CODEC_ID_HEVC || par->codec_id == AV_CODEC_ID_AV1 || > + par->codec_id == AV_CODEC_ID_VP9) { You can avoid one level of indentation by returning early here. > + if (flv->write_metadata_pkt) return; > + > + side_data = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data, > + AV_PKT_DATA_CONTENT_LIGHT_LEVEL); > + if (side_data) > + lightMetadata = (AVContentLightMetadata *)side_data->data; > + > + side_data = av_packet_side_data_get(par->coded_side_data, par->nb_coded_side_data, > + AV_PKT_DATA_MASTERING_DISPLAY_METADATA); > + if (side_data) > + displayMetadata = (AVMasteringDisplayMetadata *)side_data->data; > + > + /* > + * Reference Enhancing FLV > + * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp.pdf > + * */ > + avio_w8(pb, FLV_TAG_TYPE_VIDEO); //write video tag type > + metadata_size_pos = avio_tell(pb); > + avio_wb24(pb, 0 + flags_size); > + put_timestamp(pb, ts); //ts = pkt->dts, gen > + avio_wb24(pb, flv->reserved); > + > + if (par->codec_id == AV_CODEC_ID_HEVC) { > + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeMetadata| FLV_FRAME_VIDEO_INFO_CMD); // ExVideoTagHeader mode with PacketTypeMetadata > + avio_write(pb, "hvc1", 4); > + } else if (par->codec_id == AV_CODEC_ID_AV1 || par->codec_id == AV_CODEC_ID_VP9) { > + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeMetadata| FLV_FRAME_VIDEO_INFO_CMD); > + avio_write(pb, par->codec_id == AV_CODEC_ID_AV1 ? "av01" : "vp09", 4); > + } > + > + avio_w8(pb, AMF_DATA_TYPE_STRING); > + put_amf_string(pb, "colorInfo"); > + > + avio_w8(pb, AMF_DATA_TYPE_OBJECT); > + > + put_amf_string(pb, "colorConfig"); // colorConfig > + > + avio_w8(pb, AMF_DATA_TYPE_OBJECT); > + > + if (par->color_trc != AVCOL_TRC_UNSPECIFIED && > + par->color_trc < AVCOL_TRC_NB) { > + put_amf_string(pb, "transferCharacteristics"); // color_trc > + put_amf_double(pb, par->color_trc); > + } > + > + if (par->color_space != AVCOL_SPC_UNSPECIFIED && > + par->color_space < AVCOL_SPC_NB) { > + put_amf_string(pb, "matrixCoefficients"); // colorspace > + put_amf_double(pb, par->color_space); > + } > + > + if (par->color_primaries != AVCOL_PRI_UNSPECIFIED && > + par->color_primaries < AVCOL_PRI_NB) { > + put_amf_string(pb, "colorPrimaries"); // color_primaries > + put_amf_double(pb, par->color_primaries); > + } > + > + put_amf_string(pb, ""); > + avio_w8(pb, AMF_END_OF_OBJECT); > + > + if (lightMetadata) { > + put_amf_string(pb, "hdrCll"); > + avio_w8(pb, AMF_DATA_TYPE_OBJECT); > + > + put_amf_string(pb, "maxFall"); > + put_amf_double(pb, lightMetadata->MaxFALL); > + > + put_amf_string(pb, "maxCLL"); > + put_amf_double(pb, lightMetadata->MaxCLL); > + > + put_amf_string(pb, ""); > + avio_w8(pb, AMF_END_OF_OBJECT); > + } > + > + if (displayMetadata && (displayMetadata->has_primaries || displayMetadata->has_luminance)) { > + put_amf_string(pb, "hdrMdcv"); > + avio_w8(pb, AMF_DATA_TYPE_OBJECT); > + if (displayMetadata->has_primaries) { > + put_amf_string(pb, "redX"); > + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[0][0])); > + > + put_amf_string(pb, "redY"); > + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[0][1])); > + > + put_amf_string(pb, "greenX"); > + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[1][0])); > + > + put_amf_string(pb, "greenY"); > + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[1][1])); > + > + put_amf_string(pb, "blueX"); > + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[2][0])); > + > + put_amf_string(pb, "blueY"); > + put_amf_double(pb, av_q2d(displayMetadata->display_primaries[2][1])); > + > + put_amf_string(pb, "whitePointX"); > + put_amf_double(pb, av_q2d(displayMetadata->white_point[0])); > + > + put_amf_string(pb, "whitePointY"); > + put_amf_double(pb, av_q2d(displayMetadata->white_point[1])); > + } > + if (displayMetadata->has_luminance) { > + put_amf_string(pb, "maxLuminance"); > + put_amf_double(pb, av_q2d(displayMetadata->max_luminance)); > + > + put_amf_string(pb, "minLuminance"); > + put_amf_double(pb, av_q2d(displayMetadata->min_luminance)); > + } > + put_amf_string(pb, ""); > + avio_w8(pb, AMF_END_OF_OBJECT); > + } > + put_amf_string(pb, ""); > + avio_w8(pb, AMF_END_OF_OBJECT); > + > + total_size = avio_tell(pb) - metadata_size_pos - 10; > + avio_seek(pb, metadata_size_pos, SEEK_SET); I see nothing that guarantees that this seek will succeed. In fact, this whole muxer seems to presume that the output is seekable, without checking so. Even worse: flv_write_header() clears the AVIOContext's seekability field in case the FLV_NO_METADATA flag is set. > + avio_wb24(pb, total_size); > + avio_tell(pb); > + avio_skip(pb, total_size + 10 - 3); > + avio_tell(pb); These two avio_tell() are useless. > + avio_wb32(pb, total_size + 11); // previous tag size > + flv->write_metadata_pkt = 1; > + } > +} > + > static int unsupported_codec(AVFormatContext *s, > const char* type, int codec_id) > { > @@ -878,6 +1019,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) > memcpy(par->extradata, side, side_size); > flv_write_codec_header(s, par, pkt->dts); > } > + flv_write_metadata_packet(s, par, pkt->dts); > } > > if (flv->delay == AV_NOPTS_VALUE) _______________________________________________ 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".