1 /* 2 * Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 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 #ifndef SEC_VIDEO_PARSER_H_ 18 #define SEC_VIDEO_PARSER_H_ 19 20 #include <stdint.h> 21 22 /* H264 start code values */ 23 typedef enum _h264_nal_unit_type 24 { 25 h264_NAL_UNIT_TYPE_unspecified = 0, 26 h264_NAL_UNIT_TYPE_SLICE, 27 h264_NAL_UNIT_TYPE_DPA, 28 h264_NAL_UNIT_TYPE_DPB, 29 h264_NAL_UNIT_TYPE_DPC, 30 h264_NAL_UNIT_TYPE_IDR, 31 h264_NAL_UNIT_TYPE_SEI, 32 h264_NAL_UNIT_TYPE_SPS, 33 h264_NAL_UNIT_TYPE_PPS, 34 h264_NAL_UNIT_TYPE_Acc_unit_delimiter, 35 h264_NAL_UNIT_TYPE_EOSeq, 36 h264_NAL_UNIT_TYPE_EOstream, 37 h264_NAL_UNIT_TYPE_filler_data, 38 h264_NAL_UNIT_TYPE_SPS_extension, 39 h264_NAL_UNIT_TYPE_ACP = 19, 40 h264_NAL_UNIT_TYPE_Slice_extension = 20 41 } h264_nal_unit_type_t; 42 43 #define MAX_OP 16 44 45 enum dec_ref_pic_marking_flags { 46 IDR_PIC_FLAG = 0, 47 NO_OUTPUT_OF_PRIOR_PICS_FLAG, 48 LONG_TERM_REFERENCE_FLAG, 49 ADAPTIVE_REF_PIC_MARKING_MODE_FLAG 50 }; 51 52 typedef struct _dec_ref_pic_marking_t { 53 union { 54 uint8_t flags; 55 struct { 56 uint8_t idr_pic_flag:1; 57 uint8_t no_output_of_prior_pics_flag:1; 58 uint8_t long_term_reference_flag:1; 59 uint8_t adaptive_ref_pic_marking_mode_flag:1; 60 }; 61 }; 62 struct { 63 uint8_t memory_management_control_operation; 64 union { 65 struct { 66 uint8_t difference_of_pic_nums_minus1; 67 } op1; 68 struct { 69 uint8_t long_term_pic_num; 70 } op2; 71 struct { 72 uint8_t difference_of_pic_nums_minus1; 73 uint8_t long_term_frame_idx; 74 } op3; 75 struct { 76 uint8_t max_long_term_frame_idx_plus1; 77 } op4; 78 struct { 79 uint8_t long_term_frame_idx; 80 } op6; 81 }; 82 } op[MAX_OP]; 83 } dec_ref_pic_marking_t; 84 85 enum slice_header_flags { 86 FIELD_PIC_FLAG = 0, 87 BOTTOM_FIELD_FLAG 88 }; 89 90 typedef struct _slice_header_t { 91 uint8_t nal_unit_type; 92 uint8_t pps_id; 93 uint8_t padding; // TODO: padding needed because flags in secfw impl. is a big-endian uint16_t 94 union { 95 uint8_t flags; 96 struct { 97 uint8_t field_pic_flag:1; 98 uint8_t bottom_field_flag:1; 99 }; 100 }; 101 uint32_t first_mb_in_slice; 102 uint32_t frame_num; 103 uint16_t idr_pic_id; 104 uint16_t pic_order_cnt_lsb; 105 int32_t delta_pic_order_cnt[2]; 106 int32_t delta_pic_order_cnt_bottom; 107 } slice_header_t; 108 109 typedef struct { 110 uint8_t type; 111 uint32_t offset; 112 uint8_t* data; 113 uint32_t length; 114 slice_header_t* slice_header; 115 } nalu_info_t; 116 117 typedef struct { 118 uint32_t iv[4]; 119 uint32_t mode; 120 uint32_t app_id; 121 } pavp_info_t; 122 123 #define MAX_NUM_NALUS 20 124 125 typedef struct { 126 uint8_t* data; 127 uint32_t length; 128 pavp_info_t* pavp; 129 dec_ref_pic_marking_t* dec_ref_pic_marking; 130 uint32_t num_nalus; 131 nalu_info_t nalus[MAX_NUM_NALUS]; 132 } frame_info_t; 133 134 int parser_init(void); 135 int parse_frame(uint8_t* frame, uint32_t frame_size, uint8_t* nalu_data, uint32_t* nalu_data_size); 136 137 // DEBUG PRINTING 138 void print_slice_header(slice_header_t* slice_header); 139 void print_dec_ref_pic_marking(dec_ref_pic_marking_t* dec_ref_pic_marking); 140 void print_data_bytes(uint8_t* data, uint32_t count); 141 void print_nalu_data(uint8_t* nalu_data, uint32_t nalu_data_size); 142 143 // BYTESWAPPING 144 uint16_t byteswap_16(uint16_t word); 145 uint32_t byteswap_32(uint32_t dword); 146 void byteswap_slice_header(slice_header_t* slice_header); 147 void byteswap_dec_ref_pic_marking(dec_ref_pic_marking_t* dec_ref_pic_marking); 148 void byteswap_nalu_data(uint8_t* nalu_data, uint32_t nalu_data_size); 149 150 #endif /* SEC_VIDEO_PARSER_H_ */ 151