]> git.sesse.net Git - vlc/blobdiff - modules/codec/avcodec/audio.c
avcodec: look up pix fmt only once during deinterlace initialization
[vlc] / modules / codec / avcodec / audio.c
index eed46de50e485ab0f602cc3631e8864cc46a5fcc..272038a3f9bf3f8b83424d625bd36bcc893ce525 100644 (file)
@@ -221,6 +221,7 @@ static block_t *SplitBuffer( decoder_t *p_dec )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
     int i_samples = __MIN( p_sys->i_samples, 4096 );
+    int sample_planar=0;
     block_t *p_buffer;
 
     if( i_samples == 0 ) return NULL;
@@ -232,16 +233,26 @@ static block_t *SplitBuffer( decoder_t *p_dec )
     p_buffer->i_length = date_Increment( &p_sys->end_date, i_samples )
                          - p_buffer->i_pts;
 
+    sample_planar = av_sample_fmt_is_planar( p_sys->p_context->sample_fmt );
+    if( sample_planar )
+        aout_Interleave( p_buffer->p_buffer, p_sys->p_samples, i_samples, p_sys->p_context->channels, p_dec->fmt_out.audio.i_format );
+
     if( p_sys->b_extract )
+    {
+        if( sample_planar )
+            memcpy( p_sys->p_samples, p_buffer->p_buffer, p_buffer->i_buffer );
+
         aout_ChannelExtract( p_buffer->p_buffer, p_dec->fmt_out.audio.i_channels,
                              p_sys->p_samples, p_sys->p_context->channels, i_samples,
                              p_sys->pi_extraction, p_dec->fmt_out.audio.i_bitspersample );
-    else
+    }
+    else if (!sample_planar)
         memcpy( p_buffer->p_buffer, p_sys->p_samples, p_buffer->i_buffer );
 
     p_sys->p_samples += i_samples * p_sys->p_context->channels * ( p_dec->fmt_out.audio.i_bitspersample / 8 );
     p_sys->i_samples -= i_samples;
 
+
     return p_buffer;
 }
 
@@ -407,33 +418,23 @@ void EndAudioDec( decoder_t *p_dec )
  *
  *****************************************************************************/
 
-void GetVlcAudioFormat( vlc_fourcc_t *pi_codec, unsigned *pi_bits, int i_sample_fmt )
+vlc_fourcc_t GetVlcAudioFormat( int fmt )
 {
-    switch( i_sample_fmt )
-    {
-    case AV_SAMPLE_FMT_U8:
-        *pi_codec = VLC_CODEC_U8;
-        *pi_bits = 8;
-        break;
-    case AV_SAMPLE_FMT_S32:
-        *pi_codec = VLC_CODEC_S32N;
-        *pi_bits = 32;
-        break;
-    case AV_SAMPLE_FMT_FLT:
-        *pi_codec = VLC_CODEC_FL32;
-        *pi_bits = 32;
-        break;
-    case AV_SAMPLE_FMT_DBL:
-        *pi_codec = VLC_CODEC_FL64;
-        *pi_bits = 64;
-        break;
-
-    case AV_SAMPLE_FMT_S16:
-    default:
-        *pi_codec = VLC_CODEC_S16N;
-        *pi_bits = 16;
-        break;
-    }
+    static const vlc_fourcc_t fcc[] = {
+        [AV_SAMPLE_FMT_U8]    = VLC_CODEC_U8,
+        [AV_SAMPLE_FMT_S16]   = VLC_CODEC_S16N,
+        [AV_SAMPLE_FMT_S32]   = VLC_CODEC_S32N,
+        [AV_SAMPLE_FMT_FLT]   = VLC_CODEC_FL32,
+        [AV_SAMPLE_FMT_DBL]   = VLC_CODEC_FL64,
+        [AV_SAMPLE_FMT_U8P]   = VLC_CODEC_U8,
+        [AV_SAMPLE_FMT_S16P]  = VLC_CODEC_S16N,
+        [AV_SAMPLE_FMT_S32P]  = VLC_CODEC_S32N,
+        [AV_SAMPLE_FMT_FLTP]  = VLC_CODEC_FL32,
+        [AV_SAMPLE_FMT_DBLP]  = VLC_CODEC_FL64,
+    };
+    if( (sizeof(fcc) / sizeof(fcc[0])) > (unsigned)fmt )
+        return fcc[fmt];
+    return VLC_CODEC_S16N;
 }
 
 static const uint64_t pi_channels_map[][2] =
@@ -464,9 +465,8 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
 
-    GetVlcAudioFormat( &p_dec->fmt_out.i_codec,
-                       &p_dec->fmt_out.audio.i_bitspersample,
-                       p_sys->p_context->sample_fmt );
+    p_dec->fmt_out.i_codec = GetVlcAudioFormat( p_sys->p_context->sample_fmt );
+    p_dec->fmt_out.audio.i_format = p_dec->fmt_out.i_codec;
     p_dec->fmt_out.audio.i_rate = p_sys->p_context->sample_rate;
 
     /* */
@@ -518,6 +518,6 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
 
     p_dec->fmt_out.audio.i_physical_channels =
     p_dec->fmt_out.audio.i_original_channels = i_layout_dst;
-    p_dec->fmt_out.audio.i_channels = i_channels_dst;
+    aout_FormatPrepare( &p_dec->fmt_out.audio );
 }