FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/hw_base_encode_h264.c
Date: 2024-10-27 21:33:06
Exec Total Coverage
Lines: 0 157 0.0%
Functions: 0 1 0.0%
Branches: 0 88 0.0%

Line Branch Exec Source
1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "hw_base_encode_h264.h"
20
21 #include "h2645data.h"
22 #include "h264_levels.h"
23
24 #include "libavutil/pixdesc.h"
25
26 int ff_hw_base_encode_init_params_h264(FFHWBaseEncodeContext *base_ctx,
27 AVCodecContext *avctx,
28 FFHWBaseEncodeH264 *common,
29 FFHWBaseEncodeH264Opts *opts)
30 {
31 H264RawSPS *sps = &common->raw_sps;
32 H264RawPPS *pps = &common->raw_pps;
33 const AVPixFmtDescriptor *desc;
34 int bit_depth;
35
36 memset(sps, 0, sizeof(*sps));
37 memset(pps, 0, sizeof(*pps));
38
39 desc = av_pix_fmt_desc_get(base_ctx->input_frames->sw_format);
40 av_assert0(desc);
41 if (desc->nb_components == 1 || desc->log2_chroma_w != 1 || desc->log2_chroma_h != 1) {
42 av_log(avctx, AV_LOG_ERROR, "Chroma format of input pixel format "
43 "%s is not supported.\n", desc->name);
44 return AVERROR(EINVAL);
45 }
46 bit_depth = desc->comp[0].depth;
47
48 sps->nal_unit_header.nal_ref_idc = 3;
49 sps->nal_unit_header.nal_unit_type = H264_NAL_SPS;
50
51 sps->profile_idc = avctx->profile & 0xff;
52
53 if (avctx->profile == AV_PROFILE_H264_CONSTRAINED_BASELINE ||
54 avctx->profile == AV_PROFILE_H264_MAIN)
55 sps->constraint_set1_flag = 1;
56
57 if (avctx->profile == AV_PROFILE_H264_HIGH || avctx->profile == AV_PROFILE_H264_HIGH_10)
58 sps->constraint_set3_flag = base_ctx->gop_size == 1;
59
60 if (avctx->profile == AV_PROFILE_H264_MAIN ||
61 avctx->profile == AV_PROFILE_H264_HIGH || avctx->profile == AV_PROFILE_H264_HIGH_10) {
62 sps->constraint_set4_flag = 1;
63 sps->constraint_set5_flag = base_ctx->b_per_p == 0;
64 }
65
66 if (base_ctx->gop_size == 1)
67 common->dpb_frames = 0;
68 else
69 common->dpb_frames = 1 + base_ctx->max_b_depth;
70
71 if (avctx->level != AV_LEVEL_UNKNOWN) {
72 sps->level_idc = avctx->level;
73 } else {
74 const H264LevelDescriptor *level;
75 int framerate;
76
77 if (avctx->framerate.num > 0 && avctx->framerate.den > 0)
78 framerate = avctx->framerate.num / avctx->framerate.den;
79 else
80 framerate = 0;
81
82 level = ff_h264_guess_level(sps->profile_idc,
83 opts->bit_rate,
84 framerate,
85 opts->mb_width * 16,
86 opts->mb_height * 16,
87 common->dpb_frames);
88 if (level) {
89 av_log(avctx, AV_LOG_VERBOSE, "Using level %s.\n", level->name);
90 if (level->constraint_set3_flag)
91 sps->constraint_set3_flag = 1;
92 sps->level_idc = level->level_idc;
93 } else {
94 av_log(avctx, AV_LOG_WARNING, "Stream will not conform "
95 "to any level: using level 6.2.\n");
96 sps->level_idc = 62;
97 }
98 }
99
100 sps->seq_parameter_set_id = 0;
101 sps->chroma_format_idc = 1;
102 sps->bit_depth_luma_minus8 = bit_depth - 8;
103 sps->bit_depth_chroma_minus8 = bit_depth - 8;
104
105 sps->log2_max_frame_num_minus4 = 4;
106 sps->pic_order_cnt_type = base_ctx->max_b_depth ? 0 : 2;
107 if (sps->pic_order_cnt_type == 0) {
108 sps->log2_max_pic_order_cnt_lsb_minus4 = 4;
109 }
110
111 sps->max_num_ref_frames = common->dpb_frames;
112
113 sps->pic_width_in_mbs_minus1 = opts->mb_width - 1;
114 sps->pic_height_in_map_units_minus1 = opts->mb_height - 1;
115
116 sps->frame_mbs_only_flag = 1;
117 sps->direct_8x8_inference_flag = 1;
118
119 if (avctx->width != 16 * opts->mb_width ||
120 avctx->height != 16 * opts->mb_height) {
121 sps->frame_cropping_flag = 1;
122
123 sps->frame_crop_left_offset = 0;
124 sps->frame_crop_right_offset =
125 (16 * opts->mb_width - avctx->width) / 2;
126 sps->frame_crop_top_offset = 0;
127 sps->frame_crop_bottom_offset =
128 (16 * opts->mb_height - avctx->height) / 2;
129 } else {
130 sps->frame_cropping_flag = 0;
131 }
132
133 sps->vui_parameters_present_flag = 1;
134
135 if (avctx->sample_aspect_ratio.num != 0 &&
136 avctx->sample_aspect_ratio.den != 0) {
137 int num, den, i;
138 av_reduce(&num, &den, avctx->sample_aspect_ratio.num,
139 avctx->sample_aspect_ratio.den, 65535);
140 for (i = 0; i < FF_ARRAY_ELEMS(ff_h2645_pixel_aspect); i++) {
141 if (num == ff_h2645_pixel_aspect[i].num &&
142 den == ff_h2645_pixel_aspect[i].den) {
143 sps->vui.aspect_ratio_idc = i;
144 break;
145 }
146 }
147 if (i >= FF_ARRAY_ELEMS(ff_h2645_pixel_aspect)) {
148 sps->vui.aspect_ratio_idc = 255;
149 sps->vui.sar_width = num;
150 sps->vui.sar_height = den;
151 }
152 sps->vui.aspect_ratio_info_present_flag = 1;
153 }
154
155 // Unspecified video format, from table E-2.
156 sps->vui.video_format = 5;
157 sps->vui.video_full_range_flag =
158 avctx->color_range == AVCOL_RANGE_JPEG;
159 sps->vui.colour_primaries = avctx->color_primaries;
160 sps->vui.transfer_characteristics = avctx->color_trc;
161 sps->vui.matrix_coefficients = avctx->colorspace;
162 if (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED ||
163 avctx->color_trc != AVCOL_TRC_UNSPECIFIED ||
164 avctx->colorspace != AVCOL_SPC_UNSPECIFIED)
165 sps->vui.colour_description_present_flag = 1;
166 if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED ||
167 sps->vui.colour_description_present_flag)
168 sps->vui.video_signal_type_present_flag = 1;
169
170 if (avctx->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED) {
171 sps->vui.chroma_loc_info_present_flag = 1;
172 sps->vui.chroma_sample_loc_type_top_field =
173 sps->vui.chroma_sample_loc_type_bottom_field =
174 avctx->chroma_sample_location - 1;
175 }
176
177 sps->vui.timing_info_present_flag = 1;
178 if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
179 sps->vui.num_units_in_tick = avctx->framerate.den;
180 sps->vui.time_scale = 2 * avctx->framerate.num;
181 sps->vui.fixed_frame_rate_flag = 1;
182 } else {
183 sps->vui.num_units_in_tick = avctx->time_base.num;
184 sps->vui.time_scale = 2 * avctx->time_base.den;
185 sps->vui.fixed_frame_rate_flag = 0;
186 }
187
188 if (opts->flags & FF_HW_H264_SEI_TIMING) {
189 H264RawHRD *hrd = &sps->vui.nal_hrd_parameters;
190 H264RawSEIBufferingPeriod *bp = &common->sei_buffering_period;
191
192 sps->vui.nal_hrd_parameters_present_flag = 1;
193
194 hrd->cpb_cnt_minus1 = 0;
195
196 // Try to scale these to a sensible range so that the
197 // golomb encode of the value is not overlong.
198 hrd->bit_rate_scale =
199 av_clip_uintp2(av_log2(opts->bit_rate) - 15 - 6, 4);
200 hrd->bit_rate_value_minus1[0] =
201 (opts->bit_rate >> hrd->bit_rate_scale + 6) - 1;
202
203 hrd->cpb_size_scale =
204 av_clip_uintp2(av_log2(opts->hrd_buffer_size) - 15 - 4, 4);
205 hrd->cpb_size_value_minus1[0] =
206 (opts->hrd_buffer_size >> hrd->cpb_size_scale + 4) - 1;
207
208 // CBR mode as defined for the HRD cannot be achieved without filler
209 // data, so this flag cannot be set even with VAAPI CBR modes.
210 hrd->cbr_flag[0] = 0;
211
212 hrd->initial_cpb_removal_delay_length_minus1 = 23;
213 hrd->cpb_removal_delay_length_minus1 = 23;
214 hrd->dpb_output_delay_length_minus1 = 7;
215 hrd->time_offset_length = 0;
216
217 bp->seq_parameter_set_id = sps->seq_parameter_set_id;
218
219 // This calculation can easily overflow 32 bits.
220 bp->nal.initial_cpb_removal_delay[0] = 90000 *
221 (uint64_t)opts->initial_buffer_fullness /
222 opts->hrd_buffer_size;
223 bp->nal.initial_cpb_removal_delay_offset[0] = 0;
224 } else {
225 sps->vui.nal_hrd_parameters_present_flag = 0;
226 sps->vui.low_delay_hrd_flag = 1 - sps->vui.fixed_frame_rate_flag;
227 }
228
229 sps->vui.bitstream_restriction_flag = 1;
230 sps->vui.motion_vectors_over_pic_boundaries_flag = 1;
231 sps->vui.log2_max_mv_length_horizontal = 15;
232 sps->vui.log2_max_mv_length_vertical = 15;
233 sps->vui.max_num_reorder_frames = base_ctx->max_b_depth;
234 sps->vui.max_dec_frame_buffering = base_ctx->max_b_depth + 1;
235
236 pps->nal_unit_header.nal_ref_idc = 3;
237 pps->nal_unit_header.nal_unit_type = H264_NAL_PPS;
238
239 pps->pic_parameter_set_id = 0;
240 pps->seq_parameter_set_id = 0;
241
242 pps->entropy_coding_mode_flag =
243 !(sps->profile_idc == AV_PROFILE_H264_BASELINE ||
244 sps->profile_idc == AV_PROFILE_H264_EXTENDED ||
245 sps->profile_idc == AV_PROFILE_H264_CAVLC_444);
246 if (!opts->cabac && pps->entropy_coding_mode_flag)
247 pps->entropy_coding_mode_flag = 0;
248
249 pps->num_ref_idx_l0_default_active_minus1 = 0;
250 pps->num_ref_idx_l1_default_active_minus1 = 0;
251
252 pps->pic_init_qp_minus26 = opts->fixed_qp_idr - 26;
253
254 if (sps->profile_idc == AV_PROFILE_H264_BASELINE ||
255 sps->profile_idc == AV_PROFILE_H264_EXTENDED ||
256 sps->profile_idc == AV_PROFILE_H264_MAIN) {
257 pps->more_rbsp_data = 0;
258 } else {
259 pps->more_rbsp_data = 1;
260
261 pps->transform_8x8_mode_flag = 1;
262 }
263
264 return 0;
265 }
266