182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON/* 282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Licensed under the Apache License, Version 2.0 (the "License"); 582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* you may not use this file except in compliance with the License. 682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* You may obtain a copy of the License at 782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* http://www.apache.org/licenses/LICENSE-2.0 982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* 1082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Unless required by applicable law or agreed to in writing, software 1182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* distributed under the License is distributed on an "AS IS" BASIS, 1282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* See the License for the specific language governing permissions and 1482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* limitations under the License. 1582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*/ 1682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 1782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifndef SEC_VIDEO_PARSER_H_ 1882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#define SEC_VIDEO_PARSER_H_ 1982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <stdint.h> 2182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 2282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON/* H264 start code values */ 2382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONtypedef enum _h264_nal_unit_type 2482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON{ 2582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_unspecified = 0, 2682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_SLICE, 2782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_DPA, 2882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_DPB, 2982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_DPC, 3082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_IDR, 3182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_SEI, 3282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_SPS, 3382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_PPS, 3482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_Acc_unit_delimiter, 3582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_EOSeq, 3682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_EOstream, 3782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_filler_data, 3882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_SPS_extension, 3982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_ACP = 19, 4082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON h264_NAL_UNIT_TYPE_Slice_extension = 20 4182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} h264_nal_unit_type_t; 4282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#define MAX_OP 16 4482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 4582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONenum dec_ref_pic_marking_flags { 4682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON IDR_PIC_FLAG = 0, 4782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON NO_OUTPUT_OF_PRIOR_PICS_FLAG, 4882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON LONG_TERM_REFERENCE_FLAG, 4982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON ADAPTIVE_REF_PIC_MARKING_MODE_FLAG 5082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}; 5182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 5282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONtypedef struct _dec_ref_pic_marking_t { 5382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON union { 5482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t flags; 5582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 5682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t idr_pic_flag:1; 5782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t no_output_of_prior_pics_flag:1; 5882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t long_term_reference_flag:1; 5982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t adaptive_ref_pic_marking_mode_flag:1; 6082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }; 6182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }; 6282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 6382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t memory_management_control_operation; 6482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON union { 6582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 6682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t difference_of_pic_nums_minus1; 6782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } op1; 6882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 6982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t long_term_pic_num; 7082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } op2; 7182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 7282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t difference_of_pic_nums_minus1; 7382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t long_term_frame_idx; 7482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } op3; 7582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 7682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t max_long_term_frame_idx_plus1; 7782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } op4; 7882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 7982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t long_term_frame_idx; 8082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } op6; 8182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }; 8282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON } op[MAX_OP]; 8382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} dec_ref_pic_marking_t; 8482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 8582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONenum slice_header_flags { 8682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON FIELD_PIC_FLAG = 0, 8782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON BOTTOM_FIELD_FLAG 8882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON}; 8982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 9082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONtypedef struct _slice_header_t { 9182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t nal_unit_type; 9282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t pps_id; 9382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t padding; // TODO: padding needed because flags in secfw impl. is a big-endian uint16_t 9482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON union { 9582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t flags; 9682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON struct { 9782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t field_pic_flag:1; 9882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t bottom_field_flag:1; 9982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }; 10082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON }; 10182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t first_mb_in_slice; 10282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t frame_num; 10382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint16_t idr_pic_id; 10482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint16_t pic_order_cnt_lsb; 10582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int32_t delta_pic_order_cnt[2]; 10682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON int32_t delta_pic_order_cnt_bottom; 10782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} slice_header_t; 10882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 10982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONtypedef struct { 11082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t type; 11182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t offset; 11282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t* data; 11382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t length; 11482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON slice_header_t* slice_header; 11582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} nalu_info_t; 11682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 11782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONtypedef struct { 11882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t iv[4]; 11982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t mode; 12082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t app_id; 12182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} pavp_info_t; 12282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 12382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#define MAX_NUM_NALUS 20 12482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 12582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONtypedef struct { 12682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint8_t* data; 12782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t length; 12882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON pavp_info_t* pavp; 12982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON dec_ref_pic_marking_t* dec_ref_pic_marking; 13082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON uint32_t num_nalus; 13182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON nalu_info_t nalus[MAX_NUM_NALUS]; 13282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON} frame_info_t; 13382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 13482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONint parser_init(void); 13582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONint parse_frame(uint8_t* frame, uint32_t frame_size, uint8_t* nalu_data, uint32_t* nalu_data_size); 13682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 13782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON// DEBUG PRINTING 13882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid print_slice_header(slice_header_t* slice_header); 13982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid print_dec_ref_pic_marking(dec_ref_pic_marking_t* dec_ref_pic_marking); 14082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid print_data_bytes(uint8_t* data, uint32_t count); 14182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid print_nalu_data(uint8_t* nalu_data, uint32_t nalu_data_size); 14282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 14382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON// BYTESWAPPING 14482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONuint16_t byteswap_16(uint16_t word); 14582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONuint32_t byteswap_32(uint32_t dword); 14682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid byteswap_slice_header(slice_header_t* slice_header); 14782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid byteswap_dec_ref_pic_marking(dec_ref_pic_marking_t* dec_ref_pic_marking); 14882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONvoid byteswap_nalu_data(uint8_t* nalu_data, uint32_t nalu_data_size); 14982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON 15082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif /* SEC_VIDEO_PARSER_H_ */ 151