You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavc/gifdec: unify get_buffer() calls I/P frames
Always call ff_reget_buffer(), which ensures that get_buffer2() is called with AV_GET_BUFFER_FLAG_REF. Fixes #10460.
This commit is contained in:
		
				
					committed by
					
						 Paul B Mahol
						Paul B Mahol
					
				
			
			
				
	
			
			
			
						parent
						
							acde0ae6c7
						
					
				
				
					commit
					891167dee5
				
			| @@ -489,42 +489,29 @@ static int gif_decode_frame(AVCodecContext *avctx, AVFrame *rframe, | ||||
|             return ret; | ||||
|  | ||||
|         av_frame_unref(s->frame); | ||||
|         if ((ret = ff_get_buffer(avctx, s->frame, 0)) < 0) | ||||
|             return ret; | ||||
|  | ||||
|         av_fast_malloc(&s->idx_line, &s->idx_line_size, s->screen_width); | ||||
|         if (!s->idx_line) | ||||
|             return AVERROR(ENOMEM); | ||||
|  | ||||
|         s->frame->pict_type = AV_PICTURE_TYPE_I; | ||||
|         s->frame->flags |= AV_FRAME_FLAG_KEY; | ||||
|         s->keyframe_ok = 1; | ||||
|     } else { | ||||
|         if (!s->keyframe_ok) { | ||||
|             av_log(avctx, AV_LOG_ERROR, "cannot decode frame without keyframe\n"); | ||||
|             return AVERROR_INVALIDDATA; | ||||
|         } | ||||
|  | ||||
|         if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0) | ||||
|             return ret; | ||||
|  | ||||
|         s->frame->pict_type = AV_PICTURE_TYPE_P; | ||||
|         s->frame->flags &= ~AV_FRAME_FLAG_KEY; | ||||
|     } else if (!s->keyframe_ok) { | ||||
|         av_log(avctx, AV_LOG_ERROR, "cannot decode frame without keyframe\n"); | ||||
|         return AVERROR_INVALIDDATA; | ||||
|     } | ||||
|  | ||||
|     ret = ff_reget_buffer(avctx, s->frame, 0); | ||||
|     if (ret < 0) | ||||
|         return ret; | ||||
|  | ||||
|     ret = gif_parse_next_image(s, s->frame); | ||||
|     if (ret < 0) | ||||
|         return ret; | ||||
|  | ||||
|     if ((ret = av_frame_ref(rframe, s->frame)) < 0) | ||||
|         return ret; | ||||
|     if (s->keyframe) { | ||||
|         rframe->pict_type = AV_PICTURE_TYPE_I; | ||||
|         rframe->flags |= AV_FRAME_FLAG_KEY; | ||||
|     } else { | ||||
|         rframe->pict_type = AV_PICTURE_TYPE_P; | ||||
|         rframe->flags &= ~AV_FRAME_FLAG_KEY; | ||||
|     } | ||||
|  | ||||
|     rframe->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; | ||||
|     rframe->flags     = AV_FRAME_FLAG_KEY * s->keyframe; | ||||
|     s->keyframe_ok   |= !!s->keyframe; | ||||
|  | ||||
|     *got_frame = 1; | ||||
|  | ||||
|     return bytestream2_tell(&s->gb); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user