| /* INTEL CONFIDENTIAL |
| * Copyright (c) 2013 Intel Corporation. All rights reserved. |
| * |
| * The source code contained or described herein and all documents |
| * related to the source code ("Material") are owned by Intel |
| * Corporation or its suppliers or licensors. Title to the |
| * Material remains with Intel Corporation or its suppliers and |
| * licensors. The Material contains trade secrets and proprietary |
| * and confidential information of Intel or its suppliers and |
| * licensors. The Material is protected by worldwide copyright and |
| * trade secret laws and treaty provisions. No part of the Material |
| * may be used, copied, reproduced, modified, published, uploaded, |
| * posted, transmitted, distributed, or disclosed in any way without |
| * Intel's prior express written permission. |
| * |
| * No license under any patent, copyright, trade secret or other |
| * intellectual property right is granted to or conferred upon you |
| * by disclosure or delivery of the Materials, either expressly, by |
| * implication, inducement, estoppel or otherwise. Any license |
| * under such intellectual property rights must be express and |
| * approved by Intel in writing. |
| */ |
| |
| #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_ */ |