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