Mercurial > libavcodec.hg
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 }; |