瀏覽代碼

demux: mp4: remove the arbitrary QT_MAX_V0_SAMPLES

Fixes alaw regression.
/samples/A-codecs/aLaw/
Arbitrary limit still required for compressed format(AMR).
Now max to read 25ms of samples.
Francois Cartegnie 10 年之前
父節點
當前提交
055b369d8f
共有 1 個文件被更改,包括 20 次插入13 次删除
  1. 20 13
      modules/demux/mp4/mp4.c

+ 20 - 13
modules/demux/mp4/mp4.c

@@ -3023,7 +3023,6 @@ static inline uint32_t MP4_GetFixedSampleSize( const mp4_track_t *p_track,
     return i_size;
 }
 
-#define QT_V0_MAX_SAMPLES 1024
 static uint32_t MP4_TrackGetReadSize( mp4_track_t *p_track, uint32_t *pi_nb_samples )
 {
     uint32_t i_size = 0;
@@ -3105,6 +3104,24 @@ static uint32_t MP4_TrackGetReadSize( mp4_track_t *p_track, uint32_t *pi_nb_samp
         }
 
         /* uncompressed v0 (qt) or... not (ISO) */
+
+        uint32_t i_max_v0_samples;
+        switch( p_track->fmt.i_codec )
+        {
+            /* Compressed samples in V0 */
+            case VLC_CODEC_AMR_NB:
+            case VLC_CODEC_AMR_WB:
+                i_max_v0_samples = 16;
+                break;
+            default:
+                /* Read 25ms of samples (uncompressed) */
+                i_max_v0_samples = p_track->fmt.audio.i_rate / 40 *
+                                   p_track->fmt.audio.i_channels;
+                if( i_max_v0_samples < 1 )
+                    i_max_v0_samples = 1;
+                break;
+        }
+
         *pi_nb_samples = 0;
         for( uint32_t i=p_track->i_sample;
              i<p_chunk->i_sample_first+p_chunk->i_sample_count &&
@@ -3124,18 +3141,8 @@ static uint32_t MP4_TrackGetReadSize( mp4_track_t *p_track, uint32_t *pi_nb_samp
                 break;
             }
 
-            switch( p_track->fmt.i_codec )
-            {
-                case VLC_CODEC_AMR_NB:
-                case VLC_CODEC_AMR_WB:
-                    if ( *pi_nb_samples == 16 )
-                        i = UINT32_MAX;
-                    break;
-                default:
-                    if ( *pi_nb_samples == QT_V0_MAX_SAMPLES )
-                        i = UINT32_MAX;
-                    break;
-            }
+            if ( *pi_nb_samples == i_max_v0_samples )
+                break;
         }
     }