comparison mpegvideo.c @ 1505:010f76d07a27 libavcodec

use lagrange multipler instead of qp for ratecontrol, this may break some things, tell me ASAP if u notice anything broken quality which was 1..31 float is now a 1..FF_LAMBDA_MAX int, and FF_QP2LAMBDA * qp can be used to convert to the new range
author michaelni
date Tue, 07 Oct 2003 11:32:40 +0000
parents 37e16bd36d2c
children 79dddc5cd990
comparison
equal deleted inserted replaced
1504:df7ab60d1ee0 1505:010f76d07a27
138 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]); 138 qmat16_bias[qscale][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][i]);
139 } 139 }
140 } 140 }
141 } 141 }
142 } 142 }
143
144 static inline void update_qscale(MpegEncContext *s){
145 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
146 s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
147
148 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
149 }
143 #endif //CONFIG_ENCODERS 150 #endif //CONFIG_ENCODERS
144 151
145 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){ 152 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
146 int i; 153 int i;
147 int end; 154 int end;
422 } 429 }
423 CHECKED_ALLOCZ(s->avctx->stats_out, 256); 430 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
424 431
425 /* Allocate MB type table */ 432 /* Allocate MB type table */
426 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint8_t)) //needed for encoding 433 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint8_t)) //needed for encoding
434
435 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
427 } 436 }
428 437
429 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t)) 438 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
430 439
431 if (s->out_format == FMT_H263 || s->encoding) { 440 if (s->out_format == FMT_H263 || s->encoding) {
537 av_freep(&s->field_select_table); 546 av_freep(&s->field_select_table);
538 av_freep(&s->avctx->stats_out); 547 av_freep(&s->avctx->stats_out);
539 av_freep(&s->ac_stats); 548 av_freep(&s->ac_stats);
540 av_freep(&s->error_status_table); 549 av_freep(&s->error_status_table);
541 av_freep(&s->mb_index2xy); 550 av_freep(&s->mb_index2xy);
551 av_freep(&s->lambda_table);
542 552
543 for(i=0; i<MAX_PICTURE_COUNT; i++){ 553 for(i=0; i<MAX_PICTURE_COUNT; i++){
544 free_picture(s, &s->picture[i]); 554 free_picture(s, &s->picture[i]);
545 } 555 }
546 avcodec_default_free_buffers(s->avctx); 556 avcodec_default_free_buffers(s->avctx);
1026 1036
1027 s->current_picture_ptr= &s->picture[i]; 1037 s->current_picture_ptr= &s->picture[i];
1028 } 1038 }
1029 1039
1030 s->current_picture_ptr->pict_type= s->pict_type; 1040 s->current_picture_ptr->pict_type= s->pict_type;
1031 s->current_picture_ptr->quality= s->qscale; 1041 // if(s->flags && CODEC_FLAG_QSCALE)
1042 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1032 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE; 1043 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1033 1044
1034 s->current_picture= *s->current_picture_ptr; 1045 s->current_picture= *s->current_picture_ptr;
1035 1046
1036 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){ 1047 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1600 1611
1601 /* output? */ 1612 /* output? */
1602 if(s->new_picture.data[0]){ 1613 if(s->new_picture.data[0]){
1603 1614
1604 s->pict_type= s->new_picture.pict_type; 1615 s->pict_type= s->new_picture.pict_type;
1605 if (s->fixed_qscale){ /* the ratecontrol needs the last qscale so we dont touch it for CBR */
1606 s->qscale= (int)(s->new_picture.quality+0.5);
1607 assert(s->qscale);
1608 }
1609 //emms_c(); 1616 //emms_c();
1610 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale); 1617 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
1611 MPV_frame_start(s, avctx); 1618 MPV_frame_start(s, avctx);
1612 1619
1613 encode_picture(s, s->picture_number); 1620 encode_picture(s, s->picture_number);
2813 int dct_offset = s->linesize*8; //default for progressive frames 2820 int dct_offset = s->linesize*8; //default for progressive frames
2814 2821
2815 for(i=0; i<6; i++) skip_dct[i]=0; 2822 for(i=0; i<6; i++) skip_dct[i]=0;
2816 2823
2817 if(s->adaptive_quant){ 2824 if(s->adaptive_quant){
2818 s->dquant= s->current_picture.qscale_table[mb_x + mb_y*s->mb_stride] - s->qscale; 2825 const int last_qp= s->qscale;
2819 2826 const int mb_xy= mb_x + mb_y*s->mb_stride;
2820 if(s->out_format==FMT_H263){ 2827
2821 if (s->dquant> 2) s->dquant= 2; 2828 s->lambda= s->lambda_table[mb_xy];
2822 else if(s->dquant<-2) s->dquant=-2; 2829 update_qscale(s);
2823 } 2830 s->dquant= s->qscale - last_qp;
2831
2832 if(s->out_format==FMT_H263)
2833 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
2824 2834
2825 if(s->codec_id==CODEC_ID_MPEG4){ 2835 if(s->codec_id==CODEC_ID_MPEG4){
2826 if(!s->mb_intra){ 2836 if(!s->mb_intra){
2827 if(s->mv_dir&MV_DIRECT) 2837 if((s->mv_dir&MV_DIRECT) || s->mv_type==MV_TYPE_8X8)
2828 s->dquant=0; 2838 s->dquant=0;
2829 2839 }
2830 assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8); 2840 }
2831 } 2841 s->qscale= last_qp + s->dquant;
2832 }
2833 s->qscale+= s->dquant;
2834 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ]; 2842 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
2835 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; 2843 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
2836 } 2844 }
2837 2845
2838 if (s->mb_intra) { 2846 if (s->mb_intra) {
2991 #endif 2999 #endif
2992 } 3000 }
2993 3001
2994 } 3002 }
2995 3003
2996 #if 0
2997 {
2998 float adap_parm;
2999
3000 adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_stride*mb_y+mb_x] + 1.0) /
3001 ((s->mb_var[s->mb_stride*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0);
3002
3003 printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d",
3004 (s->mb_type[s->mb_stride*mb_y+mb_x] > 0) ? 'I' : 'P',
3005 s->qscale, adap_parm, s->qscale*adap_parm,
3006 s->mb_var[s->mb_stride*mb_y+mb_x], s->avg_mb_var);
3007 }
3008 #endif
3009 /* DCT & quantize */ 3004 /* DCT & quantize */
3010 if(s->out_format==FMT_MJPEG){ 3005 if(s->out_format==FMT_MJPEG){
3011 for(i=0;i<6;i++) { 3006 for(i=0;i<6;i++) {
3012 int overflow; 3007 int overflow;
3013 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, 8, &overflow); 3008 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, 8, &overflow);
3263 } 3258 }
3264 3259
3265 if(s->avctx->mb_decision == FF_MB_DECISION_RD){ 3260 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
3266 MPV_decode_mb(s, s->block); 3261 MPV_decode_mb(s, s->block);
3267 3262
3268 score *= s->qscale * s->qscale * 109; 3263 score *= s->lambda2;
3269 score += sse_mb(s) << 7; 3264 score += sse_mb(s) << FF_LAMBDA_SHIFT;
3270 } 3265 }
3271 3266
3272 if(*next_block){ 3267 if(*next_block){
3273 memcpy(s->dest, dest_backup, sizeof(s->dest)); 3268 memcpy(s->dest, dest_backup, sizeof(s->dest));
3274 } 3269 }
3349 ff_set_mpeg4_time(s, s->picture_number); 3344 ff_set_mpeg4_time(s, s->picture_number);
3350 #endif 3345 #endif
3351 3346
3352 s->scene_change_score=0; 3347 s->scene_change_score=0;
3353 3348
3354 s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration 3349 s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
3355 3350
3356 if(s->pict_type==I_TYPE){ 3351 if(s->pict_type==I_TYPE){
3357 if(s->msmpeg4_version >= 3) s->no_rounding=1; 3352 if(s->msmpeg4_version >= 3) s->no_rounding=1;
3358 else s->no_rounding=0; 3353 else s->no_rounding=0;
3359 }else if(s->pict_type!=B_TYPE){ 3354 }else if(s->pict_type!=B_TYPE){
3458 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR); 3453 ff_fix_long_b_mvs(s, s->b_bidir_forw_mv_table, s->f_code, MB_TYPE_BIDIR);
3459 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR); 3454 ff_fix_long_b_mvs(s, s->b_bidir_back_mv_table, s->b_code, MB_TYPE_BIDIR);
3460 } 3455 }
3461 } 3456 }
3462 3457
3463 if (s->fixed_qscale) 3458 if (!s->fixed_qscale)
3464 s->frame_qscale = s->current_picture.quality; 3459 s->current_picture.quality = ff_rate_estimate_qscale(s);
3465 else
3466 s->frame_qscale = ff_rate_estimate_qscale(s);
3467 3460
3468 if(s->adaptive_quant){ 3461 if(s->adaptive_quant){
3469 #ifdef CONFIG_RISKY 3462 #ifdef CONFIG_RISKY
3470 switch(s->codec_id){ 3463 switch(s->codec_id){
3471 case CODEC_ID_MPEG4: 3464 case CODEC_ID_MPEG4:
3477 ff_clean_h263_qscales(s); 3470 ff_clean_h263_qscales(s);
3478 break; 3471 break;
3479 } 3472 }
3480 #endif 3473 #endif
3481 3474
3482 s->qscale= s->current_picture.qscale_table[0]; 3475 s->lambda= s->lambda_table[0];
3476 //FIXME broken
3483 }else 3477 }else
3484 s->qscale= (int)(s->frame_qscale + 0.5); 3478 s->lambda= s->current_picture.quality;
3479 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
3480 update_qscale(s);
3481
3482 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
3483 s->qscale= 3; //reduce cliping problems
3485 3484
3486 if (s->out_format == FMT_MJPEG) { 3485 if (s->out_format == FMT_MJPEG) {
3487 /* for mjpeg, we do include qscale in the matrix */ 3486 /* for mjpeg, we do include qscale in the matrix */
3488 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0]; 3487 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
3489 for(i=1;i<64;i++){ 3488 for(i=1;i<64;i++){
4018 int last_score= 0; 4017 int last_score= 0;
4019 int last_i= 0; 4018 int last_i= 0;
4020 int not_coded_score= 0; 4019 int not_coded_score= 0;
4021 int coeff[3][64]; 4020 int coeff[3][64];
4022 int coeff_count[64]; 4021 int coeff_count[64];
4023 int lambda, qmul, qadd, start_i, last_non_zero, i, dc; 4022 int qmul, qadd, start_i, last_non_zero, i, dc;
4024 const int esc_length= s->ac_esc_length; 4023 const int esc_length= s->ac_esc_length;
4025 uint8_t * length; 4024 uint8_t * length;
4026 uint8_t * last_length; 4025 uint8_t * last_length;
4027 int score_limit=0; 4026 int score_limit=0;
4028 int left_limit= 0; 4027 int left_limit= 0;
4028 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
4029 const int patch_table= s->out_format == FMT_MPEG1 && !s->mb_intra;
4029 4030
4030 s->dsp.fdct (block); 4031 s->dsp.fdct (block);
4031 4032
4032 qmul= qscale*16; 4033 qmul= qscale*16;
4033 qadd= ((qscale-1)|1)*8; 4034 qadd= ((qscale-1)|1)*8;
4101 if(last_non_zero < start_i){ 4102 if(last_non_zero < start_i){
4102 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM)); 4103 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
4103 return last_non_zero; 4104 return last_non_zero;
4104 } 4105 }
4105 4106
4106 lambda= (qscale*qscale*64*105 + 64)>>7; //FIXME finetune
4107
4108 score_tab[0]= 0; 4107 score_tab[0]= 0;
4108
4109 if(patch_table){
4110 // length[UNI_AC_ENC_INDEX(0, 63)]=
4111 // length[UNI_AC_ENC_INDEX(0, 65)]= 2;
4112 }
4113
4109 for(i=0; i<=last_non_zero - start_i; i++){ 4114 for(i=0; i<=last_non_zero - start_i; i++){
4110 int level_index, run, j; 4115 int level_index, run, j;
4111 const int dct_coeff= block[ scantable[i + start_i] ]; 4116 const int dct_coeff= block[ scantable[i + start_i] ];
4112 const int zero_distoration= dct_coeff*dct_coeff; 4117 const int zero_distoration= dct_coeff*dct_coeff;
4113 int best_score=256*256*256*120; 4118 int best_score=256*256*256*120;
4210 if(score_tab[i+1] < score_limit) 4215 if(score_tab[i+1] < score_limit)
4211 score_limit= score_tab[i+1]; 4216 score_limit= score_tab[i+1];
4212 4217
4213 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level 4218 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
4214 while(score_tab[ left_limit ] > score_limit + lambda) left_limit++; 4219 while(score_tab[ left_limit ] > score_limit + lambda) left_limit++;
4215 } 4220
4216 4221 if(patch_table){
4217 //FIXME add some cbp penalty 4222 // length[UNI_AC_ENC_INDEX(0, 63)]=
4223 // length[UNI_AC_ENC_INDEX(0, 65)]= 3;
4224 }
4225 }
4218 4226
4219 if(s->out_format != FMT_H263){ 4227 if(s->out_format != FMT_H263){
4220 last_score= 256*256*256*120; 4228 last_score= 256*256*256*120;
4221 for(i= left_limit; i<=last_non_zero - start_i + 1; i++){ 4229 for(i= left_limit; i<=last_non_zero - start_i + 1; i++){
4222 int score= score_tab[i]; 4230 int score= score_tab[i];