Mercurial > libavcodec.hg
comparison rv10.c @ 622:a1e54c24f221 libavcodec
working around undefined behavior of get-vlc if the vlc s invalid
more debug output by default for errors (so we can see immedeatly whats wrong on bugreports)
guess long_vectors mode
author | michaelni |
---|---|
date | Wed, 28 Aug 2002 12:23:12 +0000 |
parents | 980b661a494a |
children | 35353e4520d8 |
comparison
equal
deleted
inserted
replaced
621:980b661a494a | 622:a1e54c24f221 |
---|---|
20 #include "dsputil.h" | 20 #include "dsputil.h" |
21 #include "mpegvideo.h" | 21 #include "mpegvideo.h" |
22 | 22 |
23 //#define DEBUG | 23 //#define DEBUG |
24 | 24 |
25 #define DC_VLC_BITS 9 | 25 #define DC_VLC_BITS 14 //FIXME find a better solution |
26 | 26 |
27 static const UINT16 rv_lum_code[256] = | 27 static const UINT16 rv_lum_code[256] = |
28 { | 28 { |
29 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, | 29 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06, |
30 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e, | 30 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e, |
208 code = -128 + get_bits(&s->gb, 7); | 208 code = -128 + get_bits(&s->gb, 7); |
209 } else if (code == 0x1fe) { | 209 } else if (code == 0x1fe) { |
210 get_bits(&s->gb, 9); | 210 get_bits(&s->gb, 9); |
211 code = 1; | 211 code = 1; |
212 } else { | 212 } else { |
213 fprintf(stderr, "chroma dc error\n"); | |
213 return 0xffff; | 214 return 0xffff; |
214 } | 215 } |
215 } else { | 216 } else { |
216 code -= 128; | 217 code -= 128; |
217 } | 218 } |
259 | 260 |
260 /* read RV 1.0 compatible frame header */ | 261 /* read RV 1.0 compatible frame header */ |
261 static int rv10_decode_picture_header(MpegEncContext *s) | 262 static int rv10_decode_picture_header(MpegEncContext *s) |
262 { | 263 { |
263 int mb_count, pb_frame, marker, h, full_frame; | 264 int mb_count, pb_frame, marker, h, full_frame; |
265 int pic_num, unk; | |
264 | 266 |
265 /* skip packet header */ | 267 /* skip packet header */ |
266 h = get_bits(&s->gb, 8); | 268 h = get_bits(&s->gb, 8); |
267 if ((h & 0xc0) == 0xc0) { | 269 if ((h & 0xc0) == 0xc0) { |
268 int len, pos; | 270 int len, pos; |
269 full_frame = 1; | 271 full_frame = 1; |
270 len = get_num(&s->gb); | 272 len = get_num(&s->gb); |
271 pos = get_num(&s->gb); | 273 pos = get_num(&s->gb); |
274 //printf("pos:%d\n",len); | |
272 } else { | 275 } else { |
273 int seq, frame_size, pos; | 276 int seq, frame_size, pos; |
274 full_frame = 0; | 277 full_frame = 0; |
275 seq = get_bits(&s->gb, 8); | 278 seq = get_bits(&s->gb, 8); |
276 frame_size = get_num(&s->gb); | 279 frame_size = get_num(&s->gb); |
277 pos = get_num(&s->gb); | 280 pos = get_num(&s->gb); |
281 //printf("seq:%d, size:%d, pos:%d\n",seq,frame_size,pos); | |
278 } | 282 } |
279 /* picture number */ | 283 /* picture number */ |
280 get_bits(&s->gb, 8); | 284 pic_num= get_bits(&s->gb, 8); |
281 | 285 |
282 marker = get_bits(&s->gb, 1); | 286 marker = get_bits(&s->gb, 1); |
283 | 287 |
284 if (get_bits(&s->gb, 1)) | 288 if (get_bits(&s->gb, 1)) |
285 s->pict_type = P_TYPE; | 289 s->pict_type = P_TYPE; |
286 else | 290 else |
287 s->pict_type = I_TYPE; | 291 s->pict_type = I_TYPE; |
288 | 292 //printf("h:%d ver:%d\n",h,s->rv10_version); |
293 if(!marker) printf("marker missing\n"); | |
289 pb_frame = get_bits(&s->gb, 1); | 294 pb_frame = get_bits(&s->gb, 1); |
290 | 295 |
291 #ifdef DEBUG | 296 #ifdef DEBUG |
292 printf("pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame); | 297 printf("pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame); |
293 #endif | 298 #endif |
294 | 299 |
295 if (pb_frame) | 300 if (pb_frame){ |
301 fprintf(stderr, "pb frame not supported\n"); | |
296 return -1; | 302 return -1; |
303 } | |
297 | 304 |
298 s->qscale = get_bits(&s->gb, 5); | 305 s->qscale = get_bits(&s->gb, 5); |
299 if(s->qscale==0){ | 306 if(s->qscale==0){ |
300 fprintf(stderr, "error, qscale:0\n"); | 307 fprintf(stderr, "error, qscale:0\n"); |
301 return -1; | 308 return -1; |
324 } else { | 331 } else { |
325 s->mb_x = 0; | 332 s->mb_x = 0; |
326 s->mb_y = 0; | 333 s->mb_y = 0; |
327 mb_count = s->mb_width * s->mb_height; | 334 mb_count = s->mb_width * s->mb_height; |
328 } | 335 } |
329 //printf("%d\n", get_bits(&s->gb, 3)); | 336 unk= get_bits(&s->gb, 3); /* ignored */ |
330 get_bits(&s->gb, 3); /* ignored */ | 337 //printf("%d\n", unk); |
338 s->h263_long_vectors = s->mb_num<100; //FIXME check if this is ok (100 i just guessed) | |
331 s->f_code = 1; | 339 s->f_code = 1; |
332 s->unrestricted_mv = 1; | 340 s->unrestricted_mv = 1; |
333 #if 0 | 341 #if 0 |
334 s->h263_long_vectors = 1; | 342 s->h263_long_vectors = 1; |
335 #endif | 343 #endif |
403 | 411 |
404 init_get_bits(&s->gb, buf, buf_size); | 412 init_get_bits(&s->gb, buf, buf_size); |
405 | 413 |
406 mb_count = rv10_decode_picture_header(s); | 414 mb_count = rv10_decode_picture_header(s); |
407 if (mb_count < 0) { | 415 if (mb_count < 0) { |
408 #ifdef DEBUG | 416 fprintf(stderr, "HEADER ERROR\n"); |
409 printf("HEADER ERROR\n"); | |
410 #endif | |
411 return -1; | 417 return -1; |
412 } | 418 } |
413 | 419 |
414 if (s->mb_x >= s->mb_width || | 420 if (s->mb_x >= s->mb_width || |
415 s->mb_y >= s->mb_height) { | 421 s->mb_y >= s->mb_height) { |
416 #ifdef DEBUG | 422 fprintf(stderr, "POS ERROR %d %d\n", s->mb_x, s->mb_y); |
417 printf("POS ERROR %d %d\n", s->mb_x, s->mb_y); | |
418 #endif | |
419 return -1; | 423 return -1; |
420 } | 424 } |
421 mb_pos = s->mb_y * s->mb_width + s->mb_x; | 425 mb_pos = s->mb_y * s->mb_width + s->mb_x; |
422 left = s->mb_width * s->mb_height - mb_pos; | 426 left = s->mb_width * s->mb_height - mb_pos; |
423 if (mb_count > left) { | 427 if (mb_count > left) { |
424 #ifdef DEBUG | 428 fprintf(stderr, "COUNT ERROR\n"); |
425 printf("COUNT ERROR\n"); | |
426 #endif | |
427 return -1; | 429 return -1; |
428 } | 430 } |
429 | 431 |
430 if (s->mb_x == 0 && s->mb_y == 0) { | 432 if (s->mb_x == 0 && s->mb_y == 0) { |
431 MPV_frame_start(s, avctx); | 433 MPV_frame_start(s, avctx); |
468 | 470 |
469 memset(block, 0, sizeof(block)); | 471 memset(block, 0, sizeof(block)); |
470 s->mv_dir = MV_DIR_FORWARD; | 472 s->mv_dir = MV_DIR_FORWARD; |
471 s->mv_type = MV_TYPE_16X16; | 473 s->mv_type = MV_TYPE_16X16; |
472 if (h263_decode_mb(s, block) < 0) { | 474 if (h263_decode_mb(s, block) < 0) { |
473 #ifdef DEBUG | 475 fprintf(stderr, "ERROR at MB %d %d\n", s->mb_x, s->mb_y); |
474 printf("ERROR\n"); | |
475 #endif | |
476 return -1; | 476 return -1; |
477 } | 477 } |
478 MPV_decode_mb(s, block); | 478 MPV_decode_mb(s, block); |
479 if (++s->mb_x == s->mb_width) { | 479 if (++s->mb_x == s->mb_width) { |
480 s->mb_x = 0; | 480 s->mb_x = 0; |