|
|
|
@@ -121,7 +121,7 @@ static int get_riff(AVFormatContext *s, AVIOContext *pb) |
|
|
|
if(!memcmp(header, avi_headers[i], 8)) |
|
|
|
break; |
|
|
|
if(!avi_headers[i][0]) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
if(header[7] == 0x19) |
|
|
|
av_log(s, AV_LOG_INFO, "This file has been generated by a totally broken muxer.\n"); |
|
|
|
@@ -149,26 +149,26 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){ |
|
|
|
longs_pre_entry,index_type, entries_in_use, chunk_id, base); |
|
|
|
|
|
|
|
if(stream_id >= s->nb_streams || stream_id < 0) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
st= s->streams[stream_id]; |
|
|
|
ast = st->priv_data; |
|
|
|
|
|
|
|
if(index_sub_type) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
avio_rl32(pb); |
|
|
|
|
|
|
|
if(index_type && longs_pre_entry != 2) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
if(index_type>1) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
if(filesize > 0 && base >= filesize){ |
|
|
|
av_log(s, AV_LOG_ERROR, "ODML index invalid\n"); |
|
|
|
if(base>>32 == (base & 0xFFFFFFFF) && (base & 0xFFFFFFFF) < filesize && filesize <= 0xFFFFFFFF) |
|
|
|
base &= 0xFFFFFFFF; |
|
|
|
else |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
for(i=0; i<entries_in_use; i++){ |
|
|
|
@@ -181,7 +181,7 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){ |
|
|
|
av_dlog(s, "pos:%"PRId64", len:%X\n", pos, len); |
|
|
|
|
|
|
|
if(pb->eof_reached) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
if(last_pos == pos || pos == base - 8) |
|
|
|
avi->non_interleaved= 1; |
|
|
|
@@ -198,13 +198,13 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){ |
|
|
|
duration = avio_rl32(pb); |
|
|
|
|
|
|
|
if(pb->eof_reached) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
pos = avio_tell(pb); |
|
|
|
|
|
|
|
if(avi->odml_depth > MAX_ODML_DEPTH){ |
|
|
|
av_log(s, AV_LOG_ERROR, "Too deeply nested ODML indexes\n"); |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
avio_seek(pb, offset+8, SEEK_SET); |
|
|
|
@@ -254,10 +254,10 @@ static int avi_read_tag(AVFormatContext *s, AVStream *st, uint32_t tag, uint32_t |
|
|
|
size += (size & 1); |
|
|
|
|
|
|
|
if (size == UINT_MAX) |
|
|
|
return -1; |
|
|
|
return AVERROR(EINVAL); |
|
|
|
value = av_malloc(size+1); |
|
|
|
if (!value) |
|
|
|
return -1; |
|
|
|
return AVERROR(ENOMEM); |
|
|
|
avio_read(pb, value, size); |
|
|
|
value[size]=0; |
|
|
|
|
|
|
|
@@ -342,8 +342,9 @@ static int avi_read_header(AVFormatContext *s) |
|
|
|
|
|
|
|
avi->stream_index= -1; |
|
|
|
|
|
|
|
if (get_riff(s, pb) < 0) |
|
|
|
return -1; |
|
|
|
ret = get_riff(s, pb); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
|
|
|
|
avi->fsize = avio_size(pb); |
|
|
|
if(avi->fsize<=0) |
|
|
|
@@ -701,7 +702,9 @@ static int avi_read_header(AVFormatContext *s) |
|
|
|
break; |
|
|
|
case MKTAG('s', 't', 'r', 'n'): |
|
|
|
if(s->nb_streams){ |
|
|
|
avi_read_tag(s, s->streams[s->nb_streams-1], tag, size); |
|
|
|
ret = avi_read_tag(s, s->streams[s->nb_streams-1], tag, size); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
break; |
|
|
|
} |
|
|
|
default: |
|
|
|
@@ -724,7 +727,7 @@ static int avi_read_header(AVFormatContext *s) |
|
|
|
/* check stream number */ |
|
|
|
if (stream_index != s->nb_streams - 1) { |
|
|
|
fail: |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
if(!avi->index_loaded && pb->seekable) |
|
|
|
@@ -1016,7 +1019,7 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
} |
|
|
|
} |
|
|
|
if(!best_st) |
|
|
|
return -1; |
|
|
|
return AVERROR_EOF; |
|
|
|
|
|
|
|
best_ast = best_st->priv_data; |
|
|
|
best_ts = av_rescale_q(best_ts, (AVRational){FFMAX(1, best_ast->sample_size), AV_TIME_BASE}, best_st->time_base); |
|
|
|
@@ -1148,7 +1151,7 @@ static int avi_read_idx1(AVFormatContext *s, int size) |
|
|
|
|
|
|
|
nb_index_entries = size / 16; |
|
|
|
if (nb_index_entries <= 0) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
idx1_pos = avio_tell(pb); |
|
|
|
avio_seek(pb, avi->movi_list+4, SEEK_SET); |
|
|
|
@@ -1183,7 +1186,7 @@ static int avi_read_idx1(AVFormatContext *s, int size) |
|
|
|
av_dlog(s, "%d cum_len=%"PRId64"\n", len, ast->cum_len); |
|
|
|
|
|
|
|
if(pb->eof_reached) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
if(last_pos == pos) |
|
|
|
avi->non_interleaved= 1; |
|
|
|
@@ -1293,7 +1296,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp |
|
|
|
ast= st->priv_data; |
|
|
|
index= av_index_search_timestamp(st, timestamp * FFMAX(ast->sample_size, 1), flags); |
|
|
|
if(index<0) |
|
|
|
return -1; |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
/* find the position */ |
|
|
|
pos = st->index_entries[index].pos; |
|
|
|
|