1 /*
2 * Copyright 2015 Rockchip Electronics Co. LTD
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define MODULE_TAG "h264e_sps"
18
19 #include <string.h>
20
21 #include "mpp_common.h"
22
23 #include "mpp_enc_ref.h"
24 #include "mpp_bitwrite.h"
25 #include "h264e_debug.h"
26 #include "h264e_sps.h"
27
28 typedef struct H264eLevelInfo_t {
29 H264Level level;
30 RK_S32 max_MBPS; /* Max macroblock rate per second */
31 RK_S32 max_MBs; /* Max frame size */
32 RK_S32 max_DpbMBs; /* Max decoded picture buffer size */
33 RK_S32 max_BR; /* Max video bitrate */
34 const char *name;
35 } H264eLevelInfo;
36
37 H264eLevelInfo level_infos[] = {
38 /* level max_MBs max_MBPS max_DpbMBs max_BR name */
39 { H264_LEVEL_1_0, 1485, 99, 396, 64, "1" },
40 { H264_LEVEL_1_b, 1485, 99, 396, 128, "1.b" },
41 { H264_LEVEL_1_1, 3000, 396, 900, 192, "1.1" },
42 { H264_LEVEL_1_2, 6000, 396, 2376, 384, "1.2" },
43 { H264_LEVEL_1_3, 11880, 396, 2376, 768, "1.3" },
44 { H264_LEVEL_2_0, 11880, 396, 2376, 2000, "2" },
45 { H264_LEVEL_2_1, 19800, 792, 4752, 4000, "2.1" },
46 { H264_LEVEL_2_2, 20250, 1620, 8100, 4000, "2.2" },
47 { H264_LEVEL_3_0, 40500, 1620, 8100, 10000, "3" },
48 { H264_LEVEL_3_1, 108000, 3600, 18000, 14000, "3.1" },
49 { H264_LEVEL_3_2, 216000, 5120, 20480, 20000, "3.2" },
50 { H264_LEVEL_4_0, 245760, 8192, 32768, 20000, "4" },
51 { H264_LEVEL_4_1, 245760, 8192, 32768, 50000, "4.1" },
52 { H264_LEVEL_4_2, 522240, 8704, 34816, 50000, "4.2" },
53 { H264_LEVEL_5_0, 589824, 22080, 110400, 135000, "5" },
54 { H264_LEVEL_5_1, 983040, 36864, 184320, 240000, "5.1" },
55 { H264_LEVEL_5_2, 2073600, 36864, 184320, 240000, "5.2" },
56 { H264_LEVEL_6_0, 4177920, 139264, 696320, 240000, "6" },
57 { H264_LEVEL_6_1, 8355840, 139264, 696320, 480000, "6.1" },
58 { H264_LEVEL_6_2, 16711680, 139264, 696320, 800000, "6.2" },
59 };
60
h264e_sps_update(H264eSps * sps,MppEncCfgSet * cfg)61 MPP_RET h264e_sps_update(H264eSps *sps, MppEncCfgSet *cfg)
62 {
63 H264eVui *vui = &sps->vui;
64 MppEncPrepCfg *prep = &cfg->prep;
65 MppEncRcCfg *rc = &cfg->rc;
66 MppEncH264Cfg *h264 = &cfg->codec.h264;
67 MppEncRefCfg ref = cfg->ref_cfg;
68 MppEncCpbInfo *info = mpp_enc_ref_cfg_get_cpb_info(ref);
69 RK_S32 gop = rc->gop;
70 RK_S32 width = prep->width;
71 RK_S32 height = prep->height;
72 RK_S32 aligned_w = MPP_ALIGN(width, 16);
73 RK_S32 aligned_h = MPP_ALIGN(height, 16);
74 RK_S32 crop_right = MPP_ALIGN(width, 16) - width;
75 RK_S32 crop_bottom = MPP_ALIGN(height, 16) - height;
76 /* default 720p */
77 H264Level level_idc = h264->level;
78
79 // default sps
80 // profile baseline
81 sps->profile_idc = h264->profile;
82 switch (sps->profile_idc) {
83 case H264_PROFILE_BASELINE : {
84 sps->constraint_set0 = 1;
85 sps->constraint_set1 = 1;
86 sps->constraint_set2 = 0;
87 sps->constraint_set3 = 0;
88 sps->constraint_set4 = 0;
89 sps->constraint_set5 = 0;
90 } break;
91 case H264_PROFILE_MAIN : {
92 sps->constraint_set0 = 0;
93 sps->constraint_set1 = 1;
94 sps->constraint_set2 = 0;
95 sps->constraint_set3 = 0;
96 sps->constraint_set4 = 0;
97 sps->constraint_set5 = 0;
98 } break;
99 case H264_PROFILE_HIGH :
100 case H264_PROFILE_HIGH10 :
101 case H264_PROFILE_HIGH422 :
102 case H264_PROFILE_HIGH444 : {
103 sps->constraint_set0 = 0;
104 sps->constraint_set1 = 0;
105 sps->constraint_set2 = 0;
106 sps->constraint_set3 = 1;
107 sps->constraint_set4 = 0;
108 sps->constraint_set5 = 0;
109 } break;
110 default : {
111 sps->constraint_set0 = 0;
112 sps->constraint_set1 = 0;
113 sps->constraint_set2 = 0;
114 sps->constraint_set3 = 0;
115 sps->constraint_set4 = 0;
116 sps->constraint_set5 = 0;
117 } break;
118 }
119
120 //updata constraint_set0~5
121 RK_U32 set = h264->constraint_set;
122 RK_U8 constraint_force = (set >> 0) & 0x3f;
123 RK_U8 force_flag = (set >> 16) & 0x3f;
124
125 if (force_flag & 1)
126 sps->constraint_set0 = (constraint_force & 1) ? 1 : 0;
127 if (force_flag & 2)
128 sps->constraint_set1 = (constraint_force & 2) ? 1 : 0;
129 if (force_flag & 4)
130 sps->constraint_set2 = (constraint_force & 4) ? 1 : 0;
131 if (force_flag & 8)
132 sps->constraint_set3 = (constraint_force & 8) ? 1 : 0;
133 if (force_flag & 16)
134 sps->constraint_set4 = (constraint_force & 16) ? 1 : 0;
135 if (force_flag & 32)
136 sps->constraint_set5 = (constraint_force & 32) ? 1 : 0;
137
138 // level_idc is connected with frame size
139 {
140 RK_S32 mbs = (aligned_w * aligned_h) >> 8;
141 RK_S32 i;
142 RK_S32 min_level = 10;
143
144 for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(level_infos); i++) {
145 if (level_infos[i].max_MBs >= mbs) {
146 min_level = level_infos[i].level;
147
148 if (min_level > (RK_S32)level_idc &&
149 min_level != H264_LEVEL_1_b) {
150 level_idc = min_level;
151 h264e_dbg_sps("set level to %s\n", level_infos[i].name);
152 }
153
154 break;
155 }
156 }
157 }
158 sps->level_idc = level_idc;
159
160 sps->sps_id = 0;
161 sps->chroma_format_idc = H264_CHROMA_420;
162
163 // set max frame number and poc lsb according to gop size
164 sps->pic_order_cnt_type = h264->hw_cfg.hw_poc_type;
165 sps->log2_max_poc_lsb_minus4 = h264->log2_max_poc_lsb;
166 sps->log2_max_frame_num_minus4 = h264->log2_max_frame_num;
167
168 mpp_assert(gop >= 0);
169 if (gop == 0) {
170 // only one I then all P frame
171 sps->log2_max_frame_num_minus4 = 12;
172 sps->log2_max_poc_lsb_minus4 = 12;
173 } else if (gop == 1) {
174 // all I frame
175 sps->log2_max_frame_num_minus4 = 12;
176 sps->log2_max_poc_lsb_minus4 = 12;
177 } else {
178 // normal case
179 RK_S32 log2_gop = MPP_MIN(mpp_log2(gop), 16);
180 RK_S32 log2_frm_num = (log2_gop <= 4) ? (0) : (log2_gop - 4);
181 RK_S32 log2_poc_lsb = (log2_gop <= 3) ? (0) : (log2_gop - 3);
182
183 if (sps->log2_max_frame_num_minus4 < log2_frm_num)
184 sps->log2_max_frame_num_minus4 = log2_frm_num;
185
186 if (log2_poc_lsb > 12)
187 log2_poc_lsb = 12;
188
189 if (sps->log2_max_poc_lsb_minus4 < log2_poc_lsb)
190 sps->log2_max_poc_lsb_minus4 = log2_poc_lsb;
191 }
192
193 // max one reference frame
194 sps->num_ref_frames = info->dpb_size;
195
196 sps->gaps_in_frame_num_value_allowed = !h264->gaps_not_allowed;
197
198 // default 720p without cropping
199 sps->pic_width_in_mbs = aligned_w >> 4;
200 sps->pic_height_in_mbs = aligned_h >> 4;
201 sps->frame_mbs_only = 1;
202
203 // baseline disable 8x8
204 sps->direct8x8_inference = h264->transform8x8_mode;
205 if (crop_right || crop_bottom) {
206 sps->cropping = 1;
207 sps->crop.left = 0;
208 sps->crop.right = crop_right;
209 sps->crop.top = 0;
210 sps->crop.bottom = crop_bottom;
211 } else {
212 sps->cropping = 0;
213 memset(&sps->crop, 0, sizeof(sps->crop));
214 }
215
216 memset(vui, 0, sizeof(*vui));
217 vui->vui_present = 1;
218 vui->timing_info_present = 1;
219 vui->time_scale = rc->fps_out_num * 2;
220 vui->num_units_in_tick = rc->fps_out_denorm;
221 vui->fixed_frame_rate = !rc->fps_out_flex;
222 vui->vidformat = MPP_FRAME_VIDEO_FMT_UNSPECIFIED;
223
224 if (prep->range == MPP_FRAME_RANGE_JPEG) {
225 vui->signal_type_present = 1;
226 vui->fullrange = 1;
227 }
228
229 if ((prep->colorprim <= MPP_FRAME_PRI_JEDEC_P22 &&
230 prep->colorprim != MPP_FRAME_PRI_UNSPECIFIED) ||
231 (prep->colortrc <= MPP_FRAME_TRC_ARIB_STD_B67 &&
232 prep->colortrc != MPP_FRAME_TRC_UNSPECIFIED) ||
233 (prep->color <= MPP_FRAME_SPC_ICTCP &&
234 prep->color != MPP_FRAME_SPC_UNSPECIFIED)) {
235 vui->signal_type_present = 1;
236 vui->color_description_present = 1;
237 vui->colorprim = prep->colorprim;
238 vui->colortrc = prep->colortrc;
239 vui->colmatrix = prep->color;
240 }
241
242 vui->bitstream_restriction = 1;
243 vui->motion_vectors_over_pic_boundaries = 1;
244 vui->log2_max_mv_length_horizontal = 16;
245 vui->log2_max_mv_length_vertical = 16;
246 vui->max_dec_frame_buffering = info->dpb_size;
247
248 return MPP_OK;
249 }
250
h264e_sps_to_packet(H264eSps * sps,MppPacket packet,RK_S32 * offset,RK_S32 * len,MppEncCfgSet * cfg)251 MPP_RET h264e_sps_to_packet(H264eSps *sps, MppPacket packet, RK_S32 *offset,
252 RK_S32 *len, MppEncCfgSet *cfg)
253 {
254 void *pos = mpp_packet_get_pos(packet);
255 void *data = mpp_packet_get_data(packet);
256 size_t size = mpp_packet_get_size(packet);
257 size_t length = mpp_packet_get_length(packet);
258 void *p = pos + length;
259 RK_S32 buf_size = (data + size) - (pos + length);
260 MppWriteCtx bit_ctx;
261 MppWriteCtx *bit = &bit_ctx;
262 RK_S32 sps_size = 0;
263
264 mpp_writer_init(bit, p, buf_size);
265
266 /* start_code_prefix 00 00 00 01 */
267 mpp_writer_put_raw_bits(bit, 0, 24);
268 mpp_writer_put_raw_bits(bit, 1, 8);
269 /* forbidden_zero_bit */
270 mpp_writer_put_raw_bits(bit, 0, 1);
271 /* nal_ref_idc */
272 mpp_writer_put_raw_bits(bit, H264_NALU_PRIORITY_HIGHEST, 2);
273 /* nal_unit_type */
274 mpp_writer_put_raw_bits(bit, H264_NALU_TYPE_SPS, 5);
275
276 /* profile_idc */
277 mpp_writer_put_bits(bit, sps->profile_idc, 8);
278 /* constraint_set0_flag */
279 mpp_writer_put_bits(bit, sps->constraint_set0, 1);
280 /* constraint_set1_flag */
281 mpp_writer_put_bits(bit, sps->constraint_set1, 1);
282 /* constraint_set2_flag */
283 mpp_writer_put_bits(bit, sps->constraint_set2, 1);
284 /* constraint_set3_flag */
285 mpp_writer_put_bits(bit, sps->constraint_set3, 1);
286 /* constraint_set4_flag */
287 mpp_writer_put_bits(bit, sps->constraint_set4, 1);
288 /* constraint_set5_flag */
289 mpp_writer_put_bits(bit, sps->constraint_set5, 1);
290 /* reserved_zero_2bits */
291 mpp_writer_put_bits(bit, 0, 2);
292
293 /* level_idc */
294 mpp_writer_put_bits(bit, sps->level_idc, 8);
295 /* seq_parameter_set_id */
296 mpp_writer_put_ue(bit, sps->sps_id);
297
298 if (sps->profile_idc >= H264_PROFILE_HIGH) {
299 /* chroma_format_idc */
300 mpp_writer_put_ue(bit, sps->chroma_format_idc);
301 /* bit_depth_luma_minus8 */
302 mpp_writer_put_ue(bit, 0);
303 /* bit_depth_chroma_minus8 */
304 mpp_writer_put_ue(bit, 0);
305 /* qpprime_y_zero_transform_bypass_flag */
306 mpp_writer_put_bits(bit, 0, 1);
307 /* seq_scaling_matrix_present_flag */
308 mpp_writer_put_bits(bit, 0, 1);
309 }
310
311 /* log2_max_frame_num_minus4 */
312 mpp_writer_put_ue(bit, sps->log2_max_frame_num_minus4);
313 /* pic_order_cnt_type */
314 /* accodring usr cfg cfg->codec.h264.poc_type, hw may no support
315 will convert after get stream
316 */
317 mpp_writer_put_ue(bit, cfg->codec.h264.poc_type);
318 if (cfg->codec.h264.poc_type == 0) {
319 /* log2_max_pic_order_cnt_lsb_minus4 */
320 mpp_writer_put_ue(bit, sps->log2_max_poc_lsb_minus4);
321 }
322
323 /* max_num_ref_frames */
324 mpp_writer_put_ue(bit, sps->num_ref_frames);
325 /* gaps_in_frame_num_value_allowed_flag */
326 mpp_writer_put_bits(bit, sps->gaps_in_frame_num_value_allowed, 1);
327
328 /* pic_width_in_mbs_minus1 */
329 mpp_writer_put_ue(bit, sps->pic_width_in_mbs - 1);
330 /* pic_height_in_map_units_minus1 */
331 mpp_writer_put_ue(bit, sps->pic_height_in_mbs - 1);
332
333 /* frame_mbs_only_flag */
334 mpp_writer_put_bits(bit, sps->frame_mbs_only, 1);
335 /* direct_8x8_inference_flag */
336 mpp_writer_put_bits(bit, sps->direct8x8_inference, 1);
337 /* frame_cropping_flag */
338 mpp_writer_put_bits(bit, sps->cropping, 1);
339 if (sps->cropping) {
340 /* frame_crop_left_offset */
341 mpp_writer_put_ue(bit, sps->crop.left / 2);
342 /* frame_crop_right_offset */
343 mpp_writer_put_ue(bit, sps->crop.right / 2);
344 /* frame_crop_top_offset */
345 mpp_writer_put_ue(bit, sps->crop.top / 2);
346 /* frame_crop_bottom_offset */
347 mpp_writer_put_ue(bit, sps->crop.bottom / 2);
348 }
349
350 /* vui_parameters_present_flag */
351 mpp_writer_put_bits(bit, sps->vui.vui_present, 1);
352 if (sps->vui.vui_present) {
353 H264eVui *vui = &sps->vui;
354
355 /* aspect_ratio_info_present_flag */
356 mpp_writer_put_bits(bit, vui->aspect_ratio_info_present, 1);
357 if (vui->aspect_ratio_info_present) {
358 /* aspect_ratio_idc */
359 mpp_writer_put_bits(bit, vui->aspect_ratio_idc, 8);
360 if (H264_EXTENDED_SAR == vui->aspect_ratio_idc) {
361 /* sar_width */
362 mpp_writer_put_bits(bit, vui->sar_width, 16);
363 /* sar_height */
364 mpp_writer_put_bits(bit, vui->sar_height, 16);
365 }
366 }
367
368 /* overscan_info_present */
369 mpp_writer_put_bits(bit, vui->overscan_info_present, 1);
370 if (vui->overscan_info_present) {
371 /* overscan_appropriate_flag */
372 mpp_writer_put_bits(bit, vui->overscan_appropriate_flag, 1);
373 }
374
375 /* video_signal_type_present_flag */
376 mpp_writer_put_bits(bit, vui->signal_type_present, 1);
377 if (vui->signal_type_present) {
378 /* video_format */
379 mpp_writer_put_bits(bit, vui->vidformat, 3);
380 /* video_full_range_flag */
381 mpp_writer_put_bits(bit, vui->fullrange, 1);
382 /* colour_description_present_flag */
383 mpp_writer_put_bits(bit, vui->color_description_present, 1);
384 if (vui->color_description_present) {
385 /* colour_primaries */
386 mpp_writer_put_bits(bit, vui->colorprim, 8);
387 /* transfer_characteristics */
388 mpp_writer_put_bits(bit, vui->colortrc, 8);
389 /* matrix_coefficients */
390 mpp_writer_put_bits(bit, vui->colmatrix, 8);
391 }
392 }
393
394 /* chroma_loc_info_present_flag */
395 mpp_writer_put_bits(bit, vui->chroma_loc_info_present, 1);
396 if (vui->chroma_loc_info_present) {
397 /* chroma_sample_loc_type_top_field */
398 mpp_writer_put_ue(bit, vui->chroma_loc_top);
399 /* chroma_sample_loc_type_bottom_field */
400 mpp_writer_put_ue(bit, vui->chroma_loc_bottom);
401 }
402
403 /* timing_info_present_flag */
404 mpp_writer_put_bits(bit, vui->timing_info_present, 1);
405 if (vui->timing_info_present) {
406 /* num_units_in_tick msb */
407 mpp_writer_put_bits(bit, vui->num_units_in_tick >> 16, 16);
408 /* num_units_in_tick lsb */
409 mpp_writer_put_bits(bit, vui->num_units_in_tick & 0xffff, 16);
410 /* time_scale msb */
411 mpp_writer_put_bits(bit, vui->time_scale >> 16, 16);
412 /* time_scale lsb */
413 mpp_writer_put_bits(bit, vui->time_scale & 0xffff, 16);
414 /* fixed_frame_rate_flag */
415 mpp_writer_put_bits(bit, vui->fixed_frame_rate, 1);
416 }
417
418 /* nal_hrd_parameters_present_flag */
419 mpp_writer_put_bits(bit, vui->nal_hrd_parameters_present, 1);
420 /* vcl_hrd_parameters_present_flag */
421 mpp_writer_put_bits(bit, vui->vcl_hrd_parameters_present, 1);
422 /* pic_struct_present_flag */
423 mpp_writer_put_bits(bit, vui->pic_struct_present, 1);
424
425 /* bit_stream_restriction_flag */
426 mpp_writer_put_bits(bit, vui->bitstream_restriction, 1);
427 if (vui->bitstream_restriction) {
428 /* motion_vectors_over_pic_boundaries */
429 mpp_writer_put_bits(bit, vui->motion_vectors_over_pic_boundaries, 1);
430 /* max_bytes_per_pic_denom */
431 mpp_writer_put_ue(bit, vui->max_bytes_per_pic_denom);
432 /* max_bits_per_mb_denom */
433 mpp_writer_put_ue(bit, vui->max_bits_per_mb_denom);
434 /* log2_mv_length_horizontal */
435 mpp_writer_put_ue(bit, vui->log2_max_mv_length_horizontal);
436 /* log2_mv_length_vertical */
437 mpp_writer_put_ue(bit, vui->log2_max_mv_length_vertical);
438 /* num_reorder_frames */
439 mpp_writer_put_ue(bit, vui->num_reorder_frames);
440 /* max_dec_frame_buffering */
441 mpp_writer_put_ue(bit, vui->max_dec_frame_buffering);
442 }
443 }
444
445 mpp_writer_trailing(bit);
446
447 sps_size = mpp_writer_bytes(bit);
448 if (len)
449 *len = sps_size;
450 if (offset)
451 *offset = length;
452
453 mpp_packet_set_length(packet, length + sps_size);
454
455 return MPP_OK;
456 }
457
h264e_sps_dump(H264eSps * sps)458 MPP_RET h264e_sps_dump(H264eSps *sps)
459 {
460 (void) sps;
461 return MPP_OK;
462 }
463