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 AC938462D3 for ; Thu, 11 May 2023 17:57:36 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8686B68C0C4; Thu, 11 May 2023 20:57:33 +0300 (EEST) Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2035.outbound.protection.outlook.com [40.92.91.35]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5291F68BF80 for ; Thu, 11 May 2023 20:57:27 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AS7Eco/XjrNdfTJOUIWy06evL1aGbW3WX1E0EVNqr07yJiNgeK7VwIZWKlBxkVb6fcpJbTxQm6YjeUlhg5KcEn2khZwcb3CU33HYlmI/d3jZPvEnwPUMyNWpydzMHH16VwSAae2J7tXtH7DcPWjGl3FezY4MxdHdfOK9UUvAX2OXicsnH69aaE9Z+OATqfqy+Rx1YImNWYzUAMCxjguP/iYKvDaQK8XLpv8mdbLsDAsAlEos6QPuNJuQfUgAb3y5eMZkYooKTjQXipcCcvqek/BNQXDeLMX9MAvNDbziFS0Wrt1XQ2se0hPUmy7Duu7BN+yxT8irGb77jhsW25Bd/Q== 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=xFWdZS4ChRkfheljv6yRnDYMii9S4lGfR9wFCMQ9lxQ=; b=dwaMK2R0DXztyPPAaYda85T6Iq51TyV7/Pv+JQAHH5nUUqHVc1/++A91HcmSR0XCjutJcMXNf4GTskB49TnyhaKOYCGV+ec2/wFTWew5u7VFncALh6Fi2OUS/XcrnTMQQcT339Cpf+2o/0uzrf/sy4IND4iSwwTp4sSAIlde1KU9nQsMxXGq+v3hRECW/qrT09wECGS87N0MY3Zchatpv4i78wcIp3eE8OsHfyekY+qyTmhCbUZ8wdvmmLWuJdWqCxiTiMf7aYXMiM/m3tsPOniq7cK5Y3Yewerbvgf4tUdRRk4nEVRlWZ412cl4IrebjSRZSttX0XUUKzspAjB1yg== 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=xFWdZS4ChRkfheljv6yRnDYMii9S4lGfR9wFCMQ9lxQ=; b=a90bhWUZkxmbOrvy4bZbaSfDisId5X+SQIy+ZrqotplTbroMzVrdxaayEvxgS2vPeoGBpyofBum6ECaoj1z13G8Q+v/4SEOhO7mfWMR366WPk4aoJZADthiUpAplQwMMmk9nY8/Kc+36Gf/Fp/ekCRLj/5umIcynolH7wu4NoTc8r6U+dITOQT5WLIa+9KPMAoctL6u2F8ellU8rYloS2AQb4fmp9zr4L8xuMaJ0poCD3NjgfnpASHB07rMmd8oUIN7eRkRZaBRjzxXX/1q6635nmlSxRs++8RPAz4b7X/mFREUbZolGybiPw2gPuYXVl0rvRngHrvfDM5RL6wgHWw== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0328.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:32b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6387.19; Thu, 11 May 2023 17:57:25 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::e17a:a918:63b0:41c6]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::e17a:a918:63b0:41c6%6]) with mapi id 15.20.6363.033; Thu, 11 May 2023 17:57:25 +0000 Message-ID: Date: Thu, 11 May 2023 19:58:07 +0200 To: ffmpeg-devel@ffmpeg.org References: <20230413094441.56225-1-lq@chinaffmpeg.org> <20230413094441.56225-2-lq@chinaffmpeg.org> Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: <20230413094441.56225-2-lq@chinaffmpeg.org> X-TMN: [wpYbXBet1PupWxWL5DBL4uAwTHgW+eRL] X-ClientProxiedBy: ZR0P278CA0139.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:40::18) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0328:EE_ X-MS-Office365-Filtering-Correlation-Id: 63769cf8-62e4-425e-bc39-08db52492d34 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: AVfAhb/0pfHrQavPZs9ILCTYLv36HLWysNUcOhcKqg9mrIpDBCP+hDpXicf69JKx5ZxgOBlvzOWUokiw+klnunY6/yfHwgBLW476FwXHi8LC5fOZZBgm3QH0FAB0KXGquLUovkw3ffiw1EqyyEub1cyNTo57sYVLKqc7EKLFPRsJbWSFEYuabfXqdYCChQtRJLlgJbCwJ5ZkH9DAgy8iRjdwXMwDdjZ1RJZIA1nuPDIrnKd8111FdInRl9YeIKSrK4KjzZEsAD4dFIFka9ElS5YUXRKGdpApqGSKkJEHybSConXrJAU5q+/PrUxzkdb4TynOSOmfVvQGjeYOA0GRDaVMCWK4qQDLp+87QW/cRmM+Qgghb8fDzPJLv9X4XpflSkOnd+8KGJZcTgf/ab+Z+XbRUJ6Mo5HnP2A9N3MACsiR7iDPfn3O8xSa21NWTW84NRu9XcwNgZiueaXMytkORqZ3zCTJFNPutL8uOndAgT5sscNiNbXSFne0aP3ixvDIynPPYHPHQ2RJMKfg8aaBfZN4RBzp1TEpOSHmZjsJpC0kz9TviFEUybV81tCpijqarEPVjrYp7wks05xVszrSU5lQuvtMMI3vmYvp2i2OHzI= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cENMWUN0NDkwRmkxY1dEWDBKNW8veDFUb2ZrUVVBM0pOeUNNckgvTGpyVk8w?= =?utf-8?B?K0ZzTWRZVzlkai9DMmFncmNMMm1yU3REYVJhbFNSNEZQUVN1dDJEQkx4bU9Z?= =?utf-8?B?US9VcHNhdStKdWt2MnFZeGxEUHF3aXIwY2phTUpJVDVIbjZKTzJkaHJ0WWtq?= =?utf-8?B?eUxTZVFHWEk1Z1lMVDlneXgvVUpHcHYrR3JROUJLWU1lR05ZOGh6YjV6RVlV?= =?utf-8?B?VzFGakFPdnNneXF5dm1ic1ZIbDFnb3dINXk3eDFxYUU3bTcvR1FhdGVsUEZ1?= =?utf-8?B?VSs0WlQ3dHFHTm5hTmJRNTZoSk1xOUYyckRHYlBSQWxnQXU0VHA2Nys1a283?= =?utf-8?B?NWNaRm9iNk9URHNrZGpwNzJxU3FPTDIxd1RVUzUvOG5GVXlvYVlSUXJUR1Fv?= =?utf-8?B?dnM0Vko4OUI3TkdhWlN1VmxEdk41aitzSWFlOURiemRCd1RxUDY1SERJZWlp?= =?utf-8?B?eWdEU3o1YW9ybFE1SUpNbGZKZVdVelhhd1pyQ1pDTE5oM2F5WThiQ0JIbkg1?= =?utf-8?B?MEpvTllMNndyOGtkbUovT1E3c25hUmN5ZGFuYmZpZlVMS3V0a0h6VVlRKzhz?= =?utf-8?B?aGZxSDhtTjRlaU0vS3hCeGVKeFpxNEpjUDEvZUQyMXNUaWJXNzBTUnBDLzAy?= =?utf-8?B?SXAyb3h2bzMvMktFbSt1Q0x6VzdQeDJ5N0pqNGhEcUZkdGZueElIYjF1RE5V?= =?utf-8?B?QjNzMGlTU2xCK0pxSi9qRFlkOUhaQzV0YWJmOUVQbGtpWjNEekNtdGRUeUFE?= =?utf-8?B?enlCdHQxeWZpR2cvSzFtTnY0WTE5NlRaOWcwQU1jWUEvdUg0RGtUK2lIN1Fi?= =?utf-8?B?TWdHRm5BYU5yM1lMMEdzOTArUHI1Y3FoN3ppMC9rZ1M0LzdnQWMvWkhtYldD?= =?utf-8?B?bTgrUkFQZWlrOGRCci9Ic3owYm1vY3NYZlBmWnBiTmZZanBpSmxtQlkyWDZX?= =?utf-8?B?cnF5S3BiclJqUFJxcWg2VnBad2VkL3VVUFY2bmE5dHd6UWNDc3Z0UE5MakRM?= =?utf-8?B?M2ZYSzhobSsrRkdjOENHS2psRXlXWWJ4NUo3djdZUWlLblM0ajU3WC9PSXlS?= =?utf-8?B?M1kvN1c3T29MK0xNTmJkSnhhVHllR0R3QXc0RDQ3aU13ZmF4ZFBuU0IwM055?= =?utf-8?B?bDA1OXFWaVc0LzVyZnRLSnNweW9tVWUxVWZNMExLTEtiSko5cXpRL0t6cSs1?= =?utf-8?B?a1JLQWJzbS9vQ2ZXYk5rZysyYjAyWHhJalNVUUlBRDg0RTdtYkVwOEQrY0ww?= =?utf-8?B?NUkrUE1OcFBxV1A3UXY4a0FTR1JoZzR5R2NaUWZEVFNaOEZwclZZTVVIYm1r?= =?utf-8?B?VHcvWGxReVduSUVzV3ZncWUrZUNWOUlhZkJESGlGbnNnWXpzWTdiUjZxSlYz?= =?utf-8?B?eCtPZkc0Wjdjc1RvU1VMeHpZenZwVXNzSFFmQ0pUSWU4U3h5ZTVLZmRqZ2RB?= =?utf-8?B?N0JsL2tOZjhibGlyZ0FpYjRPYXlXelRmSjVobGJBNlNEMjFHd2E5NHF0VUE4?= =?utf-8?B?eWZ1V2gyT0RvRlNJbUlVTmtmM0FkWHQ1bDVFZXAzdVdVRVJZRktCY1J2MGJm?= =?utf-8?B?MlFDNVBVWExxelpWWW5BYWVpS0UvRnpHL0QzYU5oYnVnQ2JDQm5lNVo5WE9v?= =?utf-8?B?ZlREUlI5OCtBdWsxQi9ZUk9OUFpuYXFhNkM2WHNDL04vT3MvMitIQ1lPMjlH?= =?utf-8?Q?kuQueWRbmHw1Vj4bVbdC?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 63769cf8-62e4-425e-bc39-08db52492d34 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 May 2023 17:57:25.2548 (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: AM8P250MB0328 Subject: Re: [FFmpeg-devel] [PATCH v8 1/6] avformat/flvenc: Add support for HEVC over flv in muxer 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: Steven Liu: > Signed-off-by: Steven Liu > --- > libavformat/flv.h | 15 +++++++++++++++ > libavformat/flvenc.c | 41 +++++++++++++++++++++++++++++++---------- > 2 files changed, 46 insertions(+), 10 deletions(-) > > diff --git a/libavformat/flv.h b/libavformat/flv.h > index 3571b90279..91e0a4140c 100644 > --- a/libavformat/flv.h > +++ b/libavformat/flv.h > @@ -35,6 +35,12 @@ > > #define FLV_VIDEO_FRAMETYPE_OFFSET 4 > > +/* Extended VideoTagHeader > + * defined in reference link: > + * https://github.com/veovera/enhanced-rtmp/blob/main/enhanced-rtmp-v1.pdf > + * */ > +#define FLV_IS_EX_HEADER 0x80 > + > /* bitmasks to isolate specific values */ > #define FLV_AUDIO_CHANNEL_MASK 0x01 > #define FLV_AUDIO_SAMPLESIZE_MASK 0x02 > @@ -112,6 +118,15 @@ enum { > FLV_CODECID_MPEG4 = 9, > }; > > +enum { > + PacketTypeSequenceStart = 0, > + PacketTypeCodedFrames = 1, > + PacketTypeSequenceEnd = 2, > + PacketTypeCodedFramesX = 3, > + PacketTypeMetadata = 4, > + PacketTypeMPEG2TSSequenceStart = 5, > +}; > + > enum { > FLV_FRAME_KEY = 1 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< key frame (for AVC, a seekable frame) > FLV_FRAME_INTER = 2 << FLV_VIDEO_FRAMETYPE_OFFSET, ///< inter frame (for AVC, a non-seekable frame) > diff --git a/libavformat/flvenc.c b/libavformat/flvenc.c > index fbf7eabaf8..57a26245ff 100644 > --- a/libavformat/flvenc.c > +++ b/libavformat/flvenc.c > @@ -28,6 +28,7 @@ > #include "libavcodec/mpeg4audio.h" > #include "avio.h" > #include "avc.h" > +#include "hevc.h" > #include "avformat.h" > #include "flv.h" > #include "internal.h" > @@ -46,6 +47,7 @@ static const AVCodecTag flv_video_codec_ids[] = { > { AV_CODEC_ID_VP6, FLV_CODECID_VP6 }, > { AV_CODEC_ID_VP6A, FLV_CODECID_VP6A }, > { AV_CODEC_ID_H264, FLV_CODECID_H264 }, > + { AV_CODEC_ID_HEVC, MKBETAG('h', 'v', 'c', '1') }, > { AV_CODEC_ID_NONE, 0 } > }; > > @@ -492,7 +494,7 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i > FLVContext *flv = s->priv_data; > > if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 > - || par->codec_id == AV_CODEC_ID_MPEG4) { > + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { > int64_t pos; > avio_w8(pb, > par->codec_type == AVMEDIA_TYPE_VIDEO ? > @@ -535,10 +537,19 @@ static void flv_write_codec_header(AVFormatContext* s, AVCodecParameters* par, i > } > avio_write(pb, par->extradata, par->extradata_size); > } else { > - avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags > - avio_w8(pb, 0); // AVC sequence header > - avio_wb24(pb, 0); // composition time > - ff_isom_write_avcc(pb, par->extradata, par->extradata_size); > + if (par->codec_id == AV_CODEC_ID_HEVC) { > + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeSequenceStart); // ExVideoTagHeader mode with PacketTypeSequenceStart > + avio_write(pb, "hvc1", 4); > + } else { > + avio_w8(pb, par->codec_tag | FLV_FRAME_KEY); // flags > + avio_w8(pb, 0); // AVC sequence header > + avio_wb24(pb, 0); // composition time > + } > + > + if (par->codec_id == AV_CODEC_ID_HEVC) > + ff_isom_write_hvcc(pb, par->extradata, par->extradata_size, 0); > + else > + ff_isom_write_avcc(pb, par->extradata, par->extradata_size); > } > data_size = avio_tell(pb) - pos; > avio_seek(pb, -data_size - 10, SEEK_CUR); > @@ -628,7 +639,8 @@ static int flv_init(struct AVFormatContext *s) > return unsupported_codec(s, "Video", par->codec_id); > > if (par->codec_id == AV_CODEC_ID_MPEG4 || > - par->codec_id == AV_CODEC_ID_H263) { > + par->codec_id == AV_CODEC_ID_H263 || > + par->codec_id == AV_CODEC_ID_HEVC) { > int error = s->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL; > av_log(s, error ? AV_LOG_ERROR : AV_LOG_WARNING, > "Codec %s is not supported in the official FLV specification,\n", avcodec_get_name(par->codec_id)); > @@ -836,13 +848,13 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) > if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A || > par->codec_id == AV_CODEC_ID_VP6 || par->codec_id == AV_CODEC_ID_AAC) > flags_size = 2; > - else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) > + else if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) > flags_size = 5; > else > flags_size = 1; > > if (par->codec_id == AV_CODEC_ID_AAC || par->codec_id == AV_CODEC_ID_H264 > - || par->codec_id == AV_CODEC_ID_MPEG4) { > + || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { > size_t side_size; > uint8_t *side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size); > if (side && side_size > 0 && (side_size != par->extradata_size || memcmp(side, par->extradata, side_size))) { > @@ -862,7 +874,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) > "Packets are not in the proper order with respect to DTS\n"); > return AVERROR(EINVAL); > } > - if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4) { > + if (par->codec_id == AV_CODEC_ID_H264 || par->codec_id == AV_CODEC_ID_MPEG4 || par->codec_id == AV_CODEC_ID_HEVC) { > if (pkt->pts == AV_NOPTS_VALUE) { > av_log(s, AV_LOG_ERROR, "Packet is missing PTS\n"); > return AVERROR(EINVAL); > @@ -907,6 +919,10 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) > if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) > if ((ret = ff_avc_parse_nal_units_buf(pkt->data, &data, &size)) < 0) > return ret; > + } else if (par->codec_id == AV_CODEC_ID_HEVC) { > + if (par->extradata_size > 0 && *(uint8_t*)par->extradata != 1) > + if ((ret = ff_hevc_annexb2mp4_buf(pkt->data, &data, &size, 0, NULL)) < 0) This requires a flvenc->hevc.o Makefile dependency. Similarly for other patches in this patchset. > + return ret; > } else if (par->codec_id == AV_CODEC_ID_AAC && pkt->size > 2 && > (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) { > if (!s->streams[pkt->stream_index]->nb_frames) { > @@ -968,7 +984,12 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt) > avio_wb32(pb, data_size + 11); > } else { > av_assert1(flags>=0); > - avio_w8(pb,flags); > + if (par->codec_id == AV_CODEC_ID_HEVC) { > + avio_w8(pb, FLV_IS_EX_HEADER | PacketTypeCodedFramesX); // ExVideoTagHeader mode with PacketTypeCodedFramesX > + avio_write(pb, "hvc1", 4); > + } else { > + avio_w8(pb, flags); > + } > if (par->codec_id == AV_CODEC_ID_VP6) > avio_w8(pb,0); > if (par->codec_id == AV_CODEC_ID_VP6F || par->codec_id == AV_CODEC_ID_VP6A) { _______________________________________________ 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".