# HG changeset patch # User michael # Date 1189350406 0 # Node ID b5c137f3f53a0092593970fa7dc9639fe8cb51ba # Parent 834f359e72579ab2adf66ac8a73883d42e860ca6 allow changing of the spatial_decomposition_count and quantization tables per frame (this is untested as the encoder does not use it yet) diff -r 834f359e7257 -r b5c137f3f53a snow.c --- a/snow.c Sun Sep 09 13:47:25 2007 +0000 +++ b/snow.c Sun Sep 09 15:06:46 2007 +0000 @@ -3516,8 +3516,21 @@ } } +static void encode_qlogs(SnowContext *s){ + int plane_index, level, orientation; + + for(plane_index=0; plane_index<2; plane_index++){ + for(level=0; levelspatial_decomposition_count; level++){ + for(orientation=level ? 1:0; orientation<4; orientation++){ + if(orientation==2) continue; + put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1); + } + } + } +} + static void encode_header(SnowContext *s){ - int plane_index, level, orientation, i; + int plane_index, i; uint8_t kstate[32]; memset(kstate, MID_STATE, sizeof(kstate)); @@ -3550,14 +3563,7 @@ // put_rac(&s->c, s->header_state, s->rate_scalability); put_symbol(&s->c, s->header_state, s->max_ref_frames-1, 0); - for(plane_index=0; plane_index<2; plane_index++){ - for(level=0; levelspatial_decomposition_count; level++){ - for(orientation=level ? 1:0; orientation<4; orientation++){ - if(orientation==2) continue; - put_symbol(&s->c, s->header_state, s->plane[plane_index].band[level][orientation].qlog, 1); - } - } - } + encode_qlogs(s); } if(!s->keyframe){ @@ -3583,6 +3589,11 @@ memcpy(p->last_hcoeff, p->hcoeff, sizeof(p->hcoeff)); } } + put_rac(&s->c, s->header_state, 0); + if(0){ + put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); + encode_qlogs(s); + } } put_symbol(&s->c, s->header_state, s->spatial_decomposition_type - s->last_spatial_decomposition_type, 1); @@ -3598,8 +3609,24 @@ s->last_block_max_depth = s->block_max_depth; } +static void decode_qlogs(SnowContext *s){ + int plane_index, level, orientation; + + for(plane_index=0; plane_index<3; plane_index++){ + for(level=0; levelspatial_decomposition_count; level++){ + for(orientation=level ? 1:0; orientation<4; orientation++){ + int q; + if (plane_index==2) q= s->plane[1].band[level][orientation].qlog; + else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog; + else q= get_symbol(&s->c, s->header_state, 1); + s->plane[plane_index].band[level][orientation].qlog= q; + } + } + } +} + static int decode_header(SnowContext *s){ - int plane_index, level, orientation; + int plane_index; uint8_t kstate[32]; memset(kstate, MID_STATE, sizeof(kstate)); @@ -3630,17 +3657,7 @@ // s->rate_scalability= get_rac(&s->c, s->header_state); s->max_ref_frames= get_symbol(&s->c, s->header_state, 0)+1; - for(plane_index=0; plane_index<3; plane_index++){ - for(level=0; levelspatial_decomposition_count; level++){ - for(orientation=level ? 1:0; orientation<4; orientation++){ - int q; - if (plane_index==2) q= s->plane[1].band[level][orientation].qlog; - else if(orientation==2) q= s->plane[plane_index].band[level][1].qlog; - else q= get_symbol(&s->c, s->header_state, 1); - s->plane[plane_index].band[level][orientation].qlog= q; - } - } - } + decode_qlogs(s); } if(!s->keyframe){ @@ -3663,6 +3680,10 @@ s->plane[2].htaps = s->plane[1].htaps; memcpy(s->plane[2].hcoeff, s->plane[1].hcoeff, sizeof(s->plane[1].hcoeff)); } + if(get_rac(&s->c, s->header_state)){ + s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0); + decode_qlogs(s); + } } s->spatial_decomposition_type+= get_symbol(&s->c, s->header_state, 1);