lavf/oggdec: rework allocations in ogg_new_streams().
This commit is contained in:
		@@ -165,28 +165,36 @@ static int ogg_new_stream(AVFormatContext *s, uint32_t serial, int new_avstream)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct ogg *ogg = s->priv_data;
 | 
					    struct ogg *ogg = s->priv_data;
 | 
				
			||||||
    int idx = ogg->nstreams++;
 | 
					    int idx = ogg->nstreams;
 | 
				
			||||||
    AVStream *st;
 | 
					    AVStream *st;
 | 
				
			||||||
    struct ogg_stream *os;
 | 
					    struct ogg_stream *os;
 | 
				
			||||||
 | 
					    size_t size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ogg->streams = av_realloc (ogg->streams,
 | 
					    if (av_size_mult(ogg->nstreams + 1, sizeof(*ogg->streams), &size) < 0 ||
 | 
				
			||||||
                               ogg->nstreams * sizeof (*ogg->streams));
 | 
					        !(os = av_realloc(ogg->streams, size)))
 | 
				
			||||||
 | 
					        return AVERROR(ENOMEM);
 | 
				
			||||||
 | 
					    ogg->streams = os;
 | 
				
			||||||
    memset (ogg->streams + idx, 0, sizeof (*ogg->streams));
 | 
					    memset (ogg->streams + idx, 0, sizeof (*ogg->streams));
 | 
				
			||||||
    os = ogg->streams + idx;
 | 
					    os = ogg->streams + idx;
 | 
				
			||||||
    os->serial = serial;
 | 
					    os->serial = serial;
 | 
				
			||||||
    os->bufsize = DECODER_BUFFER_SIZE;
 | 
					    os->bufsize = DECODER_BUFFER_SIZE;
 | 
				
			||||||
    os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
 | 
					    os->buf = av_malloc(os->bufsize + FF_INPUT_BUFFER_PADDING_SIZE);
 | 
				
			||||||
    os->header = -1;
 | 
					    os->header = -1;
 | 
				
			||||||
 | 
					    if (!os->buf)
 | 
				
			||||||
 | 
					        return AVERROR(ENOMEM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (new_avstream) {
 | 
					    if (new_avstream) {
 | 
				
			||||||
        st = avformat_new_stream(s, NULL);
 | 
					        st = avformat_new_stream(s, NULL);
 | 
				
			||||||
        if (!st)
 | 
					        if (!st) {
 | 
				
			||||||
 | 
					            av_freep(&os->buf);
 | 
				
			||||||
            return AVERROR(ENOMEM);
 | 
					            return AVERROR(ENOMEM);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        st->id = idx;
 | 
					        st->id = idx;
 | 
				
			||||||
        avpriv_set_pts_info(st, 64, 1, 1000000);
 | 
					        avpriv_set_pts_info(st, 64, 1, 1000000);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ogg->nstreams++;
 | 
				
			||||||
    return idx;
 | 
					    return idx;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user