/*****************************************************************************
* Preamble
*****************************************************************************/
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
#include <vlc/vlc.h>
#include <vlc_input.h>
#include <vlc_sout.h>
#include <vlc_filter.h>
#include <vlc_osd.h>
+#include <math.h>
+
#define MASTER_SYNC_MAX_DRIFT 100000
/* FIXME Ugly */
#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"
};
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",
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;
}
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;
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 =
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
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 )
}
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 );
* 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 )
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 );
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->p->counters.p_decoded_video,
1, NULL );
/* 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)",
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)",
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 =
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 =
/* 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 )
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 );