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