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 Originally committed as revision 2348 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -79,7 +79,7 @@ static int frame_rate = 25; | |||
| static int frame_rate_base = 1; | |||
| static int video_bit_rate = 200*1000; | |||
| static int video_bit_rate_tolerance = 4000*1000; | |||
| static int video_qscale = 0; | |||
| static float video_qscale = 0; | |||
| static int video_qmin = 2; | |||
| static int video_qmax = 31; | |||
| static int video_mb_qmin = 2; | |||
| @@ -680,7 +680,7 @@ static void do_video_stats(AVFormatContext *os, AVOutputStream *ost, | |||
| total_size += frame_size; | |||
| if (enc->codec_type == CODEC_TYPE_VIDEO) { | |||
| frame_number = ost->frame_number; | |||
| fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality); | |||
| fprintf(fvstats, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA); | |||
| if (enc->flags&CODEC_FLAG_PSNR) | |||
| fprintf(fvstats, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0))); | |||
| @@ -738,12 +738,12 @@ static void print_report(AVFormatContext **output_files, | |||
| enc = &ost->st->codec; | |||
| if (vid && enc->codec_type == CODEC_TYPE_VIDEO) { | |||
| sprintf(buf + strlen(buf), "q=%2.1f ", | |||
| enc->coded_frame->quality); | |||
| enc->coded_frame->quality/(float)FF_QP2LAMBDA); | |||
| } | |||
| if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) { | |||
| frame_number = ost->frame_number; | |||
| sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ", | |||
| frame_number, enc->coded_frame ? enc->coded_frame->quality : 0); | |||
| frame_number, enc->coded_frame ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : 0); | |||
| if (enc->flags&CODEC_FLAG_PSNR) | |||
| sprintf(buf + strlen(buf), "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0))); | |||
| vid = 1; | |||
| @@ -1774,10 +1774,10 @@ static void opt_mb_decision(const char *arg) | |||
| static void opt_qscale(const char *arg) | |||
| { | |||
| video_qscale = atoi(arg); | |||
| if (video_qscale < 0 || | |||
| video_qscale > 31) { | |||
| fprintf(stderr, "qscale must be >= 1 and <= 31\n"); | |||
| video_qscale = atof(arg); | |||
| if (video_qscale < 0.01 || | |||
| video_qscale > 255) { | |||
| fprintf(stderr, "qscale must be >= 0.01 and <= 255\n"); | |||
| exit(1); | |||
| } | |||
| } | |||
| @@ -2245,7 +2245,7 @@ static void opt_output_file(const char *filename) | |||
| video_enc->gop_size = 0; | |||
| if (video_qscale || same_quality) { | |||
| video_enc->flags |= CODEC_FLAG_QSCALE; | |||
| st->quality = video_qscale; | |||
| st->quality = FF_QP2LAMBDA * video_qscale; | |||
| } | |||
| if(bitexact) | |||
| @@ -15,7 +15,7 @@ extern "C" { | |||
| #define FFMPEG_VERSION_INT 0x000408 | |||
| #define FFMPEG_VERSION "0.4.8" | |||
| #define LIBAVCODEC_BUILD 4683 | |||
| #define LIBAVCODEC_BUILD 4684 | |||
| #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT | |||
| #define LIBAVCODEC_VERSION FFMPEG_VERSION | |||
| @@ -316,15 +316,15 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, | |||
| int display_picture_number;\ | |||
| \ | |||
| /**\ | |||
| * quality (between 1 (good) and 31 (bad)) \ | |||
| * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) \ | |||
| * - encoding: set by lavc for coded_picture (and set by user for input)\ | |||
| * - decoding: set by lavc\ | |||
| */\ | |||
| float quality; \ | |||
| int quality; \ | |||
| \ | |||
| /**\ | |||
| * buffer age (1->was last buffer and dint change, 2->..., ...).\ | |||
| * set to something large if the buffer has not been used yet \ | |||
| * set to INT_MAX if the buffer has not been used yet \ | |||
| * - encoding: unused\ | |||
| * - decoding: MUST be set by get_buffer()\ | |||
| */\ | |||
| @@ -1181,8 +1181,13 @@ typedef struct AVCodecContext { | |||
| * Dont touch, used by lavc default_get_buffer() | |||
| */ | |||
| void *internal_buffer; | |||
| #define FF_QUALITY_SCALE 256 | |||
| #define FF_LAMBDA_SHIFT 7 | |||
| #define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT) | |||
| #define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda | |||
| #define FF_LAMBDA_MAX (256*128-1) | |||
| #define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove | |||
| /** | |||
| * global quality for codecs which cannot change it per frame. | |||
| * this should be proportional to MPEG1/2/4 qscale. | |||
| @@ -1263,6 +1268,20 @@ typedef struct AVCodecContext { | |||
| * - decoding: unused | |||
| */ | |||
| int scenechange_threshold; | |||
| /** | |||
| * minimum lagrange multipler | |||
| * - encoding: set by user. | |||
| * - decoding: unused | |||
| */ | |||
| int lmin; | |||
| /** | |||
| * maximum lagrange multipler | |||
| * - encoding: set by user. | |||
| * - decoding: unused | |||
| */ | |||
| int lmax; | |||
| } AVCodecContext; | |||
| @@ -626,7 +626,7 @@ static inline int get_p_cbp(MpegEncContext * s, | |||
| int best_cbpc_score= INT_MAX; | |||
| int cbpc, cbpy; | |||
| const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0); | |||
| const int lambda= (s->qscale*s->qscale*64*105 + 64)>>7; | |||
| const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |||
| for(i=0; i<4; i++){ | |||
| int score= inter_MCBPC_bits[i + offset] * lambda; | |||
| @@ -679,7 +679,7 @@ static inline int get_b_cbp(MpegEncContext * s, DCTELEM block[6][64], | |||
| if(s->flags & CODEC_FLAG_CBP_RD){ | |||
| int score=0; | |||
| const int lambda= (s->qscale*s->qscale*64*105 + 64)>>7; | |||
| const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |||
| for(i=0; i<6; i++){ | |||
| if(s->coded_score[i] < 0){ | |||
| @@ -1877,7 +1877,8 @@ eoi_parser: | |||
| picture->qscale_table= s->qscale_table; | |||
| memset(picture->qscale_table, picture->quality, (s->width+15)/16); | |||
| if(avctx->debug & FF_DEBUG_QP) | |||
| printf("QP: %d\n", (int)picture->quality); | |||
| printf("QP: %d\n", picture->quality); | |||
| picture->quality*= FF_QP2LAMBDA; | |||
| } | |||
| goto the_end; | |||
| @@ -2052,7 +2053,8 @@ read_header: | |||
| picture->qscale_table= s->qscale_table; | |||
| memset(picture->qscale_table, picture->quality, (s->width+15)/16); | |||
| if(avctx->debug & FF_DEBUG_QP) | |||
| printf("QP: %f\n", picture->quality); | |||
| printf("QP: %d\n", picture->quality); | |||
| picture->quality*= FF_QP2LAMBDA; | |||
| } | |||
| return buf_ptr - buf; | |||
| @@ -140,6 +140,13 @@ static void convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16 | |||
| } | |||
| } | |||
| } | |||
| static inline void update_qscale(MpegEncContext *s){ | |||
| s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7); | |||
| s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax); | |||
| s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT; | |||
| } | |||
| #endif //CONFIG_ENCODERS | |||
| void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){ | |||
| @@ -424,6 +431,8 @@ int MPV_common_init(MpegEncContext *s) | |||
| /* Allocate MB type table */ | |||
| CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint8_t)) //needed for encoding | |||
| CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int)) | |||
| } | |||
| CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t)) | |||
| @@ -539,6 +548,7 @@ void MPV_common_end(MpegEncContext *s) | |||
| av_freep(&s->ac_stats); | |||
| av_freep(&s->error_status_table); | |||
| av_freep(&s->mb_index2xy); | |||
| av_freep(&s->lambda_table); | |||
| for(i=0; i<MAX_PICTURE_COUNT; i++){ | |||
| free_picture(s, &s->picture[i]); | |||
| @@ -1028,7 +1038,8 @@ alloc: | |||
| } | |||
| s->current_picture_ptr->pict_type= s->pict_type; | |||
| s->current_picture_ptr->quality= s->qscale; | |||
| // if(s->flags && CODEC_FLAG_QSCALE) | |||
| // s->current_picture_ptr->quality= s->new_picture_ptr->quality; | |||
| s->current_picture_ptr->key_frame= s->pict_type == I_TYPE; | |||
| s->current_picture= *s->current_picture_ptr; | |||
| @@ -1602,10 +1613,6 @@ int MPV_encode_picture(AVCodecContext *avctx, | |||
| if(s->new_picture.data[0]){ | |||
| s->pict_type= s->new_picture.pict_type; | |||
| if (s->fixed_qscale){ /* the ratecontrol needs the last qscale so we dont touch it for CBR */ | |||
| s->qscale= (int)(s->new_picture.quality+0.5); | |||
| assert(s->qscale); | |||
| } | |||
| //emms_c(); | |||
| //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale); | |||
| MPV_frame_start(s, avctx); | |||
| @@ -2815,22 +2822,23 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) | |||
| for(i=0; i<6; i++) skip_dct[i]=0; | |||
| if(s->adaptive_quant){ | |||
| s->dquant= s->current_picture.qscale_table[mb_x + mb_y*s->mb_stride] - s->qscale; | |||
| const int last_qp= s->qscale; | |||
| const int mb_xy= mb_x + mb_y*s->mb_stride; | |||
| if(s->out_format==FMT_H263){ | |||
| if (s->dquant> 2) s->dquant= 2; | |||
| else if(s->dquant<-2) s->dquant=-2; | |||
| } | |||
| s->lambda= s->lambda_table[mb_xy]; | |||
| update_qscale(s); | |||
| s->dquant= s->qscale - last_qp; | |||
| if(s->out_format==FMT_H263) | |||
| s->dquant= clip(s->dquant, -2, 2); //FIXME RD | |||
| if(s->codec_id==CODEC_ID_MPEG4){ | |||
| if(!s->mb_intra){ | |||
| if(s->mv_dir&MV_DIRECT) | |||
| if((s->mv_dir&MV_DIRECT) || s->mv_type==MV_TYPE_8X8) | |||
| s->dquant=0; | |||
| assert(s->dquant==0 || s->mv_type!=MV_TYPE_8X8); | |||
| } | |||
| } | |||
| s->qscale+= s->dquant; | |||
| s->qscale= last_qp + s->dquant; | |||
| s->y_dc_scale= s->y_dc_scale_table[ s->qscale ]; | |||
| s->c_dc_scale= s->c_dc_scale_table[ s->qscale ]; | |||
| } | |||
| @@ -2993,19 +3001,6 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) | |||
| } | |||
| #if 0 | |||
| { | |||
| float adap_parm; | |||
| adap_parm = ((s->avg_mb_var << 1) + s->mb_var[s->mb_stride*mb_y+mb_x] + 1.0) / | |||
| ((s->mb_var[s->mb_stride*mb_y+mb_x] << 1) + s->avg_mb_var + 1.0); | |||
| printf("\ntype=%c qscale=%2d adap=%0.2f dquant=%4.2f var=%4d avgvar=%4d", | |||
| (s->mb_type[s->mb_stride*mb_y+mb_x] > 0) ? 'I' : 'P', | |||
| s->qscale, adap_parm, s->qscale*adap_parm, | |||
| s->mb_var[s->mb_stride*mb_y+mb_x], s->avg_mb_var); | |||
| } | |||
| #endif | |||
| /* DCT & quantize */ | |||
| if(s->out_format==FMT_MJPEG){ | |||
| for(i=0;i<6;i++) { | |||
| @@ -3265,8 +3260,8 @@ static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegE | |||
| if(s->avctx->mb_decision == FF_MB_DECISION_RD){ | |||
| MPV_decode_mb(s, s->block); | |||
| score *= s->qscale * s->qscale * 109; | |||
| score += sse_mb(s) << 7; | |||
| score *= s->lambda2; | |||
| score += sse_mb(s) << FF_LAMBDA_SHIFT; | |||
| } | |||
| if(*next_block){ | |||
| @@ -3351,7 +3346,7 @@ static void encode_picture(MpegEncContext *s, int picture_number) | |||
| s->scene_change_score=0; | |||
| s->qscale= (int)(s->frame_qscale + 0.5); //FIXME qscale / ... stuff for ME ratedistoration | |||
| s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration | |||
| if(s->pict_type==I_TYPE){ | |||
| if(s->msmpeg4_version >= 3) s->no_rounding=1; | |||
| @@ -3460,10 +3455,8 @@ static void encode_picture(MpegEncContext *s, int picture_number) | |||
| } | |||
| } | |||
| if (s->fixed_qscale) | |||
| s->frame_qscale = s->current_picture.quality; | |||
| else | |||
| s->frame_qscale = ff_rate_estimate_qscale(s); | |||
| if (!s->fixed_qscale) | |||
| s->current_picture.quality = ff_rate_estimate_qscale(s); | |||
| if(s->adaptive_quant){ | |||
| #ifdef CONFIG_RISKY | |||
| @@ -3479,9 +3472,15 @@ static void encode_picture(MpegEncContext *s, int picture_number) | |||
| } | |||
| #endif | |||
| s->qscale= s->current_picture.qscale_table[0]; | |||
| s->lambda= s->lambda_table[0]; | |||
| //FIXME broken | |||
| }else | |||
| s->qscale= (int)(s->frame_qscale + 0.5); | |||
| s->lambda= s->current_picture.quality; | |||
| //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality); | |||
| update_qscale(s); | |||
| if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE)) | |||
| s->qscale= 3; //reduce cliping problems | |||
| if (s->out_format == FMT_MJPEG) { | |||
| /* for mjpeg, we do include qscale in the matrix */ | |||
| @@ -4020,12 +4019,14 @@ static int dct_quantize_trellis_c(MpegEncContext *s, | |||
| int not_coded_score= 0; | |||
| int coeff[3][64]; | |||
| int coeff_count[64]; | |||
| int lambda, qmul, qadd, start_i, last_non_zero, i, dc; | |||
| int qmul, qadd, start_i, last_non_zero, i, dc; | |||
| const int esc_length= s->ac_esc_length; | |||
| uint8_t * length; | |||
| uint8_t * last_length; | |||
| int score_limit=0; | |||
| int left_limit= 0; | |||
| const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6); | |||
| const int patch_table= s->out_format == FMT_MPEG1 && !s->mb_intra; | |||
| s->dsp.fdct (block); | |||
| @@ -4103,9 +4104,13 @@ static int dct_quantize_trellis_c(MpegEncContext *s, | |||
| return last_non_zero; | |||
| } | |||
| lambda= (qscale*qscale*64*105 + 64)>>7; //FIXME finetune | |||
| score_tab[0]= 0; | |||
| if(patch_table){ | |||
| // length[UNI_AC_ENC_INDEX(0, 63)]= | |||
| // length[UNI_AC_ENC_INDEX(0, 65)]= 2; | |||
| } | |||
| for(i=0; i<=last_non_zero - start_i; i++){ | |||
| int level_index, run, j; | |||
| const int dct_coeff= block[ scantable[i + start_i] ]; | |||
| @@ -4212,10 +4217,13 @@ static int dct_quantize_trellis_c(MpegEncContext *s, | |||
| //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level | |||
| while(score_tab[ left_limit ] > score_limit + lambda) left_limit++; | |||
| if(patch_table){ | |||
| // length[UNI_AC_ENC_INDEX(0, 63)]= | |||
| // length[UNI_AC_ENC_INDEX(0, 65)]= 3; | |||
| } | |||
| } | |||
| //FIXME add some cbp penalty | |||
| if(s->out_format != FMT_H263){ | |||
| last_score= 256*256*256*120; | |||
| for(i= left_limit; i<=last_non_zero - start_i + 1; i++){ | |||
| @@ -354,7 +354,9 @@ typedef struct MpegEncContext { | |||
| uint8_t *edge_emu_buffer; ///< points into the middle of allocated_edge_emu_buffer | |||
| int qscale; ///< QP | |||
| float frame_qscale; ///< qscale from the frame level rc FIXME remove | |||
| int lambda; ///< lagrange multipler used in rate distortion | |||
| int lambda2; ///< (lambda*lambda) >> FF_LAMBDA_SHIFT | |||
| int *lambda_table; | |||
| int adaptive_quant; ///< use adaptive quantization | |||
| int dquant; ///< qscale difference to prev qscale | |||
| int pict_type; ///< I_TYPE, P_TYPE, B_TYPE, ... | |||
| @@ -38,9 +38,9 @@ static int init_pass2(MpegEncContext *s); | |||
| static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num); | |||
| void ff_write_pass1_stats(MpegEncContext *s){ | |||
| sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%f itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", | |||
| sprintf(s->avctx->stats_out, "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d mc-var:%d var:%d icount:%d;\n", | |||
| s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type, | |||
| s->frame_qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, | |||
| s->current_picture.quality, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, | |||
| s->f_code, s->b_code, s->current_picture.mc_mb_var_sum, s->current_picture.mb_var_sum, s->i_count); | |||
| } | |||
| @@ -51,7 +51,7 @@ int ff_rate_control_init(MpegEncContext *s) | |||
| emms_c(); | |||
| for(i=0; i<5; i++){ | |||
| rcc->pred[i].coeff= 7.0; | |||
| rcc->pred[i].coeff= FF_QP2LAMBDA * 7.0; | |||
| rcc->pred[i].count= 1.0; | |||
| rcc->pred[i].decay= 0.4; | |||
| @@ -60,7 +60,7 @@ int ff_rate_control_init(MpegEncContext *s) | |||
| rcc->mv_bits_sum[i]= | |||
| rcc->qscale_sum [i]= | |||
| rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such | |||
| rcc->last_qscale_for[i]=5; | |||
| rcc->last_qscale_for[i]=FF_QP2LAMBDA * 5; | |||
| } | |||
| rcc->buffer_index= s->avctx->rc_buffer_size/2; | |||
| @@ -81,7 +81,7 @@ int ff_rate_control_init(MpegEncContext *s) | |||
| for(i=0; i<rcc->num_entries; i++){ | |||
| RateControlEntry *rce= &rcc->entry[i]; | |||
| rce->pict_type= rce->new_pict_type=P_TYPE; | |||
| rce->qscale= rce->new_qscale=2; | |||
| rce->qscale= rce->new_qscale=FF_QP2LAMBDA * 2; | |||
| rce->misc_bits= s->mb_num + 10; | |||
| rce->mb_var_sum= s->mb_num*100; | |||
| } | |||
| @@ -140,7 +140,7 @@ int ff_rate_control_init(MpegEncContext *s) | |||
| rce.new_pict_type= rce.pict_type; | |||
| rce.mc_mb_var_sum= bits*s->mb_num/100000; | |||
| rce.mb_var_sum = s->mb_num; | |||
| rce.qscale = 2; | |||
| rce.qscale = FF_QP2LAMBDA * 2; | |||
| rce.f_code = 2; | |||
| rce.b_code = 1; | |||
| rce.misc_bits= 1; | |||
| @@ -339,9 +339,10 @@ static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, doubl | |||
| /* last qscale / qdiff stuff */ | |||
| if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){ | |||
| double last_q= rcc->last_qscale_for[pict_type]; | |||
| const int maxdiff= FF_QP2LAMBDA * a->max_qdiff; | |||
| if (q > last_q + a->max_qdiff) q= last_q + a->max_qdiff; | |||
| else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff; | |||
| if (q > last_q + maxdiff) q= last_q + maxdiff; | |||
| else if(q < last_q - maxdiff) q= last_q - maxdiff; | |||
| } | |||
| rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring | |||
| @@ -356,8 +357,8 @@ static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, doubl | |||
| * gets the qmin & qmax for pict_type | |||
| */ | |||
| static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){ | |||
| int qmin= s->avctx->qmin; | |||
| int qmax= s->avctx->qmax; | |||
| int qmin= s->avctx->lmin; | |||
| int qmax= s->avctx->lmax; | |||
| assert(qmin <= qmax); | |||
| @@ -369,12 +370,8 @@ static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pic | |||
| qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5); | |||
| } | |||
| qmin= clip(qmin, 1, 31); | |||
| qmax= clip(qmax, 1, 31); | |||
| if(qmin==1 && s->avctx->qmin>1) qmin=2; //avoid qmin=1 unless the user wants qmin=1 | |||
| if(qmin<3 && s->max_qcoeff<=128 && pict_type==I_TYPE) qmin=3; //reduce cliping problems | |||
| qmin= clip(qmin, 1, FF_LAMBDA_MAX); | |||
| qmax= clip(qmax, 1, FF_LAMBDA_MAX); | |||
| if(qmax<qmin) qmax= qmin; | |||
| @@ -479,21 +476,23 @@ static void adaptive_quantization(MpegEncContext *s, double q){ | |||
| float cplx_sum= 0.0; | |||
| float cplx_tab[s->mb_num]; | |||
| float bits_tab[s->mb_num]; | |||
| const int qmin= s->avctx->mb_qmin; | |||
| const int qmax= s->avctx->mb_qmax; | |||
| const int qmin= s->avctx->lmin; | |||
| const int qmax= s->avctx->lmax; | |||
| Picture * const pic= &s->current_picture; | |||
| int last_qscale=0; | |||
| for(i=0; i<s->mb_num; i++){ | |||
| const int mb_xy= s->mb_index2xy[i]; | |||
| float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]); | |||
| float temp_cplx= sqrt(pic->mc_mb_var[mb_xy]); //FIXME merge in pow() | |||
| float spat_cplx= sqrt(pic->mb_var[mb_xy]); | |||
| const int lumi= pic->mb_mean[mb_xy]; | |||
| float bits, cplx, factor; | |||
| #if 0 | |||
| if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune | |||
| if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune | |||
| #endif | |||
| if(spat_cplx < 4) spat_cplx= 4; //FIXME finetune | |||
| if(temp_cplx < 4) temp_cplx= 4; //FIXME finetune | |||
| if((s->mb_type[mb_xy]&MB_TYPE_INTRA)){//FIXME hq mode | |||
| cplx= spat_cplx; | |||
| factor= 1.0 + p_masking; | |||
| @@ -543,19 +542,16 @@ static void adaptive_quantization(MpegEncContext *s, double q){ | |||
| newq*= bits_sum/cplx_sum; | |||
| } | |||
| if(i && ABS(last_qscale - newq)<0.75) | |||
| intq= last_qscale; | |||
| else | |||
| intq= (int)(newq + 0.5); | |||
| intq= (int)(newq + 0.5); | |||
| if (intq > qmax) intq= qmax; | |||
| else if(intq < qmin) intq= qmin; | |||
| //if(i%s->mb_width==0) printf("\n"); | |||
| //printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i])); | |||
| last_qscale= | |||
| pic->qscale_table[mb_xy]= intq; | |||
| s->lambda_table[mb_xy]= intq; | |||
| } | |||
| } | |||
| //FIXME rd or at least approx for dquant | |||
| float ff_rate_estimate_qscale(MpegEncContext *s) | |||
| { | |||
| @@ -614,7 +610,7 @@ float ff_rate_estimate_qscale(MpegEncContext *s) | |||
| rce->new_pict_type= pict_type; | |||
| rce->mc_mb_var_sum= pic->mc_mb_var_sum; | |||
| rce->mb_var_sum = pic-> mb_var_sum; | |||
| rce->qscale = 2; | |||
| rce->qscale = FF_QP2LAMBDA * 2; | |||
| rce->f_code = s->f_code; | |||
| rce->b_code = s->b_code; | |||
| rce->misc_bits= 1; | |||
| @@ -272,6 +272,8 @@ void avcodec_get_context_defaults(AVCodecContext *s){ | |||
| s->release_buffer= avcodec_default_release_buffer; | |||
| s->get_format= avcodec_default_get_format; | |||
| s->me_subpel_quality=8; | |||
| s->lmin= FF_QP2LAMBDA * s->qmin; | |||
| s->lmax= FF_QP2LAMBDA * s->qmax; | |||
| s->intra_quant_bias= FF_DEFAULT_QUANT_BIAS; | |||
| s->inter_quant_bias= FF_DEFAULT_QUANT_BIAS; | |||
| @@ -29,9 +29,9 @@ stddev: 8.02 bytes:7602176 | |||
| 5704a082cc5c5970620123ae20566286 *./data/a-huffyuv.avi | |||
| 799d3db687f6cdd7a837ec156efc171f *./data/out.yuv | |||
| stddev: 0.00 bytes:7602176 | |||
| 2fce40764b56ac4eade4bf29ee962ba0 *./data/a-mpeg4-rc.avi | |||
| 580000bfe2d4359d9aa9a9415f953b3b *./data/out.yuv | |||
| stddev: 10.53 bytes:7145472 | |||
| 0cb2324e62eba4bb94d1cd2946355137 *./data/a-mpeg4-rc.avi | |||
| 94f5f1d46c5da6d929eb8633835e73cb *./data/out.yuv | |||
| stddev: 10.18 bytes:7145472 | |||
| dfe8fcd409a0605ef0cb37fc5e76ecf7 *./data/a-mpeg4-adv.avi | |||
| c8877a6b8ed290a637c2119860b468b0 *./data/out.yuv | |||
| stddev: 7.31 bytes:7602176 | |||
| @@ -29,9 +29,9 @@ stddev: 5.28 bytes:7602176 | |||
| 242a7a18c2793e115007bc163861ef4e *./data/a-huffyuv.avi | |||
| dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv | |||
| stddev: 0.00 bytes:7602176 | |||
| 24de1707e32f6a651df9d8c72216aa68 *./data/a-mpeg4-rc.avi | |||
| 25f3d554edf174034b5e484a7cfb04d3 *./data/out.yuv | |||
| stddev: 4.32 bytes:7145472 | |||
| 910c4f83e031bfb0024380d674d79091 *./data/a-mpeg4-rc.avi | |||
| ec7bb694f4eaca71ec7b106d4fe20092 *./data/out.yuv | |||
| stddev: 4.20 bytes:7145472 | |||
| bb11d9808375911ea63d4f0889306037 *./data/a-mpeg4-adv.avi | |||
| e465df12f2c8a6492a6ec0b1bddc1d0d *./data/out.yuv | |||
| stddev: 4.97 bytes:7602176 | |||