]> git.sesse.net Git - vlc/commitdiff
avcodec: on encoding, try to match vlc and avcodec formats
authorIlkka Ollakka <ileoo@videolan.org>
Sun, 24 Mar 2013 11:42:32 +0000 (13:42 +0200)
committerIlkka Ollakka <ileoo@videolan.org>
Sun, 24 Mar 2013 11:50:29 +0000 (13:50 +0200)
This can avoid unnecessary format conversion.

modules/codec/avcodec/encoder.c

index a9c700be9b1439f39813828e5689cd8f02592ecc..6d5de8b478d720532a3c2c7e156c4424290e56b6 100644 (file)
@@ -598,21 +598,37 @@ int OpenEncoder( vlc_object_t *p_this )
                                     p_codec->sample_fmts[0] :
                                     AV_SAMPLE_FMT_S16;
 
+        /* Try to match avcodec input format to vlc format so we could avoid one
+           format conversion */
+        if( GetVlcAudioFormat( p_context->sample_fmt ) != p_enc->fmt_in.i_codec )
+        {
+            msg_Dbg( p_enc, "Trying to find more suitable sample format instead of %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
+            for( unsigned int i=0; p_codec->sample_fmts[i] != -1; i++ )
+            {
+                if( GetVlcAudioFormat( p_codec->sample_fmts[i] ) == p_enc->fmt_in.i_codec )
+                {
+                    p_context->sample_fmt = p_codec->sample_fmts[i];
+                    msg_Dbg( p_enc, "Using %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
+                    break;
+                }
+            }
+        }
         // Try if we can use interleaved format for codec input as VLC doesn't really do planar audio yet
         // FIXME: Remove when planar/interleaved audio in vlc is equally supported
         if( av_sample_fmt_is_planar( p_context->sample_fmt ) )
         {
-            msg_Dbg( p_enc, "Trying to find packet sample format instead of %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
+            msg_Dbg( p_enc, "Trying to find packet sample format instead of planar %s", av_get_sample_fmt_name( p_context->sample_fmt ) );
             for( unsigned int i=0; p_codec->sample_fmts[i] != -1; i++ )
             {
                 if( !av_sample_fmt_is_planar( p_codec->sample_fmts[i] ) )
                 {
                     p_context->sample_fmt = p_codec->sample_fmts[i];
-                    msg_Dbg( p_enc, "Using %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
+                    msg_Dbg( p_enc, "Changing to packet format %s as new sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
                     break;
                 }
             }
         }
+        msg_Dbg( p_enc, "Ended up using %s as sample format", av_get_sample_fmt_name( p_context->sample_fmt ) );
         p_enc->fmt_in.i_codec  = GetVlcAudioFormat( p_context->sample_fmt );
 
         p_context->sample_rate = p_enc->fmt_out.audio.i_rate;