comparison rv10.c @ 1639:3e2b774edce4 libavcodec

rv20 decoder
author michael
date Sun, 30 Nov 2003 14:35:35 +0000
parents 932d306bf1dc
children 3bc71266e644
comparison
equal deleted inserted replaced
1638:e389d57db630 1639:3e2b774edce4
335 s->unrestricted_mv = 1; 335 s->unrestricted_mv = 1;
336 336
337 return mb_count; 337 return mb_count;
338 } 338 }
339 339
340 static int rv20_decode_picture_header(MpegEncContext *s)
341 {
342 int pb_frame, seq, mb_pos;
343 int i;
344
345 if (get_bits(&s->gb, 1))
346 s->pict_type = P_TYPE;
347 else
348 s->pict_type = I_TYPE;
349
350 pb_frame = get_bits(&s->gb, 2);
351
352 if (pb_frame){
353 av_log(s->avctx, AV_LOG_ERROR, "pb frame not supported\n");
354 return -1;
355 }
356
357 s->qscale = get_bits(&s->gb, 5);
358 if(s->qscale==0){
359 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
360 return -1;
361 }
362
363 seq= get_bits(&s->gb, 8);
364
365 for(i=0; i<6; i++){
366 if(s->mb_width*s->mb_height < ff_mba_max[i]) break;
367 }
368 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
369 s->mb_x= mb_pos % s->mb_width;
370 s->mb_y= mb_pos / s->mb_width;
371 s->no_rounding= get_bits1(&s->gb);
372
373 s->f_code = 1;
374 s->unrestricted_mv = 1;
375 s->h263_aic= s->pict_type == I_TYPE;
376 // s->alt_inter_vlc=1;
377 // s->obmc=1;
378 // s->umvplus=1;
379 // s->modified_quant=1;
380
381 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
382 av_log(s->avctx, AV_LOG_INFO, "num:%3d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
383 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding);
384 }
385
386 return s->mb_width*s->mb_height - mb_pos;
387 }
388
340 static int rv10_decode_init(AVCodecContext *avctx) 389 static int rv10_decode_init(AVCodecContext *avctx)
341 { 390 {
342 MpegEncContext *s = avctx->priv_data; 391 MpegEncContext *s = avctx->priv_data;
343 static int done=0; 392 static int done=0;
344 393
346 s->out_format = FMT_H263; 395 s->out_format = FMT_H263;
347 396
348 s->width = avctx->width; 397 s->width = avctx->width;
349 s->height = avctx->height; 398 s->height = avctx->height;
350 399
351 s->h263_rv10 = 1;
352 switch(avctx->sub_id){ 400 switch(avctx->sub_id){
353 case 0x10000000: 401 case 0x10000000:
354 s->rv10_version= 0; 402 s->rv10_version= 0;
355 s->h263_long_vectors=0; 403 s->h263_long_vectors=0;
404 s->h263_rv10 = 1;
356 break; 405 break;
357 case 0x10003000: 406 case 0x10003000:
358 s->rv10_version= 3; 407 s->rv10_version= 3;
359 s->h263_long_vectors=1; 408 s->h263_long_vectors=1;
409 s->h263_rv10 = 1;
360 break; 410 break;
361 case 0x10003001: 411 case 0x10003001:
362 s->rv10_version= 3; 412 s->rv10_version= 3;
363 s->h263_long_vectors=0; 413 s->h263_long_vectors=0;
414 s->h263_rv10 = 1;
364 break; 415 break;
416 case 0x20001000:
417 case 0x20100001:
418 case 0x20200002:
419 case 0x20101001: //added
365 default: 420 default:
366 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id); 421 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id);
367 } 422 }
368 //printf("ver:%X\n", avctx->sub_id); 423 //printf("ver:%X\n", avctx->sub_id);
369 s->flags= avctx->flags; 424 s->flags= avctx->flags;
371 if (MPV_common_init(s) < 0) 426 if (MPV_common_init(s) < 0)
372 return -1; 427 return -1;
373 428
374 h263_decode_init_vlc(s); 429 h263_decode_init_vlc(s);
375 430
376 s->y_dc_scale_table=
377 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
378 s->progressive_sequence=1; 431 s->progressive_sequence=1;
379 432
380 /* init rv vlc */ 433 /* init rv vlc */
381 if (!done) { 434 if (!done) {
382 init_vlc(&rv_dc_lum, DC_VLC_BITS, 256, 435 init_vlc(&rv_dc_lum, DC_VLC_BITS, 256,
406 { 459 {
407 MpegEncContext *s = avctx->priv_data; 460 MpegEncContext *s = avctx->priv_data;
408 int i, mb_count, mb_pos, left; 461 int i, mb_count, mb_pos, left;
409 462
410 init_get_bits(&s->gb, buf, buf_size*8); 463 init_get_bits(&s->gb, buf, buf_size*8);
411 464 #if 0
412 mb_count = rv10_decode_picture_header(s); 465 for(i=0; i<buf_size*8 && i<100; i++)
466 printf("%d", get_bits1(&s->gb));
467 printf("\n");
468 return 0;
469 #endif
470 if(s->codec_id ==CODEC_ID_RV10)
471 mb_count = rv10_decode_picture_header(s);
472 else
473 mb_count = rv20_decode_picture_header(s);
413 if (mb_count < 0) { 474 if (mb_count < 0) {
414 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n"); 475 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
415 return -1; 476 return -1;
416 } 477 }
417 478
424 left = s->mb_width * s->mb_height - mb_pos; 485 left = s->mb_width * s->mb_height - mb_pos;
425 if (mb_count > left) { 486 if (mb_count > left) {
426 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n"); 487 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
427 return -1; 488 return -1;
428 } 489 }
490 //if(s->pict_type == P_TYPE) return 0;
429 491
430 if (s->mb_x == 0 && s->mb_y == 0) { 492 if (s->mb_x == 0 && s->mb_y == 0) {
431 if(MPV_frame_start(s, avctx) < 0) 493 if(MPV_frame_start(s, avctx) < 0)
432 return -1; 494 return -1;
433 } 495 }
435 #ifdef DEBUG 497 #ifdef DEBUG
436 printf("qscale=%d\n", s->qscale); 498 printf("qscale=%d\n", s->qscale);
437 #endif 499 #endif
438 500
439 /* default quantization values */ 501 /* default quantization values */
440 s->y_dc_scale = 8; 502 if(s->codec_id== CODEC_ID_RV10){
441 s->c_dc_scale = 8; 503 if(s->mb_y==0) s->first_slice_line=1;
504 }else{
505 s->first_slice_line=1;
506 s->resync_mb_x= s->mb_x;
507 s->resync_mb_y= s->mb_y;
508 }
509 if(s->h263_aic){
510 s->y_dc_scale_table=
511 s->c_dc_scale_table= ff_aic_dc_scale_table;
512 }else{
513 s->y_dc_scale_table=
514 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
515 }
516 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
517 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
518
442 s->rv10_first_dc_coded[0] = 0; 519 s->rv10_first_dc_coded[0] = 0;
443 s->rv10_first_dc_coded[1] = 0; 520 s->rv10_first_dc_coded[1] = 0;
444 s->rv10_first_dc_coded[2] = 0; 521 s->rv10_first_dc_coded[2] = 0;
445 522
446 if(s->mb_y==0) s->first_slice_line=1;
447
448 s->block_wrap[0]= 523 s->block_wrap[0]=
449 s->block_wrap[1]= 524 s->block_wrap[1]=
450 s->block_wrap[2]= 525 s->block_wrap[2]=
451 s->block_wrap[3]= s->mb_width*2 + 2; 526 s->block_wrap[3]= s->mb_width*2 + 2;
452 s->block_wrap[4]= 527 s->block_wrap[4]=
453 s->block_wrap[5]= s->mb_width + 2; 528 s->block_wrap[5]= s->mb_width + 2;
454 ff_init_block_index(s); 529 ff_init_block_index(s);
455 /* decode each macroblock */ 530 /* decode each macroblock */
456 for(i=0;i<mb_count;i++) { 531 for(i=0;i<mb_count;i++) {
532 int ret;
457 ff_update_block_index(s); 533 ff_update_block_index(s);
458 #ifdef DEBUG 534 #ifdef DEBUG
459 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); 535 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
460 #endif 536 #endif
461 537
462 s->dsp.clear_blocks(s->block[0]); 538 s->dsp.clear_blocks(s->block[0]);
463 s->mv_dir = MV_DIR_FORWARD; 539 s->mv_dir = MV_DIR_FORWARD;
464 s->mv_type = MV_TYPE_16X16; 540 s->mv_type = MV_TYPE_16X16;
465 if (ff_h263_decode_mb(s, s->block) == SLICE_ERROR) { 541 ret=ff_h263_decode_mb(s, s->block);
542
543 if (ret == SLICE_ERROR) {
466 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y); 544 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
467 return -1; 545 return -1;
468 } 546 }
469 ff_h263_update_motion_val(s); 547 ff_h263_update_motion_val(s);
470 MPV_decode_mb(s, s->block); 548 MPV_decode_mb(s, s->block);
471 if (++s->mb_x == s->mb_width) { 549 if (++s->mb_x == s->mb_width) {
472 s->mb_x = 0; 550 s->mb_x = 0;
473 s->mb_y++; 551 s->mb_y++;
474 ff_init_block_index(s); 552 ff_init_block_index(s);
553 }
554 if(s->mb_x == s->resync_mb_x)
475 s->first_slice_line=0; 555 s->first_slice_line=0;
476 } 556 if(ret == SLICE_END) break;
477 } 557 }
478 558
479 return buf_size; 559 return buf_size;
480 } 560 }
481 561
537 NULL, 617 NULL,
538 rv10_decode_end, 618 rv10_decode_end,
539 rv10_decode_frame, 619 rv10_decode_frame,
540 CODEC_CAP_DR1 620 CODEC_CAP_DR1
541 }; 621 };
622
623 AVCodec rv20_decoder = {
624 "rv20",
625 CODEC_TYPE_VIDEO,
626 CODEC_ID_RV20,
627 sizeof(MpegEncContext),
628 rv10_decode_init,
629 NULL,
630 rv10_decode_end,
631 rv10_decode_frame,
632 CODEC_CAP_DR1
633 };