xref: /OK3568_Linux_fs/external/mpp/mpp/codec/enc/h264/h264e_pps.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 "mpp_common.h"
20 
21 #include "mpp_bitwrite.h"
22 #include "h264e_debug.h"
23 #include "h264e_pps.h"
24 
write_scaling_list(MppWriteCtx * bit,RK_S32 mode)25 static void write_scaling_list(MppWriteCtx *bit, RK_S32 mode)
26 {
27     switch (mode) {
28     case 0 : {
29         // flat scaling matrix
30         /* scaling_list_present_flag */
31         mpp_writer_put_bits(bit, 0, 1);
32     } break;
33     case 1 : {
34         /* scaling_list_present_flag */
35         mpp_writer_put_bits(bit, 1, 1);
36         /* delta_scale */
37         mpp_writer_put_se(bit, -8);
38     } break;
39     default : {
40         mpp_err_f("unsupport scaling list mode %d\n", mode);
41     } break;
42     }
43 }
44 
h264e_pps_update(H264ePps * pps,MppEncCfgSet * cfg)45 MPP_RET h264e_pps_update(H264ePps *pps, MppEncCfgSet *cfg)
46 {
47     MppEncH264Cfg *codec = &cfg->codec.h264;
48 
49     pps->pps_id = 0;
50     pps->sps_id = 0;
51 
52     pps->entropy_coding_mode = codec->entropy_coding_mode;
53     pps->bottom_field_pic_order_in_frame_present = 0;
54     pps->num_slice_groups = 1;
55 
56     pps->num_ref_idx_l0_default_active = 1;
57     pps->num_ref_idx_l1_default_active = 1;
58 
59     pps->weighted_pred = 0;
60     pps->weighted_bipred_idc = 0;
61 
62     pps->pic_init_qp = 26;
63     pps->pic_init_qs = pps->pic_init_qp;
64 
65     pps->chroma_qp_index_offset = codec->chroma_cb_qp_offset;
66     pps->second_chroma_qp_index_offset = codec->chroma_cb_qp_offset;
67     pps->deblocking_filter_control = 1;
68     pps->constrained_intra_pred = codec->constrained_intra_pred_mode;
69     pps->redundant_pic_cnt = 0;
70 
71     // if (more_rbsp_data())
72     pps->transform_8x8_mode = codec->transform8x8_mode;
73     mpp_assert(codec->scaling_list_mode == 0 || codec->scaling_list_mode == 1);
74     pps->pic_scaling_matrix_present = codec->scaling_list_mode;
75     if (codec->scaling_list_mode) {
76         /* NOTE: H.264 current encoder do NOT split detail matrix case */
77         pps->use_default_scaling_matrix[H264_INTRA_4x4_Y] = 1;
78         pps->use_default_scaling_matrix[H264_INTRA_4x4_U] = 1;
79         pps->use_default_scaling_matrix[H264_INTRA_4x4_V] = 1;
80         pps->use_default_scaling_matrix[H264_INTER_4x4_Y] = 1;
81         pps->use_default_scaling_matrix[H264_INTER_4x4_U] = 1;
82         pps->use_default_scaling_matrix[H264_INTER_4x4_V] = 1;
83         pps->use_default_scaling_matrix[H264_INTRA_8x8_Y] = 1;
84         pps->use_default_scaling_matrix[H264_INTER_8x8_Y] = 1;
85     }
86 
87     if (codec->profile < H264_PROFILE_HIGH) {
88         pps->second_chroma_qp_index_offset_present = 0;
89         if (pps->transform_8x8_mode) {
90             pps->transform_8x8_mode = 0;
91             mpp_log_f("warning: for profile %d transform_8x8_mode should be 0\n",
92                       codec->profile);
93         }
94     } else {
95         pps->second_chroma_qp_index_offset_present = 1;
96         pps->second_chroma_qp_index_offset = codec->chroma_cr_qp_offset;
97     }
98 
99     if (codec->profile == H264_PROFILE_BASELINE && pps->entropy_coding_mode) {
100         mpp_log_f("warning: for baseline profile entropy_coding_mode should be 0\n");
101         pps->entropy_coding_mode = 0;
102     }
103 
104     return MPP_OK;
105 }
106 
h264e_pps_to_packet(H264ePps * pps,MppPacket packet,RK_S32 * offset,RK_S32 * len)107 RK_S32 h264e_pps_to_packet(H264ePps *pps, MppPacket packet, RK_S32 *offset, RK_S32 *len)
108 {
109     void *pos = mpp_packet_get_pos(packet);
110     void *data = mpp_packet_get_data(packet);
111     size_t size = mpp_packet_get_size(packet);
112     size_t length = mpp_packet_get_length(packet);
113     void *p = pos + length;
114     RK_S32 buf_size = (data + size) - (pos + length);
115     MppWriteCtx bit_ctx;
116     MppWriteCtx *bit = &bit_ctx;
117     RK_S32 pps_size = 0;
118 
119     mpp_writer_init(bit, p, buf_size);
120 
121     /* start_code_prefix 00 00 00 01 */
122     mpp_writer_put_raw_bits(bit, 0, 24);
123     mpp_writer_put_raw_bits(bit, 1, 8);
124     /* forbidden_zero_bit */
125     mpp_writer_put_raw_bits(bit, 0, 1);
126     /* nal_ref_idc */
127     mpp_writer_put_raw_bits(bit, H264_NALU_PRIORITY_HIGHEST, 2);
128     /* nal_unit_type */
129     mpp_writer_put_raw_bits(bit, H264_NALU_TYPE_PPS, 5);
130 
131     /* pic_parameter_set_id */
132     mpp_writer_put_ue(bit, pps->pps_id);
133     /* seq_parameter_set_id */
134     mpp_writer_put_ue(bit, pps->sps_id);
135     /* entropy_coding_mode_flag */
136     mpp_writer_put_bits(bit, pps->entropy_coding_mode, 1);
137     /* bottom_field_pic_order_in_frame_present */
138     mpp_writer_put_bits(bit, pps->bottom_field_pic_order_in_frame_present, 1);
139     /* num_slice_groups_minus1 */
140     mpp_writer_put_ue(bit, pps->num_slice_groups - 1);
141     /* num_ref_idx_l0_active_minus1 */
142     mpp_writer_put_ue(bit, pps->num_ref_idx_l0_default_active - 1);
143     /* num_ref_idx_l1_active_minus1 */
144     mpp_writer_put_ue(bit, pps->num_ref_idx_l1_default_active - 1);
145     /* weighted_pred_flag */
146     mpp_writer_put_bits(bit, pps->weighted_pred, 1);
147     /* weighted_bipred_idc */
148     mpp_writer_put_bits(bit, pps->weighted_bipred_idc, 2);
149     /* pic_init_qp_minus26 */
150     mpp_writer_put_se(bit, pps->pic_init_qp - 26);
151     /* pic_init_qs_minus26 */
152     mpp_writer_put_se(bit, pps->pic_init_qs - 26);
153     /* chroma_qp_index_offset */
154     mpp_writer_put_se(bit, pps->chroma_qp_index_offset);
155     /* deblocking_filter_control_present_flag */
156     mpp_writer_put_bits(bit, pps->deblocking_filter_control, 1);
157     /* constrained_intra_pred_flag */
158     mpp_writer_put_bits(bit, pps->constrained_intra_pred, 1);
159     /* redundant_pic_cnt_present_flag */
160     mpp_writer_put_bits(bit, pps->redundant_pic_cnt, 1);
161 
162     if (pps->transform_8x8_mode ||
163         pps->second_chroma_qp_index_offset_present ||
164         pps->pic_scaling_matrix_present) {
165         /* transform_8x8_mode_flag */
166         mpp_writer_put_bits(bit, pps->transform_8x8_mode, 1);
167 
168         /* pic_scaling_matrix_present_flag */
169         mpp_writer_put_bits(bit, pps->pic_scaling_matrix_present, 1);
170         if (pps->pic_scaling_matrix_present) {
171             /* Only support default scaling list */
172             /* pic_scaling_list_present_flag[i] */
173             RK_S32 count = pps->transform_8x8_mode ? 8 : 6;
174             RK_S32 i;
175 
176             for (i = 0; i < count; i++)
177                 write_scaling_list(bit, pps->use_default_scaling_matrix[i]);
178         }
179 
180         /* second_chroma_qp_index_offset */
181         mpp_writer_put_se(bit, pps->second_chroma_qp_index_offset);
182     }
183 
184     mpp_writer_trailing(bit);
185 
186     pps_size = mpp_writer_bytes(bit);
187     if (len)
188         *len = pps_size;
189     if (offset)
190         *offset = length;
191 
192     mpp_packet_set_length(packet, length + pps_size);
193 
194     return pps_size;
195 }
196 
h264e_pps_dump(H264ePps * pps)197 MPP_RET h264e_pps_dump(H264ePps *pps)
198 {
199     (void) pps;
200     return MPP_OK;
201 }
202