Mercurial > libavcodec.hg
annotate msmpeg4.c @ 5319:40af705cef7e libavcodec
AC-3 decoder, soc revision 69, Aug 31 07:12:56 2006 UTC by cloud9
Fix the bugs:
1. The quality of output because of incorrect windowing coefficients.
New code for window generation.
2. Dynrng values were reset where dynrng value is present in the first block,
but not in the subsequent block.
| author | jbr |
|---|---|
| date | Sat, 14 Jul 2007 16:03:14 +0000 |
| parents | 470601203f44 |
| children | f966fc154841 |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2 * MSMPEG4 backend for ffmpeg encoder and decoder | |
| 429 | 3 * Copyright (c) 2001 Fabrice Bellard. |
|
1739
07a484280a82
copyright year update of the files i touched and remembered, things look annoyingly unmaintained otherwise
michael
parents:
1651
diff
changeset
|
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
| 0 | 5 * |
| 5214 | 6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at> |
| 7 * | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3781
diff
changeset
|
8 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3781
diff
changeset
|
9 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3781
diff
changeset
|
10 * FFmpeg is free software; you can redistribute it and/or |
| 429 | 11 * modify it under the terms of the GNU Lesser General Public |
| 12 * License as published by the Free Software Foundation; either | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3781
diff
changeset
|
13 * version 2.1 of the License, or (at your option) any later version. |
| 0 | 14 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3781
diff
changeset
|
15 * FFmpeg is distributed in the hope that it will be useful, |
| 0 | 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 429 | 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 18 * Lesser General Public License for more details. | |
| 0 | 19 * |
| 429 | 20 * You should have received a copy of the GNU Lesser General Public |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3781
diff
changeset
|
21 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 0 | 23 */ |
| 1106 | 24 |
| 25 /** | |
| 26 * @file msmpeg4.c | |
| 27 * MSMPEG4 backend for ffmpeg encoder and decoder. | |
| 28 */ | |
| 29 | |
|
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
347
diff
changeset
|
30 #include "avcodec.h" |
| 0 | 31 #include "dsputil.h" |
| 32 #include "mpegvideo.h" | |
|
411
5c8b3a717929
workaround dc_scale bug in old ffmpeg msmpeg4v3 encoder (set workaround_bugs=1 for this)
michaelni
parents:
396
diff
changeset
|
33 |
| 0 | 34 /* |
| 2967 | 35 * You can also call this codec : MPEG4 with a twist ! |
| 0 | 36 * |
| 2967 | 37 * TODO: |
| 0 | 38 * - (encoding) select best mv table (two choices) |
| 2967 | 39 * - (encoding) select best vlc/dc table |
| 0 | 40 */ |
| 41 //#define DEBUG | |
| 42 | |
| 531 | 43 #define DC_VLC_BITS 9 |
| 44 #define CBPY_VLC_BITS 6 | |
| 45 #define INTER_INTRA_VLC_BITS 3 | |
| 46 #define V1_INTRA_CBPC_VLC_BITS 6 | |
| 47 #define V1_INTER_CBPC_VLC_BITS 6 | |
| 48 #define V2_INTRA_CBPC_VLC_BITS 3 | |
| 49 #define V2_MB_TYPE_VLC_BITS 7 | |
| 50 #define MV_VLC_BITS 9 | |
| 51 #define V2_MV_VLC_BITS 9 | |
| 52 #define TEX_VLC_BITS 9 | |
| 53 #define MB_NON_INTRA_VLC_BITS 9 | |
| 54 #define MB_INTRA_VLC_BITS 9 | |
| 55 | |
| 578 | 56 #define II_BITRATE 128*1024 |
| 57 #define MBAC_BITRATE 50*1024 | |
| 58 | |
| 936 | 59 #define DEFAULT_INTER_INDEX 3 |
| 60 | |
| 1064 | 61 static uint32_t v2_dc_lum_table[512][2]; |
| 62 static uint32_t v2_dc_chroma_table[512][2]; | |
| 307 | 63 |
| 5178 | 64 void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n); |
| 499 | 65 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
| 936 | 66 int n, int coded, const uint8_t *scantable); |
| 0 | 67 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr); |
| 2967 | 68 static int msmpeg4_decode_motion(MpegEncContext * s, |
| 0 | 69 int *mx_ptr, int *my_ptr); |
| 468 | 70 static void init_h263_dc_for_msmpeg4(void); |
| 519 | 71 static inline void msmpeg4_memsetw(short *tab, int val, int n); |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
72 #ifdef CONFIG_ENCODERS |
| 3777 | 73 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val); |
| 601 | 74 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra); |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
75 #endif //CONFIG_ENCODERS |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
76 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
77 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); |
| 936 | 78 static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); |
| 0 | 79 |
| 3359 | 80 /* vc1 externs */ |
| 2474 | 81 extern uint8_t wmv3_dc_scale_table[32]; |
| 601 | 82 |
| 0 | 83 #ifdef DEBUG |
| 84 int intra_count = 0; | |
| 85 int frame_count = 0; | |
| 86 #endif | |
| 87 | |
| 88 #include "msmpeg4data.h" | |
|
4964
9fb6d2125500
split msmpeg4 data to easily share some of it with vc1.c
aurel
parents:
4668
diff
changeset
|
89 #include "msmpeg4tab.h" |
| 0 | 90 |
| 5129 | 91 #ifdef CONFIG_ENCODERS //strangely gcc includes this even if it is not references |
| 1064 | 92 static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2]; |
| 1325 | 93 #endif //CONFIG_ENCODERS |
| 601 | 94 |
| 4668 | 95 static uint8_t static_rl_table_store[NB_RL_TABLES][2][2*MAX_RUN + MAX_LEVEL + 3]; |
| 96 | |
| 499 | 97 static void common_init(MpegEncContext * s) |
| 98 { | |
| 99 static int inited=0; | |
| 2967 | 100 |
| 499 | 101 switch(s->msmpeg4_version){ |
| 102 case 1: | |
| 103 case 2: | |
| 104 s->y_dc_scale_table= | |
| 105 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; | |
| 106 break; | |
| 107 case 3: | |
| 108 if(s->workaround_bugs){ | |
| 109 s->y_dc_scale_table= old_ff_y_dc_scale_table; | |
| 110 s->c_dc_scale_table= old_ff_c_dc_scale_table; | |
| 111 } else{ | |
| 112 s->y_dc_scale_table= ff_mpeg4_y_dc_scale_table; | |
| 113 s->c_dc_scale_table= ff_mpeg4_c_dc_scale_table; | |
| 114 } | |
| 115 break; | |
| 116 case 4: | |
| 936 | 117 case 5: |
| 499 | 118 s->y_dc_scale_table= wmv1_y_dc_scale_table; |
| 119 s->c_dc_scale_table= wmv1_c_dc_scale_table; | |
| 120 break; | |
| 3359 | 121 #if defined(CONFIG_WMV3_DECODER)||defined(CONFIG_VC1_DECODER) |
| 2474 | 122 case 6: |
| 123 s->y_dc_scale_table= wmv3_dc_scale_table; | |
| 124 s->c_dc_scale_table= wmv3_dc_scale_table; | |
| 125 break; | |
| 2639 | 126 #endif |
| 2474 | 127 |
| 499 | 128 } |
| 129 | |
| 2967 | 130 |
| 936 | 131 if(s->msmpeg4_version>=4){ |
| 1273 | 132 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , wmv1_scantable[1]); |
| 133 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, wmv1_scantable[2]); | |
| 134 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, wmv1_scantable[3]); | |
| 135 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , wmv1_scantable[0]); | |
| 499 | 136 } |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
601
diff
changeset
|
137 //Note the default tables are set in common_init in mpegvideo.c |
| 2967 | 138 |
| 499 | 139 if(!inited){ |
| 140 inited=1; | |
| 141 | |
| 142 init_h263_dc_for_msmpeg4(); | |
| 143 } | |
| 144 } | |
| 145 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
146 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
147 |
| 0 | 148 /* build the table which associate a (x,y) motion vector to a vlc */ |
| 149 static void init_mv_table(MVTable *tab) | |
| 150 { | |
| 151 int i, x, y; | |
| 152 | |
| 1064 | 153 tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096); |
| 0 | 154 /* mark all entries as not used */ |
| 155 for(i=0;i<4096;i++) | |
| 156 tab->table_mv_index[i] = tab->n; | |
| 2967 | 157 |
| 0 | 158 for(i=0;i<tab->n;i++) { |
| 159 x = tab->table_mvx[i]; | |
| 160 y = tab->table_mvy[i]; | |
| 161 tab->table_mv_index[(x << 6) | y] = i; | |
| 162 } | |
| 163 } | |
| 164 | |
|
5098
997c368e6433
Rename code012() to ff_code012(), and remove static qualifier: paves the way
gpoirier
parents:
4964
diff
changeset
|
165 void ff_code012(PutBitContext *pb, int n) |
| 0 | 166 { |
| 167 if (n == 0) { | |
| 168 put_bits(pb, 1, 0); | |
| 169 } else { | |
| 170 put_bits(pb, 1, 1); | |
| 171 put_bits(pb, 1, (n >= 2)); | |
| 172 } | |
| 173 } | |
| 174 | |
| 499 | 175 void ff_msmpeg4_encode_init(MpegEncContext *s) |
| 176 { | |
| 177 static int init_done=0; | |
| 178 int i; | |
| 179 | |
| 180 common_init(s); | |
| 181 if(s->msmpeg4_version>=4){ | |
| 182 s->min_qcoeff= -255; | |
| 183 s->max_qcoeff= 255; | |
| 184 } | |
| 185 | |
| 186 if (!init_done) { | |
| 187 /* init various encoding tables */ | |
| 188 init_done = 1; | |
| 189 init_mv_table(&mv_tables[0]); | |
| 190 init_mv_table(&mv_tables[1]); | |
| 191 for(i=0;i<NB_RL_TABLES;i++) | |
| 4668 | 192 init_rl(&rl_table[i], static_rl_table_store[i]); |
| 601 | 193 |
| 194 for(i=0; i<NB_RL_TABLES; i++){ | |
| 195 int level; | |
| 196 for(level=0; level<=MAX_LEVEL; level++){ | |
| 197 int run; | |
| 198 for(run=0; run<=MAX_RUN; run++){ | |
| 199 int last; | |
| 200 for(last=0; last<2; last++){ | |
|
774
baa66649df35
mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents:
773
diff
changeset
|
201 rl_length[i][level][run][last]= get_size_of_code(s, &rl_table[ i], last, run, level, 0); |
| 601 | 202 } |
| 203 } | |
| 204 } | |
| 205 } | |
| 499 | 206 } |
| 207 } | |
| 208 | |
| 209 static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){ | |
| 210 int size=0; | |
| 211 int code; | |
| 212 int run_diff= intra ? 0 : 1; | |
| 2967 | 213 |
| 499 | 214 code = get_rl_index(rl, last, run, level); |
| 215 size+= rl->table_vlc[code][1]; | |
| 216 if (code == rl->n) { | |
| 217 int level1, run1; | |
| 218 | |
| 219 level1 = level - rl->max_level[last][run]; | |
| 2967 | 220 if (level1 < 1) |
| 499 | 221 goto esc2; |
| 222 code = get_rl_index(rl, last, run, level1); | |
| 223 if (code == rl->n) { | |
| 224 esc2: | |
| 225 size++; | |
| 226 if (level > MAX_LEVEL) | |
| 227 goto esc3; | |
| 228 run1 = run - rl->max_run[last][level] - run_diff; | |
| 229 if (run1 < 0) | |
| 230 goto esc3; | |
| 231 code = get_rl_index(rl, last, run1, level); | |
| 232 if (code == rl->n) { | |
| 233 esc3: | |
| 234 /* third escape */ | |
| 235 size+=1+1+6+8; | |
| 236 } else { | |
| 237 /* second escape */ | |
| 238 size+= 1+1+ rl->table_vlc[code][1]; | |
| 239 } | |
| 240 } else { | |
| 241 /* first escape */ | |
| 242 size+= 1+1+ rl->table_vlc[code][1]; | |
| 243 } | |
| 244 } else { | |
| 245 size++; | |
| 246 } | |
| 247 return size; | |
| 248 } | |
| 249 | |
| 5178 | 250 void ff_find_best_tables(MpegEncContext * s) |
| 499 | 251 { |
| 252 int i; | |
| 253 int best =-1, best_size =9999999; | |
| 254 int chroma_best=-1, best_chroma_size=9999999; | |
| 601 | 255 |
| 499 | 256 for(i=0; i<3; i++){ |
| 257 int level; | |
| 258 int chroma_size=0; | |
| 259 int size=0; | |
| 260 | |
| 261 if(i>0){// ;) | |
| 2967 | 262 size++; |
| 499 | 263 chroma_size++; |
| 264 } | |
| 265 for(level=0; level<=MAX_LEVEL; level++){ | |
| 266 int run; | |
| 267 for(run=0; run<=MAX_RUN; run++){ | |
| 268 int last; | |
| 601 | 269 const int last_size= size + chroma_size; |
| 499 | 270 for(last=0; last<2; last++){ |
| 271 int inter_count = s->ac_stats[0][0][level][run][last] + s->ac_stats[0][1][level][run][last]; | |
| 272 int intra_luma_count = s->ac_stats[1][0][level][run][last]; | |
| 273 int intra_chroma_count= s->ac_stats[1][1][level][run][last]; | |
| 2967 | 274 |
| 499 | 275 if(s->pict_type==I_TYPE){ |
|
774
baa66649df35
mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents:
773
diff
changeset
|
276 size += intra_luma_count *rl_length[i ][level][run][last]; |
|
baa66649df35
mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents:
773
diff
changeset
|
277 chroma_size+= intra_chroma_count*rl_length[i+3][level][run][last]; |
| 499 | 278 }else{ |
|
774
baa66649df35
mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents:
773
diff
changeset
|
279 size+= intra_luma_count *rl_length[i ][level][run][last] |
|
baa66649df35
mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents:
773
diff
changeset
|
280 +intra_chroma_count*rl_length[i+3][level][run][last] |
|
baa66649df35
mergeing inter & intra rl_length tables (50% smaller & no meassureable difference in filesize/quality)
michaelni
parents:
773
diff
changeset
|
281 +inter_count *rl_length[i+3][level][run][last]; |
| 2967 | 282 } |
| 499 | 283 } |
| 601 | 284 if(last_size == size+chroma_size) break; |
| 499 | 285 } |
| 286 } | |
| 287 if(size<best_size){ | |
| 288 best_size= size; | |
| 289 best= i; | |
| 290 } | |
| 291 if(chroma_size<best_chroma_size){ | |
| 292 best_chroma_size= chroma_size; | |
| 293 chroma_best= i; | |
| 294 } | |
| 295 } | |
| 601 | 296 |
| 2967 | 297 // printf("type:%d, best:%d, qp:%d, var:%d, mcvar:%d, size:%d //\n", |
| 499 | 298 // s->pict_type, best, s->qscale, s->mb_var_sum, s->mc_mb_var_sum, best_size); |
| 2967 | 299 |
| 499 | 300 if(s->pict_type==P_TYPE) chroma_best= best; |
| 301 | |
| 302 memset(s->ac_stats, 0, sizeof(int)*(MAX_LEVEL+1)*(MAX_RUN+1)*2*2*2); | |
| 303 | |
| 304 s->rl_table_index = best; | |
| 305 s->rl_chroma_table_index= chroma_best; | |
| 2967 | 306 |
| 499 | 307 if(s->pict_type != s->last_non_b_pict_type){ |
| 308 s->rl_table_index= 2; | |
| 309 if(s->pict_type==I_TYPE) | |
| 310 s->rl_chroma_table_index= 1; | |
| 311 else | |
| 312 s->rl_chroma_table_index= 2; | |
| 313 } | |
| 314 | |
| 315 } | |
| 316 | |
| 457 | 317 /* write MSMPEG4 compatible frame header */ |
| 0 | 318 void msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) |
| 319 { | |
| 5178 | 320 ff_find_best_tables(s); |
| 0 | 321 |
| 322 align_put_bits(&s->pb); | |
| 323 put_bits(&s->pb, 2, s->pict_type - 1); | |
| 324 | |
| 325 put_bits(&s->pb, 5, s->qscale); | |
| 499 | 326 if(s->msmpeg4_version<=2){ |
| 327 s->rl_table_index = 2; | |
| 328 s->rl_chroma_table_index = 2; | |
| 329 } | |
| 310 | 330 |
| 0 | 331 s->dc_table_index = 1; |
| 332 s->mv_table_index = 1; /* only if P frame */ | |
| 333 s->use_skip_mb_code = 1; /* only if P frame */ | |
| 499 | 334 s->per_mb_rl_table = 0; |
| 759 | 335 if(s->msmpeg4_version==4) |
| 336 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE && s->pict_type==P_TYPE); | |
| 936 | 337 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height); |
| 499 | 338 |
| 0 | 339 if (s->pict_type == I_TYPE) { |
| 519 | 340 s->slice_height= s->mb_height/1; |
| 341 put_bits(&s->pb, 5, 0x16 + s->mb_height/s->slice_height); | |
| 2967 | 342 |
| 499 | 343 if(s->msmpeg4_version==4){ |
| 344 msmpeg4_encode_ext_header(s); | |
| 578 | 345 if(s->bit_rate>MBAC_BITRATE) |
| 519 | 346 put_bits(&s->pb, 1, s->per_mb_rl_table); |
| 499 | 347 } |
| 0 | 348 |
| 457 | 349 if(s->msmpeg4_version>2){ |
| 499 | 350 if(!s->per_mb_rl_table){ |
|
5098
997c368e6433
Rename code012() to ff_code012(), and remove static qualifier: paves the way
gpoirier
parents:
4964
diff
changeset
|
351 ff_code012(&s->pb, s->rl_chroma_table_index); |
|
997c368e6433
Rename code012() to ff_code012(), and remove static qualifier: paves the way
gpoirier
parents:
4964
diff
changeset
|
352 ff_code012(&s->pb, s->rl_table_index); |
| 499 | 353 } |
| 0 | 354 |
| 310 | 355 put_bits(&s->pb, 1, s->dc_table_index); |
| 356 } | |
| 0 | 357 } else { |
| 358 put_bits(&s->pb, 1, s->use_skip_mb_code); | |
| 2967 | 359 |
| 578 | 360 if(s->msmpeg4_version==4 && s->bit_rate>MBAC_BITRATE) |
| 499 | 361 put_bits(&s->pb, 1, s->per_mb_rl_table); |
| 362 | |
| 457 | 363 if(s->msmpeg4_version>2){ |
| 499 | 364 if(!s->per_mb_rl_table) |
|
5098
997c368e6433
Rename code012() to ff_code012(), and remove static qualifier: paves the way
gpoirier
parents:
4964
diff
changeset
|
365 ff_code012(&s->pb, s->rl_table_index); |
| 0 | 366 |
| 310 | 367 put_bits(&s->pb, 1, s->dc_table_index); |
| 0 | 368 |
| 310 | 369 put_bits(&s->pb, 1, s->mv_table_index); |
| 370 } | |
| 0 | 371 } |
| 372 | |
| 499 | 373 s->esc3_level_length= 0; |
| 374 s->esc3_run_length= 0; | |
| 0 | 375 |
| 376 #ifdef DEBUG | |
| 377 intra_count = 0; | |
| 3177 | 378 av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++); |
| 0 | 379 #endif |
| 380 } | |
| 381 | |
| 208 | 382 void msmpeg4_encode_ext_header(MpegEncContext * s) |
| 383 { | |
| 2637 | 384 put_bits(&s->pb, 5, s->avctx->time_base.den / s->avctx->time_base.num); //yes 29.97 -> 29 |
| 208 | 385 |
| 847 | 386 put_bits(&s->pb, 11, FFMIN(s->bit_rate/1024, 2047)); |
| 208 | 387 |
| 1163 | 388 if(s->msmpeg4_version>=3) |
| 457 | 389 put_bits(&s->pb, 1, s->flipflop_rounding); |
| 1163 | 390 else |
| 391 assert(s->flipflop_rounding==0); | |
| 208 | 392 } |
| 393 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
394 #endif //CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
395 |
| 0 | 396 /* predict coded block */ |
| 1064 | 397 static inline int coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr) |
| 0 | 398 { |
| 299 | 399 int xy, wrap, pred, a, b, c; |
| 0 | 400 |
| 299 | 401 xy = s->block_index[n]; |
|
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1739
diff
changeset
|
402 wrap = s->b8_stride; |
| 0 | 403 |
| 404 /* B C | |
| 2967 | 405 * A X |
| 0 | 406 */ |
| 299 | 407 a = s->coded_block[xy - 1 ]; |
| 408 b = s->coded_block[xy - 1 - wrap]; | |
| 409 c = s->coded_block[xy - wrap]; | |
| 2967 | 410 |
| 0 | 411 if (b == c) { |
| 412 pred = a; | |
| 413 } else { | |
| 414 pred = c; | |
| 415 } | |
| 2967 | 416 |
| 0 | 417 /* store value */ |
| 299 | 418 *coded_block_ptr = &s->coded_block[xy]; |
| 0 | 419 |
| 420 return pred; | |
| 421 } | |
| 422 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
423 #ifdef CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
424 |
| 2967 | 425 static void msmpeg4_encode_motion(MpegEncContext * s, |
| 0 | 426 int mx, int my) |
| 427 { | |
| 428 int code; | |
| 429 MVTable *mv; | |
| 430 | |
| 431 /* modulo encoding */ | |
| 432 /* WARNING : you cannot reach all the MVs even with the modulo | |
| 433 encoding. This is a somewhat strange compromise they took !!! */ | |
| 434 if (mx <= -64) | |
| 435 mx += 64; | |
| 436 else if (mx >= 64) | |
| 437 mx -= 64; | |
| 438 if (my <= -64) | |
| 439 my += 64; | |
| 440 else if (my >= 64) | |
| 441 my -= 64; | |
| 2967 | 442 |
| 0 | 443 mx += 32; |
| 444 my += 32; | |
| 445 #if 0 | |
| 446 if ((unsigned)mx >= 64 || | |
| 2967 | 447 (unsigned)my >= 64) |
| 3177 | 448 av_log(s->avctx, AV_LOG_ERROR, "error mx=%d my=%d\n", mx, my); |
| 0 | 449 #endif |
| 450 mv = &mv_tables[s->mv_table_index]; | |
| 451 | |
| 452 code = mv->table_mv_index[(mx << 6) | my]; | |
| 2967 | 453 put_bits(&s->pb, |
| 454 mv->table_mv_bits[code], | |
| 0 | 455 mv->table_mv_code[code]); |
| 456 if (code == mv->n) { | |
| 5129 | 457 /* escape : code literally */ |
| 0 | 458 put_bits(&s->pb, 6, mx); |
| 459 put_bits(&s->pb, 6, my); | |
| 460 } | |
| 461 } | |
| 462 | |
| 519 | 463 static inline void handle_slices(MpegEncContext *s){ |
| 464 if (s->mb_x == 0) { | |
| 465 if (s->slice_height && (s->mb_y % s->slice_height) == 0) { | |
| 983 | 466 if(s->msmpeg4_version < 4){ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
467 ff_mpeg4_clean_buffers(s); |
| 519 | 468 } |
| 469 s->first_slice_line = 1; | |
| 470 } else { | |
| 2967 | 471 s->first_slice_line = 0; |
| 519 | 472 } |
| 473 } | |
| 474 } | |
| 475 | |
| 2967 | 476 void msmpeg4_encode_mb(MpegEncContext * s, |
| 0 | 477 DCTELEM block[6][64], |
| 478 int motion_x, int motion_y) | |
| 479 { | |
| 480 int cbp, coded_cbp, i; | |
| 481 int pred_x, pred_y; | |
| 1064 | 482 uint8_t *coded_block; |
| 0 | 483 |
| 519 | 484 handle_slices(s); |
| 2967 | 485 |
| 0 | 486 if (!s->mb_intra) { |
| 2979 | 487 /* compute cbp */ |
| 488 cbp = 0; | |
| 489 for (i = 0; i < 6; i++) { | |
| 490 if (s->block_last_index[i] >= 0) | |
| 491 cbp |= 1 << (5 - i); | |
| 492 } | |
| 493 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { | |
| 494 /* skip macroblock */ | |
| 495 put_bits(&s->pb, 1, 1); | |
| 1164 | 496 s->last_bits++; |
| 2979 | 497 s->misc_bits++; |
| 1216 | 498 s->skip_count++; |
| 1164 | 499 |
| 2979 | 500 return; |
| 501 } | |
| 0 | 502 if (s->use_skip_mb_code) |
| 2979 | 503 put_bits(&s->pb, 1, 0); /* mb coded */ |
| 2967 | 504 |
| 457 | 505 if(s->msmpeg4_version<=2){ |
| 2967 | 506 put_bits(&s->pb, |
| 507 v2_mb_type[cbp&3][1], | |
| 310 | 508 v2_mb_type[cbp&3][0]); |
| 509 if((cbp&3) != 3) coded_cbp= cbp ^ 0x3C; | |
| 510 else coded_cbp= cbp; | |
| 0 | 511 |
| 2967 | 512 put_bits(&s->pb, |
| 513 cbpy_tab[coded_cbp>>2][1], | |
| 310 | 514 cbpy_tab[coded_cbp>>2][0]); |
| 1164 | 515 |
| 516 s->misc_bits += get_bits_diff(s); | |
| 517 | |
|
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1739
diff
changeset
|
518 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
| 310 | 519 msmpeg4v2_encode_motion(s, motion_x - pred_x); |
| 520 msmpeg4v2_encode_motion(s, motion_y - pred_y); | |
| 521 }else{ | |
| 2967 | 522 put_bits(&s->pb, |
| 523 table_mb_non_intra[cbp + 64][1], | |
| 310 | 524 table_mb_non_intra[cbp + 64][0]); |
| 525 | |
| 1164 | 526 s->misc_bits += get_bits_diff(s); |
| 527 | |
| 310 | 528 /* motion vector */ |
|
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1739
diff
changeset
|
529 h263_pred_motion(s, 0, 0, &pred_x, &pred_y); |
| 2967 | 530 msmpeg4_encode_motion(s, motion_x - pred_x, |
| 310 | 531 motion_y - pred_y); |
| 532 } | |
| 1164 | 533 |
| 534 s->mv_bits += get_bits_diff(s); | |
| 535 | |
| 536 for (i = 0; i < 6; i++) { | |
| 5178 | 537 ff_msmpeg4_encode_block(s, block[i], i); |
| 1164 | 538 } |
| 539 s->p_tex_bits += get_bits_diff(s); | |
| 0 | 540 } else { |
| 2979 | 541 /* compute cbp */ |
| 542 cbp = 0; | |
| 0 | 543 coded_cbp = 0; |
| 2979 | 544 for (i = 0; i < 6; i++) { |
| 0 | 545 int val, pred; |
| 546 val = (s->block_last_index[i] >= 1); | |
| 547 cbp |= val << (5 - i); | |
| 548 if (i < 4) { | |
| 549 /* predict value for close blocks only for luma */ | |
| 550 pred = coded_block_pred(s, i, &coded_block); | |
| 551 *coded_block = val; | |
| 552 val = val ^ pred; | |
| 553 } | |
| 554 coded_cbp |= val << (5 - i); | |
| 2979 | 555 } |
| 0 | 556 #if 0 |
| 557 if (coded_cbp) | |
| 558 printf("cbp=%x %x\n", cbp, coded_cbp); | |
| 559 #endif | |
| 560 | |
| 457 | 561 if(s->msmpeg4_version<=2){ |
| 310 | 562 if (s->pict_type == I_TYPE) { |
| 2967 | 563 put_bits(&s->pb, |
| 310 | 564 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]); |
| 565 } else { | |
| 566 if (s->use_skip_mb_code) | |
| 2979 | 567 put_bits(&s->pb, 1, 0); /* mb coded */ |
| 2967 | 568 put_bits(&s->pb, |
| 569 v2_mb_type[(cbp&3) + 4][1], | |
| 310 | 570 v2_mb_type[(cbp&3) + 4][0]); |
| 571 } | |
| 2979 | 572 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ |
| 2967 | 573 put_bits(&s->pb, |
| 574 cbpy_tab[cbp>>2][1], | |
| 310 | 575 cbpy_tab[cbp>>2][0]); |
| 576 }else{ | |
| 577 if (s->pict_type == I_TYPE) { | |
| 2967 | 578 put_bits(&s->pb, |
| 2474 | 579 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); |
| 310 | 580 } else { |
| 581 if (s->use_skip_mb_code) | |
| 2979 | 582 put_bits(&s->pb, 1, 0); /* mb coded */ |
| 2967 | 583 put_bits(&s->pb, |
| 584 table_mb_non_intra[cbp][1], | |
| 310 | 585 table_mb_non_intra[cbp][0]); |
| 586 } | |
| 2979 | 587 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ |
| 578 | 588 if(s->inter_intra_pred){ |
| 589 s->h263_aic_dir=0; | |
| 590 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]); | |
| 591 } | |
| 0 | 592 } |
| 1164 | 593 s->misc_bits += get_bits_diff(s); |
| 0 | 594 |
| 1164 | 595 for (i = 0; i < 6; i++) { |
| 5178 | 596 ff_msmpeg4_encode_block(s, block[i], i); |
| 1164 | 597 } |
| 598 s->i_tex_bits += get_bits_diff(s); | |
| 1216 | 599 s->i_count++; |
| 0 | 600 } |
| 601 } | |
| 602 | |
|
1070
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
603 #endif //CONFIG_ENCODERS |
|
6da5ae9ee199
more #ifdef CONFIG_ENCODERS patch by (Wolfgang Hesseler <qv at multimediaware dot com>) with modifications by me (s/WOLFGANG/CONFIG_ENCODERS/ and some other fixes)
michaelni
parents:
1064
diff
changeset
|
604 |
| 2967 | 605 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n, |
| 1064 | 606 int32_t **dc_val_ptr) |
| 457 | 607 { |
| 608 int i; | |
| 609 | |
| 610 if (n < 4) { | |
| 611 i= 0; | |
| 612 } else { | |
| 613 i= n-3; | |
| 614 } | |
| 2967 | 615 |
| 457 | 616 *dc_val_ptr= &s->last_dc[i]; |
| 2967 | 617 return s->last_dc[i]; |
| 457 | 618 } |
| 619 | |
| 519 | 620 static int get_dc(uint8_t *src, int stride, int scale) |
| 621 { | |
| 622 int y; | |
| 623 int sum=0; | |
| 624 for(y=0; y<8; y++){ | |
| 625 int x; | |
| 626 for(x=0; x<8; x++){ | |
| 627 sum+=src[x + y*stride]; | |
| 628 } | |
| 629 } | |
|
1261
362947395f5c
fastdiv patch by (BERO <bero at geocities dot co dot jp>) with fixes & cleanup by me
michaelni
parents:
1255
diff
changeset
|
630 return FASTDIV((sum + (scale>>1)), scale); |
| 519 | 631 } |
| 632 | |
| 0 | 633 /* dir = 0: left, dir = 1: top prediction */ |
| 2967 | 634 static inline int msmpeg4_pred_dc(MpegEncContext * s, int n, |
| 3781 | 635 int16_t **dc_val_ptr, int *dir_ptr) |
| 0 | 636 { |
| 299 | 637 int a, b, c, wrap, pred, scale; |
| 3781 | 638 int16_t *dc_val; |
| 0 | 639 |
| 640 /* find prediction */ | |
| 641 if (n < 4) { | |
| 2979 | 642 scale = s->y_dc_scale; |
| 0 | 643 } else { |
| 2979 | 644 scale = s->c_dc_scale; |
| 0 | 645 } |
| 2967 | 646 |
| 299 | 647 wrap = s->block_wrap[n]; |
| 648 dc_val= s->dc_val[0] + s->block_index[n]; | |
| 0 | 649 |
| 650 /* B C | |
| 2967 | 651 * A X |
| 0 | 652 */ |
| 299 | 653 a = dc_val[ - 1]; |
| 654 b = dc_val[ - 1 - wrap]; | |
| 655 c = dc_val[ - wrap]; | |
| 2967 | 656 |
| 983 | 657 if(s->first_slice_line && (n&2)==0 && s->msmpeg4_version<4){ |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
658 b=c=1024; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
659 } |
| 0 | 660 |
| 661 /* XXX: the following solution consumes divisions, but it does not | |
| 662 necessitate to modify mpegvideo.c. The problem comes from the | |
| 663 fact they decided to store the quantized DC (which would lead | |
| 664 to problems if Q could vary !) */ | |
| 4116 | 665 #if (defined(ARCH_X86)) && !defined PIC |
| 204 | 666 asm volatile( |
| 2979 | 667 "movl %3, %%eax \n\t" |
| 668 "shrl $1, %%eax \n\t" | |
| 669 "addl %%eax, %2 \n\t" | |
| 670 "addl %%eax, %1 \n\t" | |
| 671 "addl %0, %%eax \n\t" | |
| 672 "mull %4 \n\t" | |
| 673 "movl %%edx, %0 \n\t" | |
| 674 "movl %1, %%eax \n\t" | |
| 675 "mull %4 \n\t" | |
| 676 "movl %%edx, %1 \n\t" | |
| 677 "movl %2, %%eax \n\t" | |
| 678 "mull %4 \n\t" | |
| 679 "movl %%edx, %2 \n\t" | |
| 680 : "+b" (a), "+c" (b), "+D" (c) | |
| 4174 | 681 : "g" (scale), "S" (ff_inverse[scale]) |
| 2979 | 682 : "%eax", "%edx" |
| 204 | 683 ); |
| 221 | 684 #else |
| 685 /* #elif defined (ARCH_ALPHA) */ | |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
208
diff
changeset
|
686 /* Divisions are extremely costly on Alpha; optimize the most |
| 221 | 687 common case. But they are costly everywhere... |
| 688 */ | |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
208
diff
changeset
|
689 if (scale == 8) { |
| 2979 | 690 a = (a + (8 >> 1)) / 8; |
| 691 b = (b + (8 >> 1)) / 8; | |
| 692 c = (c + (8 >> 1)) / 8; | |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
208
diff
changeset
|
693 } else { |
| 2979 | 694 a = FASTDIV((a + (scale >> 1)), scale); |
| 695 b = FASTDIV((b + (scale >> 1)), scale); | |
| 696 c = FASTDIV((c + (scale >> 1)), scale); | |
|
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
208
diff
changeset
|
697 } |
| 204 | 698 #endif |
| 0 | 699 /* XXX: WARNING: they did not choose the same test as MPEG4. This |
| 700 is very important ! */ | |
|
501
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
701 if(s->msmpeg4_version>3){ |
| 519 | 702 if(s->inter_intra_pred){ |
| 703 uint8_t *dest; | |
| 704 int wrap; | |
| 2967 | 705 |
| 519 | 706 if(n==1){ |
| 707 pred=a; | |
| 708 *dir_ptr = 0; | |
| 709 }else if(n==2){ | |
| 710 pred=c; | |
| 711 *dir_ptr = 1; | |
| 712 }else if(n==3){ | |
| 713 if (abs(a - b) < abs(b - c)) { | |
| 714 pred = c; | |
| 715 *dir_ptr = 1; | |
| 716 } else { | |
| 717 pred = a; | |
| 718 *dir_ptr = 0; | |
| 719 } | |
| 720 }else{ | |
| 721 if(n<4){ | |
| 722 wrap= s->linesize; | |
| 903 | 723 dest= s->current_picture.data[0] + (((n>>1) + 2*s->mb_y) * 8* wrap ) + ((n&1) + 2*s->mb_x) * 8; |
| 519 | 724 }else{ |
| 556 | 725 wrap= s->uvlinesize; |
| 903 | 726 dest= s->current_picture.data[n-3] + (s->mb_y * 8 * wrap) + s->mb_x * 8; |
| 519 | 727 } |
| 728 if(s->mb_x==0) a= (1024 + (scale>>1))/scale; | |
| 729 else a= get_dc(dest-8, wrap, scale*8); | |
| 730 if(s->mb_y==0) c= (1024 + (scale>>1))/scale; | |
| 731 else c= get_dc(dest-8*wrap, wrap, scale*8); | |
| 2967 | 732 |
| 519 | 733 if (s->h263_aic_dir==0) { |
| 734 pred= a; | |
| 735 *dir_ptr = 0; | |
| 736 }else if (s->h263_aic_dir==1) { | |
| 737 if(n==0){ | |
| 738 pred= c; | |
| 739 *dir_ptr = 1; | |
| 740 }else{ | |
| 741 pred= a; | |
| 742 *dir_ptr = 0; | |
| 743 } | |
| 744 }else if (s->h263_aic_dir==2) { | |
| 745 if(n==0){ | |
| 746 pred= a; | |
| 747 *dir_ptr = 0; | |
| 748 }else{ | |
| 749 pred= c; | |
| 750 *dir_ptr = 1; | |
| 751 } | |
| 752 } else { | |
| 753 pred= c; | |
| 754 *dir_ptr = 1; | |
| 755 } | |
| 756 } | |
| 757 }else{ | |
| 758 if (abs(a - b) < abs(b - c)) { | |
| 759 pred = c; | |
| 760 *dir_ptr = 1; | |
| 761 } else { | |
| 762 pred = a; | |
| 763 *dir_ptr = 0; | |
| 764 } | |
|
501
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
765 } |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
766 }else{ |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
767 if (abs(a - b) <= abs(b - c)) { |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
768 pred = c; |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
769 *dir_ptr = 1; |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
770 } else { |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
771 pred = a; |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
772 *dir_ptr = 0; |
|
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
773 } |
| 0 | 774 } |
| 775 | |
| 776 /* update predictor */ | |
| 299 | 777 *dc_val_ptr = &dc_val[0]; |
| 0 | 778 return pred; |
| 779 } | |
| 780 | |
| 781 #define DC_MAX 119 | |
| 782 | |
| 783 static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) | |
| 784 { | |
| 785 int sign, code; | |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
786 int pred, extquant; |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
787 int extrabits = 0; |
| 0 | 788 |
| 457 | 789 if(s->msmpeg4_version==1){ |
| 1064 | 790 int32_t *dc_val; |
| 457 | 791 pred = msmpeg4v1_pred_dc(s, n, &dc_val); |
| 2967 | 792 |
| 457 | 793 /* update predictor */ |
| 794 *dc_val= level; | |
| 795 }else{ | |
| 3781 | 796 int16_t *dc_val; |
|
501
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
797 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); |
| 457 | 798 |
| 799 /* update predictor */ | |
| 800 if (n < 4) { | |
| 801 *dc_val = level * s->y_dc_scale; | |
| 802 } else { | |
| 803 *dc_val = level * s->c_dc_scale; | |
| 804 } | |
| 0 | 805 } |
| 806 | |
| 807 /* do the prediction */ | |
| 808 level -= pred; | |
| 809 | |
| 457 | 810 if(s->msmpeg4_version<=2){ |
| 310 | 811 if (n < 4) { |
| 2967 | 812 put_bits(&s->pb, |
| 310 | 813 v2_dc_lum_table[level+256][1], |
| 814 v2_dc_lum_table[level+256][0]); | |
| 815 }else{ | |
| 2967 | 816 put_bits(&s->pb, |
| 310 | 817 v2_dc_chroma_table[level+256][1], |
| 818 v2_dc_chroma_table[level+256][0]); | |
| 819 } | |
| 820 }else{ | |
| 821 sign = 0; | |
| 822 if (level < 0) { | |
| 823 level = -level; | |
| 824 sign = 1; | |
| 825 } | |
| 826 code = level; | |
| 2967 | 827 if (code > DC_MAX) |
| 310 | 828 code = DC_MAX; |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
829 else if( s->msmpeg4_version>=6 ) { |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
830 if( s->qscale == 1 ) { |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
831 extquant = (level + 3) & 0x3; |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
832 code = ((level+3)>>2); |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
833 } else if( s->qscale == 2 ) { |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
834 extquant = (level + 1) & 0x1; |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
835 code = ((level+1)>>1); |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
836 } |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
837 } |
| 0 | 838 |
| 310 | 839 if (s->dc_table_index == 0) { |
| 840 if (n < 4) { | |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
841 put_bits(&s->pb, ff_table0_dc_lum[code][1], ff_table0_dc_lum[code][0]); |
| 310 | 842 } else { |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
843 put_bits(&s->pb, ff_table0_dc_chroma[code][1], ff_table0_dc_chroma[code][0]); |
| 310 | 844 } |
| 0 | 845 } else { |
| 310 | 846 if (n < 4) { |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
847 put_bits(&s->pb, ff_table1_dc_lum[code][1], ff_table1_dc_lum[code][0]); |
| 310 | 848 } else { |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
849 put_bits(&s->pb, ff_table1_dc_chroma[code][1], ff_table1_dc_chroma[code][0]); |
| 310 | 850 } |
| 0 | 851 } |
| 2967 | 852 |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
853 if(s->msmpeg4_version>=6 && s->qscale<=2) |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
854 extrabits = 3 - s->qscale; |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
855 |
| 310 | 856 if (code == DC_MAX) |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
857 put_bits(&s->pb, 8 + extrabits, level); |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
858 else if(extrabits > 0)//== VC1 && s->qscale<=2 |
|
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
859 put_bits(&s->pb, extrabits, extquant); |
| 2967 | 860 |
| 310 | 861 if (level != 0) { |
| 862 put_bits(&s->pb, 1, sign); | |
| 863 } | |
| 0 | 864 } |
| 865 } | |
| 866 | |
| 867 /* Encoding of a block. Very similar to MPEG4 except for a different | |
| 868 escape coding (same as H263) and more vlc tables. | |
| 869 */ | |
| 5178 | 870 void ff_msmpeg4_encode_block(MpegEncContext * s, DCTELEM * block, int n) |
| 0 | 871 { |
| 872 int level, run, last, i, j, last_index; | |
| 873 int last_non_zero, sign, slevel; | |
| 874 int code, run_diff, dc_pred_dir; | |
| 875 const RLTable *rl; | |
| 1064 | 876 const uint8_t *scantable; |
| 0 | 877 |
| 878 if (s->mb_intra) { | |
| 879 msmpeg4_encode_dc(s, block[0], n, &dc_pred_dir); | |
| 880 i = 1; | |
| 881 if (n < 4) { | |
| 882 rl = &rl_table[s->rl_table_index]; | |
| 883 } else { | |
| 884 rl = &rl_table[3 + s->rl_chroma_table_index]; | |
| 885 } | |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
886 run_diff = s->msmpeg4_version>=6; |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
601
diff
changeset
|
887 scantable= s->intra_scantable.permutated; |
| 0 | 888 } else { |
| 889 i = 0; | |
| 890 rl = &rl_table[3 + s->rl_table_index]; | |
| 457 | 891 if(s->msmpeg4_version<=2) |
| 310 | 892 run_diff = 0; |
| 893 else | |
| 894 run_diff = 1; | |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
601
diff
changeset
|
895 scantable= s->inter_scantable.permutated; |
| 0 | 896 } |
| 897 | |
| 499 | 898 /* recalculate block_last_index for M$ wmv1 */ |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
899 if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){ |
| 499 | 900 for(last_index=63; last_index>=0; last_index--){ |
| 901 if(block[scantable[last_index]]) break; | |
| 902 } | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
903 s->block_last_index[n]= last_index; |
| 499 | 904 }else |
| 905 last_index = s->block_last_index[n]; | |
| 0 | 906 /* AC coefs */ |
| 907 last_non_zero = i - 1; | |
| 908 for (; i <= last_index; i++) { | |
| 2979 | 909 j = scantable[i]; |
| 910 level = block[j]; | |
| 911 if (level) { | |
| 912 run = i - last_non_zero - 1; | |
| 913 last = (i == last_index); | |
| 914 sign = 0; | |
| 915 slevel = level; | |
| 916 if (level < 0) { | |
| 917 sign = 1; | |
| 918 level = -level; | |
| 919 } | |
| 601 | 920 |
| 499 | 921 if(level<=MAX_LEVEL && run<=MAX_RUN){ |
| 922 s->ac_stats[s->mb_intra][n>3][level][run][last]++; | |
| 923 } | |
| 924 #if 0 | |
| 925 else | |
| 926 s->ac_stats[s->mb_intra][n>3][40][63][0]++; //esc3 like | |
| 927 #endif | |
| 0 | 928 code = get_rl_index(rl, last, run, level); |
| 929 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
| 930 if (code == rl->n) { | |
| 931 int level1, run1; | |
| 932 | |
| 933 level1 = level - rl->max_level[last][run]; | |
| 2967 | 934 if (level1 < 1) |
| 0 | 935 goto esc2; |
| 936 code = get_rl_index(rl, last, run, level1); | |
| 937 if (code == rl->n) { | |
| 938 esc2: | |
| 939 put_bits(&s->pb, 1, 0); | |
| 940 if (level > MAX_LEVEL) | |
| 941 goto esc3; | |
| 942 run1 = run - rl->max_run[last][level] - run_diff; | |
| 943 if (run1 < 0) | |
| 944 goto esc3; | |
| 945 code = get_rl_index(rl, last, run1, level); | |
| 946 if (code == rl->n) { | |
| 947 esc3: | |
| 948 /* third escape */ | |
| 949 put_bits(&s->pb, 1, 0); | |
| 950 put_bits(&s->pb, 1, last); | |
| 936 | 951 if(s->msmpeg4_version>=4){ |
| 499 | 952 if(s->esc3_level_length==0){ |
| 953 s->esc3_level_length=8; | |
| 954 s->esc3_run_length= 6; | |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
955 //ESCLVLSZ + ESCRUNSZ |
| 499 | 956 if(s->qscale<8) |
|
5179
04bbac6e28df
modify msmpeg4 functions to generate VC1 compatible block layer bitstream
benoit
parents:
5178
diff
changeset
|
957 put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3); |
| 499 | 958 else |
| 959 put_bits(&s->pb, 8, 3); | |
| 960 } | |
| 961 put_bits(&s->pb, s->esc3_run_length, run); | |
| 962 put_bits(&s->pb, 1, sign); | |
| 963 put_bits(&s->pb, s->esc3_level_length, level); | |
| 964 }else{ | |
| 965 put_bits(&s->pb, 6, run); | |
| 966 put_bits(&s->pb, 8, slevel & 0xff); | |
| 967 } | |
| 0 | 968 } else { |
| 969 /* second escape */ | |
| 970 put_bits(&s->pb, 1, 1); | |
| 971 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
| 972 put_bits(&s->pb, 1, sign); | |
| 973 } | |
| 974 } else { | |
| 975 /* first escape */ | |
| 976 put_bits(&s->pb, 1, 1); | |
| 977 put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); | |
| 978 put_bits(&s->pb, 1, sign); | |
| 979 } | |
| 980 } else { | |
| 981 put_bits(&s->pb, 1, sign); | |
| 982 } | |
| 2979 | 983 last_non_zero = i; |
| 984 } | |
| 0 | 985 } |
| 986 } | |
| 987 | |
| 988 /****************************************/ | |
| 989 /* decoding stuff */ | |
| 990 | |
| 936 | 991 static VLC mb_non_intra_vlc[4]; |
| 307 | 992 static VLC v2_dc_lum_vlc; |
| 993 static VLC v2_dc_chroma_vlc; | |
| 994 static VLC cbpy_vlc; | |
| 995 static VLC v2_intra_cbpc_vlc; | |
| 996 static VLC v2_mb_type_vlc; | |
| 997 static VLC v2_mv_vlc; | |
| 457 | 998 static VLC v1_intra_cbpc_vlc; |
| 999 static VLC v1_inter_cbpc_vlc; | |
| 519 | 1000 static VLC inter_intra_vlc; |
| 307 | 1001 |
| 5129 | 1002 /* This table is practically identical to the one from h263 |
| 1003 * except that it is inverted. */ | |
| 468 | 1004 static void init_h263_dc_for_msmpeg4(void) |
| 307 | 1005 { |
| 1006 int level, uni_code, uni_len; | |
| 1007 | |
| 309 | 1008 for(level=-256; level<256; level++){ |
| 307 | 1009 int size, v, l; |
| 1010 /* find number of bits */ | |
| 1011 size = 0; | |
| 1012 v = abs(level); | |
| 1013 while (v) { | |
| 1014 v >>= 1; | |
| 2979 | 1015 size++; |
| 307 | 1016 } |
| 1017 | |
| 1018 if (level < 0) | |
| 1019 l= (-level) ^ ((1 << size) - 1); | |
| 1020 else | |
| 1021 l= level; | |
| 1022 | |
| 1023 /* luminance h263 */ | |
| 1024 uni_code= DCtab_lum[size][0]; | |
| 1025 uni_len = DCtab_lum[size][1]; | |
| 5127 | 1026 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility |
| 307 | 1027 |
| 1028 if (size > 0) { | |
| 1029 uni_code<<=size; uni_code|=l; | |
| 1030 uni_len+=size; | |
| 1031 if (size > 8){ | |
| 1032 uni_code<<=1; uni_code|=1; | |
| 1033 uni_len++; | |
| 1034 } | |
| 1035 } | |
| 1036 v2_dc_lum_table[level+256][0]= uni_code; | |
| 1037 v2_dc_lum_table[level+256][1]= uni_len; | |
| 1038 | |
| 1039 /* chrominance h263 */ | |
| 1040 uni_code= DCtab_chrom[size][0]; | |
| 1041 uni_len = DCtab_chrom[size][1]; | |
| 5127 | 1042 uni_code ^= (1<<uni_len)-1; //M$ does not like compatibility |
| 2967 | 1043 |
| 307 | 1044 if (size > 0) { |
| 1045 uni_code<<=size; uni_code|=l; | |
| 1046 uni_len+=size; | |
| 1047 if (size > 8){ | |
| 1048 uni_code<<=1; uni_code|=1; | |
| 1049 uni_len++; | |
| 1050 } | |
| 1051 } | |
| 1052 v2_dc_chroma_table[level+256][0]= uni_code; | |
| 1053 v2_dc_chroma_table[level+256][1]= uni_len; | |
| 1054 | |
| 1055 } | |
| 1056 } | |
| 0 | 1057 |
| 1058 /* init all vlc decoding tables */ | |
| 499 | 1059 int ff_msmpeg4_decode_init(MpegEncContext *s) |
| 0 | 1060 { |
| 483 | 1061 static int done = 0; |
| 0 | 1062 int i; |
| 1063 MVTable *mv; | |
| 1064 | |
| 499 | 1065 common_init(s); |
| 483 | 1066 |
| 1067 if (!done) { | |
| 1068 done = 1; | |
| 0 | 1069 |
| 483 | 1070 for(i=0;i<NB_RL_TABLES;i++) { |
| 4668 | 1071 init_rl(&rl_table[i], static_rl_table_store[i]); |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1072 init_vlc_rl(&rl_table[i], 1); |
| 483 | 1073 } |
| 1074 for(i=0;i<2;i++) { | |
| 1075 mv = &mv_tables[i]; | |
| 2967 | 1076 init_vlc(&mv->vlc, MV_VLC_BITS, mv->n + 1, |
| 483 | 1077 mv->table_mv_bits, 1, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1078 mv->table_mv_code, 2, 2, 1); |
| 483 | 1079 } |
| 1080 | |
| 2967 | 1081 init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120, |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1082 &ff_table0_dc_lum[0][1], 8, 4, |
|
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1083 &ff_table0_dc_lum[0][0], 8, 4, 1); |
| 2967 | 1084 init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120, |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1085 &ff_table0_dc_chroma[0][1], 8, 4, |
|
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1086 &ff_table0_dc_chroma[0][0], 8, 4, 1); |
| 2967 | 1087 init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120, |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1088 &ff_table1_dc_lum[0][1], 8, 4, |
|
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1089 &ff_table1_dc_lum[0][0], 8, 4, 1); |
| 2967 | 1090 init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120, |
|
2465
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1091 &ff_table1_dc_chroma[0][1], 8, 4, |
|
5565203c95ee
use dc tables from msmpeg4 instead of duplicating them patch by anonymous
michael
parents:
2464
diff
changeset
|
1092 &ff_table1_dc_chroma[0][0], 8, 4, 1); |
| 2967 | 1093 |
| 1094 init_vlc(&v2_dc_lum_vlc, DC_VLC_BITS, 512, | |
| 483 | 1095 &v2_dc_lum_table[0][1], 8, 4, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1096 &v2_dc_lum_table[0][0], 8, 4, 1); |
| 2967 | 1097 init_vlc(&v2_dc_chroma_vlc, DC_VLC_BITS, 512, |
| 483 | 1098 &v2_dc_chroma_table[0][1], 8, 4, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1099 &v2_dc_chroma_table[0][0], 8, 4, 1); |
| 2967 | 1100 |
| 531 | 1101 init_vlc(&cbpy_vlc, CBPY_VLC_BITS, 16, |
| 483 | 1102 &cbpy_tab[0][1], 2, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1103 &cbpy_tab[0][0], 2, 1, 1); |
| 531 | 1104 init_vlc(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4, |
| 483 | 1105 &v2_intra_cbpc[0][1], 2, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1106 &v2_intra_cbpc[0][0], 2, 1, 1); |
| 531 | 1107 init_vlc(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8, |
| 483 | 1108 &v2_mb_type[0][1], 2, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1109 &v2_mb_type[0][0], 2, 1, 1); |
| 531 | 1110 init_vlc(&v2_mv_vlc, V2_MV_VLC_BITS, 33, |
| 483 | 1111 &mvtab[0][1], 2, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1112 &mvtab[0][0], 2, 1, 1); |
| 0 | 1113 |
| 936 | 1114 for(i=0; i<4; i++){ |
| 2967 | 1115 init_vlc(&mb_non_intra_vlc[i], MB_NON_INTRA_VLC_BITS, 128, |
| 936 | 1116 &wmv2_inter_table[i][0][1], 8, 4, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1117 &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name? |
| 936 | 1118 } |
| 2967 | 1119 |
| 1120 init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64, | |
| 2474 | 1121 &ff_msmp4_mb_i_table[0][1], 4, 2, |
| 1122 &ff_msmp4_mb_i_table[0][0], 4, 2, 1); | |
| 2967 | 1123 |
| 1124 init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8, | |
| 483 | 1125 intra_MCBPC_bits, 1, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1126 intra_MCBPC_code, 1, 1, 1); |
| 2967 | 1127 init_vlc(&v1_inter_cbpc_vlc, V1_INTER_CBPC_VLC_BITS, 25, |
| 483 | 1128 inter_MCBPC_bits, 1, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1129 inter_MCBPC_code, 1, 1, 1); |
| 2967 | 1130 |
| 1131 init_vlc(&inter_intra_vlc, INTER_INTRA_VLC_BITS, 4, | |
| 519 | 1132 &table_inter_intra[0][1], 2, 1, |
|
2370
26560d4fdb1f
Memory leak fix patch by (Burkhard Plaum <plaum >at< ipf.uni-stuttgart )dot( de>)
michael
parents:
2293
diff
changeset
|
1133 &table_inter_intra[0][0], 2, 1, 1); |
| 483 | 1134 } |
| 2967 | 1135 |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1136 switch(s->msmpeg4_version){ |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1137 case 1: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1138 case 2: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1139 s->decode_mb= msmpeg4v12_decode_mb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1140 break; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1141 case 3: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1142 case 4: |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1143 s->decode_mb= msmpeg4v34_decode_mb; |
|
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1144 break; |
| 936 | 1145 case 5: |
| 1146 s->decode_mb= wmv2_decode_mb; | |
| 2474 | 1147 case 6: |
| 3359 | 1148 //FIXME + TODO VC1 decode mb |
| 936 | 1149 break; |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1150 } |
| 2967 | 1151 |
| 5127 | 1152 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe |
| 2967 | 1153 |
| 0 | 1154 return 0; |
| 1155 } | |
| 1156 | |
| 307 | 1157 int msmpeg4_decode_picture_header(MpegEncContext * s) |
|
300
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1158 { |
| 499 | 1159 int code; |
|
300
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1160 |
| 311 | 1161 #if 0 |
| 1162 { | |
| 1163 int i; | |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
983
diff
changeset
|
1164 for(i=0; i<s->gb.size_in_bits; i++) |
| 3177 | 1165 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb)); |
| 311 | 1166 // get_bits1(&s->gb); |
| 3177 | 1167 av_log(s->avctx, AV_LOG_DEBUG, "END\n"); |
| 311 | 1168 return -1; |
| 1169 } | |
| 1170 #endif | |
| 457 | 1171 |
| 1172 if(s->msmpeg4_version==1){ | |
| 1173 int start_code, num; | |
| 1174 start_code = (get_bits(&s->gb, 16)<<16) | get_bits(&s->gb, 16); | |
| 1175 if(start_code!=0x00000100){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1176 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n"); |
| 457 | 1177 return -1; |
| 1178 } | |
| 1179 | |
| 1180 num= get_bits(&s->gb, 5); // frame number */ | |
| 1181 } | |
| 1182 | |
|
300
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1183 s->pict_type = get_bits(&s->gb, 2) + 1; |
|
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1184 if (s->pict_type != I_TYPE && |
| 457 | 1185 s->pict_type != P_TYPE){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1186 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n"); |
|
300
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1187 return -1; |
| 457 | 1188 } |
| 519 | 1189 #if 0 |
| 1190 { | |
| 1191 static int had_i=0; | |
| 1192 if(s->pict_type == I_TYPE) had_i=1; | |
| 1193 if(!had_i) return -1; | |
| 1194 } | |
| 1195 #endif | |
| 1651 | 1196 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); |
|
1063
fdeac9642346
check for qscale==0 (fixes 1/0 on one corrupted stream)
michaelni
parents:
1057
diff
changeset
|
1197 if(s->qscale==0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1198 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n"); |
|
1063
fdeac9642346
check for qscale==0 (fixes 1/0 on one corrupted stream)
michaelni
parents:
1057
diff
changeset
|
1199 return -1; |
|
fdeac9642346
check for qscale==0 (fixes 1/0 on one corrupted stream)
michaelni
parents:
1057
diff
changeset
|
1200 } |
|
300
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1201 |
|
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1202 if (s->pict_type == I_TYPE) { |
| 2967 | 1203 code = get_bits(&s->gb, 5); |
| 457 | 1204 if(s->msmpeg4_version==1){ |
| 1205 if(code==0 || code>s->mb_height){ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1206 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code); |
| 457 | 1207 return -1; |
| 1208 } | |
| 1209 | |
| 1210 s->slice_height = code; | |
| 1211 }else{ | |
| 1212 /* 0x17: one slice, 0x18: two slices, ... */ | |
| 519 | 1213 if (code < 0x17){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1214 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code); |
| 457 | 1215 return -1; |
| 519 | 1216 } |
| 457 | 1217 |
| 1218 s->slice_height = s->mb_height / (code - 0x16); | |
| 1219 } | |
| 311 | 1220 |
| 1221 switch(s->msmpeg4_version){ | |
| 457 | 1222 case 1: |
| 311 | 1223 case 2: |
| 307 | 1224 s->rl_chroma_table_index = 2; |
| 1225 s->rl_table_index = 2; | |
|
300
d874359e58f1
msmpeg4v2 header parser & some dump bits code behind #if 0
michaelni
parents:
299
diff
changeset
|
1226 |
| 307 | 1227 s->dc_table_index = 0; //not used |
| 311 | 1228 break; |
| 1229 case 3: | |
| 307 | 1230 s->rl_chroma_table_index = decode012(&s->gb); |
| 1231 s->rl_table_index = decode012(&s->gb); | |
| 0 | 1232 |
| 307 | 1233 s->dc_table_index = get_bits1(&s->gb); |
| 311 | 1234 break; |
| 1235 case 4: | |
| 499 | 1236 msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8); |
| 1237 | |
| 578 | 1238 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb); |
| 1239 else s->per_mb_rl_table= 0; | |
| 2967 | 1240 |
| 499 | 1241 if(!s->per_mb_rl_table){ |
| 1242 s->rl_chroma_table_index = decode012(&s->gb); | |
| 1243 s->rl_table_index = decode012(&s->gb); | |
| 311 | 1244 } |
| 1245 | |
| 499 | 1246 s->dc_table_index = get_bits1(&s->gb); |
| 519 | 1247 s->inter_intra_pred= 0; |
| 311 | 1248 break; |
| 307 | 1249 } |
| 0 | 1250 s->no_rounding = 1; |
| 1388 | 1251 if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
| 2979 | 1252 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n", |
| 1253 s->qscale, | |
| 1254 s->rl_chroma_table_index, | |
| 1255 s->rl_table_index, | |
| 1256 s->dc_table_index, | |
| 519 | 1257 s->per_mb_rl_table, |
| 1388 | 1258 s->slice_height); |
| 0 | 1259 } else { |
| 457 | 1260 switch(s->msmpeg4_version){ |
| 1261 case 1: | |
| 1262 case 2: | |
| 1263 if(s->msmpeg4_version==1) | |
| 1264 s->use_skip_mb_code = 1; | |
| 1265 else | |
| 1266 s->use_skip_mb_code = get_bits1(&s->gb); | |
| 307 | 1267 s->rl_table_index = 2; |
| 1268 s->rl_chroma_table_index = s->rl_table_index; | |
| 1269 s->dc_table_index = 0; //not used | |
| 1270 s->mv_table_index = 0; | |
| 457 | 1271 break; |
| 1272 case 3: | |
| 1273 s->use_skip_mb_code = get_bits1(&s->gb); | |
| 307 | 1274 s->rl_table_index = decode012(&s->gb); |
| 1275 s->rl_chroma_table_index = s->rl_table_index; | |
| 0 | 1276 |
| 307 | 1277 s->dc_table_index = get_bits1(&s->gb); |
| 1278 | |
| 1279 s->mv_table_index = get_bits1(&s->gb); | |
| 457 | 1280 break; |
| 499 | 1281 case 4: |
| 1282 s->use_skip_mb_code = get_bits1(&s->gb); | |
| 519 | 1283 |
| 578 | 1284 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb); |
| 1285 else s->per_mb_rl_table= 0; | |
| 519 | 1286 |
| 499 | 1287 if(!s->per_mb_rl_table){ |
| 1288 s->rl_table_index = decode012(&s->gb); | |
| 1289 s->rl_chroma_table_index = s->rl_table_index; | |
| 1290 } | |
| 1291 | |
| 1292 s->dc_table_index = get_bits1(&s->gb); | |
| 1293 | |
| 1294 s->mv_table_index = get_bits1(&s->gb); | |
| 578 | 1295 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); |
| 499 | 1296 break; |
| 307 | 1297 } |
| 2967 | 1298 |
| 1388 | 1299 if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
| 2979 | 1300 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n", |
| 1301 s->use_skip_mb_code, | |
| 1302 s->rl_table_index, | |
| 1303 s->rl_chroma_table_index, | |
| 1304 s->dc_table_index, | |
| 1305 s->mv_table_index, | |
| 519 | 1306 s->per_mb_rl_table, |
| 1388 | 1307 s->qscale); |
| 1308 | |
| 2979 | 1309 if(s->flipflop_rounding){ |
| 1310 s->no_rounding ^= 1; | |
| 1311 }else{ | |
| 1312 s->no_rounding = 0; | |
| 1313 } | |
| 0 | 1314 } |
| 936 | 1315 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height); |
| 499 | 1316 |
| 1317 s->esc3_level_length= 0; | |
| 1318 s->esc3_run_length= 0; | |
| 307 | 1319 |
| 0 | 1320 #ifdef DEBUG |
| 3177 | 1321 av_log(s->avctx, AV_LOG_DEBUG, "*****frame %d:\n", frame_count++); |
| 0 | 1322 #endif |
| 1323 return 0; | |
| 1324 } | |
| 1325 | |
| 208 | 1326 int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size) |
| 1327 { | |
| 457 | 1328 int left= buf_size*8 - get_bits_count(&s->gb); |
| 1329 int length= s->msmpeg4_version>=3 ? 17 : 16; | |
| 208 | 1330 /* the alt_bitstream reader could read over the end so we need to check it */ |
| 457 | 1331 if(left>=length && left<length+8) |
| 208 | 1332 { |
|
251
75091bfc577b
fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents:
246
diff
changeset
|
1333 int fps; |
|
75091bfc577b
fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents:
246
diff
changeset
|
1334 |
|
75091bfc577b
fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents:
246
diff
changeset
|
1335 fps= get_bits(&s->gb, 5); |
| 578 | 1336 s->bit_rate= get_bits(&s->gb, 11)*1024; |
| 457 | 1337 if(s->msmpeg4_version>=3) |
| 1338 s->flipflop_rounding= get_bits1(&s->gb); | |
| 1339 else | |
| 1340 s->flipflop_rounding= 0; | |
|
251
75091bfc577b
fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents:
246
diff
changeset
|
1341 |
| 578 | 1342 // printf("fps:%2d bps:%2d roundingType:%1d\n", fps, s->bit_rate/1024, s->flipflop_rounding); |
| 457 | 1343 } |
| 1344 else if(left<length+8) | |
| 1345 { | |
| 1346 s->flipflop_rounding= 0; | |
| 1399 | 1347 if(s->msmpeg4_version != 2) |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1348 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left); |
| 208 | 1349 } |
| 1350 else | |
| 1351 { | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1352 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n"); |
| 208 | 1353 } |
|
251
75091bfc577b
fixing msmpeg4 decoding if fps < 16 (i thought it was a indicator for the ext header, its the fps indeed)
michaelni
parents:
246
diff
changeset
|
1354 |
| 208 | 1355 return 0; |
| 1356 } | |
| 1357 | |
|
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
429
diff
changeset
|
1358 static inline void msmpeg4_memsetw(short *tab, int val, int n) |
| 0 | 1359 { |
| 1360 int i; | |
| 1361 for(i=0;i<n;i++) | |
| 1362 tab[i] = val; | |
| 1363 } | |
| 1364 | |
| 3777 | 1365 #ifdef CONFIG_ENCODERS |
| 310 | 1366 static void msmpeg4v2_encode_motion(MpegEncContext * s, int val) |
| 1367 { | |
| 1368 int range, bit_size, sign, code, bits; | |
| 1369 | |
| 1370 if (val == 0) { | |
| 1371 /* zero vector */ | |
| 1372 code = 0; | |
| 1373 put_bits(&s->pb, mvtab[code][1], mvtab[code][0]); | |
| 1374 } else { | |
| 1375 bit_size = s->f_code - 1; | |
| 1376 range = 1 << bit_size; | |
| 1377 if (val <= -64) | |
| 1378 val += 64; | |
| 1379 else if (val >= 64) | |
| 1380 val -= 64; | |
| 1381 | |
| 1382 if (val >= 0) { | |
| 1383 sign = 0; | |
| 1384 } else { | |
| 1385 val = -val; | |
| 1386 sign = 1; | |
| 1387 } | |
| 1388 val--; | |
| 1389 code = (val >> bit_size) + 1; | |
| 1390 bits = val & (range - 1); | |
| 1391 | |
| 2967 | 1392 put_bits(&s->pb, mvtab[code][1] + 1, (mvtab[code][0] << 1) | sign); |
| 310 | 1393 if (bit_size > 0) { |
| 1394 put_bits(&s->pb, bit_size, bits); | |
| 1395 } | |
| 1396 } | |
| 1397 } | |
| 3777 | 1398 #endif |
| 310 | 1399 |
| 5129 | 1400 /* This is identical to h263 except that its range is multiplied by 2. */ |
| 307 | 1401 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code) |
| 1402 { | |
| 1403 int code, val, sign, shift; | |
| 1404 | |
| 531 | 1405 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2); |
| 457 | 1406 // printf("MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred); |
| 307 | 1407 if (code < 0) |
| 1408 return 0xffff; | |
| 1409 | |
| 1410 if (code == 0) | |
| 1411 return pred; | |
| 1412 sign = get_bits1(&s->gb); | |
| 1413 shift = f_code - 1; | |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1216
diff
changeset
|
1414 val = code; |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1216
diff
changeset
|
1415 if (shift) { |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1216
diff
changeset
|
1416 val = (val - 1) << shift; |
| 307 | 1417 val |= get_bits(&s->gb, shift); |
|
1255
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1216
diff
changeset
|
1418 val++; |
|
625ccacd1113
decode motion & modulo optimize patch by (BERO <bero at geocities dot co dot jp>)
michaelni
parents:
1216
diff
changeset
|
1419 } |
| 307 | 1420 if (sign) |
| 1421 val = -val; | |
| 457 | 1422 |
| 307 | 1423 val += pred; |
| 1424 if (val <= -64) | |
| 1425 val += 64; | |
| 1426 else if (val >= 64) | |
| 1427 val -= 64; | |
| 1428 | |
| 1429 return val; | |
| 1430 } | |
| 1431 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1432 static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
| 307 | 1433 { |
| 1434 int cbp, code, i; | |
| 2967 | 1435 |
| 307 | 1436 if (s->pict_type == P_TYPE) { |
| 1437 if (s->use_skip_mb_code) { | |
| 1438 if (get_bits1(&s->gb)) { | |
| 1439 /* skip mb */ | |
| 1440 s->mb_intra = 0; | |
| 1441 for(i=0;i<6;i++) | |
| 1442 s->block_last_index[i] = -1; | |
| 1443 s->mv_dir = MV_DIR_FORWARD; | |
| 1444 s->mv_type = MV_TYPE_16X16; | |
| 1445 s->mv[0][0][0] = 0; | |
| 1446 s->mv[0][0][1] = 0; | |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
1447 s->mb_skipped = 1; |
| 307 | 1448 return 0; |
| 1449 } | |
| 1450 } | |
| 1451 | |
| 457 | 1452 if(s->msmpeg4_version==2) |
| 531 | 1453 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1); |
| 457 | 1454 else |
| 531 | 1455 code = get_vlc2(&s->gb, v1_inter_cbpc_vlc.table, V1_INTER_CBPC_VLC_BITS, 3); |
| 457 | 1456 if(code<0 || code>7){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1457 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y); |
| 457 | 1458 return -1; |
| 1459 } | |
| 1460 | |
| 307 | 1461 s->mb_intra = code >>2; |
| 2967 | 1462 |
| 307 | 1463 cbp = code & 0x3; |
| 1464 } else { | |
| 1465 s->mb_intra = 1; | |
| 457 | 1466 if(s->msmpeg4_version==2) |
| 531 | 1467 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1); |
| 457 | 1468 else |
| 531 | 1469 cbp= get_vlc2(&s->gb, v1_intra_cbpc_vlc.table, V1_INTRA_CBPC_VLC_BITS, 1); |
| 457 | 1470 if(cbp<0 || cbp>3){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1471 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); |
| 457 | 1472 return -1; |
| 1473 } | |
| 307 | 1474 } |
| 1475 | |
| 1476 if (!s->mb_intra) { | |
| 457 | 1477 int mx, my, cbpy; |
| 2967 | 1478 |
| 531 | 1479 cbpy= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); |
| 457 | 1480 if(cbpy<0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1481 av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y); |
| 457 | 1482 return -1; |
| 1483 } | |
| 307 | 1484 |
| 457 | 1485 cbp|= cbpy<<2; |
| 1486 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C; | |
| 2967 | 1487 |
|
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1739
diff
changeset
|
1488 h263_pred_motion(s, 0, 0, &mx, &my); |
| 307 | 1489 mx= msmpeg4v2_decode_motion(s, mx, 1); |
| 1490 my= msmpeg4v2_decode_motion(s, my, 1); | |
| 2967 | 1491 |
| 307 | 1492 s->mv_dir = MV_DIR_FORWARD; |
| 1493 s->mv_type = MV_TYPE_16X16; | |
| 1494 s->mv[0][0][0] = mx; | |
| 1495 s->mv[0][0][1] = my; | |
| 1496 } else { | |
| 457 | 1497 if(s->msmpeg4_version==2){ |
| 1498 s->ac_pred = get_bits1(&s->gb); | |
| 531 | 1499 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors |
| 457 | 1500 } else{ |
| 1501 s->ac_pred = 0; | |
| 531 | 1502 cbp|= get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors |
| 457 | 1503 if(s->pict_type==P_TYPE) cbp^=0x3C; |
| 1504 } | |
| 307 | 1505 } |
| 1506 | |
| 2632 | 1507 s->dsp.clear_blocks(s->block[0]); |
| 307 | 1508 for (i = 0; i < 6; i++) { |
| 936 | 1509 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
| 2979 | 1510 { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1511 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
| 307 | 1512 return -1; |
| 2979 | 1513 } |
| 307 | 1514 } |
| 1515 return 0; | |
| 1516 } | |
| 1517 | |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1518 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
| 0 | 1519 { |
| 1520 int cbp, code, i; | |
| 1064 | 1521 uint8_t *coded_val; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1522 uint32_t * const mb_type_ptr= &s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride ]; |
| 0 | 1523 |
| 1524 if (s->pict_type == P_TYPE) { | |
| 1525 if (s->use_skip_mb_code) { | |
| 21 | 1526 if (get_bits1(&s->gb)) { |
| 0 | 1527 /* skip mb */ |
| 1528 s->mb_intra = 0; | |
| 1529 for(i=0;i<6;i++) | |
| 1530 s->block_last_index[i] = -1; | |
| 1531 s->mv_dir = MV_DIR_FORWARD; | |
| 1532 s->mv_type = MV_TYPE_16X16; | |
| 1533 s->mv[0][0][0] = 0; | |
| 1534 s->mv[0][0][1] = 0; | |
|
2628
511e3afc43e1
Ministry of English Composition, reporting for duty (and the word is "skipped", not "skiped"; "skiped" would rhyme with "hyped")
melanson
parents:
2615
diff
changeset
|
1535 s->mb_skipped = 1; |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1536 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16; |
|
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1537 |
| 0 | 1538 return 0; |
| 1539 } | |
| 1540 } | |
| 2967 | 1541 |
| 936 | 1542 code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3); |
| 0 | 1543 if (code < 0) |
| 1544 return -1; | |
| 2979 | 1545 //s->mb_intra = (code & 0x40) ? 0 : 1; |
| 1546 s->mb_intra = (~code & 0x40) >> 6; | |
| 2967 | 1547 |
| 0 | 1548 cbp = code & 0x3f; |
| 1549 } else { | |
| 1550 s->mb_intra = 1; | |
| 2474 | 1551 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); |
| 0 | 1552 if (code < 0) |
| 1553 return -1; | |
| 1554 /* predict coded block pattern */ | |
| 1555 cbp = 0; | |
| 1556 for(i=0;i<6;i++) { | |
| 246 | 1557 int val = ((code >> (5 - i)) & 1); |
| 0 | 1558 if (i < 4) { |
| 246 | 1559 int pred = coded_block_pred(s, i, &coded_val); |
| 0 | 1560 val = val ^ pred; |
| 1561 *coded_val = val; | |
| 1562 } | |
| 1563 cbp |= val << (5 - i); | |
| 1564 } | |
| 1565 } | |
| 1566 | |
| 1567 if (!s->mb_intra) { | |
| 1568 int mx, my; | |
| 499 | 1569 //printf("P at %d %d\n", s->mb_x, s->mb_y); |
| 1570 if(s->per_mb_rl_table && cbp){ | |
| 1571 s->rl_table_index = decode012(&s->gb); | |
| 1572 s->rl_chroma_table_index = s->rl_table_index; | |
| 1573 } | |
|
1938
e2501e6e7ff7
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
michael
parents:
1739
diff
changeset
|
1574 h263_pred_motion(s, 0, 0, &mx, &my); |
| 0 | 1575 if (msmpeg4_decode_motion(s, &mx, &my) < 0) |
| 1576 return -1; | |
| 1577 s->mv_dir = MV_DIR_FORWARD; | |
| 1578 s->mv_type = MV_TYPE_16X16; | |
| 1579 s->mv[0][0][0] = mx; | |
| 1580 s->mv[0][0][1] = my; | |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1581 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16; |
| 0 | 1582 } else { |
| 499 | 1583 //printf("I at %d %d %d %06X\n", s->mb_x, s->mb_y, ((cbp&3)? 1 : 0) +((cbp&0x3C)? 2 : 0), show_bits(&s->gb, 24)); |
| 21 | 1584 s->ac_pred = get_bits1(&s->gb); |
|
1177
fea03d2c4946
simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents:
1164
diff
changeset
|
1585 *mb_type_ptr = MB_TYPE_INTRA; |
| 519 | 1586 if(s->inter_intra_pred){ |
| 531 | 1587 s->h263_aic_dir= get_vlc2(&s->gb, inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1); |
| 519 | 1588 // printf("%d%d %d %d/", s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); |
| 1589 } | |
| 499 | 1590 if(s->per_mb_rl_table && cbp){ |
| 1591 s->rl_table_index = decode012(&s->gb); | |
| 1592 s->rl_chroma_table_index = s->rl_table_index; | |
| 1593 } | |
| 0 | 1594 } |
| 1595 | |
| 2632 | 1596 s->dsp.clear_blocks(s->block[0]); |
| 0 | 1597 for (i = 0; i < 6; i++) { |
| 936 | 1598 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
| 2979 | 1599 { |
| 1600 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); | |
| 1601 return -1; | |
| 1602 } | |
| 0 | 1603 } |
| 2967 | 1604 |
| 0 | 1605 return 0; |
| 1606 } | |
| 563 | 1607 //#define ERROR_DETAILS |
| 499 | 1608 static inline int msmpeg4_decode_block(MpegEncContext * s, DCTELEM * block, |
| 936 | 1609 int n, int coded, const uint8_t *scan_table) |
| 0 | 1610 { |
| 542 | 1611 int level, i, last, run, run_diff; |
| 0 | 1612 int dc_pred_dir; |
| 1613 RLTable *rl; | |
| 542 | 1614 RL_VLC_ELEM *rl_vlc; |
| 200 | 1615 int qmul, qadd; |
| 0 | 1616 |
| 1617 if (s->mb_intra) { | |
| 200 | 1618 qmul=1; |
| 1619 qadd=0; | |
| 1620 | |
| 2979 | 1621 /* DC coef */ |
| 0 | 1622 level = msmpeg4_decode_dc(s, n, &dc_pred_dir); |
| 2967 | 1623 |
| 457 | 1624 if (level < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1625 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale); |
| 519 | 1626 if(s->inter_intra_pred) level=0; |
| 1627 else return -1; | |
| 457 | 1628 } |
| 0 | 1629 if (n < 4) { |
| 1630 rl = &rl_table[s->rl_table_index]; | |
| 457 | 1631 if(level > 256*s->y_dc_scale){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1632 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale); |
| 519 | 1633 if(!s->inter_intra_pred) return -1; |
| 457 | 1634 } |
| 0 | 1635 } else { |
| 1636 rl = &rl_table[3 + s->rl_chroma_table_index]; | |
| 457 | 1637 if(level > 256*s->c_dc_scale){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1638 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale); |
| 519 | 1639 if(!s->inter_intra_pred) return -1; |
| 457 | 1640 } |
| 0 | 1641 } |
| 457 | 1642 block[0] = level; |
| 200 | 1643 |
| 0 | 1644 run_diff = 0; |
| 542 | 1645 i = 0; |
| 0 | 1646 if (!coded) { |
| 1647 goto not_coded; | |
| 1648 } | |
| 1649 if (s->ac_pred) { | |
| 2967 | 1650 if (dc_pred_dir == 0) |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
601
diff
changeset
|
1651 scan_table = s->intra_v_scantable.permutated; /* left */ |
| 0 | 1652 else |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
601
diff
changeset
|
1653 scan_table = s->intra_h_scantable.permutated; /* top */ |
| 0 | 1654 } else { |
|
706
e65798d228ea
idct permutation cleanup, idct can be selected per context now
michaelni
parents:
601
diff
changeset
|
1655 scan_table = s->intra_scantable.permutated; |
| 0 | 1656 } |
| 542 | 1657 rl_vlc= rl->rl_vlc[0]; |
| 0 | 1658 } else { |
| 200 | 1659 qmul = s->qscale << 1; |
| 1660 qadd = (s->qscale - 1) | 1; | |
| 542 | 1661 i = -1; |
| 0 | 1662 rl = &rl_table[3 + s->rl_table_index]; |
| 307 | 1663 |
| 1664 if(s->msmpeg4_version==2) | |
| 1665 run_diff = 0; | |
| 1666 else | |
| 1667 run_diff = 1; | |
| 1668 | |
| 0 | 1669 if (!coded) { |
| 542 | 1670 s->block_last_index[n] = i; |
| 0 | 1671 return 0; |
| 1672 } | |
| 936 | 1673 if(!scan_table) |
| 1674 scan_table = s->inter_scantable.permutated; | |
| 542 | 1675 rl_vlc= rl->rl_vlc[s->qscale]; |
| 0 | 1676 } |
| 542 | 1677 { |
| 1678 OPEN_READER(re, &s->gb); | |
| 0 | 1679 for(;;) { |
| 542 | 1680 UPDATE_CACHE(re, &s->gb); |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2474
diff
changeset
|
1681 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0); |
| 542 | 1682 if (level==0) { |
| 1683 int cache; | |
| 1684 cache= GET_CACHE(re, &s->gb); | |
| 0 | 1685 /* escape */ |
| 542 | 1686 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) { |
| 1687 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) { | |
| 0 | 1688 /* third escape */ |
| 542 | 1689 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2); |
| 1690 UPDATE_CACHE(re, &s->gb); | |
| 499 | 1691 if(s->msmpeg4_version<=3){ |
| 542 | 1692 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); |
| 1693 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6); | |
| 1694 level= SHOW_SBITS(re, &s->gb, 8); LAST_SKIP_CACHE(re, &s->gb, 8); | |
| 1695 SKIP_COUNTER(re, &s->gb, 1+6+8); | |
| 2967 | 1696 }else{ |
| 499 | 1697 int sign; |
| 542 | 1698 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1); |
| 499 | 1699 if(!s->esc3_level_length){ |
| 1700 int ll; | |
| 1701 //printf("ESC-3 %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y); | |
| 1702 if(s->qscale<8){ | |
| 542 | 1703 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3); |
| 499 | 1704 if(ll==0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1705 if(SHOW_UBITS(re, &s->gb, 1)) av_log(s->avctx, AV_LOG_ERROR, "cool a new vlc code ,contact the ffmpeg developers and upload the file\n"); |
| 542 | 1706 SKIP_BITS(re, &s->gb, 1); |
| 499 | 1707 ll=8; |
| 1708 } | |
| 1709 }else{ | |
| 1710 ll=2; | |
| 542 | 1711 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){ |
| 1712 ll++; | |
| 1713 SKIP_BITS(re, &s->gb, 1); | |
| 1714 } | |
| 578 | 1715 if(ll<8) SKIP_BITS(re, &s->gb, 1); |
| 499 | 1716 } |
| 1717 | |
| 1718 s->esc3_level_length= ll; | |
| 542 | 1719 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2); |
| 499 | 1720 //printf("level length:%d, run length: %d\n", ll, s->esc3_run_length); |
| 578 | 1721 UPDATE_CACHE(re, &s->gb); |
| 499 | 1722 } |
| 2967 | 1723 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length); |
| 542 | 1724 SKIP_BITS(re, &s->gb, s->esc3_run_length); |
| 2967 | 1725 |
| 1726 sign= SHOW_UBITS(re, &s->gb, 1); | |
| 542 | 1727 SKIP_BITS(re, &s->gb, 1); |
| 2967 | 1728 |
| 1729 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length); | |
| 542 | 1730 SKIP_BITS(re, &s->gb, s->esc3_level_length); |
| 499 | 1731 if(sign) level= -level; |
| 1732 } | |
| 1733 //printf("level: %d, run: %d at %d %d\n", level, run, s->mb_x, s->mb_y); | |
| 457 | 1734 #if 0 // waste of time / this will detect very few errors |
| 1735 { | |
| 4001 | 1736 const int abs_level= FFABS(level); |
| 457 | 1737 const int run1= run - rl->max_run[last][abs_level] - run_diff; |
| 1738 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){ | |
| 1739 if(abs_level <= rl->max_level[last][run]){ | |
| 3177 | 1740 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n"); |
| 457 | 1741 return DECODING_AC_LOST; |
| 1742 } | |
| 1743 if(abs_level <= rl->max_level[last][run]*2){ | |
| 3177 | 1744 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n"); |
| 457 | 1745 return DECODING_AC_LOST; |
| 1746 } | |
| 499 | 1747 if(run1>=0 && abs_level <= rl->max_level[last][run1]){ |
| 3177 | 1748 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n"); |
| 457 | 1749 return DECODING_AC_LOST; |
| 1750 } | |
| 1751 } | |
| 1752 } | |
| 1753 #endif | |
| 2979 | 1754 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ; |
| 1755 if (level>0) level= level * qmul + qadd; | |
| 457 | 1756 else level= level * qmul - qadd; |
| 1757 #if 0 // waste of time too :( | |
| 1758 if(level>2048 || level<-2048){ | |
| 3177 | 1759 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n"); |
| 457 | 1760 return DECODING_AC_LOST; |
| 1761 } | |
| 1762 #endif | |
| 542 | 1763 i+= run + 1; |
| 1764 if(last) i+=192; | |
| 563 | 1765 #ifdef ERROR_DETAILS |
| 1766 if(run==66) | |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1767 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level); |
| 563 | 1768 else if((i>62 && i<192) || i>192+63) |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1769 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level); |
| 563 | 1770 #endif |
| 0 | 1771 } else { |
| 1772 /* second escape */ | |
| 542 | 1773 #if MIN_CACHE_BITS < 23 |
| 1774 LAST_SKIP_BITS(re, &s->gb, 2); | |
| 1775 UPDATE_CACHE(re, &s->gb); | |
| 1776 #else | |
| 1777 SKIP_BITS(re, &s->gb, 2); | |
| 1778 #endif | |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2474
diff
changeset
|
1779 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
| 542 | 1780 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing |
| 1781 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1782 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 563 | 1783 #ifdef ERROR_DETAILS |
| 1784 if(run==66) | |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1785 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level); |
| 563 | 1786 else if((i>62 && i<192) || i>192+63) |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1787 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level); |
| 563 | 1788 #endif |
| 0 | 1789 } |
| 1790 } else { | |
| 1791 /* first escape */ | |
| 542 | 1792 #if MIN_CACHE_BITS < 22 |
| 1793 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 1794 UPDATE_CACHE(re, &s->gb); | |
| 1795 #else | |
| 1796 SKIP_BITS(re, &s->gb, 1); | |
| 1797 #endif | |
|
2615
0d88e3f89379
avoid UPDATE_CACHE() in GET_RL_VLC() if not needed
michael
parents:
2474
diff
changeset
|
1798 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1); |
| 542 | 1799 i+= run; |
| 1800 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing | |
| 1801 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1802 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 563 | 1803 #ifdef ERROR_DETAILS |
| 1804 if(run==66) | |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1805 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level); |
| 563 | 1806 else if((i>62 && i<192) || i>192+63) |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1807 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level); |
| 563 | 1808 #endif |
| 0 | 1809 } |
| 1810 } else { | |
| 542 | 1811 i+= run; |
| 1812 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1); | |
| 1813 LAST_SKIP_BITS(re, &s->gb, 1); | |
| 563 | 1814 #ifdef ERROR_DETAILS |
| 1815 if(run==66) | |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1816 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level); |
| 563 | 1817 else if((i>62 && i<192) || i>192+63) |
|
2846
40765c51a7a9
Compilation fixes part 1 patch by (Arvind R. and Burkhard Plaum, plaum, ipf uni-stuttgart de)
michael
parents:
2639
diff
changeset
|
1818 av_log(s->avctx, AV_LOG_ERROR, "run overflow i=%d run=%d level=%d\n", i, run, level); |
| 563 | 1819 #endif |
| 0 | 1820 } |
| 542 | 1821 if (i > 62){ |
| 1822 i-= 192; | |
| 1823 if(i&(~63)){ | |
|
1025
1f9afd8b9131
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless *8 in a few inner loops
michaelni
parents:
983
diff
changeset
|
1824 const int left= s->gb.size_in_bits - get_bits_count(&s->gb); |
|
745
25d7fb7c89be
better/cleaner error resilience (done in a 2nd pass after decoding)
michaelni
parents:
743
diff
changeset
|
1825 if(((i+192 == 64 && level/qmul==-1) || s->error_resilience<=1) && left>=0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1826 av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y); |
| 563 | 1827 break; |
| 1828 }else{ | |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1829 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y); |
| 563 | 1830 return -1; |
| 1831 } | |
| 542 | 1832 } |
| 1833 | |
| 1834 block[scan_table[i]] = level; | |
| 1835 break; | |
| 499 | 1836 } |
| 457 | 1837 |
| 542 | 1838 block[scan_table[i]] = level; |
| 0 | 1839 } |
| 542 | 1840 CLOSE_READER(re, &s->gb); |
| 1841 } | |
| 0 | 1842 not_coded: |
| 1843 if (s->mb_intra) { | |
| 1844 mpeg4_pred_ac(s, block, n, dc_pred_dir); | |
| 1845 if (s->ac_pred) { | |
| 542 | 1846 i = 63; /* XXX: not optimal */ |
| 0 | 1847 } |
| 1848 } | |
| 936 | 1849 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize |
| 542 | 1850 s->block_last_index[n] = i; |
| 2967 | 1851 |
| 0 | 1852 return 0; |
| 1853 } | |
| 1854 | |
| 1855 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) | |
| 1856 { | |
| 1857 int level, pred; | |
| 1858 | |
| 457 | 1859 if(s->msmpeg4_version<=2){ |
| 307 | 1860 if (n < 4) { |
| 531 | 1861 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3); |
| 307 | 1862 } else { |
| 531 | 1863 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3); |
| 307 | 1864 } |
| 2967 | 1865 if (level < 0) |
| 307 | 1866 return -1; |
| 1867 level-=256; | |
| 1868 }else{ //FIXME optimize use unified tables & index | |
| 1869 if (n < 4) { | |
| 2474 | 1870 level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); |
| 307 | 1871 } else { |
| 2474 | 1872 level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); |
| 307 | 1873 } |
| 457 | 1874 if (level < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1875 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); |
| 307 | 1876 return -1; |
| 457 | 1877 } |
| 307 | 1878 |
| 1879 if (level == DC_MAX) { | |
| 1880 level = get_bits(&s->gb, 8); | |
| 1881 if (get_bits1(&s->gb)) | |
| 1882 level = -level; | |
| 1883 } else if (level != 0) { | |
| 1884 if (get_bits1(&s->gb)) | |
| 1885 level = -level; | |
| 1886 } | |
| 0 | 1887 } |
| 1888 | |
| 457 | 1889 if(s->msmpeg4_version==1){ |
| 1064 | 1890 int32_t *dc_val; |
| 457 | 1891 pred = msmpeg4v1_pred_dc(s, n, &dc_val); |
| 1892 level += pred; | |
| 2967 | 1893 |
| 457 | 1894 /* update predictor */ |
| 1895 *dc_val= level; | |
| 1896 }else{ | |
| 3781 | 1897 int16_t *dc_val; |
|
501
2241bce35bb9
fixing wmv1 bugs, it was foolish to belive that m$ would use the same dc prediction as mpeg4 just cuz they changed it a bit from msmpeg4v3
michaelni
parents:
499
diff
changeset
|
1898 pred = msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); |
| 457 | 1899 level += pred; |
| 0 | 1900 |
| 457 | 1901 /* update predictor */ |
| 1902 if (n < 4) { | |
| 1903 *dc_val = level * s->y_dc_scale; | |
| 1904 } else { | |
| 1905 *dc_val = level * s->c_dc_scale; | |
| 1906 } | |
| 0 | 1907 } |
| 1908 | |
| 1909 return level; | |
| 1910 } | |
| 1911 | |
| 2967 | 1912 static int msmpeg4_decode_motion(MpegEncContext * s, |
| 0 | 1913 int *mx_ptr, int *my_ptr) |
| 1914 { | |
| 1915 MVTable *mv; | |
| 1916 int code, mx, my; | |
| 1917 | |
| 1918 mv = &mv_tables[s->mv_table_index]; | |
| 1919 | |
| 531 | 1920 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2); |
| 499 | 1921 if (code < 0){ |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1399
diff
changeset
|
1922 av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y); |
| 0 | 1923 return -1; |
| 499 | 1924 } |
| 0 | 1925 if (code == mv->n) { |
| 499 | 1926 //printf("MV ESC %X at %d %d\n", show_bits(&s->gb, 24), s->mb_x, s->mb_y); |
| 0 | 1927 mx = get_bits(&s->gb, 6); |
| 1928 my = get_bits(&s->gb, 6); | |
| 1929 } else { | |
| 1930 mx = mv->table_mvx[code]; | |
| 1931 my = mv->table_mvy[code]; | |
| 1932 } | |
| 1933 | |
| 1934 mx += *mx_ptr - 32; | |
| 1935 my += *my_ptr - 32; | |
| 1936 /* WARNING : they do not do exactly modulo encoding */ | |
| 1937 if (mx <= -64) | |
| 1938 mx += 64; | |
| 1939 else if (mx >= 64) | |
| 1940 mx -= 64; | |
| 1941 | |
| 1942 if (my <= -64) | |
| 1943 my += 64; | |
| 1944 else if (my >= 64) | |
| 1945 my -= 64; | |
| 1946 *mx_ptr = mx; | |
| 1947 *my_ptr = my; | |
| 1948 return 0; | |
| 1949 } | |
| 936 | 1950 |
| 1951 /* cleanest way to support it | |
| 1952 * there is too much shared between versions so that we cant have 1 file per version & 1 common | |
| 2967 | 1953 * as allmost everything would be in the common file |
| 936 | 1954 */ |
| 1955 #include "wmv2.c" |
