mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-25 09:51:06 +08:00 
			
		
		
		
	flac_parser: only buffer the estimated amount of input needed.
Patch by Michael Chinen [mchinen at gmail] Originally committed as revision 25933 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		 Michael Chinen
					Michael Chinen
				
			
				
					committed by
					
						 Justin Ruggles
						Justin Ruggles
					
				
			
			
				
	
			
			
			 Justin Ruggles
						Justin Ruggles
					
				
			
						parent
						
							97f7fe687a
						
					
				
				
					commit
					7edbd5361c
				
			| @@ -42,6 +42,8 @@ | |||||||
| #define FLAC_MAX_SEQUENTIAL_HEADERS 3 | #define FLAC_MAX_SEQUENTIAL_HEADERS 3 | ||||||
| /** minimum number of headers buffered and checked before returning frames    */ | /** minimum number of headers buffered and checked before returning frames    */ | ||||||
| #define FLAC_MIN_HEADERS 10 | #define FLAC_MIN_HEADERS 10 | ||||||
|  | /** estimate for average size of a FLAC frame                                 */ | ||||||
|  | #define FLAC_AVG_FRAME_SIZE 8192 | ||||||
|  |  | ||||||
| /** scoring settings for score_header */ | /** scoring settings for score_header */ | ||||||
| #define FLAC_HEADER_BASE_SCORE        10 | #define FLAC_HEADER_BASE_SCORE        10 | ||||||
| @@ -476,6 +478,7 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, | |||||||
|     FLACParseContext *fpc = s->priv_data; |     FLACParseContext *fpc = s->priv_data; | ||||||
|     FLACHeaderMarker *curr; |     FLACHeaderMarker *curr; | ||||||
|     int nb_headers; |     int nb_headers; | ||||||
|  |     int read_size = 0; | ||||||
|  |  | ||||||
|     if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { |     if (s->flags & PARSER_FLAG_COMPLETE_FRAMES) { | ||||||
|         FLACFrameInfo fi; |         FLACFrameInfo fi; | ||||||
| @@ -543,20 +546,25 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, | |||||||
|         /* Pad the end once if EOF, to check the final region for headers. */ |         /* Pad the end once if EOF, to check the final region for headers. */ | ||||||
|         if (!buf_size) { |         if (!buf_size) { | ||||||
|             fpc->end_padded = 1; |             fpc->end_padded = 1; | ||||||
|             buf_size        = MAX_FRAME_HEADER_SIZE; |             buf_size = read_size = MAX_FRAME_HEADER_SIZE; | ||||||
|  |         } else { | ||||||
|  |             /* The maximum read size is the upper-bound of what the parser | ||||||
|  |                needs to have the required number of frames buffered */ | ||||||
|  |             int nb_desired = FLAC_MIN_HEADERS - fpc->nb_headers_buffered + 1; | ||||||
|  |             read_size = FFMIN(buf_size, nb_desired * FLAC_AVG_FRAME_SIZE); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         /* Fill the buffer. */ |         /* Fill the buffer. */ | ||||||
|         if (av_fifo_realloc2(fpc->fifo_buf, |         if (av_fifo_realloc2(fpc->fifo_buf, | ||||||
|                              buf_size + av_fifo_size(fpc->fifo_buf)) < 0) { |                              read_size + av_fifo_size(fpc->fifo_buf)) < 0) { | ||||||
|             av_log(avctx, AV_LOG_ERROR, |             av_log(avctx, AV_LOG_ERROR, | ||||||
|                    "couldn't reallocate buffer of size %d\n", |                    "couldn't reallocate buffer of size %d\n", | ||||||
|                    buf_size + av_fifo_size(fpc->fifo_buf)); |                    read_size + av_fifo_size(fpc->fifo_buf)); | ||||||
|             goto handle_error; |             goto handle_error; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (buf) { |         if (buf) { | ||||||
|             av_fifo_generic_write(fpc->fifo_buf, (void*) buf, buf_size, NULL); |             av_fifo_generic_write(fpc->fifo_buf, (void*) buf, read_size, NULL); | ||||||
|         } else { |         } else { | ||||||
|             int8_t pad[MAX_FRAME_HEADER_SIZE]; |             int8_t pad[MAX_FRAME_HEADER_SIZE]; | ||||||
|             memset(pad, 0, sizeof(pad)); |             memset(pad, 0, sizeof(pad)); | ||||||
| @@ -565,7 +573,7 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, | |||||||
|  |  | ||||||
|         /* Tag headers and update sequences. */ |         /* Tag headers and update sequences. */ | ||||||
|         start_offset = av_fifo_size(fpc->fifo_buf) - |         start_offset = av_fifo_size(fpc->fifo_buf) - | ||||||
|                        (buf_size + (MAX_FRAME_HEADER_SIZE - 1)); |                        (read_size + (MAX_FRAME_HEADER_SIZE - 1)); | ||||||
|         start_offset = FFMAX(0, start_offset); |         start_offset = FFMAX(0, start_offset); | ||||||
|         nb_headers   = find_new_headers(fpc, start_offset); |         nb_headers   = find_new_headers(fpc, start_offset); | ||||||
|  |  | ||||||
| @@ -593,7 +601,7 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, | |||||||
|                 fpc->fifo_buf->wptr += fpc->fifo_buf->end - |                 fpc->fifo_buf->wptr += fpc->fifo_buf->end - | ||||||
|                     fpc->fifo_buf->buffer; |                     fpc->fifo_buf->buffer; | ||||||
|             } |             } | ||||||
|             buf_size = 0; |             buf_size = read_size = 0; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -615,7 +623,7 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, | |||||||
|             *poutbuf          = flac_fifo_read_wrap(fpc, 0, *poutbuf_size, |             *poutbuf          = flac_fifo_read_wrap(fpc, 0, *poutbuf_size, | ||||||
|                                                     &fpc->wrap_buf, |                                                     &fpc->wrap_buf, | ||||||
|                                                     &fpc->wrap_buf_allocated_size); |                                                     &fpc->wrap_buf_allocated_size); | ||||||
|             return buf_size ? buf_size : (fpc->best_header->offset - |             return buf_size ? read_size : (fpc->best_header->offset - | ||||||
|                                           av_fifo_size(fpc->fifo_buf)); |                                           av_fifo_size(fpc->fifo_buf)); | ||||||
|         } |         } | ||||||
|         if (!buf_size) |         if (!buf_size) | ||||||
| @@ -625,16 +633,15 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx, | |||||||
| handle_error: | handle_error: | ||||||
|     *poutbuf      = NULL; |     *poutbuf      = NULL; | ||||||
|     *poutbuf_size = 0; |     *poutbuf_size = 0; | ||||||
|     return buf_size; |     return read_size; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int flac_parse_init(AVCodecParserContext *c) | static int flac_parse_init(AVCodecParserContext *c) | ||||||
| { | { | ||||||
|     FLACParseContext *fpc = c->priv_data; |     FLACParseContext *fpc = c->priv_data; | ||||||
|     /* There will generally be FLAC_MIN_HEADERS buffered in the fifo before |     /* There will generally be FLAC_MIN_HEADERS buffered in the fifo before | ||||||
|        it drains.  8192 is an approximate average size of a flac frame     */ |        it drains.  This is allocated early to avoid slow reallocation. */ | ||||||
|     fpc->fifo_buf = av_fifo_alloc(8192 * FLAC_MIN_HEADERS); |     fpc->fifo_buf = av_fifo_alloc(FLAC_AVG_FRAME_SIZE * (FLAC_MIN_HEADERS + 3)); | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user