]> git.sesse.net Git - vlc/blobdiff - modules/stream_out/transcode.c
Removes trailing spaces. Removes tabs.
[vlc] / modules / stream_out / transcode.c
index 43ddc31bed93d68ed4a59b0d4944cc2876c26208..c44108e10364cd54ecdbf91931b35a2f5dd81947 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
 #include <vlc/vlc.h>
-#include <vlc/input.h>
-#include <vlc/sout.h>
-#include <vlc/vout.h>
-#include <vlc/decoder.h>
+#include <vlc_input.h>
+#include <vlc_sout.h>
+#include <vlc_aout.h>
+#include <vlc_vout.h>
+#include <vlc_codec.h>
+#include <vlc_block.h>
 #include <vlc_filter.h>
 #include <vlc_osd.h>
 
+#include <math.h>
+
 #define MASTER_SYNC_MAX_DRIFT 100000
 
+/* FIXME Ugly */
+#include "../../src/input/input_internal.h"
+
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
 #define HURRYUP_LONGTEXT N_( "The transcoder will drop frames if your CPU " \
                 "can't keep up with the encoding rate." )
 
-static char *ppsz_deinterlace_type[] =
+static const char *ppsz_deinterlace_type[] =
 {
     "deinterlace", "ffmpeg-deinterlace"
 };
