WAV muxer: add RF64 support
[ffmpeg.git] / libavformat / avidec.c
index 185c67c..2f248b1 100644 (file)
@@ -140,7 +140,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");
@@ -168,26 +168,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++){
@@ -201,7 +201,7 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
             av_log(s, AV_LOG_ERROR, "pos:%"PRId64", len:%X\n", pos, len);
 #endif
             if(url_feof(pb))
-                return -1;
+                return AVERROR_INVALIDDATA;
 
             if(last_pos == pos || pos == base - 8)
                 avi->non_interleaved= 1;
@@ -218,13 +218,13 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
             duration = avio_rl32(pb);
 
             if(url_feof(pb))
-                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;
             }
 
             if(avio_seek(pb, offset+8, SEEK_SET) < 0)
@@ -279,10 +279,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;
 
@@ -367,8 +367,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;
 
     av_log(avi, AV_LOG_DEBUG, "use odml:%d\n", avi->use_odml);
 
@@ -626,7 +627,7 @@ static int avi_read_header(AVFormatContext *s)
                         pal_size = FFMIN(pal_size, st->codec->extradata_size);
                         pal_src = st->codec->extradata + st->codec->extradata_size - pal_size;
                         for (i = 0; i < pal_size/4; i++)
-                            ast->pal[i] = 0xFF<<24 | AV_RL32(pal_src+4*i);
+                            ast->pal[i] = 0xFFU<<24 | AV_RL32(pal_src+4*i);
                         ast->has_pal = 1;
                     }
 
@@ -681,14 +682,17 @@ static int avi_read_header(AVFormatContext *s)
                         av_log(s, AV_LOG_DEBUG, "overriding invalid dshow_block_align of %d\n", ast->dshow_block_align);
                         ast->dshow_block_align = 0;
                     }
-                    if(st->codec->codec_id == AV_CODEC_ID_AAC && ast->dshow_block_align == 1024 && ast->sample_size == 1024) {
-                        av_log(s, AV_LOG_DEBUG, "overriding sample_size\n", ast->dshow_block_align);
+                    if(st->codec->codec_id == AV_CODEC_ID_AAC && ast->dshow_block_align == 1024 && ast->sample_size == 1024 ||
+                       st->codec->codec_id == AV_CODEC_ID_AAC && ast->dshow_block_align == 4096 && ast->sample_size == 4096 ||
+                       st->codec->codec_id == AV_CODEC_ID_MP3 && ast->dshow_block_align == 1152 && ast->sample_size == 1152) {
+                        av_log(s, AV_LOG_DEBUG, "overriding sample_size\n");
                         ast->sample_size = 0;
                     }
                     break;
                 case AVMEDIA_TYPE_SUBTITLE:
                     st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
                     st->request_probe= 1;
+                    avio_skip(pb, size);
                     break;
                 default:
                     st->codec->codec_type = AVMEDIA_TYPE_DATA;
@@ -758,7 +762,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:
@@ -781,7 +787,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)
@@ -814,7 +820,7 @@ static int avi_read_header(AVFormatContext *s)
 }
 
 static int read_gab2_sub(AVStream *st, AVPacket *pkt) {
-    if (!strcmp(pkt->data, "GAB2") && AV_RL16(pkt->data+5) == 2) {
+    if (pkt->data && !strcmp(pkt->data, "GAB2") && AV_RL16(pkt->data+5) == 2) {
         uint8_t desc[256];
         int score = AVPROBE_SCORE_MAX / 2, ret;
         AVIStream *ast = st->priv_data;
@@ -1007,7 +1013,7 @@ start_sync:
                 avio_rl16(pb); //flags
 
                 for (; k <= last; k++)
-                    ast->pal[k] = 0xFF<<24 | avio_rb32(pb)>>8;// b + (g << 8) + (r << 16);
+                    ast->pal[k] = 0xFFU<<24 | avio_rb32(pb)>>8;// b + (g << 8) + (r << 16);
                 ast->has_pal= 1;
                 goto start_sync;
             } else if(   ((ast->prefix_count<5 || sync+9 > i) && d[2]<128 && d[3]<128) ||
@@ -1142,7 +1148,7 @@ resync:
             return err;
         size = err;
 
-        if(ast->has_pal && pkt->data && pkt->size<(unsigned)INT_MAX/2){
+        if(ast->has_pal && pkt->size<(unsigned)INT_MAX/2){
             uint8_t *pal;
             pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE);
             if(!pal){
@@ -1259,7 +1265,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);
@@ -1269,6 +1275,11 @@ static int avi_read_idx1(AVFormatContext *s, int size)
     avi->stream_index = -1;
     avio_seek(pb, idx1_pos, SEEK_SET);
 
+    if (s->nb_streams == 1 && s->streams[0]->codec->codec_tag == AV_RL32("MMES")){
+        first_packet_pos = 0;
+        data_offset = avi->movi_list;
+    }
+
     /* Read the entries and sort them in each stream component. */
     for(i = 0; i < nb_index_entries; i++) {
         if(url_feof(pb))
@@ -1296,7 +1307,6 @@ static int avi_read_idx1(AVFormatContext *s, int size)
 
         av_dlog(s, "%d cum_len=%"PRId64"\n", len, ast->cum_len);
 
-
         // even if we have only a single stream, we should
         // switch to non-interleaved to get correct timestamps
         if(last_pos == pos)
@@ -1457,7 +1467,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
                    timestamp * FFMAX(ast->sample_size, 1),
                    st->index_entries[0].timestamp,
                    st->index_entries[st->nb_index_entries - 1].timestamp);
-        return -1;
+        return AVERROR_INVALIDDATA;
     }
 
     /* find the position */