fix support for avis with sample_size > packet size
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 16 Nov 2006 23:36:54 +0000 (23:36 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 16 Nov 2006 23:36:54 +0000 (23:36 +0000)
Originally committed as revision 7110 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avidec.c

index e29115a..aa82a30 100644 (file)
@@ -145,10 +145,10 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
             if(last_pos == pos || pos == base - 8)
                 avi->non_interleaved= 1;
             else
-                av_add_index_entry(st, pos, ast->cum_len, len, 0, key ? AVINDEX_KEYFRAME : 0);
+                av_add_index_entry(st, pos, ast->cum_len / FFMAX(1, ast->sample_size), len, 0, key ? AVINDEX_KEYFRAME : 0);
 
             if(ast->sample_size)
-                ast->cum_len += len / ast->sample_size;
+                ast->cum_len += len;
             else
                 ast->cum_len ++;
             last_pos= pos;
@@ -355,6 +355,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
             get_le32(pb); /* buffer size */
             get_le32(pb); /* quality */
             ast->sample_size = get_le32(pb); /* sample ssize */
+            ast->cum_len *= FFMAX(1, ast->sample_size);
 //            av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d\n", ast->rate, ast->scale, ast->start, ast->sample_size);
 
             switch(tag1) {
@@ -378,7 +379,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
                 av_log(s, AV_LOG_ERROR, "unknown stream type %X\n", tag1);
                 goto fail;
             }
-            ast->frame_offset= ast->cum_len * FFMAX(ast->sample_size, 1);
+            ast->frame_offset= ast->cum_len;
             url_fskip(pb, size - 12 * 4);
             break;
         case MKTAG('s', 't', 'r', 'f'):
@@ -805,9 +806,9 @@ static int avi_read_idx1(AVFormatContext *s, int size)
         if(last_pos == pos)
             avi->non_interleaved= 1;
         else
-            av_add_index_entry(st, pos, ast->cum_len, len, 0, (flags&AVIIF_INDEX) ? AVINDEX_KEYFRAME : 0);
+            av_add_index_entry(st, pos, ast->cum_len / FFMAX(1, ast->sample_size), len, 0, (flags&AVIIF_INDEX) ? AVINDEX_KEYFRAME : 0);
         if(ast->sample_size)
-            ast->cum_len += len / ast->sample_size;
+            ast->cum_len += len;
         else
             ast->cum_len ++;
         last_pos= pos;