]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/avidec.c
Change mtv_read_packet so it does not break after seeking (displaying a shifted image).
[ffmpeg] / libavformat / avidec.c
index c85439ec06b57f3e15aa7620edd39ea2b99a7b91..df557c128ceccdd47618224b88fc8e3ff8a202a1 100644 (file)
@@ -380,6 +380,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
             ast->scale = get_le32(pb);
             ast->rate = get_le32(pb);
             if(!(ast->scale && ast->rate)){
+                av_log(s, AV_LOG_WARNING, "Scale/Rate is %u/%u which is invalid. (This file has been generated by broken software)\n", ast->scale, ast->rate);
                 if(frame_period){
                     ast->rate = 1000000;
                     ast->scale = frame_period;
@@ -414,6 +415,9 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
                 //FIXME
                 codec_type = CODEC_TYPE_DATA; //CODEC_TYPE_SUB ?  FIXME
                 break;
+            case MKTAG('d', 'a', 't', 's'):
+                codec_type = CODEC_TYPE_DATA;
+                break;
             default:
                 av_log(s, AV_LOG_ERROR, "unknown stream type %X\n", tag1);
                 goto fail;
@@ -593,10 +597,6 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
     /* check stream number */
     if (stream_index != s->nb_streams - 1) {
     fail:
-        for(i=0;i<s->nb_streams;i++) {
-            av_freep(&s->streams[i]->codec->extradata);
-            av_freep(&s->streams[i]);
-        }
         return -1;
     }
 
@@ -604,8 +604,10 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
         avi_load_index(s);
     avi->index_loaded = 1;
     avi->non_interleaved |= guess_ni_flag(s);
-    if(avi->non_interleaved)
+    if(avi->non_interleaved) {
+        av_log(s, AV_LOG_INFO, "Non interleaved AVI\n");
         clean_index(s);
+    }
 
     return 0;
 }
@@ -641,12 +643,15 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
             ts= av_rescale(ts, AV_TIME_BASE * (int64_t)st->time_base.num, st->time_base.den);
 
 //            av_log(NULL, AV_LOG_DEBUG, "%"PRId64" %d/%d %"PRId64"\n", ts, st->time_base.num, st->time_base.den, ast->frame_offset);
-            if(ts < best_ts){
+            if(ts < best_ts && st->nb_index_entries){
                 best_ts= ts;
                 best_st= st;
                 best_stream_index= i;
             }
         }
+        if(!best_st)
+            return -1;
+
         best_ast = best_st->priv_data;
         best_ts= av_rescale(best_ts, best_st->time_base.den, AV_TIME_BASE * (int64_t)best_st->time_base.num); //FIXME a little ugly
         if(best_ast->remaining)
@@ -995,7 +1000,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
 
     if (ENABLE_DV_DEMUXER && avi->dv_demux) {
         /* One and only one real stream for DV in AVI, and it has video  */
-        /* offsets. Calling with other stream indices should have failed */
+        /* offsets. Calling with other stream indexes should have failed */
         /* the av_index_search_timestamp call above.                     */
         assert(stream_index == 0);
 
@@ -1055,8 +1060,6 @@ static int avi_read_close(AVFormatContext *s)
 
     for(i=0;i<s->nb_streams;i++) {
         AVStream *st = s->streams[i];
-        AVIStream *ast = st->priv_data;
-        av_free(ast);
         av_free(st->codec->palctrl);
     }
 
@@ -1081,7 +1084,7 @@ static int avi_probe(AVProbeData *p)
 
 AVInputFormat avi_demuxer = {
     "avi",
-    "avi format",
+    NULL_IF_CONFIG_SMALL("AVI format"),
     sizeof(AVIContext),
     avi_probe,
     avi_read_header,