From patchwork Tue Jan 25 17:41:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33848 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2c4e:0:0:0:0 with SMTP id x14csp832916iov; Tue, 25 Jan 2022 09:43:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJzPDIoN+g8q1Lh5Xo/SR9J12fPIynZ9GKBwldPn/fV4/akvaPg0DEufKw8eqvUn+rXRXSi4 X-Received: by 2002:a17:906:5d08:: with SMTP id g8mr17015303ejt.759.1643132602674; Tue, 25 Jan 2022 09:43:22 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q17si11613162edd.193.2022.01.25.09.43.21; Tue, 25 Jan 2022 09:43:22 -0800 (PST) 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=bnvn7yn1; 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 9198668B0EE; Tue, 25 Jan 2022 19:42:24 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-oln040092068072.outbound.protection.outlook.com [40.92.68.72]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 73B9368B082 for ; Tue, 25 Jan 2022 19:42:20 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Hy5JzZc4ci+xwBJbwcRO2cqd+E7cg/yhatSBCK3yk0GVO3iWFzObnovBbVJK1bGzXlSDWRpWhKA+EFiJqW2IJoxQ9gv5e1Z9yeT3/9sUYzABGSXQW+bQ8arpy0eiFFpsnb1VXq67phSTpWWnLMOX5pwpvAtgJTUXWU8yCnygngd64AEGn8EXKCHlDDbHoRTUmXqOcDbN65Au0GbbXDx9jVZ4xnnTobTmXr8jWscU+zcKunl6bhYOR/GUMW9iYFzJxQR4HZHntQ7YBb4LkA5oEOp6y0ztZ02Xm1mYBI4DazptXA6VNIfNxqf0yxhsXsogfm2jpv2FtOptI3ZUMkaO1w== 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=ZI+hrEV1IF/baYC7amBhBjR7L/ycM53EEBOS8ICYLzU=; b=dEn73N+T42kUYt5Ju2IWtgdHDAiEPyUh7BqeBLD55l7j8FiH5rq3gXFPo7czvkscp7fSl12BMCJE/qQqjHTzLy0mUpBl/icEzYNnT//E7tiYXC+ouHmbkkb2ukuhPoRjyX6xELwYCf0W/CB3xJ9Clumt/nd2YanFSQmGgVK3lcfIwUBY1S1mjc6KfBaohjO2v/i+w/SN3yhhFg7tp3tDIh9X4b4P02qSOhRrUsxeNXRFO7aTCMNsm8rnOyD7HWHI7Jc4rC1GrEaSc+ypPPkB03tvaBkuQ1Tmj4lhj+x40tnYyJaYPfQtriPqDKmuw/44bW2sXoP7g6FTp1aiyWAKMA== 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=ZI+hrEV1IF/baYC7amBhBjR7L/ycM53EEBOS8ICYLzU=; b=bnvn7yn1SoTZCRAccgveypEJG3GSl/xEQ/cpHLAJHmmrpt+m9YtRqqRE/B0hYY62M33zRi8z4Brru8fZw609yFPznplg2WcGLTvqIWyaxfWHzq7yIcMaM1uIrv0P5No3R4MdESDgiNwie1M5kYF3tH4giA7gCFO7l9dZNnW3iue1aP9OaLiHHQFtzKUa8/7UlnBIkReHhAPjNB49bWzyrdivz3Wj0Wbg2r0cRe5C58RUNfhON6UWaWOIRDcCKzQA4xI/n+YYN8AKz7LVyGx2oRU2S62MsEswDTUv1q+vNALW0a4CSy/Dzwdm+66wht98bklqjqyWa/DArDkbRqSn3g== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by DB7PR03MB3500.eurprd03.prod.outlook.com (2603:10a6:5:8::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.12; Tue, 25 Jan 2022 17:42:13 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::ac56:2ff4:d304:ab22%4]) with mapi id 15.20.4930.015; Tue, 25 Jan 2022 17:42:13 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 25 Jan 2022 18:41:36 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220125174148.994967-1-andreas.rheinhardt@outlook.com> References: <20220125174148.994967-1-andreas.rheinhardt@outlook.com> X-TMN: [zw0yJBxbNl6XG40XUkCuDtk7FkFrSSCl] X-ClientProxiedBy: AM6P193CA0061.EURP193.PROD.OUTLOOK.COM (2603:10a6:209:8e::38) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220125174148.994967-8-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 93c70a4b-f75a-4765-234b-08d9e02a0570 X-MS-TrafficTypeDiagnostic: DB7PR03MB3500:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 1jSk3KeGWb4U90AELpTLMLsmuhUv+U0QzlfS1uQCYHnSUQKcq5qd88VCSrcx1LGQ8+0QmSB4eCOem3Eu7dvKOvYCvcyCX7T29mO6z4Ke9RlZFsOGJLAuGFKB1LejtjqAFRos5TL12Fuxo7HveoDY9nyBv5IdyJJSzwruf5lggSiofGJbhUXdcwVN6QkaOv+NItFNSbymOo9zNl22LarabXKaC1F6zpZKb1VzDwUuoBq954qzw9zC5EHDf7Sd01RcZ2xQnc2b4LUDxlrLCKoeVtwJSO1qrC9S90dO9DqCimdja7IR7V8i0+FeZOK6KR9+pRlBwo3kZUNFDldSoKubNtktmlE2Y7J/A4q/KBcsiLAeDDppx3riEnHTFC5dJMgeIKAAHt1SRLW/1OV4mzUj1Stfd4bxSYGR0OZSjdPIQVkw3jcjV9mNotDZnI5vCOXPwMDuL+TtFY/w6n2IKsZbggE+fKKOlTc25ausXwocMvw3Kvmme3yYj34WXSjsNIm/aJCgO1IziOEqWMlzsNyBerrh47HoHlQVw/376V68Zbq/qv0K3+bmxcYEmZxRIQ9n X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 4GNHaGScXM89lwAJC0AugVLNyQ0QkU1s9FW8gE5AUscKkfN3Gp+ZxYiBPadvwboBLXxBLaCEZTRWWOmjtA2ZviDrLxhoJpn9ZYZr2g7yGS0o1gPfR06aYAub814SMTX5msOO77t5v6d5YMDSBJksioXuB5eQSMF7bas11FJ5xYZjctRV/bpEZZx6Hxkk5zDfYril8l2DeHaGnChX272BfyGcSyZPMvmHgfIgd9jWAKJqyMw6NMsDSjBgTVeTZOYmgym+kHg8c6qh9orsJkARkL4gp1xxS0MWeIIJToirA7ZjLePW25PFjUPNKU9dMJUNSdWtN0T8MHGCFVG+dzjgmvxWPRRb0kubdE/2gq4wG0m0wQwSKTXueLa2WeK8R9Ef3bsv1IvXUctPw8NcwgG6XPmfHSK9+ZNvehVx/l1+Ge428PBFn++Bus+L7l1Zip/ISxogfo5wVz7Mc8diJdaqI67pHFQd7BKOKAvtkNw2J/3QIHhIDTd8JNkDlJMcFmJvvzSBWa3mpSE+Ljnja0jTLwxxCBRaM4eCluwp9w3SL6iVnd2cCowGPtgWo1ZL4OWEU/ixaAkO7PNMM9teMD9Pqcfh+XB0gnicFUcKc+3n3gwGXkLWgTAp5YzJfbqSZd0ZwBWTp3zXJtOSg3NdoDI6JHtMpLghbxUpe8KLeuH8wsczNTVQQhYH9I+yQcfL8CpOlztGOkZ7Lx2/GQrPvEvUjTehy+7Dy9XtU3o+GPzGh2VW7ZlisnZPoAwg3ytcJBAFJDz/81QxoIqNoPMOEWxI9S8l3EX9SmJDysQyd/Rb+kU9x0YHGy7yWGEq+KClzzZczYRF8MbpOYomoI1vmw1W0IMupxHtOfxeS7ATreMrU042TUfRBOOks119fxrReu1DLJZytty7ovQ1QMefjaF7APrcsOCo9Tc8xsXwtNZGieEeDfJ53d82V5MPpbbmqudV9tV0+Vq1lf9rnscUuoMjbA== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 93c70a4b-f75a-4765-234b-08d9e02a0570 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Jan 2022 17:42:13.5369 (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: DB7PR03MB3500 Subject: [FFmpeg-devel] [PATCH 09/21] avcodec/mpeg12enc: Reindent after the previous commit 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: HKVw+oYije9Z Signed-off-by: Andreas Rheinhardt --- libavcodec/mpeg12enc.c | 255 ++++++++++++++++++++--------------------- 1 file changed, 127 insertions(+), 128 deletions(-) diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index e30e41027c..bec522d8e7 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -263,7 +263,7 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) { MPEG12EncContext *const mpeg12 = (MPEG12EncContext*)s; unsigned int vbv_buffer_size, fps, v; - int i, constraint_parameter_flag; + int constraint_parameter_flag; AVRational framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index]; uint64_t time_code; int64_t best_aspect_error = INT64_MAX; @@ -276,146 +276,145 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) if (aspect_ratio.num == 0 || aspect_ratio.den == 0) aspect_ratio = (AVRational){1,1}; // pixel aspect 1.1 (VGA) + /* MPEG-1 header repeated every GOP */ + put_header(s, SEQ_START_CODE); - /* MPEG-1 header repeated every GOP */ - put_header(s, SEQ_START_CODE); + put_sbits(&s->pb, 12, s->width & 0xFFF); + put_sbits(&s->pb, 12, s->height & 0xFFF); - put_sbits(&s->pb, 12, s->width & 0xFFF); - put_sbits(&s->pb, 12, s->height & 0xFFF); - - for (i = 1; i < 15; i++) { - int64_t error = aspect_ratio.num * (1LL<<32) / aspect_ratio.den; - if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || i <= 1) - error -= (1LL<<32) / ff_mpeg1_aspect[i]; - else - error -= (1LL<<32)*ff_mpeg2_aspect[i].num * s->height / s->width / ff_mpeg2_aspect[i].den; + for (int i = 1; i < 15; i++) { + int64_t error = aspect_ratio.num * (1LL<<32) / aspect_ratio.den; + if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || i <= 1) + error -= (1LL<<32) / ff_mpeg1_aspect[i]; + else + error -= (1LL<<32)*ff_mpeg2_aspect[i].num * s->height / s->width / ff_mpeg2_aspect[i].den; - error = FFABS(error); + error = FFABS(error); - if (error - 2 <= best_aspect_error) { - best_aspect_error = error; - aspect_ratio_info = i; - } + if (error - 2 <= best_aspect_error) { + best_aspect_error = error; + aspect_ratio_info = i; } + } - put_bits(&s->pb, 4, aspect_ratio_info); - put_bits(&s->pb, 4, s->frame_rate_index); + put_bits(&s->pb, 4, aspect_ratio_info); + put_bits(&s->pb, 4, s->frame_rate_index); - if (s->avctx->rc_max_rate) { - v = (s->avctx->rc_max_rate + 399) / 400; - if (v > 0x3ffff && s->codec_id == AV_CODEC_ID_MPEG1VIDEO) - v = 0x3ffff; - } else { - v = 0x3FFFF; - } + if (s->avctx->rc_max_rate) { + v = (s->avctx->rc_max_rate + 399) / 400; + if (v > 0x3ffff && s->codec_id == AV_CODEC_ID_MPEG1VIDEO) + v = 0x3ffff; + } else { + v = 0x3FFFF; + } - if (s->avctx->rc_buffer_size) - vbv_buffer_size = s->avctx->rc_buffer_size; - else - /* VBV calculation: Scaled so that a VCD has the proper - * VBV size of 40 kilobytes */ - vbv_buffer_size = ((20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024; - vbv_buffer_size = (vbv_buffer_size + 16383) / 16384; - - put_sbits(&s->pb, 18, v); - put_bits(&s->pb, 1, 1); // marker - put_sbits(&s->pb, 10, vbv_buffer_size); - - constraint_parameter_flag = - s->width <= 768 && - s->height <= 576 && - s->mb_width * s->mb_height <= 396 && - s->mb_width * s->mb_height * framerate.num <= 396 * 25 * framerate.den && - framerate.num <= framerate.den * 30 && - s->avctx->me_range && - s->avctx->me_range < 128 && - vbv_buffer_size <= 20 && - v <= 1856000 / 400 && - s->codec_id == AV_CODEC_ID_MPEG1VIDEO; - - put_bits(&s->pb, 1, constraint_parameter_flag); - - ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); - ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); - - if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) { - AVFrameSideData *side_data; - int width = s->width; - int height = s->height; - int use_seq_disp_ext; + if (s->avctx->rc_buffer_size) + vbv_buffer_size = s->avctx->rc_buffer_size; + else + /* VBV calculation: Scaled so that a VCD has the proper + * VBV size of 40 kilobytes */ + vbv_buffer_size = ((20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024; + vbv_buffer_size = (vbv_buffer_size + 16383) / 16384; + + put_sbits(&s->pb, 18, v); + put_bits(&s->pb, 1, 1); // marker + put_sbits(&s->pb, 10, vbv_buffer_size); + + constraint_parameter_flag = + s->width <= 768 && + s->height <= 576 && + s->mb_width * s->mb_height <= 396 && + s->mb_width * s->mb_height * framerate.num <= 396 * 25 * framerate.den && + framerate.num <= framerate.den * 30 && + s->avctx->me_range && + s->avctx->me_range < 128 && + vbv_buffer_size <= 20 && + v <= 1856000 / 400 && + s->codec_id == AV_CODEC_ID_MPEG1VIDEO; + + put_bits(&s->pb, 1, constraint_parameter_flag); + + ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); + ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); - put_header(s, EXT_START_CODE); - put_bits(&s->pb, 4, 1); // seq ext - - put_bits(&s->pb, 1, s->avctx->profile == FF_PROFILE_MPEG2_422); // escx 1 for 4:2:2 profile - - put_bits(&s->pb, 3, s->avctx->profile); // profile - put_bits(&s->pb, 4, s->avctx->level); // level - - put_bits(&s->pb, 1, s->progressive_sequence); - put_bits(&s->pb, 2, s->chroma_format); - put_bits(&s->pb, 2, s->width >> 12); - put_bits(&s->pb, 2, s->height >> 12); - put_bits(&s->pb, 12, v >> 18); // bitrate ext - put_bits(&s->pb, 1, 1); // marker - put_bits(&s->pb, 8, vbv_buffer_size >> 10); // vbv buffer ext - put_bits(&s->pb, 1, s->low_delay); - put_bits(&s->pb, 2, mpeg12->frame_rate_ext.num-1); // frame_rate_ext_n - put_bits(&s->pb, 5, mpeg12->frame_rate_ext.den-1); // frame_rate_ext_d - - side_data = av_frame_get_side_data(s->current_picture_ptr->f, AV_FRAME_DATA_PANSCAN); - if (side_data) { - AVPanScan *pan_scan = (AVPanScan *)side_data->data; - if (pan_scan->width && pan_scan->height) { - width = pan_scan->width >> 4; - height = pan_scan->height >> 4; - } - } + if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO) { + const AVFrameSideData *side_data; + int width = s->width; + int height = s->height; + int use_seq_disp_ext; - use_seq_disp_ext = (width != s->width || - height != s->height || - s->avctx->color_primaries != AVCOL_PRI_UNSPECIFIED || - s->avctx->color_trc != AVCOL_TRC_UNSPECIFIED || - s->avctx->colorspace != AVCOL_SPC_UNSPECIFIED || - mpeg12->video_format != VIDEO_FORMAT_UNSPECIFIED); - - if (mpeg12->seq_disp_ext == 1 || - (mpeg12->seq_disp_ext == -1 && use_seq_disp_ext)) { - put_header(s, EXT_START_CODE); - put_bits(&s->pb, 4, 2); // sequence display extension - put_bits(&s->pb, 3, mpeg12->video_format); // video_format - put_bits(&s->pb, 1, 1); // colour_description - put_bits(&s->pb, 8, s->avctx->color_primaries); // colour_primaries - put_bits(&s->pb, 8, s->avctx->color_trc); // transfer_characteristics - put_bits(&s->pb, 8, s->avctx->colorspace); // matrix_coefficients - put_bits(&s->pb, 14, width); // display_horizontal_size - put_bits(&s->pb, 1, 1); // marker_bit - put_bits(&s->pb, 14, height); // display_vertical_size - put_bits(&s->pb, 3, 0); // remaining 3 bits are zero padding + put_header(s, EXT_START_CODE); + put_bits(&s->pb, 4, 1); // seq ext + + put_bits(&s->pb, 1, s->avctx->profile == FF_PROFILE_MPEG2_422); // escx 1 for 4:2:2 profile + + put_bits(&s->pb, 3, s->avctx->profile); // profile + put_bits(&s->pb, 4, s->avctx->level); // level + + put_bits(&s->pb, 1, s->progressive_sequence); + put_bits(&s->pb, 2, s->chroma_format); + put_bits(&s->pb, 2, s->width >> 12); + put_bits(&s->pb, 2, s->height >> 12); + put_bits(&s->pb, 12, v >> 18); // bitrate ext + put_bits(&s->pb, 1, 1); // marker + put_bits(&s->pb, 8, vbv_buffer_size >> 10); // vbv buffer ext + put_bits(&s->pb, 1, s->low_delay); + put_bits(&s->pb, 2, mpeg12->frame_rate_ext.num-1); // frame_rate_ext_n + put_bits(&s->pb, 5, mpeg12->frame_rate_ext.den-1); // frame_rate_ext_d + + side_data = av_frame_get_side_data(s->current_picture_ptr->f, AV_FRAME_DATA_PANSCAN); + if (side_data) { + const AVPanScan *pan_scan = (AVPanScan *)side_data->data; + if (pan_scan->width && pan_scan->height) { + width = pan_scan->width >> 4; + height = pan_scan->height >> 4; } } - put_header(s, GOP_START_CODE); - put_bits(&s->pb, 1, mpeg12->drop_frame_timecode); // drop frame flag - /* time code: we must convert from the real frame rate to a - * fake MPEG frame rate in case of low frame rate */ - fps = (framerate.num + framerate.den / 2) / framerate.den; - time_code = s->current_picture_ptr->f->coded_picture_number + - mpeg12->timecode_frame_start; - - s->gop_picture_number = s->current_picture_ptr->f->coded_picture_number; - - av_assert0(mpeg12->drop_frame_timecode == !!(mpeg12->tc.flags & AV_TIMECODE_FLAG_DROPFRAME)); - if (mpeg12->drop_frame_timecode) - time_code = av_timecode_adjust_ntsc_framenum2(time_code, fps); - - put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); - put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); - put_bits(&s->pb, 1, 1); - put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); - put_bits(&s->pb, 6, (uint32_t)((time_code % fps))); - put_bits(&s->pb, 1, !!(s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) || s->intra_only || !s->gop_picture_number); - put_bits(&s->pb, 1, 0); // broken link + use_seq_disp_ext = (width != s->width || + height != s->height || + s->avctx->color_primaries != AVCOL_PRI_UNSPECIFIED || + s->avctx->color_trc != AVCOL_TRC_UNSPECIFIED || + s->avctx->colorspace != AVCOL_SPC_UNSPECIFIED || + mpeg12->video_format != VIDEO_FORMAT_UNSPECIFIED); + + if (mpeg12->seq_disp_ext == 1 || + (mpeg12->seq_disp_ext == -1 && use_seq_disp_ext)) { + put_header(s, EXT_START_CODE); + put_bits(&s->pb, 4, 2); // sequence display extension + put_bits(&s->pb, 3, mpeg12->video_format); // video_format + put_bits(&s->pb, 1, 1); // colour_description + put_bits(&s->pb, 8, s->avctx->color_primaries); // colour_primaries + put_bits(&s->pb, 8, s->avctx->color_trc); // transfer_characteristics + put_bits(&s->pb, 8, s->avctx->colorspace); // matrix_coefficients + put_bits(&s->pb, 14, width); // display_horizontal_size + put_bits(&s->pb, 1, 1); // marker_bit + put_bits(&s->pb, 14, height); // display_vertical_size + put_bits(&s->pb, 3, 0); // remaining 3 bits are zero padding + } + } + + put_header(s, GOP_START_CODE); + put_bits(&s->pb, 1, mpeg12->drop_frame_timecode); // drop frame flag + /* time code: we must convert from the real frame rate to a + * fake MPEG frame rate in case of low frame rate */ + fps = (framerate.num + framerate.den / 2) / framerate.den; + time_code = s->current_picture_ptr->f->coded_picture_number + + mpeg12->timecode_frame_start; + + s->gop_picture_number = s->current_picture_ptr->f->coded_picture_number; + + av_assert0(mpeg12->drop_frame_timecode == !!(mpeg12->tc.flags & AV_TIMECODE_FLAG_DROPFRAME)); + if (mpeg12->drop_frame_timecode) + time_code = av_timecode_adjust_ntsc_framenum2(time_code, fps); + + put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24)); + put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60)); + put_bits(&s->pb, 1, 1); + put_bits(&s->pb, 6, (uint32_t)((time_code / fps) % 60)); + put_bits(&s->pb, 6, (uint32_t)((time_code % fps))); + put_bits(&s->pb, 1, !!(s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) || s->intra_only || !s->gop_picture_number); + put_bits(&s->pb, 1, 0); // broken link } static inline void encode_mb_skip_run(MpegEncContext *s, int run)