aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/snow.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2004-08-02 19:09:28 +0000
committerMichael Niedermayer <michaelni@gmx.at>2004-08-02 19:09:28 +0000
commit93fbdb5ac555e6fc03af61ac5a870d30924c330b (patch)
tree91a66ac35beb0fc463e3980621fa1c6672e4eb25 /libavcodec/snow.c
parent3bb9f096d46001aef0eadd13b72d52621d8bbbce (diff)
downloadffmpeg-93fbdb5ac555e6fc03af61ac5a870d30924c330b.tar.gz
lossless support
Originally committed as revision 3374 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/snow.c')
-rw-r--r--libavcodec/snow.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/libavcodec/snow.c b/libavcodec/snow.c
index d3162edaad..99e39a127e 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; y<h; y++){
@@ -2673,9 +2678,13 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size,
s->keyframe=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; i<s->mb_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; y<h; y++){
+ for(x=0; x<w; x++){
+ s->spatial_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; level<s->spatial_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; y<h; y++){
+ for(x=0; x<w; x++){
+ s->spatial_dwt_buffer[y*w + x]<<=8;
+ }
+ }
+ }
predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
//FIXME optimize
for(y=0; y<h; y++){
@@ -2918,11 +2942,10 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size,
if(pict->data[plane_index]) //FIXME gray hack
for(y=0; y<h; y++){
for(x=0; x<w; x++){
- int d= s->spatial_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; y<h; y++){
+ for(x=0; x<w; x++){
+ s->spatial_dwt_buffer[y*w + x]<<=8;
+ }
+ }
+ }
predict_plane(s, s->spatial_dwt_buffer, plane_index, 1);
//FIXME optimize