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 9821D4959C for ; Thu, 14 Mar 2024 13:15:05 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8536F68D19C; Thu, 14 Mar 2024 15:15:02 +0200 (EET) Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04olkn2024.outbound.protection.outlook.com [40.92.73.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 027C968CF55 for ; Thu, 14 Mar 2024 15:14:55 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ATIDPPrqvub0CRGiYLnBt8SFsYK4fxWrBoinCrKoiS8kijo7QsaN+HrTV1nUX4ZvcsdEF/OjQmI7yqWZp1H4GBfYNWesKRLjoTnb0+eLMqPx2nrmW2DhgUOL9b63w0ot5TydZK5Vf7P36El9gJP64dVX/t41uc7putPWDEyiw4RMYR4jQIi1p7Z/dWqjwD3THSMUBzXRjJT74/PJTQWhWyZq/PSKvqo+t+cpoBHdB01y5/tU9C8HPo8JhBzi4Jrnz9vWjX0KxaB0lHmY3BeMJ3ASlS0Z4E/Hh4DxjJp4yWtouyEWYowkCIxqB7RbpbaVoi88nlrv4KbzQlxCdQ97wA== 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=Mn97aybgvljHEVUCraxNB05CpiWL8wQiO/nnDnFV9cA=; b=PexaXWltbF/oXVQTWbDXUSTH5mSyP+WvpF5xxRnsu/iGaO/4Ux5PiVqn/y8fwzChjG8FOcNdC66Tjb0uzw0FrZmMmXPkTsgihJ+aYFm9JxOxtkYdezGkOg+J/+Ck/L/0miiS3AyiJy6hNOvBmYEhpuZs5qRYVP7N7jKOAceiKpc8u8AqL+zahAufwrK4ADFFRf+02D4cz2bcpLdyLvACe4UHV5zBPA8tf8kmrzeF0zwFv3+1Zh8mWMloG8aZrdfZiWqhO+FPBPHtXrB6t/5MX8gopdjqKfNnXG4u5TyFUPIuLbEtuitHrUfBxTXxhiX1YdiRh/kyfjPomfwlwJdYqg== 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=Mn97aybgvljHEVUCraxNB05CpiWL8wQiO/nnDnFV9cA=; b=GOI2IiOXanQrL8woHL4Ul9fi/Rjgu+DPrcH3Wnhx3pOrpHglpW5uP7atun6aPXfWK9u/2w7xWsevKJINhlfVfB/KCeUlxe0IdYOr0WRK8gXlFThyzjgtTt+1AB2GXDbCwptyV+gklVnCalFUD8ZeSz2KZ7/wD8EWQu0CxW1M2GVfmjiyq1VXi9bz7ShpJtW5+A6jUPcP9NqgL9wp0nl1RqupT65LJmCvmmF8GwVPhoYatMNsKLDU+nFVUdmL66AfgLUW3KpnDCiclLfEUUBlsUEOjZX1V68TNleyeyFj3nWE1KxfsPPa8aMe74k7lbsPiSD7sos/JEvVUGWoq2CzxQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AS4P250MB0560.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:4bc::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7362.36; Thu, 14 Mar 2024 13:14:54 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::228d:8c6f:ed10:82eb]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::228d:8c6f:ed10:82eb%7]) with mapi id 15.20.7362.035; Thu, 14 Mar 2024 13:14:54 +0000 Message-ID: Date: Thu, 14 Mar 2024 14:14:52 +0100 User-Agent: Mozilla Thunderbird Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: Andreas Rheinhardt In-Reply-To: X-TMN: [4+pk8oMvGkMg5TGL72Gtb2wWFYKZHjAqWL2S2T5ZU1U=] X-ClientProxiedBy: ZR2P278CA0006.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:50::12) 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_|AS4P250MB0560:EE_ X-MS-Office365-Filtering-Correlation-Id: 146aa7a8-bda3-483a-b5de-08dc4428bcf8 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: OS6MsiI2QoHz+JEMYxyWW43PBocPkzs8UBphXIiR204S9xk/Puf6uTplTjnSy9l/l6ej64WSSqsrL88JVOLkgH+is1soPEVLhYPzNQhnVaEgDd4vw3j18hvD0/zsol9aHwUWgXiFioJraQk9A/5A1ZjVH90JQmNsdiD6TcOuOwdaZCGFLVkCQ74rQjNIEhe/Xb+NYwh/Km0FMGddXBALTyEWwwmUcjKooJogGtSfYjsZ7L9FqLMES1feT6Z8RcN2BbNILF7Eu0Li5yP8xYsan+AuvYfl7j4kVNduQr9Zno9lsnyI8/2iYtTUhUK3HYOxT7WynbksklI1CM9a1TNy0r2x4a1P3AK5KCZRs1ABK3nUrFmOerdn6wdkgXiKuqSa0Ttpoqdu2sL9QE+Sx59p5uQqo3/dPsnK/8amOs2hUFWTmw5dYKbKra+m6PC7yLNMzYGfE4QHsyPjAFgKSofmvbgHCI59COSTsUPTNVSxk5MzU+2X7fG2Zv2JwuC6wk5bKFolOIGb4Z/yODlDmKjyLeIIUJic7vYC1MOvXHMunxQcjnA7DZfGjOcdujlO3G31 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SDhaaHN2Znk1THJ2RXp4MldJbUhCZVN5aG9xUnhrM3ZhL0svWUMzYTgyTUpk?= =?utf-8?B?Mm8rMTJpRUozNjl2akhLeUxNZTJHdXFPN3Q3Q2hBQnhoS0JTeGl1MGpFVUkv?= =?utf-8?B?aTIySkhqd0c4ZkE3VTNkQ1BJQnQ0cDd5alJMUGxwRnQ2TkUvQmJxWEU0dTha?= =?utf-8?B?V21iR0I0MTdITVBaK2t0RmxsWkNNTTNSNHVaTFU4YmVpVmVEZjZIcm96Snc3?= =?utf-8?B?Ky9nUXZlWmZzRXdxYUE4TS9EcDE5b0JuUU9JS2JyZmMwdXcxSG1jM1h0T1VW?= =?utf-8?B?MHNkNHR6cmpCWlp6NHdtbW9idzJiQWNyblVPcUs2Sm0xNlo2ZTA2dkZCRDJC?= =?utf-8?B?R3hua0g3UlRLdDdnei9iZlJTOXJrNnlhcHJOSmJXMkc0eW9NR0w5SUw4RFp4?= =?utf-8?B?NFNkNmt6MjcxVE8rcVJOVENWd3F6UEF2RDhYMzgwRWZpUkxwOVVRaG1IOFZ1?= =?utf-8?B?R0cwSFJwSUZZYlZ0aEJ5b1Y5NGZ2ZE9YU0FNR1o4MDFtVWVDWmh5NUhUejU1?= =?utf-8?B?VHJLR1FxdHdRRGRJWjdkY0lGNFFkRkRDV1l2ZjRSSWluQmpoWVJvVmN3bTk4?= =?utf-8?B?eWszY1grZmF5Y0poN3R3cnMyS2RaUFNDVnR4REVPMTczQWN0eFM3NWF6Q0U0?= =?utf-8?B?UEZ2Wnk5Q2lLdWVpbEdZaS93NmxXTlFMbnRXRzg5L0lxNGdpVm4yWTY1aW93?= =?utf-8?B?Y3U0R0dUazJHVjJjSm8rSlhxOXd3bWloMG54SWJVQWE4bVJ3QmVobTFsOEhs?= =?utf-8?B?MS82L2cya0JCY2R6UWVjelNmcmExWGtPTmVHV0Y5Y3JJdWFxMXF0bUxQYkhB?= =?utf-8?B?RWthSzV5NWNCK2RXaFpmTVpRc2ZzTnpSTlZodHFNT1ZNK0g2QUZKSUV6Z21S?= =?utf-8?B?YnF6bjgrTFF1dXc4dXhSWVNDTGlMUXZPWmN1S1pleHFhaDV3dVBEM0pSeWpy?= =?utf-8?B?Unptc2VVYkZnQkwvSUxYNjdEQmhtb1pRcjRTYVBQRERpSWFZUG5jOWYzaERs?= =?utf-8?B?TzhYWTgzY0pOWCtqOFJVQUtNNW96WW1KU21qTmx1RG83WlVRUHliSTEvNEd6?= =?utf-8?B?QUNKSUhkWWJJZGszczBkV0VtWExKOEpPMXU3OElMMkNPTWdVOEVVQTRhVnZ5?= =?utf-8?B?ZGhuUGtnZVA1bGlLajdwR1k0UG5jVlhzcGtKRFAxMitzbTZhQ3YrZDVRV1Zy?= =?utf-8?B?VEVkek01Wmp2ditpMHJmSHZSbFpvSVdwVzRTdytVWk02WFdUeDQvWFJ4S25I?= =?utf-8?B?R0kzUE1LU2labHh4VFB6ZjFyV05uYnpqNUpoemlQVmR3bmhlRDRXQ3NsUHV3?= =?utf-8?B?OEdCeTNUdFdnYzhoeHQ3eDB3UGJxbjZndEQwSTMyWXFqZ0s4QmRXeEk5Q21s?= =?utf-8?B?NE4yci9OK3U0QUJja1p2VjZCN0FybVRKV2FiekNxdWExZ2lxZlV3RE84VEd6?= =?utf-8?B?UlJKeFlxZmttOHFWWFNzNjZxWmxwT2dNVFV0N1FiVmgvaWFCWHQza1BqV2Yw?= =?utf-8?B?eEhIYW9BN0h4ZDBKL0R3ZElyRDVSYm1KenZNOFB5UWhCY3hPdG9Ha2cxVEJu?= =?utf-8?B?c3JGM09pVCtCczdPTDlZVlVYWDgrWi94SXpON2QraUFhSDVyWkdHTjhKTzdZ?= =?utf-8?B?ekJMQUFjVkZTTWZnQ3lGRUxHZXZsTlFvZjg4b1d5SDNjS3hBYnpMK3dJeHc5?= =?utf-8?B?b3FFc0dnNHdiRE9RTWFiT2VIR0JwaWlHM1lGblduaGFFcW1RdGIwcjlnPT0=?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 146aa7a8-bda3-483a-b5de-08dc4428bcf8 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Mar 2024 13:14:54.1851 (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: AS4P250MB0560 Subject: Re: [FFmpeg-devel] [PATCH v5] 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 > > --- > v5: Decode chroma_format_idc directly instead of ff_h264_decode_seq_parameter_set > v4: Fix missing SEI in set_avcc_extradata > v3: Remove unnecessary inclusion > > libavcodec/libx264.c | 162 ++++++++++++++++++++++++++++++++++++------- > 1 file changed, 138 insertions(+), 24 deletions(-) > > diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c > index 10d646bd76..64cefb5fb0 100644 > --- a/libavcodec/libx264.c > +++ b/libavcodec/libx264.c > @@ -38,6 +38,7 @@ > #include "packet_internal.h" > #include "atsc_a53.h" > #include "sei.h" > +#include "golomb.h" > > #include > #include > @@ -865,6 +866,140 @@ static int convert_pix_fmt(enum AVPixelFormat pix_fmt) > return 0; > } > > +static int save_sei(AVCodecContext *avctx, x264_nal_t *nal) > +{ > + X264Context *x4 = avctx->priv_data; > + > + av_log(avctx, AV_LOG_INFO, "%s\n", nal->p_payload + 25); > + x4->sei_size = nal->i_payload; > + x4->sei = av_malloc(x4->sei_size); > + if (!x4->sei) > + return AVERROR(ENOMEM); > + > + memcpy(x4->sei, nal->p_payload, nal->i_payload); > + > + return 0; > +} > + > +static int set_avcc_extradata(AVCodecContext *avctx, x264_nal_t *nal, int nnal) > +{ > + X264Context *x4 = avctx->priv_data; > + x264_nal_t *sps_nal = NULL; > + x264_nal_t *pps_nal = NULL; > + uint8_t *p, *sps; > + int ret; > + > + /* 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++) { > + switch (nal[i].i_type) { > + case NAL_SPS: > + sps_nal = &nal[i]; > + break; > + case NAL_PPS: > + pps_nal = &nal[i]; > + break; > + case NAL_SEI: > + ret = save_sei(avctx, &nal[i]); > + if (ret < 0) > + return ret; > + break; > + } > + } > + if (!sps_nal || !pps_nal) > + return AVERROR_EXTERNAL; > + > + avctx->extradata_size = sps_nal->i_payload + pps_nal->i_payload + 7; > + avctx->extradata = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); > + if (!avctx->extradata) > + return AVERROR(ENOMEM); > + > + // Now create AVCDecoderConfigurationRecord > + p = avctx->extradata; > + // Skip size part > + sps = sps_nal->p_payload + 4; > + *p++ = 1; // version > + *p++ = sps[1]; // AVCProfileIndication > + *p++ = sps[2]; // profile_compatibility > + *p++ = sps[3]; // AVCLevelIndication > + *p++ = 0xFF; > + *p++ = 0xE0 | 0x01; // 3 bits reserved (111) + 5 bits number of sps > + memcpy(p, sps_nal->p_payload + 2, sps_nal->i_payload - 2); > + // Make sps has AV_INPUT_BUFFER_PADDING_SIZE padding, so it can be used > + // with GetBitContext > + sps = p + 2; > + p += sps_nal->i_payload - 2; > + *p++ = 1; > + memcpy(p, pps_nal->p_payload + 2, pps_nal->i_payload - 2); > + p += pps_nal->i_payload - 2; > + > + if (sps[3] != 66 && sps[3] != 77 && sps[3] != 88) { > + GetBitContext gbc; > + int chroma_format_idc; > + int bit_depth_luma_minus8, bit_depth_chroma_minus8; > + > + /* It's not possible to have emulation prevention byte before > + * bit_depth_chroma_minus8 due to the range of sps id, chroma_format_idc > + * and so on. So we can read directly without need to escape emulation > + * prevention byte. There is a slight problem here: You ignore the possibility of profile_idc being zero. After all, all values not being used are merely reserved and can be used at any time (although I doubt that they will ever use this). Shall we ignore this? The above check (and presumably the ISOBMFF spec for this) uses an opt-out check for profile, whereas the H.264 spec actually uses an opt-in check. I just wanted to mention it, feel free to ignore it. > + * > + * +4 to skip until sps id. > + */ > + init_get_bits8(&gbc, sps + 4, sps_nal->i_payload - 4 - 4); > + // Skip sps id > + get_ue_golomb_31(&gbc); > + chroma_format_idc = get_ue_golomb_31(&gbc); > + if (chroma_format_idc == 3) > + skip_bits1(&gbc); > + bit_depth_luma_minus8 = get_ue_golomb_31(&gbc); > + bit_depth_chroma_minus8 = get_ue_golomb_31(&gbc); > + > + *p++ = 0xFC | chroma_format_idc; > + *p++ = 0xF8 | bit_depth_luma_minus8; > + *p++ = 0xF8 | bit_depth_chroma_minus8; > + *p++ = 0; > + } > + av_assert0(avctx->extradata + avctx->extradata_size >= p); Does this have to be an av_assert0? > + avctx->extradata_size = p - avctx->extradata; > + > + 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) { > + s = save_sei(avctx, &nal[i]); > + if (s < 0) > + return s; > + 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 +1368,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); You need a golomb configure dependency for get_ue_golomb_31(). - Andreas _______________________________________________ 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".