uint32_t pi_channel_positions[MAX_CHANNEL_POSITIONS];
vlc_bool_t b_sbr, b_ps;
+
+ int i_input_rate;
};
static const uint32_t pi_channels_in[MAX_CHANNEL_POSITIONS] =
aout_DateSet( &p_sys->date, 0 );
p_dec->fmt_out.i_cat = AUDIO_ES;
- if (p_this->p_libvlc_global->i_cpu & CPU_CAPABILITY_FPU)
+ if (vlc_CPU() & CPU_CAPABILITY_FPU)
p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
else
p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
/* Set the faad config */
cfg = faacDecGetCurrentConfiguration( p_sys->hfaad );
- if (p_this->p_libvlc_global->i_cpu & CPU_CAPABILITY_FPU)
+ if (vlc_CPU() & CPU_CAPABILITY_FPU)
cfg->outputFormat = FAAD_FMT_FLOAT;
else
cfg->outputFormat = FAAD_FMT_16BIT;
p_sys->i_buffer = p_sys->i_buffer_size = 0;
p_sys->p_buffer = 0;
+ p_sys->i_input_rate = INPUT_RATE_DEFAULT;
+
/* Faad2 can't deal with truncated data (eg. from MPEG TS) */
p_dec->b_need_packetized = VLC_TRUE;
return NULL;
}
+ if( p_block->i_rate > 0 )
+ p_sys->i_input_rate = p_block->i_rate;
+
/* Append the block to the temporary buffer */
if( p_sys->i_buffer_size < p_sys->i_buffer + p_block->i_buffer )
{
p_dec->p_parent->i_object_type == VLC_OBJECT_INPUT )
{
input_thread_t *p_input = (input_thread_t *)p_dec->p_parent;
- char *psz_cat, *psz_ext = (frame.sbr && frame.ps) ? "SBR+PS" :
- frame.sbr ? "SBR" : "PS";
+ char *psz_cat;
+ const char *psz_ext = (frame.sbr && frame.ps) ? "SBR+PS" :
+ frame.sbr ? "SBR" : "PS";
msg_Dbg( p_dec, "AAC %s (channels: %u, samplerate: %lu)",
psz_ext, frame.channels, frame.samplerate );
}
/* Convert frame.channel_position to our own channel values */
+ p_dec->fmt_out.audio.i_physical_channels = 0;
for( i = 0; i < frame.channels; i++ )
{
/* Find the channel code */
for( j = 0; j < MAX_CHANNEL_POSITIONS; j++ )
{
if( frame.channel_position[i] == pi_channels_in[j] )
- {
- p_sys->pi_channel_positions[i] = pi_channels_out[j];
- p_dec->fmt_out.audio.i_physical_channels |=
- pi_channels_out[j];
break;
- }
}
-
- if( j == MAX_CHANNEL_POSITIONS )
+ if( j >= MAX_CHANNEL_POSITIONS )
{
msg_Warn( p_dec, "unknown channel ordering" );
-
- /* Try to invent something */
- p_sys->pi_channel_positions[i] = pi_channels_out[i];
- p_dec->fmt_out.audio.i_physical_channels |=
- pi_channels_out[i];
+ /* Invent something */
+ j = i;
}
+ /* */
+ p_sys->pi_channel_positions[i] = pi_channels_out[j];
+ if( p_dec->fmt_out.audio.i_physical_channels & pi_channels_out[j] )
+ frame.channels--; /* We loose a duplicated channel */
+ else
+ p_dec->fmt_out.audio.i_physical_channels |= pi_channels_out[j];
}
p_dec->fmt_out.audio.i_original_channels =
p_dec->fmt_out.audio.i_physical_channels;
p_out->start_date = aout_DateGet( &p_sys->date );
p_out->end_date = aout_DateIncrement( &p_sys->date,
- frame.samples / frame.channels );
+ (frame.samples / frame.channels) * p_sys->i_input_rate / INPUT_RATE_DEFAULT );
DoReordering( p_dec, (uint32_t *)p_out->p_buffer, samples,
frame.samples / frame.channels, frame.channels,
int i, j, k;
/* Find the channels mapping */
- for( i = 0, j = 0; i < MAX_CHANNEL_POSITIONS; i++ )
+ for( k = 0, j = 0; k < i_nb_channels; k++ )
{
- for( k = 0; k < i_nb_channels; k++ )
+ for( i = 0; i < MAX_CHANNEL_POSITIONS; i++ )
{
if( pi_channels_ordered[i] == pi_chan_positions[k] )
{
}
/* Do the actual reordering */
- if( p_dec->p_libvlc_global->i_cpu & CPU_CAPABILITY_FPU )
+ if( vlc_CPU() & CPU_CAPABILITY_FPU )
for( i = 0; i < i_samples; i++ )
for( j = 0; j < i_nb_channels; j++ )
p_out[i * i_nb_channels + pi_chan_table[j]] =