00001 #include "mpeg3private.h"
00002 #include "mpeg3protos.h"
00003 #include "vlc.h"
00004
00005 #include <stdio.h>
00006
00007 int mpeg3video_get_macroblock_address(mpeg3_slice_t *slice)
00008 {
00009 int code, val = 0;
00010 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00011
00012 while((code = mpeg3slice_showbits(slice_buffer, 11)) < 24)
00013 {
00014
00015 if(code != 15)
00016 {
00017
00018 if(code == 8)
00019 {
00020 val += 33;
00021 }
00022 else
00023 {
00024
00025 slice->fault = 1;
00026 return 1;
00027 }
00028 }
00029
00030 mpeg3slice_flushbits(slice_buffer, 11);
00031 }
00032
00033 if(code >= 1024)
00034 {
00035 mpeg3slice_flushbit(slice_buffer);
00036 return val + 1;
00037 }
00038
00039 if(code >= 128)
00040 {
00041 code >>= 6;
00042 mpeg3slice_flushbits(slice_buffer, mpeg3_MBAtab1[code].len);
00043 return val + mpeg3_MBAtab1[code].val;
00044 }
00045
00046 code -= 24;
00047 mpeg3slice_flushbits(slice_buffer, mpeg3_MBAtab2[code].len);
00048
00049 return val + mpeg3_MBAtab2[code].val;
00050 }
00051
00052
00053
00054 static inline int mpeg3video_getsp_imb_type(mpeg3_slice_t *slice)
00055 {
00056 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00057 unsigned int code = mpeg3slice_showbits(slice_buffer, 4);
00058 if(!code)
00059 {
00060
00061 slice->fault = 1;
00062 return 0;
00063 }
00064
00065 mpeg3slice_flushbits(slice_buffer, mpeg3_spIMBtab[code].len);
00066 return mpeg3_spIMBtab[code].val;
00067 }
00068
00069 static inline int mpeg3video_getsp_pmb_type(mpeg3_slice_t *slice)
00070 {
00071 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00072 int code = mpeg3slice_showbits(slice_buffer, 7);
00073 if(code < 2)
00074 {
00075
00076 slice->fault = 1;
00077 return 0;
00078 }
00079
00080 if(code >= 16)
00081 {
00082 code >>= 3;
00083 mpeg3slice_flushbits(slice_buffer, mpeg3_spPMBtab0[code].len);
00084
00085 return mpeg3_spPMBtab0[code].val;
00086 }
00087
00088 mpeg3slice_flushbits(slice_buffer, mpeg3_spPMBtab1[code].len);
00089 return mpeg3_spPMBtab1[code].val;
00090 }
00091
00092 static inline int mpeg3video_getsp_bmb_type(mpeg3_slice_t *slice)
00093 {
00094 mpeg3_VLCtab_t *p;
00095 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00096 int code = mpeg3slice_showbits9(slice_buffer);
00097
00098 if(code >= 64)
00099 p = &mpeg3_spBMBtab0[(code >> 5) - 2];
00100 else
00101 if(code >= 16)
00102 p = &mpeg3_spBMBtab1[(code >> 2) - 4];
00103 else
00104 if(code >= 8)
00105 p = &mpeg3_spBMBtab2[code - 8];
00106 else
00107 {
00108
00109 slice->fault = 1;
00110 return 0;
00111 }
00112
00113 mpeg3slice_flushbits(slice_buffer, p->len);
00114 return p->val;
00115 }
00116
00117 static inline int mpeg3video_get_imb_type(mpeg3_slice_t *slice)
00118 {
00119 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00120 if(mpeg3slice_getbit(slice_buffer))
00121 {
00122 return 1;
00123 }
00124
00125 if(!mpeg3slice_getbit(slice_buffer))
00126 {
00127
00128 slice->fault = 1;
00129 }
00130
00131 return 17;
00132 }
00133
00134 static inline int mpeg3video_get_pmb_type(mpeg3_slice_t *slice)
00135 {
00136 int code;
00137 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00138
00139 if((code = mpeg3slice_showbits(slice_buffer, 6)) >= 8)
00140 {
00141 code >>= 3;
00142 mpeg3slice_flushbits(slice_buffer, mpeg3_PMBtab0[code].len);
00143 return mpeg3_PMBtab0[code].val;
00144 }
00145
00146 if(code == 0)
00147 {
00148
00149 slice->fault = 1;
00150 return 0;
00151 }
00152
00153 mpeg3slice_flushbits(slice_buffer, mpeg3_PMBtab1[code].len);
00154 return mpeg3_PMBtab1[code].val;
00155 }
00156
00157 static inline int mpeg3video_get_bmb_type(mpeg3_slice_t *slice)
00158 {
00159 int code;
00160 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00161
00162 if((code = mpeg3slice_showbits(slice_buffer, 6)) >= 8)
00163 {
00164 code >>= 2;
00165 mpeg3slice_flushbits(slice_buffer, mpeg3_BMBtab0[code].len);
00166 return mpeg3_BMBtab0[code].val;
00167 }
00168
00169 if(code == 0)
00170 {
00171
00172 slice->fault = 1;
00173 return 0;
00174 }
00175
00176 mpeg3slice_flushbits(slice_buffer, mpeg3_BMBtab1[code].len);
00177
00178 return mpeg3_BMBtab1[code].val;
00179 }
00180
00181 static inline int mpeg3video_get_dmb_type(mpeg3_slice_t *slice)
00182 {
00183 if(!mpeg3slice_getbit(slice->slice_buffer))
00184 {
00185
00186 slice->fault=1;
00187 }
00188
00189 return 1;
00190 }
00191
00192
00193 static inline int mpeg3video_get_snrmb_type(mpeg3_slice_t *slice)
00194 {
00195 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00196 int code = mpeg3slice_showbits(slice_buffer, 3);
00197
00198 if(code == 0)
00199 {
00200
00201 slice->fault = 1;
00202 return 0;
00203 }
00204
00205 mpeg3slice_flushbits(slice_buffer, mpeg3_SNRMBtab[code].len);
00206 return mpeg3_SNRMBtab[code].val;
00207 }
00208
00209 int mpeg3video_get_mb_type(mpeg3_slice_t *slice, mpeg3video_t *video)
00210 {
00211 if(video->scalable_mode == SC_SNR)
00212 {
00213 return mpeg3video_get_snrmb_type(slice);
00214 }
00215 else
00216 {
00217 switch(video->pict_type)
00218 {
00219 case I_TYPE: return video->pict_scal ? mpeg3video_getsp_imb_type(slice) : mpeg3video_get_imb_type(slice);
00220 case P_TYPE: return video->pict_scal ? mpeg3video_getsp_pmb_type(slice) : mpeg3video_get_pmb_type(slice);
00221 case B_TYPE: return video->pict_scal ? mpeg3video_getsp_bmb_type(slice) : mpeg3video_get_bmb_type(slice);
00222 case D_TYPE: return mpeg3video_get_dmb_type(slice);
00223 default:
00224
00225 break;
00226
00227 }
00228 }
00229
00230 return 0;
00231 }
00232
00233 int mpeg3video_macroblock_modes(mpeg3_slice_t *slice,
00234 mpeg3video_t *video,
00235 int *pmb_type,
00236 int *pstwtype,
00237 int *pstwclass,
00238 int *pmotion_type,
00239 int *pmv_count,
00240 int *pmv_format,
00241 int *pdmv,
00242 int *pmvscale,
00243 int *pdct_type)
00244 {
00245 int mb_type;
00246 int stwtype, stwcode, stwclass;
00247 int motion_type = 0, mv_count, mv_format, dmv, mvscale;
00248 int dct_type;
00249 mpeg3_slice_buffer_t *slice_buffer = slice->slice_buffer;
00250 static unsigned char stwc_table[3][4]
00251 = { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
00252 static unsigned char stwclass_table[9]
00253 = {0, 1, 2, 1, 1, 2, 3, 3, 4};
00254
00255
00256 mb_type = mpeg3video_get_mb_type(slice, video);
00257
00258 if(slice->fault) return 1;
00259
00260
00261 if(mb_type & MB_WEIGHT)
00262 {
00263 if(video->stwc_table_index == 0)
00264 stwtype = 4;
00265 else
00266 {
00267 stwcode = mpeg3slice_getbits2(slice_buffer);
00268 stwtype = stwc_table[video->stwc_table_index - 1][stwcode];
00269 }
00270 }
00271 else
00272 stwtype = (mb_type & MB_CLASS4) ? 8 : 0;
00273
00274
00275 stwclass = stwclass_table[stwtype];
00276
00277
00278 if(mb_type & (MB_FORWARD | MB_BACKWARD))
00279 {
00280 if(video->pict_struct == FRAME_PICTURE)
00281 {
00282
00283 motion_type = video->frame_pred_dct ? MC_FRAME : mpeg3slice_getbits2(slice_buffer);
00284 }
00285 else
00286 {
00287
00288 motion_type = mpeg3slice_getbits2(slice_buffer);
00289 }
00290 }
00291 else
00292 if((mb_type & MB_INTRA) && video->conceal_mv)
00293 {
00294
00295 motion_type = (video->pict_struct == FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
00296 }
00297
00298
00299 if(video->pict_struct == FRAME_PICTURE)
00300 {
00301 mv_count = (motion_type == MC_FIELD && stwclass < 2) ? 2 : 1;
00302 mv_format = (motion_type == MC_FRAME) ? MV_FRAME : MV_FIELD;
00303 }
00304 else
00305 {
00306 mv_count = (motion_type == MC_16X8) ? 2 : 1;
00307 mv_format = MV_FIELD;
00308 }
00309
00310 dmv = (motion_type == MC_DMV);
00311
00312
00313 mvscale = ((mv_format == MV_FIELD) && (video->pict_struct == FRAME_PICTURE));
00314
00315
00316 dct_type = (video->pict_struct == FRAME_PICTURE) &&
00317 (!video->frame_pred_dct) &&
00318 (mb_type & (MB_PATTERN | MB_INTRA)) ?
00319 mpeg3slice_getbit(slice_buffer) : 0;
00320
00321
00322 *pmb_type = mb_type;
00323 *pstwtype = stwtype;
00324 *pstwclass = stwclass;
00325 *pmotion_type = motion_type;
00326 *pmv_count = mv_count;
00327 *pmv_format = mv_format;
00328 *pdmv = dmv;
00329 *pmvscale = mvscale;
00330 *pdct_type = dct_type;
00331 return 0;
00332 }