@@ -292,8 +295,8 @@ vlc_module_end();
 
 static const char *ppsz_sout_options[] = {
     "venc", "vcodec", "vb", "croptop", "cropbottom", "cropleft", "cropright",
-    "paddtop", "paddbottom", "paddleft", "paddright", 
-    "canvas-width", "canvas-height", "canvas-aspect", 
+    "paddtop", "paddbottom", "paddleft", "paddright",
+    "canvas-width", "canvas-height", "canvas-aspect",
     "scale", "fps", "width", "height", "vfilter", "deinterlace",
     "deinterlace-module", "threads", "hurry-up", "aenc", "acodec", "ab",
     "afilter", "samplerate", "channels", "senc", "scodec", "soverlay",
@@ -793,6 +796,15 @@ static void Close( vlc_object_t * p_this )
 
     sout_StreamDelete( p_sys->p_out );
 
+    while( p_sys->i_afilters )
+    {
+        p_sys->i_afilters--;
+        if( p_sys->psz_afilters[p_sys->i_afilters] )
+            free( p_sys->psz_afilters[p_sys->i_afilters] );
+        if( p_sys->p_afilters_cfg[p_sys->i_afilters] )
+            free( p_sys->p_afilters_cfg[p_sys->i_afilters] );
+    }
+
     while( p_sys->p_audio_cfg != NULL )
     {
         config_chain_t *p_next = p_sys->p_audio_cfg->p_next;
@@ -807,6 +819,15 @@ static void Close( vlc_object_t * p_this )
     }
     if( p_sys->psz_aenc ) free( p_sys->psz_aenc );
 
+    while( p_sys->i_vfilters )
+    {
+        p_sys->i_vfilters--;
+        if( p_sys->psz_vfilters[p_sys->i_vfilters] )
+            free( p_sys->psz_vfilters[p_sys->i_vfilters] );
+        if( p_sys->p_vfilters_cfg[p_sys->i_vfilters] )
+            free( p_sys->p_vfilters_cfg[p_sys->i_vfilters] );
+    }
+
     while( p_sys->p_video_cfg != NULL )
     {
         config_chain_t *p_next = p_sys->p_video_cfg->p_next;
@@ -1253,7 +1274,8 @@ static filter_t *transcode_audio_filter_new( sout_stream_t *p_stream,
     if( psz_name )
         p_filter->p_cfg = p_sys->p_afilters_cfg[id->i_ufilter];
 
-    p_filter->p_module = module_Need( p_filter, "audio filter2", psz_name, 0 );
+    p_filter->p_module = module_Need( p_filter, "audio filter2", psz_name,
+                                      VLC_TRUE );
     if( p_filter->p_module )
     {
         p_filter->fmt_out.audio.i_bitspersample =
@@ -1297,11 +1319,14 @@ static int transcode_audio_new( sout_stream_t *p_stream,
         msg_Err( p_stream, "cannot find decoder" );
         return VLC_EGENERIC;
     }
-    id->p_decoder->fmt_out.audio.i_bitspersample = 
+    id->p_decoder->fmt_out.audio.i_bitspersample =
         audio_BitsPerSample( id->p_decoder->fmt_out.i_codec );
     fmt_last = id->p_decoder->fmt_out;
-    /* FIX decoders so we don't have to do this */
-    fmt_last.audio.i_rate = id->p_decoder->fmt_in.audio.i_rate;
+    /* Fix AAC SBR changing number of channels and sampling rate */
+    if( !(id->p_decoder->fmt_in.i_codec == VLC_FOURCC('m','p','4','a') &&
+        fmt_last.audio.i_rate != id->p_encoder->fmt_in.audio.i_rate &&
+        fmt_last.audio.i_channels != id->p_encoder->fmt_in.audio.i_channels) )
+        fmt_last.audio.i_rate = id->p_decoder->fmt_in.audio.i_rate;
 
     /*
      * Open encoder
@@ -1340,6 +1365,15 @@ static int transcode_audio_new( sout_stream_t *p_stream,
     id->p_encoder->fmt_in.audio.i_bitspersample =
         audio_BitsPerSample( id->p_encoder->fmt_in.i_codec );
 
+    /* Fix AAC SBR changing number of channels and sampling rate */
+    if( id->p_decoder->fmt_in.i_codec == VLC_FOURCC('m','p','4','a') &&
+        fmt_last.audio.i_rate != id->p_encoder->fmt_in.audio.i_rate &&
+        fmt_last.audio.i_channels != id->p_encoder->fmt_in.audio.i_channels )
+    {
+      id->p_encoder->fmt_in.audio.i_rate = fmt_last.audio.i_rate;
+      id->p_encoder->fmt_out.audio.i_rate = fmt_last.audio.i_rate;
+    }
+
     /* Load conversion filters */
     if( fmt_last.audio.i_channels != id->p_encoder->fmt_in.audio.i_channels ||
         fmt_last.audio.i_rate != id->p_encoder->fmt_in.audio.i_rate )
@@ -1515,7 +1549,7 @@ static int transcode_audio_process( sout_stream_t *p_stream,
                                                           &in )) )
     {
         if( p_input )
-            stats_UpdateInteger( p_input, p_input->counters.p_decoded_audio,
+            stats_UpdateInteger( p_input, p_input->p->counters.p_decoded_audio,
                                  1, NULL );
         if( p_sys->b_master_sync )
         {
@@ -1601,6 +1635,7 @@ static aout_buffer_t *audio_new_buffer( decoder_t *p_dec, int i_samples )
     }
 
     p_buffer = malloc( sizeof(aout_buffer_t) );
+    p_buffer->b_discontinuity = VLC_FALSE;
     p_buffer->pf_release = audio_release_buffer;
     p_buffer->p_sys = p_block = block_New( p_dec, i_size );
 
@@ -1696,7 +1731,11 @@ static int transcode_video_new( sout_stream_t *p_stream, sout_stream_id_t *id )
      * We'll open it only when we have the first frame. */
     module_Unneed( id->p_encoder, id->p_encoder->p_module );
     if( id->p_encoder->fmt_out.p_extra )
+    {
         free( id->p_encoder->fmt_out.p_extra );
+        id->p_encoder->fmt_out.p_extra = NULL;
+        id->p_encoder->fmt_out.i_extra = 0;
+    }
     id->p_encoder->p_module = NULL;
 
     if( p_sys->i_threads >= 1 )
@@ -2025,7 +2064,7 @@ static void transcode_video_close( sout_stream_t *p_stream,
     if( p_stream->p_sys->i_threads >= 1 )
     {
         vlc_mutex_lock( &p_stream->p_sys->lock_out );
-        p_stream->p_sys->b_die = 1;
+        vlc_object_kill( p_stream->p_sys );
         vlc_cond_signal( &p_stream->p_sys->cond );
         vlc_mutex_unlock( &p_stream->p_sys->lock_out );
         vlc_thread_join( p_stream->p_sys );
@@ -2107,9 +2146,9 @@ static int transcode_video_process( sout_stream_t *p_stream,
 
     while( (p_pic = id->p_decoder->pf_decode_video( id->p_decoder, &in )) )
     {
-        subpicture_t *p_subpic = 0;
+        subpicture_t *p_subpic = NULL;
         if( p_input )
-            stats_UpdateInteger( p_input, p_input->counters.p_decoded_video,
+            stats_UpdateInteger( p_input, p_input->p->counters.p_decoded_video,
                                  1, NULL );
 
         if( p_stream->p_sout->i_out_pace_nocontrol && p_sys->b_hurry_up )
@@ -2144,7 +2183,7 @@ static int transcode_video_process( sout_stream_t *p_stream,
             /* Set the pts of the frame being encoded */
             p_pic->date = i_pts;
 
-            if( i_video_drift < i_master_drift - 50000 )
+            if( i_video_drift < (i_master_drift - 50000) )
             {
 #if 0
                 msg_Dbg( p_stream, "dropping frame (%i)",
@@ -2153,7 +2192,7 @@ static int transcode_video_process( sout_stream_t *p_stream,
                 p_pic->pf_release( p_pic );
                 continue;
             }
-            else if( i_video_drift > i_master_drift + 50000 )
+            else if( i_video_drift > (i_master_drift + 50000) )
             {
 #if 0
                 msg_Dbg( p_stream, "adding frame (%i)",
@@ -2190,7 +2229,8 @@ static int transcode_video_process( sout_stream_t *p_stream,
                 id->pp_filter[id->i_filter]->p_cfg = p_sys->p_deinterlace_cfg;
                 id->pp_filter[id->i_filter]->p_module =
                     module_Need( id->pp_filter[id->i_filter],
-                                 "video filter2", p_sys->psz_deinterlace, 0 );
+                                 "video filter2", p_sys->psz_deinterlace,
+                                 VLC_TRUE );
                 if( id->pp_filter[id->i_filter]->p_module )
                 {
                     id->pp_filter[id->i_filter]->p_owner =
@@ -2286,7 +2326,7 @@ static int transcode_video_process( sout_stream_t *p_stream,
                 id->pp_ufilter[id->i_ufilter]->p_cfg = p_sys->p_vfilters_cfg[i];
                 id->pp_ufilter[id->i_ufilter]->p_module =
                     module_Need( id->pp_ufilter[id->i_ufilter],
-                          "video filter2", p_sys->psz_vfilters[i], 0 );
+                          "video filter2", p_sys->psz_vfilters[i], VLC_TRUE );
                 if( id->pp_ufilter[id->i_ufilter]->p_module )
                 {
                     id->pp_ufilter[id->i_ufilter]->p_owner =
@@ -2364,7 +2404,8 @@ static int transcode_video_process( sout_stream_t *p_stream,
         /* Run user specified filter chain */
         for( i = 0; i < id->i_ufilter; i++ )
         {
-            p_pic = id->pp_ufilter[i]->pf_video_filter(id->pp_ufilter[i], p_pic);
+            p_pic = id->pp_ufilter[i]->pf_video_filter( id->pp_ufilter[i],
+                                                        p_pic );
         }
 
         if( p_sys->i_threads == 0 )
@@ -2390,8 +2431,8 @@ static int transcode_video_process( sout_stream_t *p_stream,
         if( p_sys->b_master_sync && i_duplicate > 1 )
         {
             mtime_t i_pts = date_Get( &id->interpolated_pts ) + 1;
-            if ( p_pic->date - i_pts > MASTER_SYNC_MAX_DRIFT
-                  || p_pic->date - i_pts < -MASTER_SYNC_MAX_DRIFT )
+            if( (p_pic->date - i_pts > MASTER_SYNC_MAX_DRIFT)
+                 || ((p_pic->date - i_pts) < -MASTER_SYNC_MAX_DRIFT) )
             {
                 msg_Dbg( p_stream, "drift is too high, resetting master sync" );
                 date_Set( &id->interpolated_pts, p_pic->date );