comparison h263.c @ 591:d3f374218030 libavcodec

fixing mpeg4 mpeg quantizers
author michaelni
date Fri, 02 Aug 2002 20:27:46 +0000
parents 5132a4ee50cd
children d5d0c11ea4cf
comparison
equal deleted inserted replaced
590:3f8824eb4690 591:d3f374218030
1450 } 1450 }
1451 } 1451 }
1452 /* left copy */ 1452 /* left copy */
1453 for(i=1;i<8;i++) 1453 for(i=1;i<8;i++)
1454 ac_val1[i] = block[block_permute_op(i * 8)]; 1454 ac_val1[i] = block[block_permute_op(i * 8)];
1455
1455 /* top copy */ 1456 /* top copy */
1456 for(i=1;i<8;i++) 1457 for(i=1;i<8;i++)
1457 ac_val1[8 + i] = block[block_permute_op(i)]; 1458 ac_val1[8 + i] = block[block_permute_op(i)];
1459
1458 } 1460 }
1459 1461
1460 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n, 1462 static void mpeg4_inv_pred_ac(MpegEncContext * s, INT16 *block, int n,
1461 int dir) 1463 int dir)
1462 { 1464 {
2639 switch(mb_type) 2641 switch(mb_type)
2640 { 2642 {
2641 case 0: /* direct */ 2643 case 0: /* direct */
2642 mx = h263_decode_motion(s, 0, 1); 2644 mx = h263_decode_motion(s, 0, 1);
2643 my = h263_decode_motion(s, 0, 1); 2645 my = h263_decode_motion(s, 0, 1);
2646 PRINT_MB_TYPE("S");
2644 case 4: /* direct with mx=my=0 */ 2647 case 4: /* direct with mx=my=0 */
2645 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT; 2648 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
2646 xy= s->block_index[0]; 2649 xy= s->block_index[0];
2647 time_pp= s->pp_time; 2650 time_pp= s->pp_time;
2648 time_pb= time_pp - s->bp_time; 2651 time_pb= time_pp - s->bp_time;
2657 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my; 2660 : s->motion_val[xy][1]*(time_pb - time_pp)/time_pp + my;
2658 /* s->mv[0][0][0] = 2661 /* s->mv[0][0][0] =
2659 s->mv[0][0][1] = 2662 s->mv[0][0][1] =
2660 s->mv[1][0][0] = 2663 s->mv[1][0][0] =
2661 s->mv[1][0][1] = 1000;*/ 2664 s->mv[1][0][1] = 1000;*/
2662 PRINT_MB_TYPE("D"); 2665 if(mb_type==4) PRINT_MB_TYPE("D");
2663 break; 2666 break;
2664 case 1: 2667 case 1:
2665 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD; 2668 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
2666 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code); 2669 mx = h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
2667 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code); 2670 my = h263_decode_motion(s, s->last_mv[0][0][1], s->f_code);
2699 if (cbpc < 0) 2702 if (cbpc < 0)
2700 return -1; 2703 return -1;
2701 dquant = cbpc & 4; 2704 dquant = cbpc & 4;
2702 s->mb_intra = 1; 2705 s->mb_intra = 1;
2703 intra: 2706 intra:
2704 PRINT_MB_TYPE("I");
2705 s->ac_pred = 0; 2707 s->ac_pred = 0;
2706 if (s->h263_pred || s->h263_aic) { 2708 if (s->h263_pred || s->h263_aic) {
2707 s->ac_pred = get_bits1(&s->gb); 2709 s->ac_pred = get_bits1(&s->gb);
2708 if (s->ac_pred && s->h263_aic) 2710 if (s->ac_pred && s->h263_aic)
2709 s->h263_aic_dir = get_bits1(&s->gb); 2711 s->h263_aic_dir = get_bits1(&s->gb);
2710 } 2712 }
2713 PRINT_MB_TYPE(s->ac_pred ? "A" : "I");
2714
2711 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); 2715 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
2712 if(cbpy<0) return -1; 2716 if(cbpy<0) return -1;
2713 cbp = (cbpc & 3) | (cbpy << 2); 2717 cbp = (cbpc & 3) | (cbpy << 2);
2714 if (dquant) { 2718 if (dquant) {
2715 s->qscale += quant_tab[get_bits(&s->gb, 2)]; 2719 s->qscale += quant_tab[get_bits(&s->gb, 2)];
2993 if (!coded) { 2997 if (!coded) {
2994 s->block_last_index[n] = i; 2998 s->block_last_index[n] = i;
2995 return 0; 2999 return 0;
2996 } 3000 }
2997 rl = &rl_inter; 3001 rl = &rl_inter;
2998 rl_vlc = rl_inter.rl_vlc[s->qscale];
2999 scan_table = zigzag_direct; 3002 scan_table = zigzag_direct;
3000 qmul = s->qscale << 1; 3003 if(s->mpeg_quant){
3001 qadd = (s->qscale - 1) | 1; 3004 qmul=1;
3005 qadd=0;
3006 rl_vlc = rl_inter.rl_vlc[0];
3007 }else{
3008 qmul = s->qscale << 1;
3009 qadd = (s->qscale - 1) | 1;
3010 rl_vlc = rl_inter.rl_vlc[s->qscale];
3011 }
3002 } 3012 }
3003 { 3013 {
3004 OPEN_READER(re, &s->gb); 3014 OPEN_READER(re, &s->gb);
3005 for(;;) { 3015 for(;;) {
3006 UPDATE_CACHE(re, &s->gb); 3016 UPDATE_CACHE(re, &s->gb);
3613 s->quant_precision = 5; 3623 s->quant_precision = 5;
3614 } 3624 }
3615 3625
3616 // FIXME a bunch of grayscale shape things 3626 // FIXME a bunch of grayscale shape things
3617 3627
3618 if(get_bits1(&s->gb)){ /* vol_quant_type */ 3628 if((s->mpeg_quant=get_bits1(&s->gb))){ /* vol_quant_type */
3619 int i, j, v; 3629 int i, j, v;
3630
3620 /* load default matrixes */ 3631 /* load default matrixes */
3621 for(i=0; i<64; i++){ 3632 for(i=0; i<64; i++){
3622 v= ff_mpeg4_default_intra_matrix[i]; 3633 v= ff_mpeg4_default_intra_matrix[i];
3623 s->intra_matrix[i]= v; 3634 s->intra_matrix[i]= v;
3624 s->chroma_intra_matrix[i]= v; 3635 s->chroma_intra_matrix[i]= v;
3657 s->inter_matrix[j]= v; 3668 s->inter_matrix[j]= v;
3658 s->chroma_inter_matrix[j]= v; 3669 s->chroma_inter_matrix[j]= v;
3659 } 3670 }
3660 } 3671 }
3661 3672
3662 s->dct_unquantize= s->dct_unquantize_mpeg2;
3663
3664 // FIXME a bunch of grayscale shape things 3673 // FIXME a bunch of grayscale shape things
3665 }else 3674 }
3666 s->dct_unquantize= s->dct_unquantize_h263;
3667 3675
3668 if(vo_ver_id != 1) 3676 if(vo_ver_id != 1)
3669 s->quarter_sample= get_bits1(&s->gb); 3677 s->quarter_sample= get_bits1(&s->gb);
3670 else s->quarter_sample=0; 3678 else s->quarter_sample=0;
3671 3679
3756 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){ 3764 if(s->pict_type==B_TYPE && s->low_delay && s->vol_control_parameters==0){
3757 printf("low_delay flag set, but shouldnt, clearing it\n"); 3765 printf("low_delay flag set, but shouldnt, clearing it\n");
3758 s->low_delay=0; 3766 s->low_delay=0;
3759 } 3767 }
3760 // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample); 3768 // printf("pic: %d, qpel:%d\n", s->pict_type, s->quarter_sample);
3761 //printf("%d", s->pict_type);
3762 time_incr=0; 3769 time_incr=0;
3763 while (get_bits1(&s->gb) != 0) 3770 while (get_bits1(&s->gb) != 0)
3764 time_incr++; 3771 time_incr++;
3765 3772
3766 check_marker(&s->gb, "before time_increment"); 3773 check_marker(&s->gb, "before time_increment");