]> git.sesse.net Git - vlc/commitdiff
* try a workaround for BeOS MediaKit files.
authorLaurent Aimar <fenrir@videolan.org>
Fri, 28 Feb 2003 17:23:35 +0000 (17:23 +0000)
committerLaurent Aimar <fenrir@videolan.org>
Fri, 28 Feb 2003 17:23:35 +0000 (17:23 +0000)
modules/demux/avi/avi.c

index 6baa05eafc4817cda68cd0b017b1bd74989526e7..94c6f9eae22b61bfad704e47d918f368aea664cc 100644 (file)
@@ -2,7 +2,7 @@
  * avi.c : AVI file Stream input module for vlc
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: avi.c,v 1.37 2003/02/27 16:38:39 gbazin Exp $
+ * $Id: avi.c,v 1.38 2003/02/28 17:23:35 fenrir Exp $
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -1122,6 +1122,53 @@ static int AVIInit( vlc_object_t * p_this )
         msg_Warn( p_input, "broken or missing index, 'seek' will be axproximative or will have strange behavour" );
     }
 
+    /* fix some BeOS MediaKit generated file */
+    for( i = 0 ; i < p_avi->i_streams; i++ )
+    {
+        avi_chunk_list_t    *p_avi_strl;
+        avi_chunk_strh_t    *p_avi_strh;
+        avi_chunk_strf_auds_t    *p_avi_strf_auds;
+#define p_stream  p_avi->pp_info[i]
+
+        if( p_stream->i_cat != AUDIO_ES )
+        {
+            continue;
+        }
+        if( p_stream->i_idxnb < 1 ||
+            p_stream->i_scale != 1 ||
+            p_stream->i_samplesize != 0 )
+        {
+            continue;
+        }
+        p_avi_strl = (avi_chunk_list_t*)AVI_ChunkFind( p_hdrl,
+                                                       AVIFOURCC_strl, i );
+        p_avi_strh = (avi_chunk_strh_t*)AVI_ChunkFind( p_avi_strl,
+                                                       AVIFOURCC_strh, 0 );
+        p_avi_strf_auds =
+            (avi_chunk_strf_auds_t*)AVI_ChunkFind( p_avi_strl,
+                                                   AVIFOURCC_strf, 0 );
+
+        if( p_avi_strf_auds->p_wf->wFormatTag != WAVE_FORMAT_PCM &&
+            (unsigned int)p_stream->i_rate == p_avi_strf_auds->p_wf->nSamplesPerSec )
+        {
+            int64_t i_track_length =
+                p_stream->p_index[p_stream->i_idxnb-1].i_length +
+                p_stream->p_index[p_stream->i_idxnb-1].i_lengthtotal;
+            mtime_t i_length = (mtime_t)p_avih->i_totalframes *
+                               (mtime_t)p_avih->i_microsecperframe;
+
+            if( i_length == 0 )
+            {
+                msg_Warn( p_input, "track[%d] cannot be fixed (BeOS MediaKit generated)", i );
+                continue;
+            }
+            p_stream->i_samplesize = 1;
+            p_stream->i_rate       = i_track_length  * (int64_t)1000000/ i_length;
+            msg_Warn( p_input, "track[%d] fixed with rate=%d scale=%d (BeOS MediaKit generated)", i, p_stream->i_rate, p_stream->i_scale );
+        }
+#undef p_stream
+    }
+
     vlc_mutex_lock( &p_input->stream.stream_lock );
     if( p_avi->i_length )
     {