xref: /OK3568_Linux_fs/external/mpp/mpp/codec/enc/h264/h264e_sps.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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