blob: 18f487d8c35d5b8b5fbb648c80f329989a8f30ce [file] [log] [blame]
/* 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_ */