Home | History | Annotate | Download | only in cherrytrail
      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