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;