avidec: use sensible error codes instead of -1

Use AVERROR_INVALIDDATA on invalid inputs, and AVERROR_EOF when no more
frames are available in an interleaved AVI.

Signed-off-by: Jindrich Makovicka <makovick@gmail.com>
Signed-off-by: Diego Biurrun <diego@biurrun.de>
pull/11/head
Jindrich Makovicka 12 years ago committed by Diego Biurrun
parent 9f00b1cbab
commit 570a4a0189
  1. 41
      libavformat/avidec.c

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

Loading…
Cancel
Save