Home | History | Annotate | Download | only in include
      1 #ifndef _VIDDEC_MPEG2_H
      2 #define _VIDDEC_MPEG2_H
      3 
      4 /**
      5  * viddec_mpeg2.h
      6  * --------------
      7  * This header file contains all the necessary state information and function
      8  * prototypes for the MPEG2 parser. This header also defines the debug macros
      9  * used by the MPEG2 parser to emit debug messages in host mode.
     10  */
     11 
     12 #include "viddec_fw_debug.h"
     13 #include "viddec_parser_ops.h"
     14 #include "mpeg2.h"
     15 
     16 /* Debug Print Macros */
     17 #define MPEG2_DEB(x...)        DEB("MPEG2_Parser: "x)
     18 #define MPEG2_FA_DEB(x...)     DEB("MPEG2_Frame_attribute: "x)
     19 
     20 /* Bit masks */
     21 #define MPEG2_BIT_MASK_11      0x7ff /* Used for masking Height and Width */
     22 #define MPEG2_BIT_MASK_8       0xff  /* Used fro masking start code byte */
     23 #define MPEG2_BIT_MASK_4       0xf   /* Used for masking Level */
     24 #define MPEG2_BIT_MASK_3       0x7   /* Used for masking Profile */
     25 
     26 /* MPEG2 Start code and prefix size */
     27 #define MPEG2_SC_AND_PREFIX_SIZE 32
     28 
     29 /* Number of DMEM Workload Items */
     30 #define MPEG2_NUM_DMEM_WL_ITEMS 2
     31 
     32 /* Number of Quantization Matrix Workload Items */
     33 #define MPEG2_NUM_QMAT_WL_ITEMS 32
     34 
     35 /* Maximum supported content size */
     36 #define MPEG2_MAX_CONTENT_WIDTH  2048
     37 #define MPEG2_MAX_CONTENT_HEIGHT 2048
     38 
     39 /* Others */
     40 #define MPEG2_BITS_EIGHT        8
     41 
     42 
     43 /* MPEG2 Stream Levels */
     44 typedef enum {
     45     MPEG2_LEVEL_SEQ = 0,
     46     MPEG2_LEVEL_GOP,
     47     MPEG2_LEVEL_PIC
     48 } mpeg2_stream_levels;
     49 
     50 /* MPEG2 Headers and Extensions */
     51 typedef enum {
     52     MPEG2_HEADER_NONE           = 0,
     53     MPEG2_HEADER_SEQ            = 1 << 0,
     54     MPEG2_HEADER_SEQ_EXT        = 1 << 1,
     55     MPEG2_HEADER_SEQ_DISP_EXT   = 1 << 2,
     56     MPEG2_HEADER_GOP            = 1 << 3,
     57     MPEG2_HEADER_PIC            = 1 << 4,
     58     MPEG2_HEADER_PIC_COD_EXT    = 1 << 5,
     59     MPEG2_HEADER_PIC_DISP_EXT   = 1 << 6,
     60     MPEG2_HEADER_SEQ_SCAL_EXT   = 1 << 7
     61 } mpeg2_headers;
     62 
     63 /* MPEG2 Parser Status Codes */
     64 typedef enum {
     65     MPEG2_SUCCESS            = 0, /* No error */
     66     MPEG2_FRAME_COMPLETE     = 1, /* Frame parsing complete found */
     67     MPEG2_PARSE_ERROR        = 2, /* Failure in parsing */
     68 } mpeg2_status;
     69 
     70 /* MPEG2 Current Workload Status Codes */
     71 typedef enum {
     72     MPEG2_WL_EMPTY          = 0,
     73     MPEG2_WL_DMEM_DATA      = (1 << 0),
     74     MPEG2_WL_REF_INFO       = (1 << 1),
     75     MPEG2_WL_PARTIAL_SLICE  = (1 << 2),
     76     MPEG2_WL_DANGLING_FIELD = (1 << 3),
     77     MPEG2_WL_COMPLETE       = (1 << 4),
     78     MPEG2_WL_MISSING_TF     = (1 << 5),
     79     MPEG2_WL_MISSING_BF     = (1 << 6),
     80     MPEG2_WL_UNSUPPORTED    = (1 << 7),
     81     /* Error codes */
     82     MPEG2_WL_CORRUPTED_SEQ_HDR      = (1 << 8),
     83     MPEG2_WL_CORRUPTED_SEQ_EXT      = (1 << 9),
     84     MPEG2_WL_CORRUPTED_SEQ_DISP_EXT = (1 << 10),
     85     MPEG2_WL_CORRUPTED_GOP_HDR      = (1 << 11),
     86     MPEG2_WL_CORRUPTED_PIC_HDR      = (1 << 12),
     87     MPEG2_WL_CORRUPTED_PIC_COD_EXT  = (1 << 13),
     88     MPEG2_WL_CORRUPTED_PIC_DISP_EXT = (1 << 14),
     89     MPEG2_WL_CORRUPTED_QMAT_EXT     = (1 << 15),
     90     /* Error concealment codes */
     91     MPEG2_WL_CONCEALED_PIC_COD_TYPE = (1 << 16),
     92     MPEG2_WL_CONCEALED_PIC_STRUCT   = (1 << 17),
     93     MPEG2_WL_CONCEALED_CHROMA_FMT   = (1 << 18),
     94     /* Type of dangling field */
     95     MPEG2_WL_DANGLING_FIELD_TOP     = (1 << 24),
     96     MPEG2_WL_DANGLING_FIELD_BOTTOM  = (1 << 25),
     97     MPEG2_WL_REPEAT_FIELD           = (1 << 26),
     98 } mpeg2_wl_status_codes;
     99 
    100 /* MPEG2 Parser Workload types */
    101 typedef enum
    102 {
    103     /* MPEG2 Decoder Specific data */
    104     VIDDEC_WORKLOAD_MPEG2_DMEM = VIDDEC_WORKLOAD_DECODER_SPECIFIC,
    105 
    106     /* MPEG2 Quantization Matrix data */
    107     VIDDEC_WORKLOAD_MPEG2_QMAT,
    108 
    109     /* Past reference frame */
    110     VIDDEC_WORKLOAD_MPEG2_REF_PAST = VIDDEC_WORKLOAD_REF_FRAME_SOURCE_0,
    111 
    112     /* Future reference frame */
    113     VIDDEC_WORKLOAD_MPEG2_REF_FUTURE,
    114 
    115     /* Use current frame as reference */
    116     VIDDEC_WORKLOAD_MPEG2_REF_CURRENT_FRAME,
    117 
    118     /* User Data */
    119     VIDDEC_WORKLOAD_MPEG2_USERDATA = VIDDEC_WORKLOAD_USERDATA
    120 } viddec_mpeg2_workloads;
    121 
    122 /* MPEG2 Decoder Specific Workitems */
    123 struct mpeg2_workitems
    124 {
    125     /* Core Sequence Info 1 */
    126     uint32_t csi1;
    127 
    128     /* Core Sequence Info 2 */
    129     uint32_t csi2;
    130 
    131     /* Core Picture Info 1 */
    132     uint32_t cpi1;
    133 
    134     /* Core Picture Coding Extension Info 1 */
    135     uint32_t cpce1;
    136 
    137     /* Quantization Matrices */
    138     /*  0-15: Intra Quantization Matrix */
    139     /* 16-31: Non-Intra Quantization Matrix */
    140     /* 32-47: Chroma Intra Quantization Matrix */
    141     /* 48-63: Chroma Non-Intra Quantization Matrix */
    142     uint32_t qmat[MPEG2_QUANT_MAT_SIZE];
    143 };
    144 
    145 /* MPEG2 Video Parser Context */
    146 struct viddec_mpeg2_parser
    147 {
    148     /* MPEG2 Metadata Structure */
    149     struct mpeg2_info info;
    150 
    151     /* MPEG2 Workitems */
    152     struct mpeg2_workitems wi;
    153 
    154     /* Workload Status */
    155     uint32_t  mpeg2_wl_status;
    156 
    157     /* Last parsed start code */
    158     int32_t   mpeg2_last_parsed_sc;
    159 
    160     /* Last parsed slice start code. Used to start emitting workload items. */
    161     int32_t   mpeg2_last_parsed_slice_sc;
    162 
    163     /* Current sequence headers parsed */
    164     uint8_t   mpeg2_curr_seq_headers;
    165 
    166     /* Current frame headers parsed */
    167     uint8_t   mpeg2_curr_frame_headers;
    168 
    169     /* Flag to indicate a valid sequence header was successfully parsed for */
    170     /* the current stream. */
    171     uint8_t   mpeg2_valid_seq_hdr_parsed;
    172 
    173     /* Flag to indicate if quantization matrices are updated */
    174     uint8_t   mpeg2_custom_qmat_parsed;
    175 
    176     /* Flag to indicate if reference table is updated with an entry */
    177     uint8_t   mpeg2_ref_table_updated;
    178 
    179     /* Flag to indicate if the stream is MPEG2 */
    180     uint8_t   mpeg2_stream;
    181 
    182     /* Flag to indicate if the previous picture metadata is parsed */
    183     uint8_t   mpeg2_pic_metadata_complete;
    184 
    185     /* Number of active pan scan offsets */
    186     uint8_t   mpeg2_num_pan_scan_offsets;
    187 
    188     /* Indicates the current stream level (Sequence/GOP/Picture) */
    189     /* Used for identifying the level for User Data */
    190     uint8_t   mpeg2_stream_level;
    191 
    192     /* Flag to indicate if the current picture is interlaced or not */
    193     uint8_t   mpeg2_picture_interlaced;
    194 
    195     /* Flag to indicate if the current field for interlaced picture is first */
    196     /* field or not. This flag is used only when mpeg2_picture_interlaced is */
    197     /* set to 1. */
    198     uint8_t   mpeg2_first_field;
    199 
    200     /* Flag to indicate if the current parsed data has start of a frame */
    201     uint8_t   mpeg2_frame_start;
    202 
    203     /* Temporal reference of the previous picture - Used to detect dangling fields */
    204     uint32_t  mpeg2_prev_temp_ref;
    205 
    206     /* Previous picture structure - Used to identify the type of missing field */
    207     uint8_t   mpeg2_prev_picture_structure;
    208 
    209     /* Flag to decide whether to use the current or next workload to dump workitems */
    210     uint8_t   mpeg2_use_next_workload;
    211     uint8_t   mpeg2_first_slice_flag;
    212 };
    213 
    214 /* External Function Declarations */
    215 extern void *memset(void *s, int32_t c, uint32_t n);
    216 
    217 /* MPEG2 Parser Function Prototypes */
    218 void     viddec_mpeg2_translate_attr            (void *parent, void *ctxt);
    219 void     viddec_mpeg2_emit_workload             (void *parent, void *ctxt);
    220 void     viddec_mpeg2_parse_seq_hdr             (void *parent, void *ctxt);
    221 void     viddec_mpeg2_parse_gop_hdr             (void *parent, void *ctxt);
    222 void     viddec_mpeg2_parse_pic_hdr             (void *parent, void *ctxt);
    223 void     viddec_mpeg2_parse_and_append_user_data(void *parent, void *ctxt);
    224 void     viddec_mpeg2_parse_and_append_slice_data(void *parent, void *ctxt);
    225 void     viddec_mpeg2_parse_ext                 (void *parent, void *ctxt);
    226 
    227 /* MPEG2 wrapper functions for workload operations */
    228 void    viddec_mpeg2_append_workitem        (void *parent, viddec_workload_item_t *wi, uint8_t flag);
    229 void    viddec_mpeg2_append_pixeldata       (void *parent, uint8_t flag);
    230 viddec_workload_t*  viddec_mpeg2_get_header (void *parent, uint8_t flag);
    231 #endif
    232