mirror of
				https://github.com/nyanmisaka/mpp.git
				synced 2025-10-31 12:36:44 +08:00 
			
		
		
		
	[h264e_pps]: Add h264e pps function
NOTE: Add scaling list mode flag to rk_venc_cmd.h Change-Id: Idd3b33c577ce5ffd79dabc850f7c98a98c1ac19a Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
		| @@ -601,6 +601,13 @@ typedef struct MppEncH264Cfg_t { | ||||
|      */ | ||||
|     RK_S32              constrained_intra_pred_mode; | ||||
|  | ||||
|     /* | ||||
|      * 0 : flat scaling list | ||||
|      * 1 : default scaling list for all cases | ||||
|      * 2 : customized scaling list (not supported) | ||||
|      */ | ||||
|     RK_S32              scaling_list_mode; | ||||
|  | ||||
|     /* | ||||
|      * chroma qp offset (-12 - 12) | ||||
|      */ | ||||
|   | ||||
| @@ -15,6 +15,7 @@ set(H264E_HDR | ||||
| # h264 encoder sourse | ||||
| set(H264E_SRC | ||||
|     h264e_sps.c | ||||
|     h264e_pps.c | ||||
|     h264e_api.c | ||||
|     ) | ||||
|  | ||||
|   | ||||
							
								
								
									
										196
									
								
								mpp/codec/enc/h264/h264e_pps.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								mpp/codec/enc/h264/h264e_pps.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | ||||
| /* | ||||
|  * Copyright 2015 Rockchip Electronics Co. LTD | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #define MODULE_TAG "h264e_sps" | ||||
|  | ||||
| #include "mpp_common.h" | ||||
|  | ||||
| #include "mpp_bitwrite.h" | ||||
| #include "h264e_pps.h" | ||||
|  | ||||
| static void write_scaling_list(MppWriteCtx *bit, RK_S32 mode) | ||||
| { | ||||
|     switch (mode) { | ||||
|     case 0 : { | ||||
|         // flat scaling matrix | ||||
|         /* scaling_list_present_flag */ | ||||
|         mpp_writer_put_bits(bit, 0, 1); | ||||
|     } break; | ||||
|     case 1 : { | ||||
|         /* scaling_list_present_flag */ | ||||
|         mpp_writer_put_bits(bit, 1, 1); | ||||
|         /* delta_scale */ | ||||
|         mpp_writer_put_se(bit, -8); | ||||
|     } break; | ||||
|     default : { | ||||
|         mpp_err_f("unsupport scaling list mode %d\n", mode); | ||||
|     } break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| MPP_RET h264e_pps_update(SynH264ePps *pps, MppEncCfgSet *cfg) | ||||
| { | ||||
|     MppEncH264Cfg *codec = &cfg->codec.h264; | ||||
|  | ||||
|     pps->pps_id = 0; | ||||
|     pps->sps_id = 0; | ||||
|  | ||||
|     pps->entropy_coding_mode = codec->entropy_coding_mode; | ||||
|     pps->bottom_field_pic_order_in_frame_present = 0; | ||||
|     pps->num_slice_groups = 1; | ||||
|  | ||||
|     pps->num_ref_idx_l0_default_active = 1; | ||||
|     pps->num_ref_idx_l1_default_active = 1; | ||||
|  | ||||
|     pps->weighted_pred = 0; | ||||
|     pps->weighted_bipred_idc = 0; | ||||
|  | ||||
|     pps->pic_init_qp = 26; | ||||
|     pps->pic_init_qs = pps->pic_init_qp; | ||||
|  | ||||
|     pps->chroma_qp_index_offset = codec->chroma_cb_qp_offset; | ||||
|     pps->deblocking_filter_control = 1; | ||||
|     pps->constrained_intra_pred = codec->constrained_intra_pred_mode; | ||||
|     pps->redundant_pic_cnt = 0; | ||||
|  | ||||
|     // if (more_rbsp_data()) | ||||
|     pps->transform_8x8_mode = codec->transform8x8_mode; | ||||
|     mpp_assert(codec->scaling_list_mode == 0 || codec->scaling_list_mode == 1); | ||||
|     pps->pic_scaling_matrix_present = codec->scaling_list_mode; | ||||
|     if (codec->scaling_list_mode) { | ||||
|         /* NOTE: H.264 current encoder do NOT split detail matrix case */ | ||||
|         pps->use_default_scaling_matrix[H264_INTRA_4x4_Y] = 1; | ||||
|         pps->use_default_scaling_matrix[H264_INTRA_4x4_U] = 1; | ||||
|         pps->use_default_scaling_matrix[H264_INTRA_4x4_V] = 1; | ||||
|         pps->use_default_scaling_matrix[H264_INTER_4x4_Y] = 1; | ||||
|         pps->use_default_scaling_matrix[H264_INTER_4x4_U] = 1; | ||||
|         pps->use_default_scaling_matrix[H264_INTER_4x4_V] = 1; | ||||
|         pps->use_default_scaling_matrix[H264_INTRA_8x8_Y] = 1; | ||||
|         pps->use_default_scaling_matrix[H264_INTER_8x8_Y] = 1; | ||||
|     } | ||||
|     pps->second_chroma_qp_index_offset = codec->chroma_cr_qp_offset; | ||||
|  | ||||
|     if (codec->profile < H264_PROFILE_HIGH) { | ||||
|         if (pps->transform_8x8_mode) { | ||||
|             pps->transform_8x8_mode = 0; | ||||
|             mpp_log_f("warning: for profile %d transform_8x8_mode should be 0\n", | ||||
|                       codec->profile); | ||||
|         } | ||||
|         if (pps->second_chroma_qp_index_offset) { | ||||
|             pps->second_chroma_qp_index_offset = 0; | ||||
|             mpp_log_f("warning: for profile %d second_chroma_qp_index_offset should be 0\n", | ||||
|                       codec->profile); | ||||
|         } | ||||
|     } | ||||
|     if (codec->profile == H264_PROFILE_BASELINE && pps->entropy_coding_mode) { | ||||
|         mpp_log_f("warning: for baseline profile entropy_coding_mode should be 0\n"); | ||||
|         pps->entropy_coding_mode = 0; | ||||
|     } | ||||
|  | ||||
|     return MPP_OK; | ||||
| } | ||||
|  | ||||
| MPP_RET h264e_pps_to_packet(SynH264ePps *pps, MppPacket packet) | ||||
| { | ||||
|     void *pos = mpp_packet_get_pos(packet); | ||||
|     void *data = mpp_packet_get_data(packet); | ||||
|     size_t size = mpp_packet_get_size(packet); | ||||
|     size_t length = mpp_packet_get_length(packet); | ||||
|     void *p = pos + length; | ||||
|     RK_S32 buf_size = (data + size) - (pos + length); | ||||
|     MppWriteCtx bit_ctx; | ||||
|     MppWriteCtx *bit = &bit_ctx; | ||||
|     RK_S32 pps_size = 0; | ||||
|  | ||||
|     mpp_writer_init(bit, p, buf_size); | ||||
|  | ||||
|     /* start_code_prefix 00 00 00 01 */ | ||||
|     mpp_writer_put_raw_bits(bit, 0, 24); | ||||
|     mpp_writer_put_raw_bits(bit, 1, 8); | ||||
|     /* forbidden_zero_bit */ | ||||
|     mpp_writer_put_raw_bits(bit, 0, 1); | ||||
|     /* nal_ref_idc */ | ||||
|     mpp_writer_put_raw_bits(bit, H264_NALU_PRIORITY_HIGHEST, 2); | ||||
|     /* nal_unit_type */ | ||||
|     mpp_writer_put_raw_bits(bit, H264_NALU_TYPE_PPS, 5); | ||||
|  | ||||
|     /* pic_parameter_set_id */ | ||||
|     mpp_writer_put_ue(bit, pps->pps_id); | ||||
|     /* seq_parameter_set_id */ | ||||
|     mpp_writer_put_ue(bit, pps->sps_id); | ||||
|     /* entropy_coding_mode_flag */ | ||||
|     mpp_writer_put_bits(bit, pps->entropy_coding_mode, 1); | ||||
|     /* bottom_field_pic_order_in_frame_present */ | ||||
|     mpp_writer_put_bits(bit, pps->bottom_field_pic_order_in_frame_present, 1); | ||||
|     /* num_slice_groups_minus1 */ | ||||
|     mpp_writer_put_ue(bit, pps->num_slice_groups - 1); | ||||
|     /* num_ref_idx_l0_active_minus1 */ | ||||
|     mpp_writer_put_ue(bit, pps->num_ref_idx_l0_default_active - 1); | ||||
|     /* num_ref_idx_l1_active_minus1 */ | ||||
|     mpp_writer_put_ue(bit, pps->num_ref_idx_l1_default_active - 1); | ||||
|     /* weighted_pred_flag */ | ||||
|     mpp_writer_put_bits(bit, pps->weighted_pred, 1); | ||||
|     /* weighted_bipred_idc */ | ||||
|     mpp_writer_put_bits(bit, pps->weighted_bipred_idc, 2); | ||||
|     /* pic_init_qp_minus26 */ | ||||
|     mpp_writer_put_se(bit, pps->pic_init_qp - 26); | ||||
|     /* pic_init_qs_minus26 */ | ||||
|     mpp_writer_put_se(bit, pps->pic_init_qs - 26); | ||||
|     /* chroma_qp_index_offset */ | ||||
|     mpp_writer_put_se(bit, pps->chroma_qp_index_offset); | ||||
|     /* deblocking_filter_control_present_flag */ | ||||
|     mpp_writer_put_bits(bit, pps->deblocking_filter_control, 1); | ||||
|     /* constrained_intra_pred_flag */ | ||||
|     mpp_writer_put_bits(bit, pps->constrained_intra_pred, 1); | ||||
|     /* redundant_pic_cnt_present_flag */ | ||||
|     mpp_writer_put_bits(bit, pps->redundant_pic_cnt, 1); | ||||
|  | ||||
|     if (pps->transform_8x8_mode || | ||||
|         pps->second_chroma_qp_index_offset || | ||||
|         pps->pic_scaling_matrix_present) { | ||||
|         /* transform_8x8_mode_flag */ | ||||
|         mpp_writer_put_bits(bit, pps->transform_8x8_mode, 1); | ||||
|  | ||||
|         /* pic_scaling_matrix_present_flag */ | ||||
|         mpp_writer_put_bits(bit, pps->pic_scaling_matrix_present, 1); | ||||
|         if (pps->pic_scaling_matrix_present) { | ||||
|             /* Only support default scaling list */ | ||||
|             /* pic_scaling_list_present_flag[i] */ | ||||
|             RK_S32 count = pps->transform_8x8_mode ? 8 : 6; | ||||
|             RK_S32 i; | ||||
|  | ||||
|             for (i = 0; i < count; i++) | ||||
|                 write_scaling_list(bit, pps->use_default_scaling_matrix[i]); | ||||
|         } | ||||
|  | ||||
|         /* second_chroma_qp_index_offset */ | ||||
|         mpp_writer_put_se(bit, pps->second_chroma_qp_index_offset); | ||||
|     } | ||||
|  | ||||
|     mpp_writer_trailing(bit); | ||||
|  | ||||
|     pps_size = mpp_writer_bytes(bit); | ||||
|  | ||||
|     mpp_packet_set_length(packet, length + pps_size); | ||||
|  | ||||
|     return MPP_OK; | ||||
| } | ||||
|  | ||||
| MPP_RET h264e_pps_dump(SynH264ePps *pps) | ||||
| { | ||||
|     (void) pps; | ||||
|     return MPP_OK; | ||||
| } | ||||
							
								
								
									
										37
									
								
								mpp/codec/enc/h264/h264e_pps.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								mpp/codec/enc/h264/h264e_pps.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| /* | ||||
|  * Copyright 2015 Rockchip Electronics Co. LTD | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|  * you may not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  *      http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an "AS IS" BASIS, | ||||
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #ifndef __H264E_PPS_H__ | ||||
| #define __H264E_PPS_H__ | ||||
|  | ||||
| #include "mpp_packet.h" | ||||
| #include "mpp_enc_cfg.h" | ||||
|  | ||||
| #include "h264e_syntax.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| MPP_RET h264e_pps_update(SynH264ePps *pps, MppEncCfgSet *cfg); | ||||
| MPP_RET h264e_pps_to_packet(SynH264ePps *pps, MppPacket packet); | ||||
| MPP_RET h264e_pps_dump(SynH264ePps *pps); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* __H264E_PPS_H__ */ | ||||
| @@ -165,4 +165,16 @@ typedef enum H264SeiType_e { | ||||
|     H264_SEI_MAX_ELEMENTS  //!< number of maximum syntax elements | ||||
| } H264SeiType; | ||||
|  | ||||
| typedef enum H264ScalingListType_e { | ||||
|     H264_INTRA_4x4_Y, | ||||
|     H264_INTRA_4x4_U, | ||||
|     H264_INTRA_4x4_V, | ||||
|     H264_INTER_4x4_Y, | ||||
|     H264_INTER_4x4_U, | ||||
|     H264_INTER_4x4_V, | ||||
|     H264_INTRA_8x8_Y, | ||||
|     H264_INTER_8x8_Y, | ||||
|     H264_SCALING_MATRIX_TYPE_BUTT, | ||||
| } H264ScalingMatrixType; | ||||
|  | ||||
| #endif /*__H264_SYNTAX_H__*/ | ||||
|   | ||||
| @@ -285,7 +285,8 @@ typedef struct SynH264ePps_t { | ||||
|     RK_S32      transform_8x8_mode; | ||||
|  | ||||
|     // Only support flat and default scaling list | ||||
|     RK_S32      pic_scaling_list_present; | ||||
|     RK_S32      pic_scaling_matrix_present; | ||||
|     RK_S32      use_default_scaling_matrix[H264_SCALING_MATRIX_TYPE_BUTT]; | ||||
| } SynH264ePps; | ||||
|  | ||||
| #endif | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Herman Chen
					Herman Chen