1 /* ///////////////////////////////////////////////////////////////////////
2 //
3 //               INTEL CORPORATION PROPRIETARY INFORMATION
4 //  This software is supplied under the terms of a license agreement or
5 //  nondisclosure agreement with Intel Corporation and may not be copied
6 //  or disclosed except in accordance with the terms of that agreement.
7 //        Copyright (c) 2001-2006 Intel Corporation. All Rights Reserved.
8 //
9 //  Description:    VC1 header.
10 //
11 */
12 
13 #ifndef _VC1_H_
14 #define _VC1_H_
15 
16 #ifdef MFD_FIRMWARE
17    typedef unsigned int size_t;
18    #define LOG(...)
19 #else
20    #include <stdio.h>
21    #include <unistd.h>
22    #include <stdint.h>
23    enum {
24       NONE = 0,
25       CRITICAL,
26       WARNING,
27       INFO,
28       DEBUG,
29    } log_level;
30 
31    #define vc1_log_level DEBUG
32 
33    #define LOG( log_lev, format, args ... ) \
34       if (vc1_log_level >= log_lev) { OS_INFO("%s[%d]:: " format "\n", __FUNCTION__ , __LINE__ ,  ## args ); }
35 #endif
36 
37 #include "viddec_fw_workload.h"
38 #include "vc1parse_common_defs.h"
39 #include "vc1common.h"
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44 
45 #define LOG_CRIT(format, args ... )  LOG( CRITICAL, format, ## args)
46 #define LOG_WARN(format, args ... )  LOG( WARNING,  format, ## args)
47 #define LOG_INFO(format, args ... )  LOG( INFO,     format, ## args)
48 #define LOG_DEBUG(format, args ... ) LOG( DEBUG,    format, ## args)
49 
50 // Seems to be hardware bug: DO NOT TRY TO SWAP BITPLANE0 and BITPLANE2
51 // Block Control Register at offset 222C uses Bitplane_raw_ID0 to indicate directmb/fieldtx while
52 // and Bitplane_raw_ID2 for acpred/mvtypemb/forwardmb
53 // but when we send bitplane index 0 for directmb/fieldtx and bitplane index 2 for acpred/mvtypemb/forwardmb
54 // md5 mismatches are seen
55 typedef enum
56 {
57    BPP_FORWARDMB  =  VIDDEC_WORKLOAD_VC1_BITPLANE0,
58    BPP_ACPRED     =  VIDDEC_WORKLOAD_VC1_BITPLANE0,
59    BPP_MVTYPEMB   =  VIDDEC_WORKLOAD_VC1_BITPLANE0,
60    BPP_OVERFLAGS  =  VIDDEC_WORKLOAD_VC1_BITPLANE1,
61    BPP_SKIPMB     =  VIDDEC_WORKLOAD_VC1_BITPLANE1,
62    BPP_DIRECTMB   =  VIDDEC_WORKLOAD_VC1_BITPLANE2,
63    BPP_FIELDTX    =  VIDDEC_WORKLOAD_VC1_BITPLANE2,
64 } vc1_bpp_type_t;
65 
66 /* status codes */
67 typedef enum {
68    VC1_STATUS_EOF          =  1,   // end of file
69    VC1_STATUS_OK           =  0,   // no error
70    VC1_STATUS_NO_MEM       =  2,   // out of memory
71    VC1_STATUS_FILE_ERROR   =  2,   // file error
72    VC1_STATUS_NOTSUPPORT   =  2,   // not supported mode
73    VC1_STATUS_PARSE_ERROR  =  2,   // fail in parse MPEG-4 stream
74    VC1_STATUS_ERROR        =  2    // unknown/unspecified error
75 } vc1_Status;
76 
77 /* VC1 start code values */
78 typedef enum {
79    vc1_Forbidden           = 0x80,/*0x80-0xFF*/
80    vc1_Reserved1           = 0x09,/*0x00-0x09*/
81    vc1_Reserved2           = 0x10,
82    vc1_Reserved3           = 0x1A,
83    vc1_Reserved4           = 0x20,/*0x20-0x7F*/
84    vc1_SCEndOfSequence     = 0x0A,
85    vc1_SCSlice             = 0x0B,
86    vc1_SCField             = 0x0C,
87    vc1_SCFrameHeader       = 0x0D,
88    vc1_SCEntryPointHeader  = 0x0E,
89    vc1_SCSequenceHeader    = 0x0F,
90    vc1_SCSliceUser         = 0x1B,
91    vc1_SCFieldUser         = 0x1C,
92    vc1_SCFrameUser         = 0x1D,
93    vc1_SCEntryPointUser    = 0x1E,
94    vc1_SCSequenceUser      = 0x1F
95 } vc1_sc;
96 
97 #if 0
98 typedef enum
99 {
100    vc1_ProfileSimple = 0,  /** Simple profile */
101    vc1_ProfileMain,        /** Main profile */
102    vc1_ProfileReserved,    /** Reserved */
103    vc1_ProfileAdvanced     /** Advanced profile */
104 } vc1_Profile;
105 #endif
106 
107 typedef enum
108 {
109    vc1_PtypeI  = 1,
110    vc1_PtypeP  = 2,
111    vc1_PtypeB  = 4,
112    vc1_PtypeBI = 5,
113    vc1_PtypeSkipped = 8|2,
114 } vc1_ptype;
115 
116 typedef enum
117 {
118    vc1_PtypeII = 0,
119    vc1_PtypeIP = 1,
120    vc1_PtypePI = 2,
121    vc1_PtypePP = 3,
122    vc1_PtypeBB = 4,
123    vc1_PtypeBBI = 5,
124    vc1_PtypeBIB = 6,
125    vc1_PtypeBIBI = 7
126 } vc1_fptype;
127 
128 typedef enum
129 {
130    vc1_Imode_Raw  = 0,         //0x0000
131    vc1_Imode_Norm2,        //0x10
132    vc1_Imode_Diff2,        //0x001
133    vc1_Imode_Norm6,        //0x11
134    vc1_Imode_Diff6,        //0x0001
135    vc1_Imode_Rowskip,      //0x010
136    vc1_Imode_Colskip,      //0x011
137 } vc1_Imode;
138 
139 /* calculation of MAX_BITPLANE_SZ 2048/16x1088/16 pel= 128x68 bit used for bitplane
140  * as rows are packed in DWORDS
141  * we have (128)/32 * 68 Dwords needed for bitplane storage
142  */
143 #define MAX_BITPLANE_SZ 272
144 
145 /* Full Info */
146 typedef struct {
147    unsigned char*       bufptr;         /* current frame, point to header or data */
148    int                  bitoff;         /* mostly point to next frame header or PSC */
149    int                  picture_info_has_changed;
150    vc1_metadata_t       metadata;
151    vc1_PictureLayerHeader picLayerHeader;
152    uint32_t             bitplane[MAX_BITPLANE_SZ];
153 } vc1_Info;
154 
155 #ifdef __cplusplus
156 }
157 #endif
158 
159 enum {
160    VC1_REF_FRAME_T_MINUS_1 = 0,
161    VC1_REF_FRAME_T_MINUS_2,
162    VC1_REF_FRAME_T_MINUS_0,
163    VC1_NUM_REFERENCE_FRAMES,
164 };
165 
166 enum vc1_sc_seen_flags
167 {
168     VC1_SC_INVALID = 0 << 0,
169     VC1_SC_SEQ     = 1 << 0,
170     VC1_SC_EP      = 1 << 1,
171     VC1_SC_FRM     = 1 << 2,
172     VC1_SC_FLD     = 1 << 3,
173     VC1_SC_SLC     = 1 << 4,
174     VC1_SC_UD      = 1 << 5,
175 };
176 #define VC1_SEQ_MASK VC1_SC_SEQ
177 #define VC1_EP_MASK VC1_SC_SEQ | VC1_SC_EP
178 #define VC1_FRM_MASK VC1_SC_SEQ | VC1_SC_EP | VC1_SC_FRM
179 #define VC1_FLD_MASK VC1_SC_SEQ | VC1_SC_EP | VC1_SC_FRM | VC1_SC_FLD
180 
181 typedef struct {
182    int id;
183    uint32_t intcomp_top;
184    uint32_t intcomp_bot;
185    int fcm;         /* frame coding mode */
186    int type;
187    int anchor[2];   /* one per field */
188    int rr_en;       /* range reduction enable flag at sequence layer */
189    int rr_frm;      /* range reduction flag at picture layer */
190 } ref_frame_t;
191 
192 typedef struct
193 {
194     uint32_t      sc_seen_since_last_wkld;
195     uint32_t      sc_seen;
196     uint32_t      is_frame_start;
197 	uint8_t is_reference_picture;
198     uint32_t      intcomp_last[4]; /* for B frames */
199     uint32_t      intcomp_top[2];
200     uint32_t      intcomp_bot[2];
201     vc1_Info      info;
202     VC1D_SPR_REGS spr;
203     ref_frame_t   ref_frame[VC1_NUM_REFERENCE_FRAMES];
204 #ifdef VBP
205     /* A storage area is provided for each type of bit plane.  Only one of */
206     /* each type will ever be used for a picture and never more than three */
207     /* bit-planes per picture, and often only one is used.  We never clear */
208     /* this data and writes into it when we need to.  vc1parse_bitplane.c  */
209     /* makes use of these set them to one of the bitplane types included   */
210     /* in the picture header structure.  Those sturctures are set every    */
211     /* time a picture parse begins. */
212     uint32_t      bp_forwardmb[4096];
213     uint32_t      bp_acpred[4096];
214     uint32_t      bp_mvtypemb[4096];
215     uint32_t      bp_overflags[4096];
216     uint32_t      bp_skipmb[4096];
217     uint32_t      bp_directmb[4096];
218     uint32_t      bp_fieldtx[4096];
219     uint32_t	  start_code;
220 #endif
221 } vc1_viddec_parser_t;
222 
223 #endif  //_VC1_H_
224 
225