| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -164,6 +164,43 @@ void ff_copy_picture(Picture *dst, Picture *src){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    dst->type= FF_BUFFER_TYPE_COPY; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			/** | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 * Releases a frame buffer | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static void free_frame_buffer(MpegEncContext *s, Picture *pic) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->avctx->release_buffer(s->avctx, (AVFrame*)pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			/** | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 * Allocates a frame buffer | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int r; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    r = s->avctx->get_buffer(s->avctx, (AVFrame*)pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (r<0 || !pic->age || !pic->type || !pic->data[0]) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return -1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        free_frame_buffer(s, pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return -1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (pic->linesize[1] != pic->linesize[2]) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        free_frame_buffer(s, pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return -1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			/** | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 * allocates a Picture | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 * The pixels are allocated/set by calling get_buffer() if shared=0 | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -183,24 +220,8 @@ int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    }else{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        assert(!pic->data[0]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(r<0 || !pic->age || !pic->type || !pic->data[0]){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (alloc_frame_buffer(s, pic) < 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return -1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            s->avctx->release_buffer(s->avctx, (AVFrame*)pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return -1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if(pic->linesize[1] != pic->linesize[2]){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            s->avctx->release_buffer(s->avctx, (AVFrame*)pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return -1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->linesize  = pic->linesize[0]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->uvlinesize= pic->linesize[1]; | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -249,7 +270,7 @@ int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			fail: //for the CHECKED_ALLOCZ macro | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(r>=0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->avctx->release_buffer(s->avctx, (AVFrame*)pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        free_frame_buffer(s, pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return -1; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -260,7 +281,7 @@ static void free_picture(MpegEncContext *s, Picture *pic){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int i; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        s->avctx->release_buffer(s->avctx, (AVFrame*)pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        free_frame_buffer(s, pic); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&pic->mb_var); | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -839,7 +860,7 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    /* mark&release old frames */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (s->pict_type != FF_B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			      if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			          free_frame_buffer(s, s->last_picture_ptr); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /* release forgotten pictures */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /* if(mpeg124/h263) */ | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -847,7 +868,7 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            for(i=0; i<MAX_PICTURE_COUNT; i++){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    free_frame_buffer(s, &s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -858,7 +879,7 @@ alloc: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /* release non reference frames */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for(i=0; i<MAX_PICTURE_COUNT; i++){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                free_frame_buffer(s, &s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -996,7 +1017,7 @@ void MPV_frame_end(MpegEncContext *s) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        /* release non-reference frames */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for(i=0; i<MAX_PICTURE_COUNT; i++){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                free_frame_buffer(s, &s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -2068,7 +2089,7 @@ void ff_mpeg_flush(AVCodecContext *avctx){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for(i=0; i<MAX_PICTURE_COUNT; i++){ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			       if(s->picture[i].data[0] && (   s->picture[i].type == FF_BUFFER_TYPE_INTERNAL | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                    || s->picture[i].type == FF_BUFFER_TYPE_USER)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        free_frame_buffer(s, &s->picture[i]); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |