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