avidec: use sensible error codes instead of -1
authorJindrich Makovicka <makovick@gmail.com>
Thu, 17 Jan 2013 15:24:28 +0000 (16:24 +0100)
committerDiego Biurrun <diego@biurrun.de>
Mon, 21 Jan 2013 15:02:40 +0000 (16:02 +0100)
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>
libavformat/avidec.c

index a3af5cf..2277ef0 100644 (file)
@@ -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;