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 210C2491AA for ; Wed, 6 Mar 2024 14:35:09 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C1CCF68CB11; Wed, 6 Mar 2024 16:35:06 +0200 (EET) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01olkn2064.outbound.protection.outlook.com [40.92.64.64]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 21B3868C046 for ; Wed, 6 Mar 2024 16:35:00 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mHStw192hXYJe9ziYVE7JuSBY+HKwXLXjwH6eMdIXuUq9hOj2VZECL0OWGg0qjVovFPzS8FtueGSQ9C/jiMuIqk4MWnmxm+SwelkNJcnAY4/VbV5SEUSQEfiDVfEW4eOW0+SdknDECYJse2nMkVPoSoT71BOlLH0bdCjzDquHi8IZ/hsSAXcH7ZFi5SoJWRuz9OKFP+jaWYZmBcm5f/k/KwVrCrTdqA50WutaamyUl+EG4OH+dp2Sku+gxXQbFLWpP5h82FZkulmt9N7SKR4qWTgFgzMT78ZP6tnAboQwV4uAvSFgn1K3XwiACxSQ55Iev83beft6F/BqbIMMRi25w== 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=cF2T2dqVPrPWTvKwiNG2iwOvjc8bo5YpM4qisOjQnF0=; b=k+9JK/dbx3RGOzSTSL1sQiXvz8m8cyeuQSEoaLfuJvTLHAelhC3cvjI0bCEZ9vnoCcv2izxeuEzA13sQk31p4YRxIP/+OFcLFMT3mE2JNsKZmqOoowy7muShjY+czR7FHksiXFjDNN8Z4QfTB7TJXXK+qqDOwX8/rIlKHSp2xO44/E7cZBAmi/i1p2tfkdkDkF89TxP1AQIssc2KDszh84da/lqGU3FypGSRAYTDC70f1KMhWWYv9owIywol+Sk0kcfC7jts3xAlx2fuewtuSatMvByP57vuyZuPanwE3b9B9DaG4U2S5Ak6k0VlFABLZXdB1+2BAFPNCbSze8V+lw== 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=cF2T2dqVPrPWTvKwiNG2iwOvjc8bo5YpM4qisOjQnF0=; b=sziPss6Iuq0gKj1OJ47ah5eIcewgrBYRFjRRIlUQS4rpBKxBOdxRWWH9U663pu/EOTJQvDBrFBPT1btyBz1Vm7dMEPpUuMxB1Vu8bHab7S0iZUsNMCSzf/ltYr+HkYrTQF8jy9QgMejQkv9p82iLkMdmzJu6xOUQLfL0gGpt/sfrp5Y9u5SK6n5Hh4wcq7UC+SOSQUCBW0tPdeoIX1KLUCY1nX7YoUYXKU/ChtxpVo1wAZBJEHWxMUCd441H9hdW5y3lFuJqOC5EnF2v5IGkjSV5DlgLoptGYtQiLSjmOwQkBI4r8ltRSy8rEuyLv99vKF332vTZqg0nTKVuI1+Naw== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by GV1P250MB1063.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:17b::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7339.39; Wed, 6 Mar 2024 14:18:57 +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; Wed, 6 Mar 2024 14:18:57 +0000 Message-ID: Date: Wed, 6 Mar 2024 15:18:56 +0100 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: X-TMN: [NUT9B5QkaCfI7bWjVhoMw7DIJU6HRMD+BrbghJYunrU=] X-ClientProxiedBy: ZRAP278CA0008.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:10::18) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <067c3d54-569d-471c-9af7-272164370060@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|GV1P250MB1063:EE_ X-MS-Office365-Filtering-Correlation-Id: d12b06df-e657-423f-e386-08dc3de85cb6 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: X2bYlkSSBUb+M1/iAmE9fv5ERh5haMJ79saPKLlI5S2wVpQ5LnXGOTbd+gR/5yaeik0nAaV0ienbcm6i/Vz/7gKJivNNm4w0SO+QhiMaYTiBqPccuZaYjWtE+pMFyfFHp7DYbaTsfoLewF/VsrQEsH9OI2GOIuopiAG70dqfzo4hhuXNWhusDlXfV5IrWEZJ9RVBY+zNvJpypXcA2nA31FmqhIbkeNNlVfMZmwslL3sbnoGpWzzHZb4eg5fDB3qp4y24zBDUuwhUflxj3LnHo+8dZdHyLejcbUEDaEsUkbh8Kus18r9RFd345UqXckijxf/9uC6R3bQ8n8yxfcs2GVZJCRIGHRJyVnqwr64unC+5t475NS8Orvm1JEKLgRnMwOtTtPYbAT9KekfmkO07+nTTwp5HMKtEnS+3Vl+3lZRWAuetvG3aQ3HON88sKtWH0ZlQ9vQK7mKgI23Lt0VEePao/n5aatawS9zhc3OuwOf7lGKAAhEoW908nYWzCYUdc51evwjtVatDcBF5KTCh40lOPq7L7ecT9B9wgfcdvr+xfqDqHC7dA5SCnn3wyzSa X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?eW80OEUvajRrakFTaGxNcGZzUFM0TVgzQjhJV1ljSXUxdkV2SGM0TkJoUzRv?= =?utf-8?B?THI4bE16OE05Q05rQVV6Z2hEMWtjWWg5dm1WR3JJcllKSUVLeWdYRVZlV3pp?= =?utf-8?B?ZVF4dkRBQkNkVkUwdnZNcEJJN25YVjdlTmxLODZFU1E5bk5CcE5ySGNVSnc2?= =?utf-8?B?US9kN2h4Y1BjOUsvNkljT0RxNHJpWjZWbVJNYUdWZ04xYkI3VWxUMXl5Ny9Z?= =?utf-8?B?dkRuejA1aTJROGVPcHlwV3dWcjVUK0FSU2QzVVlmOWN5ZnZ0Z2F1dEpFQzhT?= =?utf-8?B?QUgvZ0p2Ym1CMXI0R0FDanJJTHBuMTRTRXFUWEZ1R081NlY2R1lFNy9RTTdh?= =?utf-8?B?WTc1RCtlVTUyMXJXMWZTam1MSDdVdEtlbzNFNWlCYXczeTdqM0hlYTNNeEhS?= =?utf-8?B?d3dCQXRkQzdHVVhHV2FHU3czM0ttU3ZxRC82YkdRL2ZWZ3lXbi9VQkE2cHph?= =?utf-8?B?QU96OUpVeUNURkJlRE5sWHpNV1MxL1EyMTdocktsVXJsSGxWbmNVY21FZmRY?= =?utf-8?B?NVVyV1VsMDE1TVM2Y1dsc29vYjg0S3ZwaXN3cm5hNXpmS0lYN0JBd2Q5aDlO?= =?utf-8?B?azJmQXVDdnpnR1VzR0dVOW85OUltUUtUUitDTkFVVUtqNDkzV1BoTGpKbTJG?= =?utf-8?B?bnV6MHo5QWZaQTZVZ0pnTzVYNksyakt2YnNLaFVxR2w5L2ZLSElBbzZtTnNO?= =?utf-8?B?QlRkL3JFSll0RnpZOWp1dnIrWVJDUXpjbm1tRGhVTkJmVVNsMURjZGUyMXpF?= =?utf-8?B?T3FUcWU2U0VDakNmdlFObTE1dk5zZGw3bndlKzBtNTNnZ2VwOHVqZGIwTTFh?= =?utf-8?B?cjBWY3VLVThva0pCNzdrLzBmalN4YlJlUnhod1JsNzhxVmh2d3BrYzFRNjhj?= =?utf-8?B?cDRtWGtBWWpOZG1pcEN2QnVsckp6YnhLeTZISlh5aERDaDV2MDZnRU9LM0pH?= =?utf-8?B?OXVTN0tOWFBGSHUyUDBtUFpzSmFuRHJtM2Q1alBYUHEvb09VMkJYNVRCUlQv?= =?utf-8?B?dG5YL3BxeDFpcWZqN0NnZWRGbjJHRnJIeHkrdG9QWDgzWW1MMHVMamRpUmtq?= =?utf-8?B?dzV4R3laeGZUaHhrZmVUaDFlM2Y0d1RicWg4K3Z3dldJRml5N1VobmttOTdz?= =?utf-8?B?bW0zRXNZeWErTTNrelQyamQ4STd2K2RHODVERHY1bHZGQ0FQM1VqeXAxdC9n?= =?utf-8?B?MEgrT3pRSENRZXdRSi91Z1VwRjdQcjJjMDM0WFQ5VGlDQ24vc08yVEVmOThY?= =?utf-8?B?dk4xU1cyQ1FpYlROQm95M291MUU4ekp0T1JPcGhjeDZvVkVxZ3ZkdGNwRVc0?= =?utf-8?B?R0F3aGFNUkFDa1U4QktFQWxxR2F0YVBkelIvTkJ1YjVMWFZha0xhTFl0UXRo?= =?utf-8?B?b3I5M2dtU3BsOUVTMG9uVGt3azNCNVNTdXQ4RVlleGdBb0dNL1dKcXNYRlEr?= =?utf-8?B?U1hSbzN1bnZxaERLdmlQcUhaWXpHTHh6bHE3UzhpQkFadTdPSEMwMENQOWpH?= =?utf-8?B?aWJ0bDhPQkVqTjYzOHh4YlZ1aE5tWkxQVGQvR0EzTDFyLzd0SlVsbTF6YnN0?= =?utf-8?B?TjZmc2V4UGdPSEJIZ0tXa2lrcmFqeTBPWk1YZ3htS2pobWY0eFV4cUhpSE41?= =?utf-8?B?VjdFMFo5WVV2bGRHWEcrQ0Rwdzg3bTFMVmxjc2NsOGhETTBBN20zcVpXN3dV?= =?utf-8?B?TkV3L2NKaHJiNmZDTWorcDRENzQ4K21PU1RublByT1JyRWovYUd2YzJRPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d12b06df-e657-423f-e386-08dc3de85cb6 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2024 14:18:57.8836 (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: GV1P250MB1063 Subject: Re: [FFmpeg-devel] [PATCH] avcodec/libx264: fix extradata when config annexb=0 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: Zhao Zhili: > From: Zhao Zhili > > --- > configure | 2 +- > libavcodec/libx264.c | 148 ++++++++++++++++++++++++++++++++++++------- > 2 files changed, 125 insertions(+), 25 deletions(-) > > diff --git a/configure b/configure > index bbf1a70731..ef58c3fe97 100755 > --- a/configure > +++ b/configure > @@ -3491,7 +3491,7 @@ libwebp_encoder_deps="libwebp" > libwebp_anim_encoder_deps="libwebp" > libx262_encoder_deps="libx262" > libx264_encoder_deps="libx264" > -libx264_encoder_select="atsc_a53" > +libx264_encoder_select="atsc_a53 h264parse" > libx264rgb_encoder_deps="libx264" > libx264rgb_encoder_select="libx264_encoder" > libx265_encoder_deps="libx265" > diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c > index 10d646bd76..10dfda125d 100644 > --- a/libavcodec/libx264.c > +++ b/libavcodec/libx264.c > @@ -34,9 +34,12 @@ > #include "avcodec.h" > #include "codec_internal.h" > #include "encode.h" > +#include "get_bits.h" > +#include "h264_ps.h" > #include "internal.h" > #include "packet_internal.h" > #include "atsc_a53.h" > +#include "put_bits.h" > #include "sei.h" > > #include > @@ -865,6 +868,124 @@ static int convert_pix_fmt(enum AVPixelFormat pix_fmt) > return 0; > } > > +static int set_avcc_extradata(AVCodecContext *avctx, x264_nal_t *nal, int nnal) > +{ > + x264_nal_t *sps_nal = NULL; > + x264_nal_t *pps_nal = NULL; > + GetBitContext gbc; > + PutBitContext pbc; > + H264ParamSets ps = { 0 }; > + uint8_t *p; > + int ret, profile; > + > + /* We know it's in the order of SPS/PPS/SEI, but it's not documented in x264 API. > + * The x264 param i_sps_id implies there is a single pair of SPS/PPS. > + */ > + for (int i = 0; i < nnal; i++) { > + if (nal[i].i_type == NAL_SPS) > + sps_nal = &nal[i]; > + else if (nal[i].i_type == NAL_PPS) > + pps_nal = &nal[i]; > + } > + av_assert0(sps_nal); > + av_assert0(pps_nal); We should never assert on the output of external libraries. > + > + // +11 for AVCDecoderConfigurationRecord, will shrink to the real size finally > + avctx->extradata_size = sps_nal->i_payload + pps_nal->i_payload + 11; > + avctx->extradata = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_MIN_SIZE); AV_INPUT_BUFFER_PADDING_SIZE > + if (!avctx->extradata) > + return AVERROR(ENOMEM); > + > + // Skip size part > + p = sps_nal->p_payload + 4; > + init_get_bits8(&gbc, p, sps_nal->i_payload - 4); > + skip_bits(&gbc, 8); > + ret = ff_h264_decode_seq_parameter_set(&gbc, avctx, &ps, 0); This is completely overblown. You only read three fields: profile_idc, the constraint fields and level_idc. All three are at the start of the SPS and occupy a whole byte, so there is no need for a GetBitContext at all. (Yes, I am aware of the hypothetical scenario in which we could have a 0x03 escape byte before level_idc (in case of a hypothetical future profile zero), but even then using ff_h264_decode_seq_parameter_set() is overblown.) > + if (ret < 0) > + return ret; > + > + for (int i = 0; i < FF_ARRAY_ELEMS(ps.sps_list); i++) { > + if (ps.sps_list[i]) { > + ps.sps = ps.sps_list[i]; > + break; > + } > + } > + > + // Now create AVCDecoderConfigurationRecord > + init_put_bits(&pbc, avctx->extradata, avctx->extradata_size); > + put_bits(&pbc, 8, 1); // version > + put_bits(&pbc, 8, ps.sps->profile_idc); // AVCProfileIndication > + put_bits(&pbc, 8, ps.sps->constraint_set_flags); // profile_compatibility > + put_bits(&pbc, 8, ps.sps->level_idc); // AVCLevelIndication > + put_bits(&pbc, 11, 0x7FF); > + > + p = sps_nal->p_payload + 4; > + put_bits(&pbc, 5, 1); // numOfSequenceParameterSets > + put_bits(&pbc, 16, sps_nal->i_payload - 4); // sequenceParameterSetLength I also think that using a PutBitContext is overblown here (most fields don't cross a byte-boundary, the bit-alignment of every field is fixed), in particular if you copy the NALUs eight bits at a time: > + for (int i = 0; i < sps_nal->i_payload - 4; i++) > + put_bits(&pbc, 8, p[i]); > + > + p = pps_nal->p_payload + 4; > + put_bits(&pbc, 8, 1); // numOfPictureParameterSets > + put_bits(&pbc, 16, pps_nal->i_payload - 4); // pictureParameterSetLength > + for (int i = 0; i < pps_nal->i_payload - 4; i++) > + put_bits(&pbc, 8, p[i]); > + > + profile = ps.sps->profile_idc; > + if (profile != 66 && profile != 77 && profile != 88) { > + put_bits(&pbc, 6, 0x3F); > + put_bits(&pbc, 2, ps.sps->chroma_format_idc); > + put_bits(&pbc, 5, 0x1F); > + put_bits(&pbc, 3, ps.sps->bit_depth_luma - 8); > + put_bits(&pbc, 5, 0x1F); > + put_bits(&pbc, 3, ps.sps->bit_depth_chroma - 8); > + put_bits(&pbc, 8, 0); > + } > + flush_put_bits(&pbc); > + avctx->extradata_size = put_bytes_output(&pbc); > + > + ff_h264_ps_uninit(&ps); > + > + return 0; > +} > + > +static int set_extradata(AVCodecContext *avctx) > +{ > + X264Context *x4 = avctx->priv_data; > + x264_nal_t *nal; > + uint8_t *p; > + int nnal, s; > + > + s = x264_encoder_headers(x4->enc, &nal, &nnal); > + if (s < 0) > + return AVERROR_EXTERNAL; > + > + if (!x4->params.b_annexb) > + return set_avcc_extradata(avctx, nal, nnal); > + > + avctx->extradata = p = av_mallocz(s + AV_INPUT_BUFFER_PADDING_SIZE); > + if (!p) > + return AVERROR(ENOMEM); > + > + for (int i = 0; i < nnal; i++) { > + /* Don't put the SEI in extradata. */ > + if (nal[i].i_type == NAL_SEI) { > + av_log(avctx, AV_LOG_INFO, "%s\n", nal[i].p_payload + 25); > + x4->sei_size = nal[i].i_payload; > + x4->sei = av_malloc(x4->sei_size); > + if (!x4->sei) > + return AVERROR(ENOMEM); > + memcpy(x4->sei, nal[i].p_payload, nal[i].i_payload); > + continue; > + } > + memcpy(p, nal[i].p_payload, nal[i].i_payload); > + p += nal[i].i_payload; > + } > + avctx->extradata_size = p - avctx->extradata; > + > + return 0; > +} > + > #define PARSE_X264_OPT(name, var)\ > if (x4->var && x264_param_parse(&x4->params, name, x4->var) < 0) {\ > av_log(avctx, AV_LOG_ERROR, "Error parsing option '%s' with value '%s'.\n", name, x4->var);\ > @@ -1233,30 +1354,9 @@ FF_ENABLE_DEPRECATION_WARNINGS > return AVERROR_EXTERNAL; > > if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) { > - x264_nal_t *nal; > - uint8_t *p; > - int nnal, s, i; > - > - s = x264_encoder_headers(x4->enc, &nal, &nnal); > - avctx->extradata = p = av_mallocz(s + AV_INPUT_BUFFER_PADDING_SIZE); > - if (!p) > - return AVERROR(ENOMEM); > - > - for (i = 0; i < nnal; i++) { > - /* Don't put the SEI in extradata. */ > - if (nal[i].i_type == NAL_SEI) { > - av_log(avctx, AV_LOG_INFO, "%s\n", nal[i].p_payload+25); > - x4->sei_size = nal[i].i_payload; > - x4->sei = av_malloc(x4->sei_size); > - if (!x4->sei) > - return AVERROR(ENOMEM); > - memcpy(x4->sei, nal[i].p_payload, nal[i].i_payload); > - continue; > - } > - memcpy(p, nal[i].p_payload, nal[i].i_payload); > - p += nal[i].i_payload; > - } > - avctx->extradata_size = p - avctx->extradata; > + ret = set_extradata(avctx); > + if (ret < 0) > + return ret; > } > > cpb_props = ff_encode_add_cpb_side_data(avctx); _______________________________________________ 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".