@ -2699,10 +2699,10 @@ static int vp3_decode_frame(AVCodecContext *avctx,
debug_vp3 ( " , keyframe \n " ) ;
debug_vp3 ( " , keyframe \n " ) ;
/* skip the other 2 header bytes for now */
/* skip the other 2 header bytes for now */
skip_bits ( & gb , 16 ) ;
skip_bits ( & gb , 16 ) ;
if ( s - > last_frame . data [ 0 ] = = s - > golden_frame . data [ 0 ] ) {
if ( s - > last_frame . data [ 0 ] = = s - > golden_frame . data [ 0 ] ) {
if ( s - > golden_frame . data [ 0 ] )
if ( s - > golden_frame . data [ 0 ] )
avctx - > release_buffer ( avctx , & s - > golden_frame ) ;
avctx - > release_buffer ( avctx , & s - > golden_frame ) ;
s - > last_frame = s - > golden_frame ; /* ensure that we catch any access to this released frame */
} else {
} else {
if ( s - > golden_frame . data [ 0 ] )
if ( s - > golden_frame . data [ 0 ] )
avctx - > release_buffer ( avctx , & s - > golden_frame ) ;
avctx - > release_buffer ( avctx , & s - > golden_frame ) ;
@ -2710,7 +2710,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
avctx - > release_buffer ( avctx , & s - > last_frame ) ;
avctx - > release_buffer ( avctx , & s - > last_frame ) ;
}
}
s - > golden_frame . reference = 0 ;
s - > golden_frame . reference = 3 ;
if ( avctx - > get_buffer ( avctx , & s - > golden_frame ) < 0 ) {
if ( avctx - > get_buffer ( avctx , & s - > golden_frame ) < 0 ) {
printf ( " vp3: get_buffer() failed \n " ) ;
printf ( " vp3: get_buffer() failed \n " ) ;
return - 1 ;
return - 1 ;
@ -2728,7 +2728,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
debug_vp3 ( " \n " ) ;
debug_vp3 ( " \n " ) ;
/* allocate a new current frame */
/* allocate a new current frame */
s - > current_frame . reference = 0 ;
s - > current_frame . reference = 3 ;
if ( avctx - > get_buffer ( avctx , & s - > current_frame ) < 0 ) {
if ( avctx - > get_buffer ( avctx , & s - > current_frame ) < 0 ) {
printf ( " vp3: get_buffer() failed \n " ) ;
printf ( " vp3: get_buffer() failed \n " ) ;
return - 1 ;
return - 1 ;
@ -2789,6 +2789,7 @@ if (!s->keyframe) {
/* shuffle frames (last = current) */
/* shuffle frames (last = current) */
memcpy ( & s - > last_frame , & s - > current_frame , sizeof ( AVFrame ) ) ;
memcpy ( & s - > last_frame , & s - > current_frame , sizeof ( AVFrame ) ) ;
s - > current_frame . data [ 0 ] = NULL ; /* ensure that we catch any access to this released frame */
return buf_size ;
return buf_size ;
}
}
@ -2806,9 +2807,9 @@ static int vp3_decode_end(AVCodecContext *avctx)
av_free ( s - > superblock_macroblocks ) ;
av_free ( s - > superblock_macroblocks ) ;
av_free ( s - > macroblock_fragments ) ;
av_free ( s - > macroblock_fragments ) ;
av_free ( s - > macroblock_coding ) ;
av_free ( s - > macroblock_coding ) ;
/* release all frames */
/* release all frames */
if ( s - > golden_frame . data [ 0 ] )
if ( s - > golden_frame . data [ 0 ] & & s - > golden_frame . data [ 0 ] ! = s - > last_frame . data [ 0 ] )
avctx - > release_buffer ( avctx , & s - > golden_frame ) ;
avctx - > release_buffer ( avctx , & s - > golden_frame ) ;
if ( s - > last_frame . data [ 0 ] )
if ( s - > last_frame . data [ 0 ] )
avctx - > release_buffer ( avctx , & s - > last_frame ) ;
avctx - > release_buffer ( avctx , & s - > last_frame ) ;