# HG changeset patch # User michael # Date 1093969729 0 # Node ID e0b08bdf565d410b7825adb3c07031da1ba9f6ce # Parent 970c2de19b2e89c2c98841408b18aecd19cdd730 10l (keyframes and context resets) diff -r 970c2de19b2e -r e0b08bdf565d snow.c --- a/snow.c Sat Aug 28 14:24:48 2004 +0000 +++ b/snow.c Tue Aug 31 16:28:49 2004 +0000 @@ -400,6 +400,7 @@ uint8_t header_state[32]; uint8_t block_state[128 + 32*128]; int keyframe; + int always_reset; int version; int spatial_decomposition_type; int temporal_decomposition_type; @@ -1526,7 +1527,7 @@ static void reset_contexts(SnowContext *s){ int plane_index, level, orientation; - for(plane_index=0; plane_index<2; plane_index++){ + for(plane_index=0; plane_index<3; plane_index++){ for(level=0; levelspatial_decomposition_count; level++){ for(orientation=level ? 1:0; orientation<4; orientation++){ memset(s->plane[plane_index].band[level][orientation].state, 0, sizeof(s->plane[plane_index].band[level][orientation].state)); @@ -2261,10 +2262,14 @@ static void encode_header(SnowContext *s){ int plane_index, level, orientation; + uint8_t kstate[32]={0}; - put_cabac(&s->c, s->header_state, s->keyframe); // state clearing stuff? + put_cabac(&s->c, kstate, s->keyframe); + if(s->keyframe || s->always_reset) + reset_contexts(s); if(s->keyframe){ put_symbol(&s->c, s->header_state, s->version, 0); + put_cabac(&s->c, s->header_state, s->always_reset); put_symbol(&s->c, s->header_state, s->temporal_decomposition_type, 0); put_symbol(&s->c, s->header_state, s->temporal_decomposition_count, 0); put_symbol(&s->c, s->header_state, s->spatial_decomposition_count, 0); @@ -2292,14 +2297,18 @@ static int decode_header(SnowContext *s){ int plane_index, level, orientation; + uint8_t kstate[32]={0}; - s->keyframe= get_cabac(&s->c, s->header_state); + s->keyframe= get_cabac(&s->c, kstate); + if(s->keyframe || s->always_reset) + reset_contexts(s); if(s->keyframe){ s->version= get_symbol(&s->c, s->header_state, 0); if(s->version>0){ av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version); return -1; } + s->always_reset= get_cabac(&s->c, s->header_state); s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0); s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0); s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0); @@ -2522,9 +2531,6 @@ int w= s->avctx->width; //FIXME round up to x16 ? int h= s->avctx->height; - if(s->keyframe) - reset_contexts(s); - if(s->current_picture.data[0]){ draw_edges(s->current_picture.data[0], s->current_picture.linesize[0], w , h , EDGE_WIDTH ); draw_edges(s->current_picture.data[1], s->current_picture.linesize[1], w>>1, h>>1, EDGE_WIDTH/2); @@ -2557,8 +2563,6 @@ s->input_picture = *pict; - memset(s->header_state, 0, sizeof(s->header_state)); - s->keyframe=avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0; pict->pict_type= s->keyframe ? FF_I_TYPE : FF_P_TYPE; @@ -2571,6 +2575,7 @@ } frame_start(s); + s->current_picture.key_frame= s->keyframe; if(pict->pict_type == P_TYPE){ int block_width = (width +15)>>4; @@ -2777,8 +2782,6 @@ ff_init_cabac_decoder(c, buf, buf_size); ff_init_cabac_states(c, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64); - memset(s->header_state, 0, sizeof(s->header_state)); - s->current_picture.pict_type= FF_I_TYPE; //FIXME I vs. P decode_header(s); if(!s->block) alloc_blocks(s);