cleaned up buffer management
Originally committed as revision 5522 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									42fb414804
								
							
						
					
					
						commit
						12a195e32f
					
				| @ -193,8 +193,6 @@ ogg_new_stream (AVFormatContext * s, uint32_t serial) | ||||
|     os = ogg->streams + idx; | ||||
|     os->serial = serial; | ||||
|     os->bufsize = DECODER_BUFFER_SIZE; | ||||
|     os->buf = av_malloc (os->bufsize); | ||||
|     memset (os->buf, 0, os->bufsize); | ||||
|     os->header = -1; | ||||
| 
 | ||||
|     st = av_new_stream (s, idx); | ||||
| @ -207,6 +205,23 @@ ogg_new_stream (AVFormatContext * s, uint32_t serial) | ||||
|     return idx; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| ogg_new_buf(ogg_t *ogg, int idx) | ||||
| { | ||||
|     ogg_stream_t *os = ogg->streams + idx; | ||||
|     u_char *nb = av_malloc(os->bufsize); | ||||
|     int size = os->bufpos - os->pstart; | ||||
|     if(os->buf){ | ||||
|         memcpy(nb, os->buf + os->pstart, size); | ||||
|         av_free(os->buf); | ||||
|     } | ||||
|     os->buf = nb; | ||||
|     os->bufpos = size; | ||||
|     os->pstart = 0; | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| ogg_read_page (AVFormatContext * s, int *str) | ||||
| { | ||||
| @ -264,6 +279,9 @@ ogg_read_page (AVFormatContext * s, int *str) | ||||
| 
 | ||||
|     os = ogg->streams + idx; | ||||
| 
 | ||||
|     if(os->segp == os->nsegs) | ||||
|         ogg_new_buf(ogg, idx); | ||||
| 
 | ||||
|     if (get_buffer (bc, os->segments, nsegs) < nsegs) | ||||
|         return -1; | ||||
| 
 | ||||
| @ -310,7 +328,7 @@ ogg_read_page (AVFormatContext * s, int *str) | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| ogg_packet (AVFormatContext * s, int *str) | ||||
| ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize) | ||||
| { | ||||
|     ogg_t *ogg = s->priv_data; | ||||
|     int idx; | ||||
| @ -363,14 +381,6 @@ ogg_packet (AVFormatContext * s, int *str) | ||||
|         } | ||||
| 
 | ||||
|         if (!complete && os->segp == os->nsegs){ | ||||
|             uint8_t *nb = av_malloc (os->bufsize); | ||||
|             int size = os->bufpos - os->pstart; | ||||
|             memset (nb, 0, os->bufsize); | ||||
|             memcpy (nb, os->buf + os->pstart, size); | ||||
|             av_free (os->buf); | ||||
|             os->buf = nb; | ||||
|             os->bufpos = size; | ||||
|             os->pstart = 0; | ||||
|             ogg->curidx = -1; | ||||
|         } | ||||
|     }while (!complete); | ||||
| @ -401,6 +411,12 @@ ogg_packet (AVFormatContext * s, int *str) | ||||
|             os->codec->packet (s, idx); | ||||
|         if (str) | ||||
|             *str = idx; | ||||
|         if (dstart) | ||||
|             *dstart = os->pstart; | ||||
|         if (dsize) | ||||
|             *dsize = os->psize; | ||||
|         os->pstart += os->psize; | ||||
|         os->psize = 0; | ||||
|     } | ||||
| 
 | ||||
|     os->seq++; | ||||
| @ -416,7 +432,7 @@ ogg_get_headers (AVFormatContext * s) | ||||
|     ogg_t *ogg = s->priv_data; | ||||
| 
 | ||||
|     do{ | ||||
|         if (ogg_packet (s, NULL) < 0) | ||||
|         if (ogg_packet (s, NULL, NULL, NULL) < 0) | ||||
|             return -1; | ||||
|     }while (!ogg->headers); | ||||
| 
 | ||||
| @ -507,10 +523,11 @@ ogg_read_packet (AVFormatContext * s, AVPacket * pkt) | ||||
|     ogg_t *ogg; | ||||
|     ogg_stream_t *os; | ||||
|     int idx = -1; | ||||
|     int pstart, psize; | ||||
| 
 | ||||
|     //Get an ogg packet
 | ||||
|     do{ | ||||
|         if (ogg_packet (s, &idx) < 0) | ||||
|         if (ogg_packet (s, &idx, &pstart, &psize) < 0) | ||||
|             return AVERROR_IO; | ||||
|     }while (idx < 0 || !s->streams[idx]); | ||||
| 
 | ||||
| @ -518,18 +535,16 @@ ogg_read_packet (AVFormatContext * s, AVPacket * pkt) | ||||
|     os = ogg->streams + idx; | ||||
| 
 | ||||
|     //Alloc a pkt
 | ||||
|     if (av_new_packet (pkt, os->psize) < 0) | ||||
|     if (av_new_packet (pkt, psize) < 0) | ||||
|         return AVERROR_IO; | ||||
|     pkt->stream_index = idx; | ||||
|     memcpy (pkt->data, os->buf + os->pstart, os->psize); | ||||
|     memcpy (pkt->data, os->buf + pstart, psize); | ||||
|     if (os->lastgp != -1LL){ | ||||
|         pkt->pts = ogg_gptopts (s, idx, os->lastgp); | ||||
|         os->lastgp = -1; | ||||
|     } | ||||
|     //next
 | ||||
|     os->pstart += os->psize; | ||||
|     os->psize = 0; | ||||
|     return os->psize; | ||||
| 
 | ||||
|     return psize; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user