# HG changeset patch # User michael # Date 1107370144 0 # Node ID 258120c61eeaf2913584abd88fb4027dca91af92 # Parent 57ba17bd39243e9c621b87ed1db6493bfa2b4925 Border processing adaptive quant patch by (Christophe Massiot |cmassiot freebox fr) diff -r 57ba17bd3924 -r 258120c61eea avcodec.h --- a/avcodec.h Wed Feb 02 18:14:59 2005 +0000 +++ b/avcodec.h Wed Feb 02 18:49:04 2005 +0000 @@ -17,7 +17,7 @@ #define FFMPEG_VERSION_INT 0x000409 #define FFMPEG_VERSION "0.4.9-pre1" -#define LIBAVCODEC_BUILD 4740 +#define LIBAVCODEC_BUILD 4741 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION FFMPEG_VERSION @@ -1750,6 +1750,14 @@ * - decoding: unused */ int frame_skip_cmp; + + /** + * border processing masking. raises the quantizer for mbs on the borders + * of the picture. + * - encoding: set by user + * - decoding: unused + */ + float border_masking; } AVCodecContext; diff -r 57ba17bd3924 -r 258120c61eea mpegvideo.c --- a/mpegvideo.c Wed Feb 02 18:14:59 2005 +0000 +++ b/mpegvideo.c Wed Feb 02 18:49:04 2005 +0000 @@ -949,6 +949,7 @@ || s->avctx->temporal_cplx_masking || s->avctx->spatial_cplx_masking || s->avctx->p_masking + || s->avctx->border_masking || (s->flags&CODEC_FLAG_QP_RD)) && !s->fixed_qscale; diff -r 57ba17bd3924 -r 258120c61eea ratecontrol.c --- a/ratecontrol.c Wed Feb 02 18:14:59 2005 +0000 +++ b/ratecontrol.c Wed Feb 02 18:49:04 2005 +0000 @@ -501,6 +501,7 @@ const float temp_cplx_masking= s->avctx->temporal_cplx_masking; const float spatial_cplx_masking = s->avctx->spatial_cplx_masking; const float p_masking = s->avctx->p_masking; + const float border_masking = s->avctx->border_masking; float bits_sum= 0.0; float cplx_sum= 0.0; float cplx_tab[s->mb_num]; @@ -508,6 +509,8 @@ const int qmin= s->avctx->lmin; const int qmax= s->avctx->lmax; Picture * const pic= &s->current_picture; + const int mb_width = s->mb_width; + const int mb_height = s->mb_height; for(i=0; imb_num; i++){ const int mb_xy= s->mb_index2xy[i]; @@ -515,6 +518,10 @@ float spat_cplx= sqrt(pic->mb_var[mb_xy]); const int lumi= pic->mb_mean[mb_xy]; float bits, cplx, factor; + int mb_x = mb_xy % s->mb_stride; + int mb_y = mb_xy / s->mb_stride; + int mb_distance; + float mb_factor = 0.0; #if 0 if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune @@ -535,6 +542,23 @@ factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking); else factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking); + + if(mb_x < mb_width/5){ + mb_distance = mb_width/5 - mb_x; + mb_factor = (float)mb_distance / (float)(mb_width/5); + }else if(mb_x > 4*mb_width/5){ + mb_distance = mb_x - 4*mb_width/5; + mb_factor = (float)mb_distance / (float)(mb_width/5); + } + if(mb_y < mb_height/5){ + mb_distance = mb_height/5 - mb_y; + mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5)); + }else if(mb_y > 4*mb_height/5){ + mb_distance = mb_y - 4*mb_height/5; + mb_factor = FFMAX(mb_factor, (float)mb_distance / (float)(mb_height/5)); + } + + factor*= 1.0 - border_masking*mb_factor; if(factor<0.00001) factor= 0.00001;