/* only usable for MPEG-PS streams */
static void av_estimate_timings_from_pts(AVFormatContext *ic, int64_t old_offset)
{
+ unsigned int nb_streams = ic->nb_streams;
AVPacket pkt1, *pkt = &pkt1;
AVStream *st;
int read_size, i, ret;
- int64_t end_time, start_time[MAX_STREAMS];
+ int64_t end_time, *start_time;
int64_t filesize, offset, duration;
int retry=0;
+ if (nb_streams >= INT_MAX/sizeof(*start_time) ||
+ !(start_time = av_malloc(nb_streams * sizeof(*start_time))))
+ return;
+
ic->cur_st = NULL;
/* flush packet queue */
flush_packet_queue(ic);
- for(i=0;i<ic->nb_streams;i++) {
+ for (i=0; i<nb_streams; i++) {
st = ic->streams[i];
if(st->start_time != AV_NOPTS_VALUE){
start_time[i]= st->start_time;
}while( end_time==AV_NOPTS_VALUE
&& filesize > (DURATION_MAX_READ_SIZE<<retry)
&& ++retry <= DURATION_MAX_RETRY);
+ av_free(start_time);
fill_all_stream_timings(ic);
url_fseek(ic->pb, old_offset, SEEK_SET);
- for(i=0; i<ic->nb_streams; i++){
+ for (i=0; i<nb_streams; i++) {
st= ic->streams[i];
st->cur_dts= st->first_dts;
st->last_IP_pts = AV_NOPTS_VALUE;
AVStream *st;
AVPacket pkt1, *pkt;
int64_t old_offset = url_ftell(ic->pb);
+ unsigned int nb_streams = ic->nb_streams;
struct {
int64_t last_dts;
int64_t duration_gcd;
int duration_count;
double duration_error[MAX_STD_TIMEBASES];
int64_t codec_info_duration;
- } info[MAX_STREAMS] = {{0}};
+ } *info, *tmp_info;
+
+ if (ic->nb_streams >= INT_MAX/sizeof(*info) ||
+ !(info = av_mallocz(ic->nb_streams * sizeof(*info))))
+ return AVERROR(ENOMEM);
for(i=0;i<ic->nb_streams;i++) {
AVCodec *codec;
}
}
- for(i=0;i<MAX_STREAMS;i++){
+ for (i=0; i<ic->nb_streams; i++) {
info[i].last_dts= AV_NOPTS_VALUE;
}
/* NOTE: a new stream can be added there if no header in file
(AVFMTCTX_NOHEADER) */
ret = av_read_frame_internal(ic, &pkt1);
- if(ret == AVERROR(EAGAIN))
- continue;
- if (ret < 0) {
+ if (ret < 0 && ret != AVERROR(EAGAIN)) {
/* EOF or error */
ret = -1; /* we could not have all the codec parameters before EOF */
for(i=0;i<ic->nb_streams;i++) {
break;
}
+ if (ic->nb_streams > nb_streams) {
+ if (ic->nb_streams >= INT_MAX/sizeof(*info) ||
+ !(tmp_info = av_realloc(info, ic->nb_streams*sizeof(*info)))) {
+ av_free(info);
+ return AVERROR(ENOMEM);
+ }
+ info = tmp_info;
+ memset(info + nb_streams, 0, (ic->nb_streams - nb_streams) * sizeof(*info));
+ nb_streams = ic->nb_streams;
+ }
+
+ if (ret == AVERROR(EAGAIN))
+ continue;
+
pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end);
if(av_dup_packet(pkt) < 0) {
+ av_free(info);
return AVERROR(ENOMEM);
}
}
#endif
+ av_free(info);
return ret;
}