xref: /rockchip-linux_mpp/mpp/codec/enc/h264/h264e_pps.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "h264e_sps"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include "mpp_common.h"
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include "mpp_bitwrite.h"
22*437bfbebSnyanmisaka #include "h264e_debug.h"
23*437bfbebSnyanmisaka #include "h264e_pps.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka static const uint8_t zigzag[64] = {
26*437bfbebSnyanmisaka     0,  8,  1,  2,  9, 16, 24, 17, 10,  3,  4, 11, 18, 25, 32, 40,
27*437bfbebSnyanmisaka     33, 26, 19, 12,  5,  6, 13, 20, 27, 34, 41, 48, 56, 49, 42, 35,
28*437bfbebSnyanmisaka     28, 21, 14,  7, 15, 22, 29, 36, 43, 50, 57, 58, 51, 44, 37, 30,
29*437bfbebSnyanmisaka     23, 31, 38, 45, 52, 59, 60, 53, 46, 39, 47, 54, 61, 62, 55, 63
30*437bfbebSnyanmisaka };
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka static const uint8_t intra_scl[64] = {
33*437bfbebSnyanmisaka     10, 11, 14, 16, 17, 19, 21, 23,
34*437bfbebSnyanmisaka     11, 12, 16, 17, 19, 21, 23, 25,
35*437bfbebSnyanmisaka     14, 16, 17, 19, 21, 23, 25, 27,
36*437bfbebSnyanmisaka     16, 17, 19, 21, 23, 25, 27, 28,
37*437bfbebSnyanmisaka     17, 19, 21, 23, 25, 27, 28, 29,
38*437bfbebSnyanmisaka     19, 21, 23, 25, 27, 28, 29, 30,
39*437bfbebSnyanmisaka     21, 23, 25, 27, 28, 29, 30, 31,
40*437bfbebSnyanmisaka     23, 25, 27, 28, 29, 30, 31, 32,
41*437bfbebSnyanmisaka };
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka static const uint8_t inter_scl[64] = {
44*437bfbebSnyanmisaka     12, 13, 15, 16, 17, 19, 20, 21,
45*437bfbebSnyanmisaka     13, 14, 16, 17, 19, 20, 21, 22,
46*437bfbebSnyanmisaka     15, 16, 17, 19, 20, 21, 22, 23,
47*437bfbebSnyanmisaka     16, 17, 19, 20, 21, 22, 23, 25,
48*437bfbebSnyanmisaka     17, 19, 20, 21, 22, 23, 25, 27,
49*437bfbebSnyanmisaka     19, 20, 21, 22, 23, 25, 27, 28,
50*437bfbebSnyanmisaka     20, 21, 22, 23, 25, 27, 28, 29,
51*437bfbebSnyanmisaka     21, 22, 23, 25, 27, 28, 29, 30,
52*437bfbebSnyanmisaka };
53*437bfbebSnyanmisaka 
h264e_pps_update(H264ePps * pps,MppEncCfgSet * cfg)54*437bfbebSnyanmisaka MPP_RET h264e_pps_update(H264ePps *pps, MppEncCfgSet *cfg)
55*437bfbebSnyanmisaka {
56*437bfbebSnyanmisaka     MppEncH264Cfg *codec = &cfg->h264;
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka     pps->pps_id = 0;
59*437bfbebSnyanmisaka     pps->sps_id = 0;
60*437bfbebSnyanmisaka 
61*437bfbebSnyanmisaka     pps->entropy_coding_mode = codec->entropy_coding_mode;
62*437bfbebSnyanmisaka     pps->bottom_field_pic_order_in_frame_present = 0;
63*437bfbebSnyanmisaka     pps->num_slice_groups = 1;
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka     pps->num_ref_idx_l0_default_active = 1;
66*437bfbebSnyanmisaka     pps->num_ref_idx_l1_default_active = 1;
67*437bfbebSnyanmisaka 
68*437bfbebSnyanmisaka     pps->weighted_pred = 0;
69*437bfbebSnyanmisaka     pps->weighted_bipred_idc = 0;
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka     pps->pic_init_qp = 26;
72*437bfbebSnyanmisaka     pps->pic_init_qs = pps->pic_init_qp;
73*437bfbebSnyanmisaka 
74*437bfbebSnyanmisaka     pps->chroma_qp_index_offset = codec->chroma_cb_qp_offset;
75*437bfbebSnyanmisaka     pps->second_chroma_qp_index_offset = codec->chroma_cb_qp_offset;
76*437bfbebSnyanmisaka     pps->deblocking_filter_control = 1;
77*437bfbebSnyanmisaka     pps->constrained_intra_pred = codec->constrained_intra_pred_mode;
78*437bfbebSnyanmisaka     pps->redundant_pic_cnt = 0;
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka     // if (more_rbsp_data())
81*437bfbebSnyanmisaka     pps->transform_8x8_mode = codec->transform8x8_mode;
82*437bfbebSnyanmisaka     mpp_assert(codec->scaling_list_mode == 0 || codec->scaling_list_mode == 1);
83*437bfbebSnyanmisaka     pps->pic_scaling_matrix_present = codec->scaling_list_mode;
84*437bfbebSnyanmisaka     if (codec->scaling_list_mode) {
85*437bfbebSnyanmisaka         /* NOTE: H.264 current encoder do NOT split detail matrix case */
86*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTRA_4x4_Y] = 1;
87*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTRA_4x4_U] = 1;
88*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTRA_4x4_V] = 1;
89*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTER_4x4_Y] = 1;
90*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTER_4x4_U] = 1;
91*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTER_4x4_V] = 1;
92*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTRA_8x8_Y] = 1;
93*437bfbebSnyanmisaka         pps->use_default_scaling_matrix[H264_INTER_8x8_Y] = 1;
94*437bfbebSnyanmisaka     }
95*437bfbebSnyanmisaka 
96*437bfbebSnyanmisaka     if (codec->profile < H264_PROFILE_HIGH) {
97*437bfbebSnyanmisaka         pps->second_chroma_qp_index_offset_present = 0;
98*437bfbebSnyanmisaka         if (pps->transform_8x8_mode) {
99*437bfbebSnyanmisaka             pps->transform_8x8_mode = 0;
100*437bfbebSnyanmisaka             mpp_log_f("warning: for profile %d transform_8x8_mode should be 0\n",
101*437bfbebSnyanmisaka                       codec->profile);
102*437bfbebSnyanmisaka         }
103*437bfbebSnyanmisaka         if (pps->pic_scaling_matrix_present) {
104*437bfbebSnyanmisaka             pps->pic_scaling_matrix_present = 0;
105*437bfbebSnyanmisaka             mpp_log_f("warning: for profile %d pic_scaling_matrix_present should be 0\n",
106*437bfbebSnyanmisaka                       codec->profile);
107*437bfbebSnyanmisaka         }
108*437bfbebSnyanmisaka     } else {
109*437bfbebSnyanmisaka         pps->second_chroma_qp_index_offset_present = 1;
110*437bfbebSnyanmisaka         pps->second_chroma_qp_index_offset = codec->chroma_cr_qp_offset;
111*437bfbebSnyanmisaka     }
112*437bfbebSnyanmisaka 
113*437bfbebSnyanmisaka     if (codec->profile == H264_PROFILE_BASELINE && pps->entropy_coding_mode) {
114*437bfbebSnyanmisaka         mpp_log_f("warning: for baseline profile entropy_coding_mode should be 0\n");
115*437bfbebSnyanmisaka         pps->entropy_coding_mode = 0;
116*437bfbebSnyanmisaka     }
117*437bfbebSnyanmisaka 
118*437bfbebSnyanmisaka     return MPP_OK;
119*437bfbebSnyanmisaka }
120*437bfbebSnyanmisaka 
h264e_pps_to_packet(H264ePps * pps,MppPacket packet,RK_S32 * offset,RK_S32 * len)121*437bfbebSnyanmisaka RK_S32 h264e_pps_to_packet(H264ePps *pps, MppPacket packet, RK_S32 *offset, RK_S32 *len)
122*437bfbebSnyanmisaka {
123*437bfbebSnyanmisaka     void *pos = mpp_packet_get_pos(packet);
124*437bfbebSnyanmisaka     void *data = mpp_packet_get_data(packet);
125*437bfbebSnyanmisaka     size_t size = mpp_packet_get_size(packet);
126*437bfbebSnyanmisaka     size_t length = mpp_packet_get_length(packet);
127*437bfbebSnyanmisaka     void *p = pos + length;
128*437bfbebSnyanmisaka     RK_S32 buf_size = (data + size) - (pos + length);
129*437bfbebSnyanmisaka     MppWriteCtx bit_ctx;
130*437bfbebSnyanmisaka     MppWriteCtx *bit = &bit_ctx;
131*437bfbebSnyanmisaka     RK_S32 pps_size = 0;
132*437bfbebSnyanmisaka 
133*437bfbebSnyanmisaka     mpp_writer_init(bit, p, buf_size);
134*437bfbebSnyanmisaka 
135*437bfbebSnyanmisaka     /* start_code_prefix 00 00 00 01 */
136*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(bit, 0, 24);
137*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(bit, 1, 8);
138*437bfbebSnyanmisaka     /* forbidden_zero_bit */
139*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(bit, 0, 1);
140*437bfbebSnyanmisaka     /* nal_ref_idc */
141*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(bit, H264_NALU_PRIORITY_HIGHEST, 2);
142*437bfbebSnyanmisaka     /* nal_unit_type */
143*437bfbebSnyanmisaka     mpp_writer_put_raw_bits(bit, H264_NALU_TYPE_PPS, 5);
144*437bfbebSnyanmisaka 
145*437bfbebSnyanmisaka     /* pic_parameter_set_id */
146*437bfbebSnyanmisaka     mpp_writer_put_ue(bit, pps->pps_id);
147*437bfbebSnyanmisaka     /* seq_parameter_set_id */
148*437bfbebSnyanmisaka     mpp_writer_put_ue(bit, pps->sps_id);
149*437bfbebSnyanmisaka     /* entropy_coding_mode_flag */
150*437bfbebSnyanmisaka     mpp_writer_put_bits(bit, pps->entropy_coding_mode, 1);
151*437bfbebSnyanmisaka     /* bottom_field_pic_order_in_frame_present */
152*437bfbebSnyanmisaka     mpp_writer_put_bits(bit, pps->bottom_field_pic_order_in_frame_present, 1);
153*437bfbebSnyanmisaka     /* num_slice_groups_minus1 */
154*437bfbebSnyanmisaka     mpp_writer_put_ue(bit, pps->num_slice_groups - 1);
155*437bfbebSnyanmisaka     /* num_ref_idx_l0_active_minus1 */
156*437bfbebSnyanmisaka     mpp_writer_put_ue(bit, pps->num_ref_idx_l0_default_active - 1);
157*437bfbebSnyanmisaka     /* num_ref_idx_l1_active_minus1 */
158*437bfbebSnyanmisaka     mpp_writer_put_ue(bit, pps->num_ref_idx_l1_default_active - 1);
159*437bfbebSnyanmisaka     /* weighted_pred_flag */
160*437bfbebSnyanmisaka     mpp_writer_put_bits(bit, pps->weighted_pred, 1);
161*437bfbebSnyanmisaka     /* weighted_bipred_idc */
162*437bfbebSnyanmisaka     mpp_writer_put_bits(bit, pps->weighted_bipred_idc, 2);
163*437bfbebSnyanmisaka     /* pic_init_qp_minus26 */
164*437bfbebSnyanmisaka     mpp_writer_put_se(bit, pps->pic_init_qp - 26);
165*437bfbebSnyanmisaka     /* pic_init_qs_minus26 */
166*437bfbebSnyanmisaka     mpp_writer_put_se(bit, pps->pic_init_qs - 26);
167*437bfbebSnyanmisaka     /* chroma_qp_index_offset */
168*437bfbebSnyanmisaka     mpp_writer_put_se(bit, pps->chroma_qp_index_offset);
169*437bfbebSnyanmisaka     /* deblocking_filter_control_present_flag */
170*437bfbebSnyanmisaka     mpp_writer_put_bits(bit, pps->deblocking_filter_control, 1);
171*437bfbebSnyanmisaka     /* constrained_intra_pred_flag */
172*437bfbebSnyanmisaka     mpp_writer_put_bits(bit, pps->constrained_intra_pred, 1);
173*437bfbebSnyanmisaka     /* redundant_pic_cnt_present_flag */
174*437bfbebSnyanmisaka     mpp_writer_put_bits(bit, pps->redundant_pic_cnt, 1);
175*437bfbebSnyanmisaka 
176*437bfbebSnyanmisaka     if (pps->transform_8x8_mode ||
177*437bfbebSnyanmisaka         pps->second_chroma_qp_index_offset_present ||
178*437bfbebSnyanmisaka         pps->pic_scaling_matrix_present) {
179*437bfbebSnyanmisaka         /* transform_8x8_mode_flag */
180*437bfbebSnyanmisaka         mpp_writer_put_bits(bit, pps->transform_8x8_mode, 1);
181*437bfbebSnyanmisaka 
182*437bfbebSnyanmisaka         /* TODO: scaling_list_mode */
183*437bfbebSnyanmisaka         mpp_writer_put_bits(bit, pps->pic_scaling_matrix_present != 0, 1);
184*437bfbebSnyanmisaka         if (pps->pic_scaling_matrix_present)
185*437bfbebSnyanmisaka             mpp_writer_put_bits(bit, 0, 6);
186*437bfbebSnyanmisaka 
187*437bfbebSnyanmisaka         if (1 == pps->pic_scaling_matrix_present)
188*437bfbebSnyanmisaka             mpp_writer_put_bits(bit, 0, 2); /* default scaling list */
189*437bfbebSnyanmisaka         else if (2 == pps->pic_scaling_matrix_present) {
190*437bfbebSnyanmisaka             /* user defined scaling list */
191*437bfbebSnyanmisaka             if (pps->transform_8x8_mode) {
192*437bfbebSnyanmisaka                 RK_S32 run = 0;
193*437bfbebSnyanmisaka                 RK_S32 len2 = 64;
194*437bfbebSnyanmisaka                 RK_S32 j = 0;
195*437bfbebSnyanmisaka 
196*437bfbebSnyanmisaka                 mpp_writer_put_bits(bit, 1, 1);
197*437bfbebSnyanmisaka                 for (run = len2; run > 1; run --)
198*437bfbebSnyanmisaka                     if (intra_scl[zigzag[run - 1]] != intra_scl[zigzag[run - 2]])
199*437bfbebSnyanmisaka                         break;
200*437bfbebSnyanmisaka                 for (j = 0; j < run; j ++)
201*437bfbebSnyanmisaka                     mpp_writer_put_se(bit, (int8_t)(intra_scl[zigzag[j]] - (j > 0 ? intra_scl[zigzag[j - 1]] : 8)));
202*437bfbebSnyanmisaka                 if (run < len2)
203*437bfbebSnyanmisaka                     mpp_writer_put_se(bit, (int8_t) - intra_scl[zigzag[run]]);
204*437bfbebSnyanmisaka 
205*437bfbebSnyanmisaka                 mpp_writer_put_bits(bit, 1, 1);
206*437bfbebSnyanmisaka                 for (run = len2; run > 1; run --)
207*437bfbebSnyanmisaka                     if (inter_scl[zigzag[run - 1]] != inter_scl[zigzag[run - 2]])
208*437bfbebSnyanmisaka                         break;
209*437bfbebSnyanmisaka                 for (j = 0; j < run; j ++)
210*437bfbebSnyanmisaka                     mpp_writer_put_se(bit, (int8_t)(inter_scl[zigzag[j]] - (j > 0 ? inter_scl[zigzag[j - 1]] : 8)));
211*437bfbebSnyanmisaka                 if (run < len2)
212*437bfbebSnyanmisaka                     mpp_writer_put_se(bit, (int8_t) - inter_scl[zigzag[run]]);
213*437bfbebSnyanmisaka             } else
214*437bfbebSnyanmisaka                 mpp_writer_put_bits(bit, 0, 2);
215*437bfbebSnyanmisaka         }
216*437bfbebSnyanmisaka 
217*437bfbebSnyanmisaka         /* second_chroma_qp_index_offset */
218*437bfbebSnyanmisaka         mpp_writer_put_se(bit, pps->second_chroma_qp_index_offset);
219*437bfbebSnyanmisaka     }
220*437bfbebSnyanmisaka 
221*437bfbebSnyanmisaka     mpp_writer_trailing(bit);
222*437bfbebSnyanmisaka 
223*437bfbebSnyanmisaka     pps_size = mpp_writer_bytes(bit);
224*437bfbebSnyanmisaka     if (len)
225*437bfbebSnyanmisaka         *len = pps_size;
226*437bfbebSnyanmisaka     if (offset)
227*437bfbebSnyanmisaka         *offset = length;
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka     mpp_packet_set_length(packet, length + pps_size);
230*437bfbebSnyanmisaka 
231*437bfbebSnyanmisaka     return pps_size;
232*437bfbebSnyanmisaka }
233*437bfbebSnyanmisaka 
h264e_pps_dump(H264ePps * pps)234*437bfbebSnyanmisaka MPP_RET h264e_pps_dump(H264ePps *pps)
235*437bfbebSnyanmisaka {
236*437bfbebSnyanmisaka     (void) pps;
237*437bfbebSnyanmisaka     return MPP_OK;
238*437bfbebSnyanmisaka }
239