diff options
Diffstat (limited to 'videodecoder/securevideo/cherrytrail/secvideoparser.h')
-rw-r--r-- | videodecoder/securevideo/cherrytrail/secvideoparser.h | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/videodecoder/securevideo/cherrytrail/secvideoparser.h b/videodecoder/securevideo/cherrytrail/secvideoparser.h new file mode 100644 index 0000000..f27580a --- /dev/null +++ b/videodecoder/securevideo/cherrytrail/secvideoparser.h @@ -0,0 +1,150 @@ +/* +* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. +* +* 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 SEC_VIDEO_PARSER_H_ +#define SEC_VIDEO_PARSER_H_ + +#include <stdint.h> + +/* H264 start code values */ +typedef enum _h264_nal_unit_type +{ + h264_NAL_UNIT_TYPE_unspecified = 0, + h264_NAL_UNIT_TYPE_SLICE, + h264_NAL_UNIT_TYPE_DPA, + h264_NAL_UNIT_TYPE_DPB, + h264_NAL_UNIT_TYPE_DPC, + h264_NAL_UNIT_TYPE_IDR, + h264_NAL_UNIT_TYPE_SEI, + h264_NAL_UNIT_TYPE_SPS, + h264_NAL_UNIT_TYPE_PPS, + h264_NAL_UNIT_TYPE_Acc_unit_delimiter, + h264_NAL_UNIT_TYPE_EOSeq, + h264_NAL_UNIT_TYPE_EOstream, + h264_NAL_UNIT_TYPE_filler_data, + h264_NAL_UNIT_TYPE_SPS_extension, + h264_NAL_UNIT_TYPE_ACP = 19, + h264_NAL_UNIT_TYPE_Slice_extension = 20 +} h264_nal_unit_type_t; + +#define MAX_OP 16 + +enum dec_ref_pic_marking_flags { + IDR_PIC_FLAG = 0, + NO_OUTPUT_OF_PRIOR_PICS_FLAG, + LONG_TERM_REFERENCE_FLAG, + ADAPTIVE_REF_PIC_MARKING_MODE_FLAG +}; + +typedef struct _dec_ref_pic_marking_t { + union { + uint8_t flags; + struct { + uint8_t idr_pic_flag:1; + uint8_t no_output_of_prior_pics_flag:1; + uint8_t long_term_reference_flag:1; + uint8_t adaptive_ref_pic_marking_mode_flag:1; + }; + }; + struct { + uint8_t memory_management_control_operation; + union { + struct { + uint8_t difference_of_pic_nums_minus1; + } op1; + struct { + uint8_t long_term_pic_num; + } op2; + struct { + uint8_t difference_of_pic_nums_minus1; + uint8_t long_term_frame_idx; + } op3; + struct { + uint8_t max_long_term_frame_idx_plus1; + } op4; + struct { + uint8_t long_term_frame_idx; + } op6; + }; + } op[MAX_OP]; +} dec_ref_pic_marking_t; + +enum slice_header_flags { + FIELD_PIC_FLAG = 0, + BOTTOM_FIELD_FLAG +}; + +typedef struct _slice_header_t { + uint8_t nal_unit_type; + uint8_t pps_id; + uint8_t padding; // TODO: padding needed because flags in secfw impl. is a big-endian uint16_t + union { + uint8_t flags; + struct { + uint8_t field_pic_flag:1; + uint8_t bottom_field_flag:1; + }; + }; + uint32_t first_mb_in_slice; + uint32_t frame_num; + uint16_t idr_pic_id; + uint16_t pic_order_cnt_lsb; + int32_t delta_pic_order_cnt[2]; + int32_t delta_pic_order_cnt_bottom; +} slice_header_t; + +typedef struct { + uint8_t type; + uint32_t offset; + uint8_t* data; + uint32_t length; + slice_header_t* slice_header; +} nalu_info_t; + +typedef struct { + uint32_t iv[4]; + uint32_t mode; + uint32_t app_id; +} pavp_info_t; + +#define MAX_NUM_NALUS 20 + +typedef struct { + uint8_t* data; + uint32_t length; + pavp_info_t* pavp; + dec_ref_pic_marking_t* dec_ref_pic_marking; + uint32_t num_nalus; + nalu_info_t nalus[MAX_NUM_NALUS]; +} frame_info_t; + +int parser_init(void); +int parse_frame(uint8_t* frame, uint32_t frame_size, uint8_t* nalu_data, uint32_t* nalu_data_size); + +// DEBUG PRINTING +void print_slice_header(slice_header_t* slice_header); +void print_dec_ref_pic_marking(dec_ref_pic_marking_t* dec_ref_pic_marking); +void print_data_bytes(uint8_t* data, uint32_t count); +void print_nalu_data(uint8_t* nalu_data, uint32_t nalu_data_size); + +// BYTESWAPPING +uint16_t byteswap_16(uint16_t word); +uint32_t byteswap_32(uint32_t dword); +void byteswap_slice_header(slice_header_t* slice_header); +void byteswap_dec_ref_pic_marking(dec_ref_pic_marking_t* dec_ref_pic_marking); +void byteswap_nalu_data(uint8_t* nalu_data, uint32_t nalu_data_size); + +#endif /* SEC_VIDEO_PARSER_H_ */ |