Mercurial > libavcodec.hg
comparison msmpeg4.c @ 2979:bfabfdf9ce55 libavcodec
COSMETICS: tabs --> spaces, some prettyprinting
author | diego |
---|---|
date | Thu, 22 Dec 2005 01:10:11 +0000 |
parents | ef2149182f1c |
children | 0b546eab515d |
comparison
equal
deleted
inserted
replaced
2978:403183bbb505 | 2979:bfabfdf9ce55 |
---|---|
542 uint8_t *coded_block; | 542 uint8_t *coded_block; |
543 | 543 |
544 handle_slices(s); | 544 handle_slices(s); |
545 | 545 |
546 if (!s->mb_intra) { | 546 if (!s->mb_intra) { |
547 /* compute cbp */ | 547 /* compute cbp */ |
548 set_stat(ST_INTER_MB); | 548 set_stat(ST_INTER_MB); |
549 cbp = 0; | 549 cbp = 0; |
550 for (i = 0; i < 6; i++) { | 550 for (i = 0; i < 6; i++) { |
551 if (s->block_last_index[i] >= 0) | 551 if (s->block_last_index[i] >= 0) |
552 cbp |= 1 << (5 - i); | 552 cbp |= 1 << (5 - i); |
553 } | 553 } |
554 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { | 554 if (s->use_skip_mb_code && (cbp | motion_x | motion_y) == 0) { |
555 /* skip macroblock */ | 555 /* skip macroblock */ |
556 put_bits(&s->pb, 1, 1); | 556 put_bits(&s->pb, 1, 1); |
557 s->last_bits++; | 557 s->last_bits++; |
558 s->misc_bits++; | 558 s->misc_bits++; |
559 s->skip_count++; | 559 s->skip_count++; |
560 | 560 |
561 return; | 561 return; |
562 } | 562 } |
563 if (s->use_skip_mb_code) | 563 if (s->use_skip_mb_code) |
564 put_bits(&s->pb, 1, 0); /* mb coded */ | 564 put_bits(&s->pb, 1, 0); /* mb coded */ |
565 | 565 |
566 if(s->msmpeg4_version<=2){ | 566 if(s->msmpeg4_version<=2){ |
567 put_bits(&s->pb, | 567 put_bits(&s->pb, |
568 v2_mb_type[cbp&3][1], | 568 v2_mb_type[cbp&3][1], |
569 v2_mb_type[cbp&3][0]); | 569 v2_mb_type[cbp&3][0]); |
597 for (i = 0; i < 6; i++) { | 597 for (i = 0; i < 6; i++) { |
598 msmpeg4_encode_block(s, block[i], i); | 598 msmpeg4_encode_block(s, block[i], i); |
599 } | 599 } |
600 s->p_tex_bits += get_bits_diff(s); | 600 s->p_tex_bits += get_bits_diff(s); |
601 } else { | 601 } else { |
602 /* compute cbp */ | 602 /* compute cbp */ |
603 cbp = 0; | 603 cbp = 0; |
604 coded_cbp = 0; | 604 coded_cbp = 0; |
605 for (i = 0; i < 6; i++) { | 605 for (i = 0; i < 6; i++) { |
606 int val, pred; | 606 int val, pred; |
607 val = (s->block_last_index[i] >= 1); | 607 val = (s->block_last_index[i] >= 1); |
608 cbp |= val << (5 - i); | 608 cbp |= val << (5 - i); |
609 if (i < 4) { | 609 if (i < 4) { |
610 /* predict value for close blocks only for luma */ | 610 /* predict value for close blocks only for luma */ |
611 pred = coded_block_pred(s, i, &coded_block); | 611 pred = coded_block_pred(s, i, &coded_block); |
612 *coded_block = val; | 612 *coded_block = val; |
613 val = val ^ pred; | 613 val = val ^ pred; |
614 } | 614 } |
615 coded_cbp |= val << (5 - i); | 615 coded_cbp |= val << (5 - i); |
616 } | 616 } |
617 #if 0 | 617 #if 0 |
618 if (coded_cbp) | 618 if (coded_cbp) |
619 printf("cbp=%x %x\n", cbp, coded_cbp); | 619 printf("cbp=%x %x\n", cbp, coded_cbp); |
620 #endif | 620 #endif |
621 | 621 |
623 if (s->pict_type == I_TYPE) { | 623 if (s->pict_type == I_TYPE) { |
624 put_bits(&s->pb, | 624 put_bits(&s->pb, |
625 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]); | 625 v2_intra_cbpc[cbp&3][1], v2_intra_cbpc[cbp&3][0]); |
626 } else { | 626 } else { |
627 if (s->use_skip_mb_code) | 627 if (s->use_skip_mb_code) |
628 put_bits(&s->pb, 1, 0); /* mb coded */ | 628 put_bits(&s->pb, 1, 0); /* mb coded */ |
629 put_bits(&s->pb, | 629 put_bits(&s->pb, |
630 v2_mb_type[(cbp&3) + 4][1], | 630 v2_mb_type[(cbp&3) + 4][1], |
631 v2_mb_type[(cbp&3) + 4][0]); | 631 v2_mb_type[(cbp&3) + 4][0]); |
632 } | 632 } |
633 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | 633 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ |
634 put_bits(&s->pb, | 634 put_bits(&s->pb, |
635 cbpy_tab[cbp>>2][1], | 635 cbpy_tab[cbp>>2][1], |
636 cbpy_tab[cbp>>2][0]); | 636 cbpy_tab[cbp>>2][0]); |
637 }else{ | 637 }else{ |
638 if (s->pict_type == I_TYPE) { | 638 if (s->pict_type == I_TYPE) { |
639 set_stat(ST_INTRA_MB); | 639 set_stat(ST_INTRA_MB); |
640 put_bits(&s->pb, | 640 put_bits(&s->pb, |
641 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); | 641 ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]); |
642 } else { | 642 } else { |
643 if (s->use_skip_mb_code) | 643 if (s->use_skip_mb_code) |
644 put_bits(&s->pb, 1, 0); /* mb coded */ | 644 put_bits(&s->pb, 1, 0); /* mb coded */ |
645 put_bits(&s->pb, | 645 put_bits(&s->pb, |
646 table_mb_non_intra[cbp][1], | 646 table_mb_non_intra[cbp][1], |
647 table_mb_non_intra[cbp][0]); | 647 table_mb_non_intra[cbp][0]); |
648 } | 648 } |
649 set_stat(ST_INTRA_MB); | 649 set_stat(ST_INTRA_MB); |
650 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ | 650 put_bits(&s->pb, 1, 0); /* no AC prediction yet */ |
651 if(s->inter_intra_pred){ | 651 if(s->inter_intra_pred){ |
652 s->h263_aic_dir=0; | 652 s->h263_aic_dir=0; |
653 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]); | 653 put_bits(&s->pb, table_inter_intra[s->h263_aic_dir][1], table_inter_intra[s->h263_aic_dir][0]); |
654 } | 654 } |
655 } | 655 } |
700 int a, b, c, wrap, pred, scale; | 700 int a, b, c, wrap, pred, scale; |
701 int16_t *dc_val; | 701 int16_t *dc_val; |
702 | 702 |
703 /* find prediction */ | 703 /* find prediction */ |
704 if (n < 4) { | 704 if (n < 4) { |
705 scale = s->y_dc_scale; | 705 scale = s->y_dc_scale; |
706 } else { | 706 } else { |
707 scale = s->c_dc_scale; | 707 scale = s->c_dc_scale; |
708 } | 708 } |
709 | 709 |
710 wrap = s->block_wrap[n]; | 710 wrap = s->block_wrap[n]; |
711 dc_val= s->dc_val[0] + s->block_index[n]; | 711 dc_val= s->dc_val[0] + s->block_index[n]; |
712 | 712 |
725 necessitate to modify mpegvideo.c. The problem comes from the | 725 necessitate to modify mpegvideo.c. The problem comes from the |
726 fact they decided to store the quantized DC (which would lead | 726 fact they decided to store the quantized DC (which would lead |
727 to problems if Q could vary !) */ | 727 to problems if Q could vary !) */ |
728 #if (defined(ARCH_X86) || defined(ARCH_X86_64)) && !defined PIC | 728 #if (defined(ARCH_X86) || defined(ARCH_X86_64)) && !defined PIC |
729 asm volatile( | 729 asm volatile( |
730 "movl %3, %%eax \n\t" | 730 "movl %3, %%eax \n\t" |
731 "shrl $1, %%eax \n\t" | 731 "shrl $1, %%eax \n\t" |
732 "addl %%eax, %2 \n\t" | 732 "addl %%eax, %2 \n\t" |
733 "addl %%eax, %1 \n\t" | 733 "addl %%eax, %1 \n\t" |
734 "addl %0, %%eax \n\t" | 734 "addl %0, %%eax \n\t" |
735 "mull %4 \n\t" | 735 "mull %4 \n\t" |
736 "movl %%edx, %0 \n\t" | 736 "movl %%edx, %0 \n\t" |
737 "movl %1, %%eax \n\t" | 737 "movl %1, %%eax \n\t" |
738 "mull %4 \n\t" | 738 "mull %4 \n\t" |
739 "movl %%edx, %1 \n\t" | 739 "movl %%edx, %1 \n\t" |
740 "movl %2, %%eax \n\t" | 740 "movl %2, %%eax \n\t" |
741 "mull %4 \n\t" | 741 "mull %4 \n\t" |
742 "movl %%edx, %2 \n\t" | 742 "movl %%edx, %2 \n\t" |
743 : "+b" (a), "+c" (b), "+D" (c) | 743 : "+b" (a), "+c" (b), "+D" (c) |
744 : "g" (scale), "S" (inverse[scale]) | 744 : "g" (scale), "S" (inverse[scale]) |
745 : "%eax", "%edx" | 745 : "%eax", "%edx" |
746 ); | 746 ); |
747 #else | 747 #else |
748 /* #elif defined (ARCH_ALPHA) */ | 748 /* #elif defined (ARCH_ALPHA) */ |
749 /* Divisions are extremely costly on Alpha; optimize the most | 749 /* Divisions are extremely costly on Alpha; optimize the most |
750 common case. But they are costly everywhere... | 750 common case. But they are costly everywhere... |
751 */ | 751 */ |
752 if (scale == 8) { | 752 if (scale == 8) { |
753 a = (a + (8 >> 1)) / 8; | 753 a = (a + (8 >> 1)) / 8; |
754 b = (b + (8 >> 1)) / 8; | 754 b = (b + (8 >> 1)) / 8; |
755 c = (c + (8 >> 1)) / 8; | 755 c = (c + (8 >> 1)) / 8; |
756 } else { | 756 } else { |
757 a = FASTDIV((a + (scale >> 1)), scale); | 757 a = FASTDIV((a + (scale >> 1)), scale); |
758 b = FASTDIV((b + (scale >> 1)), scale); | 758 b = FASTDIV((b + (scale >> 1)), scale); |
759 c = FASTDIV((c + (scale >> 1)), scale); | 759 c = FASTDIV((c + (scale >> 1)), scale); |
760 } | 760 } |
761 #endif | 761 #endif |
762 /* XXX: WARNING: they did not choose the same test as MPEG4. This | 762 /* XXX: WARNING: they did not choose the same test as MPEG4. This |
763 is very important ! */ | 763 is very important ! */ |
764 if(s->msmpeg4_version>3){ | 764 if(s->msmpeg4_version>3){ |
955 }else | 955 }else |
956 last_index = s->block_last_index[n]; | 956 last_index = s->block_last_index[n]; |
957 /* AC coefs */ | 957 /* AC coefs */ |
958 last_non_zero = i - 1; | 958 last_non_zero = i - 1; |
959 for (; i <= last_index; i++) { | 959 for (; i <= last_index; i++) { |
960 j = scantable[i]; | 960 j = scantable[i]; |
961 level = block[j]; | 961 level = block[j]; |
962 if (level) { | 962 if (level) { |
963 run = i - last_non_zero - 1; | 963 run = i - last_non_zero - 1; |
964 last = (i == last_index); | 964 last = (i == last_index); |
965 sign = 0; | 965 sign = 0; |
966 slevel = level; | 966 slevel = level; |
967 if (level < 0) { | 967 if (level < 0) { |
968 sign = 1; | 968 sign = 1; |
969 level = -level; | 969 level = -level; |
970 } | 970 } |
971 | 971 |
972 if(level<=MAX_LEVEL && run<=MAX_RUN){ | 972 if(level<=MAX_LEVEL && run<=MAX_RUN){ |
973 s->ac_stats[s->mb_intra][n>3][level][run][last]++; | 973 s->ac_stats[s->mb_intra][n>3][level][run][last]++; |
974 } | 974 } |
975 #if 0 | 975 #if 0 |
1028 put_bits(&s->pb, 1, sign); | 1028 put_bits(&s->pb, 1, sign); |
1029 } | 1029 } |
1030 } else { | 1030 } else { |
1031 put_bits(&s->pb, 1, sign); | 1031 put_bits(&s->pb, 1, sign); |
1032 } | 1032 } |
1033 last_non_zero = i; | 1033 last_non_zero = i; |
1034 } | 1034 } |
1035 } | 1035 } |
1036 } | 1036 } |
1037 | 1037 |
1038 /****************************************/ | 1038 /****************************************/ |
1039 /* decoding stuff */ | 1039 /* decoding stuff */ |
1062 /* find number of bits */ | 1062 /* find number of bits */ |
1063 size = 0; | 1063 size = 0; |
1064 v = abs(level); | 1064 v = abs(level); |
1065 while (v) { | 1065 while (v) { |
1066 v >>= 1; | 1066 v >>= 1; |
1067 size++; | 1067 size++; |
1068 } | 1068 } |
1069 | 1069 |
1070 if (level < 0) | 1070 if (level < 0) |
1071 l= (-level) ^ ((1 << size) - 1); | 1071 l= (-level) ^ ((1 << size) - 1); |
1072 else | 1072 else |
1299 s->inter_intra_pred= 0; | 1299 s->inter_intra_pred= 0; |
1300 break; | 1300 break; |
1301 } | 1301 } |
1302 s->no_rounding = 1; | 1302 s->no_rounding = 1; |
1303 if(s->avctx->debug&FF_DEBUG_PICT_INFO) | 1303 if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
1304 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n", | 1304 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n", |
1305 s->qscale, | 1305 s->qscale, |
1306 s->rl_chroma_table_index, | 1306 s->rl_chroma_table_index, |
1307 s->rl_table_index, | 1307 s->rl_table_index, |
1308 s->dc_table_index, | 1308 s->dc_table_index, |
1309 s->per_mb_rl_table, | 1309 s->per_mb_rl_table, |
1310 s->slice_height); | 1310 s->slice_height); |
1311 } else { | 1311 } else { |
1312 switch(s->msmpeg4_version){ | 1312 switch(s->msmpeg4_version){ |
1313 case 1: | 1313 case 1: |
1347 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); | 1347 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE); |
1348 break; | 1348 break; |
1349 } | 1349 } |
1350 | 1350 |
1351 if(s->avctx->debug&FF_DEBUG_PICT_INFO) | 1351 if(s->avctx->debug&FF_DEBUG_PICT_INFO) |
1352 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n", | 1352 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n", |
1353 s->use_skip_mb_code, | 1353 s->use_skip_mb_code, |
1354 s->rl_table_index, | 1354 s->rl_table_index, |
1355 s->rl_chroma_table_index, | 1355 s->rl_chroma_table_index, |
1356 s->dc_table_index, | 1356 s->dc_table_index, |
1357 s->mv_table_index, | 1357 s->mv_table_index, |
1358 s->per_mb_rl_table, | 1358 s->per_mb_rl_table, |
1359 s->qscale); | 1359 s->qscale); |
1360 | 1360 |
1361 if(s->flipflop_rounding){ | 1361 if(s->flipflop_rounding){ |
1362 s->no_rounding ^= 1; | 1362 s->no_rounding ^= 1; |
1363 }else{ | 1363 }else{ |
1364 s->no_rounding = 0; | 1364 s->no_rounding = 0; |
1365 } | 1365 } |
1366 } | 1366 } |
1367 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height); | 1367 //printf("%d %d %d %d %d\n", s->pict_type, s->bit_rate, s->inter_intra_pred, s->width, s->height); |
1368 | 1368 |
1369 s->esc3_level_length= 0; | 1369 s->esc3_level_length= 0; |
1370 s->esc3_run_length= 0; | 1370 s->esc3_run_length= 0; |
1555 } | 1555 } |
1556 | 1556 |
1557 s->dsp.clear_blocks(s->block[0]); | 1557 s->dsp.clear_blocks(s->block[0]); |
1558 for (i = 0; i < 6; i++) { | 1558 for (i = 0; i < 6; i++) { |
1559 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) | 1559 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
1560 { | 1560 { |
1561 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); | 1561 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
1562 return -1; | 1562 return -1; |
1563 } | 1563 } |
1564 } | 1564 } |
1565 return 0; | 1565 return 0; |
1566 } | 1566 } |
1567 | 1567 |
1568 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) | 1568 static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) |
1591 } | 1591 } |
1592 | 1592 |
1593 code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3); | 1593 code = get_vlc2(&s->gb, mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3); |
1594 if (code < 0) | 1594 if (code < 0) |
1595 return -1; | 1595 return -1; |
1596 //s->mb_intra = (code & 0x40) ? 0 : 1; | 1596 //s->mb_intra = (code & 0x40) ? 0 : 1; |
1597 s->mb_intra = (~code & 0x40) >> 6; | 1597 s->mb_intra = (~code & 0x40) >> 6; |
1598 | 1598 |
1599 cbp = code & 0x3f; | 1599 cbp = code & 0x3f; |
1600 } else { | 1600 } else { |
1601 set_stat(ST_INTRA_MB); | 1601 set_stat(ST_INTRA_MB); |
1602 s->mb_intra = 1; | 1602 s->mb_intra = 1; |
1648 } | 1648 } |
1649 | 1649 |
1650 s->dsp.clear_blocks(s->block[0]); | 1650 s->dsp.clear_blocks(s->block[0]); |
1651 for (i = 0; i < 6; i++) { | 1651 for (i = 0; i < 6; i++) { |
1652 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) | 1652 if (msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0) |
1653 { | 1653 { |
1654 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); | 1654 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i); |
1655 return -1; | 1655 return -1; |
1656 } | 1656 } |
1657 } | 1657 } |
1658 | 1658 |
1659 return 0; | 1659 return 0; |
1660 } | 1660 } |
1661 //#define ERROR_DETAILS | 1661 //#define ERROR_DETAILS |
1670 | 1670 |
1671 if (s->mb_intra) { | 1671 if (s->mb_intra) { |
1672 qmul=1; | 1672 qmul=1; |
1673 qadd=0; | 1673 qadd=0; |
1674 | 1674 |
1675 /* DC coef */ | 1675 /* DC coef */ |
1676 set_stat(ST_DC); | 1676 set_stat(ST_DC); |
1677 level = msmpeg4_decode_dc(s, n, &dc_pred_dir); | 1677 level = msmpeg4_decode_dc(s, n, &dc_pred_dir); |
1678 | 1678 |
1679 if (level < 0){ | 1679 if (level < 0){ |
1680 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale); | 1680 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale); |
1806 return DECODING_AC_LOST; | 1806 return DECODING_AC_LOST; |
1807 } | 1807 } |
1808 } | 1808 } |
1809 } | 1809 } |
1810 #endif | 1810 #endif |
1811 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ; | 1811 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ; |
1812 if (level>0) level= level * qmul + qadd; | 1812 if (level>0) level= level * qmul + qadd; |
1813 else level= level * qmul - qadd; | 1813 else level= level * qmul - qadd; |
1814 #if 0 // waste of time too :( | 1814 #if 0 // waste of time too :( |
1815 if(level>2048 || level<-2048){ | 1815 if(level>2048 || level<-2048){ |
1816 fprintf(stderr, "|level| overflow in 3. esc\n"); | 1816 fprintf(stderr, "|level| overflow in 3. esc\n"); |
1817 return DECODING_AC_LOST; | 1817 return DECODING_AC_LOST; |