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 Originally committed as revision 2348 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									7238579835
								
							
						
					
					
						commit
						158c7f059c
					
				
							
								
								
									
										18
									
								
								ffmpeg.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								ffmpeg.c
									
									
									
									
									
								
							@ -79,7 +79,7 @@ static int frame_rate = 25;
 | 
				
			|||||||
static int frame_rate_base = 1;
 | 
					static int frame_rate_base = 1;
 | 
				
			||||||
static int video_bit_rate = 200*1000;
 | 
					static int video_bit_rate = 200*1000;
 | 
				
			||||||
static int video_bit_rate_tolerance = 4000*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_qmin = 2;
 | 
				
			||||||
static int video_qmax = 31;
 | 
					static int video_qmax = 31;
 | 
				
			||||||
static int video_mb_qmin = 2;
 | 
					static int video_mb_qmin = 2;
 | 
				
			||||||
@ -680,7 +680,7 @@ static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
 | 
				
			|||||||
    total_size += frame_size;
 | 
					    total_size += frame_size;
 | 
				
			||||||
    if (enc->codec_type == CODEC_TYPE_VIDEO) {
 | 
					    if (enc->codec_type == CODEC_TYPE_VIDEO) {
 | 
				
			||||||
        frame_number = ost->frame_number;
 | 
					        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)
 | 
					        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)));
 | 
					            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;
 | 
					        enc = &ost->st->codec;
 | 
				
			||||||
        if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
 | 
					        if (vid && enc->codec_type == CODEC_TYPE_VIDEO) {
 | 
				
			||||||
            sprintf(buf + strlen(buf), "q=%2.1f ",
 | 
					            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) {
 | 
					        if (!vid && enc->codec_type == CODEC_TYPE_VIDEO) {
 | 
				
			||||||
            frame_number = ost->frame_number;
 | 
					            frame_number = ost->frame_number;
 | 
				
			||||||
            sprintf(buf + strlen(buf), "frame=%5d q=%2.1f ",
 | 
					            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)
 | 
					            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)));
 | 
					                sprintf(buf + strlen(buf), "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
 | 
				
			||||||
            vid = 1;
 | 
					            vid = 1;
 | 
				
			||||||
@ -1774,10 +1774,10 @@ static void opt_mb_decision(const char *arg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void opt_qscale(const char *arg)
 | 
					static void opt_qscale(const char *arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    video_qscale = atoi(arg);
 | 
					    video_qscale = atof(arg);
 | 
				
			||||||
    if (video_qscale < 0 ||
 | 
					    if (video_qscale < 0.01 ||
 | 
				
			||||||
        video_qscale > 31) {
 | 
					        video_qscale > 255) {
 | 
				
			||||||
        fprintf(stderr, "qscale must be >= 1 and <= 31\n");
 | 
					        fprintf(stderr, "qscale must be >= 0.01 and <= 255\n");
 | 
				
			||||||
        exit(1);
 | 
					        exit(1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2245,7 +2245,7 @@ static void opt_output_file(const char *filename)
 | 
				
			|||||||
                    video_enc->gop_size = 0;
 | 
					                    video_enc->gop_size = 0;
 | 
				
			||||||
                if (video_qscale || same_quality) {
 | 
					                if (video_qscale || same_quality) {
 | 
				
			||||||
                    video_enc->flags |= CODEC_FLAG_QSCALE;
 | 
					                    video_enc->flags |= CODEC_FLAG_QSCALE;
 | 
				
			||||||
                    st->quality = video_qscale;
 | 
					                    st->quality = FF_QP2LAMBDA * video_qscale;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                if(bitexact)
 | 
					                if(bitexact)
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ extern "C" {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define FFMPEG_VERSION_INT     0x000408
 | 
					#define FFMPEG_VERSION_INT     0x000408
 | 
				
			||||||
#define FFMPEG_VERSION         "0.4.8"
 | 
					#define FFMPEG_VERSION         "0.4.8"
 | 
				
			||||||
#define LIBAVCODEC_BUILD       4683
 | 
					#define LIBAVCODEC_BUILD       4684
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
 | 
					#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
 | 
				
			||||||
#define LIBAVCODEC_VERSION     FFMPEG_VERSION
 | 
					#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;\
 | 
					    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)\
 | 
					     * - encoding: set by lavc for coded_picture (and set by user for input)\
 | 
				
			||||||
     * - decoding: set by lavc\
 | 
					     * - decoding: set by lavc\
 | 
				
			||||||
     */\
 | 
					     */\
 | 
				
			||||||
    float quality; \
 | 
					    int quality; \
 | 
				
			||||||
\
 | 
					\
 | 
				
			||||||
    /**\
 | 
					    /**\
 | 
				
			||||||
     * buffer age (1->was last buffer and dint change, 2->..., ...).\
 | 
					     * 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\
 | 
					     * - encoding: unused\
 | 
				
			||||||
     * - decoding: MUST be set by get_buffer()\
 | 
					     * - decoding: MUST be set by get_buffer()\
 | 
				
			||||||
     */\
 | 
					     */\
 | 
				
			||||||
@ -1181,8 +1181,13 @@ typedef struct AVCodecContext {
 | 
				
			|||||||
     * Dont touch, used by lavc default_get_buffer()
 | 
					     * Dont touch, used by lavc default_get_buffer()
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    void *internal_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.
 | 
					     * global quality for codecs which cannot change it per frame.
 | 
				
			||||||
     * this should be proportional to MPEG1/2/4 qscale.
 | 
					     * this should be proportional to MPEG1/2/4 qscale.
 | 
				
			||||||
@ -1263,6 +1268,20 @@ typedef struct AVCodecContext {
 | 
				
			|||||||
     * - decoding: unused
 | 
					     * - decoding: unused
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    int scenechange_threshold;
 | 
					    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;
 | 
					} AVCodecContext;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -626,7 +626,7 @@ static inline int get_p_cbp(MpegEncContext * s,
 | 
				
			|||||||
        int best_cbpc_score= INT_MAX;
 | 
					        int best_cbpc_score= INT_MAX;
 | 
				
			||||||
        int cbpc, cbpy;
 | 
					        int cbpc, cbpy;
 | 
				
			||||||
        const int offset= (s->mv_type==MV_TYPE_16X16 ? 0 : 16) + (s->dquant ? 8 : 0);
 | 
					        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++){
 | 
					        for(i=0; i<4; i++){
 | 
				
			||||||
            int score= inter_MCBPC_bits[i + offset] * lambda;
 | 
					            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){
 | 
					    if(s->flags & CODEC_FLAG_CBP_RD){
 | 
				
			||||||
        int score=0;
 | 
					        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++){
 | 
					        for(i=0; i<6; i++){
 | 
				
			||||||
            if(s->coded_score[i] < 0){
 | 
					            if(s->coded_score[i] < 0){
 | 
				
			||||||
 | 
				
			|||||||
@ -1877,7 +1877,8 @@ eoi_parser:
 | 
				
			|||||||
                            picture->qscale_table= s->qscale_table;
 | 
					                            picture->qscale_table= s->qscale_table;
 | 
				
			||||||
                            memset(picture->qscale_table, picture->quality, (s->width+15)/16);
 | 
					                            memset(picture->qscale_table, picture->quality, (s->width+15)/16);
 | 
				
			||||||
                            if(avctx->debug & FF_DEBUG_QP)
 | 
					                            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;
 | 
					                        goto the_end;
 | 
				
			||||||
@ -2052,7 +2053,8 @@ read_header:
 | 
				
			|||||||
        picture->qscale_table= s->qscale_table;
 | 
					        picture->qscale_table= s->qscale_table;
 | 
				
			||||||
        memset(picture->qscale_table, picture->quality, (s->width+15)/16);
 | 
					        memset(picture->qscale_table, picture->quality, (s->width+15)/16);
 | 
				
			||||||
        if(avctx->debug & FF_DEBUG_QP)
 | 
					        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;
 | 
					    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
 | 
					#endif //CONFIG_ENCODERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
 | 
					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 */
 | 
					        /* Allocate MB type table */
 | 
				
			||||||
        CHECKED_ALLOCZ(s->mb_type  , mb_array_size * sizeof(uint8_t)) //needed for encoding
 | 
					        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))
 | 
					    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->ac_stats);
 | 
				
			||||||
    av_freep(&s->error_status_table);
 | 
					    av_freep(&s->error_status_table);
 | 
				
			||||||
    av_freep(&s->mb_index2xy);
 | 
					    av_freep(&s->mb_index2xy);
 | 
				
			||||||
 | 
					    av_freep(&s->lambda_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(i=0; i<MAX_PICTURE_COUNT; i++){
 | 
					    for(i=0; i<MAX_PICTURE_COUNT; i++){
 | 
				
			||||||
        free_picture(s, &s->picture[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->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_ptr->key_frame= s->pict_type == I_TYPE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    s->current_picture= *s->current_picture_ptr;
 | 
					    s->current_picture= *s->current_picture_ptr;
 | 
				
			||||||
@ -1602,10 +1613,6 @@ int MPV_encode_picture(AVCodecContext *avctx,
 | 
				
			|||||||
    if(s->new_picture.data[0]){
 | 
					    if(s->new_picture.data[0]){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        s->pict_type= s->new_picture.pict_type;
 | 
					        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();
 | 
					//emms_c();
 | 
				
			||||||
//printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
 | 
					//printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
 | 
				
			||||||
        MPV_frame_start(s, avctx);
 | 
					        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;
 | 
					    for(i=0; i<6; i++) skip_dct[i]=0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if(s->adaptive_quant){
 | 
					    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){
 | 
					        s->lambda= s->lambda_table[mb_xy];
 | 
				
			||||||
            if     (s->dquant> 2) s->dquant= 2;
 | 
					        update_qscale(s);
 | 
				
			||||||
            else if(s->dquant<-2) s->dquant=-2;
 | 
					        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->codec_id==CODEC_ID_MPEG4){        
 | 
				
			||||||
            if(!s->mb_intra){
 | 
					            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;
 | 
					                    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->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
 | 
				
			||||||
        s->c_dc_scale= s->c_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 */
 | 
					    /* DCT & quantize */
 | 
				
			||||||
    if(s->out_format==FMT_MJPEG){
 | 
					    if(s->out_format==FMT_MJPEG){
 | 
				
			||||||
        for(i=0;i<6;i++) {
 | 
					        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){
 | 
					    if(s->avctx->mb_decision == FF_MB_DECISION_RD){
 | 
				
			||||||
        MPV_decode_mb(s, s->block);
 | 
					        MPV_decode_mb(s, s->block);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        score *= s->qscale * s->qscale * 109;
 | 
					        score *= s->lambda2;
 | 
				
			||||||
        score += sse_mb(s) << 7;
 | 
					        score += sse_mb(s) << FF_LAMBDA_SHIFT;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if(*next_block){
 | 
					    if(*next_block){
 | 
				
			||||||
@ -3351,7 +3346,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
 | 
				
			|||||||
        
 | 
					        
 | 
				
			||||||
    s->scene_change_score=0;
 | 
					    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->pict_type==I_TYPE){
 | 
				
			||||||
        if(s->msmpeg4_version >= 3) s->no_rounding=1;
 | 
					        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) 
 | 
					    if (!s->fixed_qscale) 
 | 
				
			||||||
        s->frame_qscale = s->current_picture.quality;
 | 
					        s->current_picture.quality = ff_rate_estimate_qscale(s);
 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        s->frame_qscale = ff_rate_estimate_qscale(s);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(s->adaptive_quant){
 | 
					    if(s->adaptive_quant){
 | 
				
			||||||
#ifdef CONFIG_RISKY
 | 
					#ifdef CONFIG_RISKY
 | 
				
			||||||
@ -3479,9 +3472,15 @@ static void encode_picture(MpegEncContext *s, int picture_number)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        s->qscale= s->current_picture.qscale_table[0];
 | 
					        s->lambda= s->lambda_table[0];
 | 
				
			||||||
 | 
					        //FIXME broken
 | 
				
			||||||
    }else
 | 
					    }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) {
 | 
					    if (s->out_format == FMT_MJPEG) {
 | 
				
			||||||
        /* for mjpeg, we do include qscale in the matrix */
 | 
					        /* 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 not_coded_score= 0;
 | 
				
			||||||
    int coeff[3][64];
 | 
					    int coeff[3][64];
 | 
				
			||||||
    int coeff_count[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;
 | 
					    const int esc_length= s->ac_esc_length;
 | 
				
			||||||
    uint8_t * length;
 | 
					    uint8_t * length;
 | 
				
			||||||
    uint8_t * last_length;
 | 
					    uint8_t * last_length;
 | 
				
			||||||
    int score_limit=0;
 | 
					    int score_limit=0;
 | 
				
			||||||
    int left_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);
 | 
					    s->dsp.fdct (block);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -4103,9 +4104,13 @@ static int dct_quantize_trellis_c(MpegEncContext *s,
 | 
				
			|||||||
        return last_non_zero;
 | 
					        return last_non_zero;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lambda= (qscale*qscale*64*105 + 64)>>7; //FIXME finetune
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
    score_tab[0]= 0;
 | 
					    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++){
 | 
					    for(i=0; i<=last_non_zero - start_i; i++){
 | 
				
			||||||
        int level_index, run, j;
 | 
					        int level_index, run, j;
 | 
				
			||||||
        const int dct_coeff= block[ scantable[i + start_i] ];
 | 
					        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
 | 
					        //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++;
 | 
					        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){
 | 
					    if(s->out_format != FMT_H263){
 | 
				
			||||||
        last_score= 256*256*256*120;
 | 
					        last_score= 256*256*256*120;
 | 
				
			||||||
        for(i= left_limit; i<=last_non_zero - start_i + 1; i++){
 | 
					        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  
 | 
					    uint8_t *edge_emu_buffer;     ///< points into the middle of allocated_edge_emu_buffer  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int qscale;                 ///< QP 
 | 
					    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 adaptive_quant;         ///< use adaptive quantization 
 | 
				
			||||||
    int dquant;                 ///< qscale difference to prev qscale  
 | 
					    int dquant;                 ///< qscale difference to prev qscale  
 | 
				
			||||||
    int pict_type;              ///< I_TYPE, P_TYPE, B_TYPE, ... 
 | 
					    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);
 | 
					static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ff_write_pass1_stats(MpegEncContext *s){
 | 
					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->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);
 | 
					            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();
 | 
					    emms_c();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for(i=0; i<5; i++){
 | 
					    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].count= 1.0;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        rcc->pred[i].decay= 0.4;
 | 
					        rcc->pred[i].decay= 0.4;
 | 
				
			||||||
@ -60,7 +60,7 @@ int ff_rate_control_init(MpegEncContext *s)
 | 
				
			|||||||
        rcc->mv_bits_sum[i]=
 | 
					        rcc->mv_bits_sum[i]=
 | 
				
			||||||
        rcc->qscale_sum [i]=
 | 
					        rcc->qscale_sum [i]=
 | 
				
			||||||
        rcc->frame_count[i]= 1; // 1 is better cuz of 1/0 and such
 | 
					        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;
 | 
					    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++){
 | 
					        for(i=0; i<rcc->num_entries; i++){
 | 
				
			||||||
            RateControlEntry *rce= &rcc->entry[i];
 | 
					            RateControlEntry *rce= &rcc->entry[i];
 | 
				
			||||||
            rce->pict_type= rce->new_pict_type=P_TYPE;
 | 
					            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->misc_bits= s->mb_num + 10;
 | 
				
			||||||
            rce->mb_var_sum= s->mb_num*100;
 | 
					            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.new_pict_type= rce.pict_type;
 | 
				
			||||||
                rce.mc_mb_var_sum= bits*s->mb_num/100000;
 | 
					                rce.mc_mb_var_sum= bits*s->mb_num/100000;
 | 
				
			||||||
                rce.mb_var_sum   = s->mb_num;
 | 
					                rce.mb_var_sum   = s->mb_num;
 | 
				
			||||||
                rce.qscale   = 2;
 | 
					                rce.qscale   = FF_QP2LAMBDA * 2;
 | 
				
			||||||
                rce.f_code   = 2;
 | 
					                rce.f_code   = 2;
 | 
				
			||||||
                rce.b_code   = 1;
 | 
					                rce.b_code   = 1;
 | 
				
			||||||
                rce.misc_bits= 1;
 | 
					                rce.misc_bits= 1;
 | 
				
			||||||
@ -339,9 +339,10 @@ static double get_diff_limited_q(MpegEncContext *s, RateControlEntry *rce, doubl
 | 
				
			|||||||
    /* last qscale / qdiff stuff */
 | 
					    /* last qscale / qdiff stuff */
 | 
				
			||||||
    if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){
 | 
					    if(rcc->last_non_b_pict_type==pict_type || pict_type!=I_TYPE){
 | 
				
			||||||
        double last_q= rcc->last_qscale_for[pict_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;
 | 
					        if     (q > last_q + maxdiff) q= last_q + maxdiff;
 | 
				
			||||||
        else if(q < last_q - a->max_qdiff) q= last_q - a->max_qdiff;
 | 
					        else if(q < last_q - maxdiff) q= last_q - maxdiff;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rcc->last_qscale_for[pict_type]= q; //Note we cant do that after blurring
 | 
					    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
 | 
					 * gets the qmin & qmax for pict_type
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
 | 
					static void get_qminmax(int *qmin_ret, int *qmax_ret, MpegEncContext *s, int pict_type){
 | 
				
			||||||
    int qmin= s->avctx->qmin;                                                       
 | 
					    int qmin= s->avctx->lmin;                                                       
 | 
				
			||||||
    int qmax= s->avctx->qmax;
 | 
					    int qmax= s->avctx->lmax;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    assert(qmin <= qmax);
 | 
					    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);
 | 
					        qmax= (int)(qmax*ABS(s->avctx->i_quant_factor)+s->avctx->i_quant_offset + 0.5);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qmin= clip(qmin, 1, 31);
 | 
					    qmin= clip(qmin, 1, FF_LAMBDA_MAX);
 | 
				
			||||||
    qmax= clip(qmax, 1, 31);
 | 
					    qmax= clip(qmax, 1, FF_LAMBDA_MAX);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    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
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(qmax<qmin) qmax= qmin;
 | 
					    if(qmax<qmin) qmax= qmin;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -479,21 +476,23 @@ static void adaptive_quantization(MpegEncContext *s, double q){
 | 
				
			|||||||
    float cplx_sum= 0.0;
 | 
					    float cplx_sum= 0.0;
 | 
				
			||||||
    float cplx_tab[s->mb_num];
 | 
					    float cplx_tab[s->mb_num];
 | 
				
			||||||
    float bits_tab[s->mb_num];
 | 
					    float bits_tab[s->mb_num];
 | 
				
			||||||
    const int qmin= s->avctx->mb_qmin;
 | 
					    const int qmin= s->avctx->lmin;
 | 
				
			||||||
    const int qmax= s->avctx->mb_qmax;
 | 
					    const int qmax= s->avctx->lmax;
 | 
				
			||||||
    Picture * const pic= &s->current_picture;
 | 
					    Picture * const pic= &s->current_picture;
 | 
				
			||||||
    int last_qscale=0;
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    for(i=0; i<s->mb_num; i++){
 | 
					    for(i=0; i<s->mb_num; i++){
 | 
				
			||||||
        const int mb_xy= s->mb_index2xy[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]);
 | 
					        float spat_cplx= sqrt(pic->mb_var[mb_xy]);
 | 
				
			||||||
        const int lumi= pic->mb_mean[mb_xy];
 | 
					        const int lumi= pic->mb_mean[mb_xy];
 | 
				
			||||||
        float bits, cplx, factor;
 | 
					        float bits, cplx, factor;
 | 
				
			||||||
        
 | 
					#if 0        
 | 
				
			||||||
        if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune
 | 
					        if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune
 | 
				
			||||||
        if(temp_cplx < q/3) temp_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 
 | 
					        if((s->mb_type[mb_xy]&MB_TYPE_INTRA)){//FIXME hq mode 
 | 
				
			||||||
            cplx= spat_cplx;
 | 
					            cplx= spat_cplx;
 | 
				
			||||||
            factor= 1.0 + p_masking;
 | 
					            factor= 1.0 + p_masking;
 | 
				
			||||||
@ -543,19 +542,16 @@ static void adaptive_quantization(MpegEncContext *s, double q){
 | 
				
			|||||||
            newq*= bits_sum/cplx_sum;
 | 
					            newq*= bits_sum/cplx_sum;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(i && ABS(last_qscale - newq)<0.75)
 | 
					        intq= (int)(newq + 0.5);
 | 
				
			||||||
            intq= last_qscale;
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            intq= (int)(newq + 0.5);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if     (intq > qmax) intq= qmax;
 | 
					        if     (intq > qmax) intq= qmax;
 | 
				
			||||||
        else if(intq < qmin) intq= qmin;
 | 
					        else if(intq < qmin) intq= qmin;
 | 
				
			||||||
//if(i%s->mb_width==0) printf("\n");
 | 
					//if(i%s->mb_width==0) printf("\n");
 | 
				
			||||||
//printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i]));
 | 
					//printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i]));
 | 
				
			||||||
        last_qscale=
 | 
					        s->lambda_table[mb_xy]= intq;
 | 
				
			||||||
        pic->qscale_table[mb_xy]= intq;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					//FIXME rd or at least approx for dquant
 | 
				
			||||||
 | 
					
 | 
				
			||||||
float ff_rate_estimate_qscale(MpegEncContext *s)
 | 
					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->new_pict_type= pict_type;
 | 
				
			||||||
        rce->mc_mb_var_sum= pic->mc_mb_var_sum;
 | 
					        rce->mc_mb_var_sum= pic->mc_mb_var_sum;
 | 
				
			||||||
        rce->mb_var_sum   = pic->   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->f_code   = s->f_code;
 | 
				
			||||||
        rce->b_code   = s->b_code;
 | 
					        rce->b_code   = s->b_code;
 | 
				
			||||||
        rce->misc_bits= 1;
 | 
					        rce->misc_bits= 1;
 | 
				
			||||||
 | 
				
			|||||||
@ -272,6 +272,8 @@ void avcodec_get_context_defaults(AVCodecContext *s){
 | 
				
			|||||||
    s->release_buffer= avcodec_default_release_buffer;
 | 
					    s->release_buffer= avcodec_default_release_buffer;
 | 
				
			||||||
    s->get_format= avcodec_default_get_format;
 | 
					    s->get_format= avcodec_default_get_format;
 | 
				
			||||||
    s->me_subpel_quality=8;
 | 
					    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->intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
 | 
				
			||||||
    s->inter_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
 | 
					5704a082cc5c5970620123ae20566286 *./data/a-huffyuv.avi
 | 
				
			||||||
799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
 | 
					799d3db687f6cdd7a837ec156efc171f *./data/out.yuv
 | 
				
			||||||
stddev:  0.00 bytes:7602176
 | 
					stddev:  0.00 bytes:7602176
 | 
				
			||||||
2fce40764b56ac4eade4bf29ee962ba0 *./data/a-mpeg4-rc.avi
 | 
					0cb2324e62eba4bb94d1cd2946355137 *./data/a-mpeg4-rc.avi
 | 
				
			||||||
580000bfe2d4359d9aa9a9415f953b3b *./data/out.yuv
 | 
					94f5f1d46c5da6d929eb8633835e73cb *./data/out.yuv
 | 
				
			||||||
stddev: 10.53 bytes:7145472
 | 
					stddev: 10.18 bytes:7145472
 | 
				
			||||||
dfe8fcd409a0605ef0cb37fc5e76ecf7 *./data/a-mpeg4-adv.avi
 | 
					dfe8fcd409a0605ef0cb37fc5e76ecf7 *./data/a-mpeg4-adv.avi
 | 
				
			||||||
c8877a6b8ed290a637c2119860b468b0 *./data/out.yuv
 | 
					c8877a6b8ed290a637c2119860b468b0 *./data/out.yuv
 | 
				
			||||||
stddev:  7.31 bytes:7602176
 | 
					stddev:  7.31 bytes:7602176
 | 
				
			||||||
 | 
				
			|||||||
@ -29,9 +29,9 @@ stddev:  5.28 bytes:7602176
 | 
				
			|||||||
242a7a18c2793e115007bc163861ef4e *./data/a-huffyuv.avi
 | 
					242a7a18c2793e115007bc163861ef4e *./data/a-huffyuv.avi
 | 
				
			||||||
dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
 | 
					dde5895817ad9d219f79a52d0bdfb001 *./data/out.yuv
 | 
				
			||||||
stddev:  0.00 bytes:7602176
 | 
					stddev:  0.00 bytes:7602176
 | 
				
			||||||
24de1707e32f6a651df9d8c72216aa68 *./data/a-mpeg4-rc.avi
 | 
					910c4f83e031bfb0024380d674d79091 *./data/a-mpeg4-rc.avi
 | 
				
			||||||
25f3d554edf174034b5e484a7cfb04d3 *./data/out.yuv
 | 
					ec7bb694f4eaca71ec7b106d4fe20092 *./data/out.yuv
 | 
				
			||||||
stddev:  4.32 bytes:7145472
 | 
					stddev:  4.20 bytes:7145472
 | 
				
			||||||
bb11d9808375911ea63d4f0889306037 *./data/a-mpeg4-adv.avi
 | 
					bb11d9808375911ea63d4f0889306037 *./data/a-mpeg4-adv.avi
 | 
				
			||||||
e465df12f2c8a6492a6ec0b1bddc1d0d *./data/out.yuv
 | 
					e465df12f2c8a6492a6ec0b1bddc1d0d *./data/out.yuv
 | 
				
			||||||
stddev:  4.97 bytes:7602176
 | 
					stddev:  4.97 bytes:7602176
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user