| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -60,7 +60,10 @@ typedef struct PNGDecContext { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint32_t palette[256]; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint8_t *crow_buf; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint8_t *last_row; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int last_row_size; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint8_t *tmp_row; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint8_t *buffer; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int buffer_size; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int pass; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int crow_size; /* compressed row size (include filter type) */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int row_size; /* decompressed row size */ | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -509,7 +512,6 @@ static int decode_frame(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int buf_size            = avpkt->size; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    AVFrame *p; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    AVDictionary *metadata  = NULL; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint8_t *crow_buf_base  = NULL; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    uint32_t tag, length; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int64_t sig; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int ret; | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -667,7 +669,7 @@ static int decode_frame(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (avctx->pix_fmt == AV_PIX_FMT_PAL8) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    memcpy(p->data[1], s->palette, 256 * sizeof(uint32_t)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                /* empty row is used if differencing to the first row */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->last_row = av_mallocz(s->row_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                av_fast_padded_mallocz(&s->last_row, &s->last_row_size, s->row_size); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (!s->last_row) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    goto fail; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (s->interlace_type || | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -677,12 +679,12 @@ static int decode_frame(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        goto fail; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                /* compressed row */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                crow_buf_base = av_malloc(s->row_size + 16); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (!crow_buf_base) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                av_fast_padded_malloc(&s->buffer, &s->buffer_size, s->row_size + 16); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if (!s->buffer) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    goto fail; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                /* we want crow_buf+1 to be 16-byte aligned */ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->crow_buf          = crow_buf_base + 15; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->crow_buf          = s->buffer + 15; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->zstream.avail_out = s->crow_size; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                s->zstream.next_out  = s->crow_buf; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -861,9 +863,7 @@ static int decode_frame(AVCodecContext *avctx, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ret = bytestream2_tell(&s->gb); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 the_end: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    inflateEnd(&s->zstream); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_free(crow_buf_base); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->crow_buf = NULL; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&s->last_row); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&s->tmp_row); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return ret; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 fail: | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -914,6 +914,10 @@ static av_cold int png_dec_end(AVCodecContext *avctx) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_frame_free(&s->last_picture.f); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    ff_thread_release_buffer(avctx, &s->picture); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_frame_free(&s->picture.f); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&s->buffer); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->buffer_size = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    av_freep(&s->last_row); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    s->last_row_size = 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |