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