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;