From: Michael Niedermayer Date: Mon, 2 Aug 2004 19:09:28 +0000 (+0000) Subject: lossless support X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=93fbdb5ac555e6fc03af61ac5a870d30924c330b;p=ffmpeg lossless support Originally committed as revision 3374 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavcodec/snow.c b/libavcodec/snow.c index d3162edaada..99e39a127ea 100644 --- a/libavcodec/snow.c +++ b/libavcodec/snow.c @@ -30,6 +30,7 @@ #define MAX_PLANES 4 #define DWTELEM int #define QROOT 8 +#define LOSSLESS_QLOG -128 static const int8_t quant3[256]={ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -2246,6 +2247,8 @@ static void quantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride, int b assert(QROOT==8); + if(s->qlog == LOSSLESS_QLOG) return; + bias= bias ? 0 : (3*qmul)>>3; thres1= ((qmul - bias)>>QEXPSHIFT) - 1; thres2= 2*thres1; @@ -2305,6 +2308,8 @@ static void dequantize(SnowContext *s, SubBand *b, DWTELEM *src, int stride){ const int qadd= (s->qbias*qmul)>>QBIAS_SHIFT; int x,y; + if(s->qlog == LOSSLESS_QLOG) return; + assert(QROOT==8); for(y=0; ykeyframe=avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0; pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE; - s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2)); - //<64 >60 - s->qlog += 61; + if(pict->quality){ + s->qlog= rint(QROOT*log(pict->quality / (float)FF_QP2LAMBDA)/log(2)); + //<64 >60 + s->qlog += 61; + }else{ + s->qlog= LOSSLESS_QLOG; + } for(i=0; imb_band.stride * s->mb_band.height; i++){ s->mb_band.buf[i]= s->keyframe; @@ -2877,8 +2886,16 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, } } predict_plane(s, s->spatial_dwt_buffer, plane_index, 0); - spatial_dwt(s, s->spatial_dwt_buffer, w, h, w); + if(s->qlog == LOSSLESS_QLOG){ + for(y=0; yspatial_dwt_buffer[y*w + x]= (s->spatial_dwt_buffer[y*w + x] + 127)>>8; + } + } + } + spatial_dwt(s, s->spatial_dwt_buffer, w, h, w); + for(level=0; levelspatial_decomposition_count; level++){ for(orientation=level ? 1 : 0; orientation<4; orientation++){ SubBand *b= &p->band[level][orientation]; @@ -2901,8 +2918,15 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, dequantize(s, b, b->buf, b->stride); } } - + spatial_idwt(s, s->spatial_dwt_buffer, w, h, w); + if(s->qlog == LOSSLESS_QLOG){ + for(y=0; yspatial_dwt_buffer[y*w + x]<<=8; + } + } + } predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); //FIXME optimize for(y=0; ydata[plane_index]) //FIXME gray hack for(y=0; yspatial_dwt_buffer[y*w + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x]*256; + int d= s->current_picture.data[plane_index][y*s->current_picture.linesize[plane_index] + x] - pict->data[plane_index][y*pict->linesize[plane_index] + x]; error += d*d; } } - error= (error + 128*256)>>16; s->avctx->error[plane_index] += error; s->avctx->error[3] += error; } @@ -3041,6 +3064,13 @@ if(!(s->avctx->debug&1024)) } spatial_idwt(s, s->spatial_dwt_buffer, w, h, w); + if(s->qlog == LOSSLESS_QLOG){ + for(y=0; yspatial_dwt_buffer[y*w + x]<<=8; + } + } + } predict_plane(s, s->spatial_dwt_buffer, plane_index, 1); //FIXME optimize