mirror of https://github.com/mpv-player/mpv
make -srate work again, unify audio filter init and preinit.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@15812 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
2f79d1aa8d
commit
d22ae4a4d9
26
libaf/af.c
26
libaf/af.c
|
@ -329,12 +329,11 @@ void af_uninit(af_stream_t* s)
|
|||
and output should contain the format of the current movie and the
|
||||
formate of the preferred output respectively. The function is
|
||||
reentrant i.e. if called with an already initialized stream the
|
||||
stream will be reinitialized. If the binary parameter
|
||||
"force_output" is set, the output format will be converted to the
|
||||
format given in "s", otherwise the output fromat in the last filter
|
||||
will be copied "s". The return value is 0 if success and -1 if
|
||||
failure */
|
||||
int af_init(af_stream_t* s, int force_output)
|
||||
stream will be reinitialized.
|
||||
If one of the prefered output parameters is 0 the one that needs
|
||||
no conversion is used (i.e. the output format in the last filter).
|
||||
The return value is 0 if success and -1 if failure */
|
||||
int af_init(af_stream_t* s)
|
||||
{
|
||||
int i=0;
|
||||
|
||||
|
@ -373,17 +372,11 @@ int af_init(af_stream_t* s, int force_output)
|
|||
if (!af_append(s,s->first,"dummy") || AF_OK != af_reinit(s,s->first))
|
||||
return -1;
|
||||
|
||||
// If force_output isn't set do not compensate for output format
|
||||
if(!force_output){
|
||||
memcpy(&s->output, s->last->data, sizeof(af_data_t));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Check output format
|
||||
if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){
|
||||
af_instance_t* af = NULL; // New filter
|
||||
// Check output frequency if not OK fix with resample
|
||||
if(s->last->data->rate!=s->output.rate){
|
||||
if(s->output.rate && s->last->data->rate!=s->output.rate){
|
||||
// try to find a filter that can change samplrate
|
||||
af = af_control_any_rev(s, AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET,
|
||||
&(s->output.rate));
|
||||
|
@ -428,7 +421,7 @@ int af_init(af_stream_t* s, int force_output)
|
|||
|
||||
// Check number of output channels fix if not OK
|
||||
// If needed always inserted last -> easy to screw up other filters
|
||||
if(s->last->data->nch!=s->output.nch){
|
||||
if(s->output.nch && s->last->data->nch!=s->output.nch){
|
||||
if(!strcmp(s->last->info->name,"format"))
|
||||
af = af_prepend(s,s->last,"channels");
|
||||
else
|
||||
|
@ -441,7 +434,7 @@ int af_init(af_stream_t* s, int force_output)
|
|||
}
|
||||
|
||||
// Check output format fix if not OK
|
||||
if(s->last->data->format != s->output.format){
|
||||
if(s->output.format && s->last->data->format != s->output.format){
|
||||
if(strcmp(s->last->info->name,"format"))
|
||||
af = af_append(s,s->last,"format");
|
||||
else
|
||||
|
@ -458,6 +451,9 @@ int af_init(af_stream_t* s, int force_output)
|
|||
if(AF_OK != af_reinit(s,s->first))
|
||||
return -1;
|
||||
|
||||
if (!s->output.format) s->output.format = s->last->data->format;
|
||||
if (!s->output.nch) s->output.nch = s->last->data->nch;
|
||||
if (!s->output.rate) s->output.rate = s->last->data->rate;
|
||||
if((s->last->data->format != s->output.format) ||
|
||||
(s->last->data->nch != s->output.nch) ||
|
||||
(s->last->data->rate != s->output.rate)) {
|
||||
|
|
|
@ -134,7 +134,7 @@ typedef struct af_stream_s
|
|||
format given in "s", otherwise the output fromat in the last filter
|
||||
will be copied "s". The return value is 0 if success and -1 if
|
||||
failure */
|
||||
int af_init(af_stream_t* s, int force_output);
|
||||
int af_init(af_stream_t* s);
|
||||
|
||||
// Uninit and remove all filters
|
||||
void af_uninit(af_stream_t* s);
|
||||
|
|
|
@ -260,6 +260,7 @@ void uninit_audio(sh_audio_t *sh_audio)
|
|||
}
|
||||
if(sh_audio->a_out_buffer!=sh_audio->a_buffer) free(sh_audio->a_out_buffer);
|
||||
sh_audio->a_out_buffer=NULL;
|
||||
sh_audio->a_out_buffer_size=0;
|
||||
if(sh_audio->a_buffer) free(sh_audio->a_buffer);
|
||||
sh_audio->a_buffer=NULL;
|
||||
if(sh_audio->a_in_buffer) free(sh_audio->a_in_buffer);
|
||||
|
@ -270,50 +271,14 @@ void uninit_audio(sh_audio_t *sh_audio)
|
|||
int preinit_audio_filters(sh_audio_t *sh_audio,
|
||||
int in_samplerate, int in_channels, int in_format,
|
||||
int* out_samplerate, int* out_channels, int* out_format){
|
||||
af_stream_t* afs=malloc(sizeof(af_stream_t));
|
||||
memset(afs,0,sizeof(af_stream_t));
|
||||
|
||||
// input format: same as codec's output format:
|
||||
afs->input.rate = in_samplerate;
|
||||
afs->input.nch = in_channels;
|
||||
afs->input.format = in_format;
|
||||
af_fix_parameters(&(afs->input));
|
||||
|
||||
// output format: same as ao driver's input format (if missing, fallback to input)
|
||||
afs->output.rate = *out_samplerate ? *out_samplerate : afs->input.rate;
|
||||
afs->output.nch = *out_channels ? *out_channels : afs->input.nch;
|
||||
afs->output.format = *out_format ? *out_format : afs->input.format;
|
||||
af_fix_parameters(&(afs->output));
|
||||
|
||||
// filter config:
|
||||
memcpy(&afs->cfg,&af_cfg,sizeof(af_cfg_t));
|
||||
|
||||
mp_msg(MSGT_DECAUDIO, MSGL_INFO, "Checking audio filter chain for %dHz/%dch/%s -> %dHz/%dch/%s...\n",
|
||||
afs->input.rate,afs->input.nch,af_fmt2str_short(afs->input.format),
|
||||
afs->output.rate,afs->output.nch,af_fmt2str_short(afs->output.format));
|
||||
|
||||
// let's autoprobe it!
|
||||
if(0 != af_init(afs,0)){
|
||||
free(afs);
|
||||
return 0; // failed :(
|
||||
}
|
||||
|
||||
*out_samplerate=afs->output.rate;
|
||||
*out_channels=afs->output.nch;
|
||||
*out_format=afs->output.format;
|
||||
|
||||
mp_msg(MSGT_DECAUDIO, MSGL_INFO, "AF_pre: %dHz/%dch/%s\n",
|
||||
afs->output.rate, afs->output.nch,
|
||||
af_fmt2str_short(afs->output.format));
|
||||
|
||||
sh_audio->afilter=(void*)afs;
|
||||
return 1;
|
||||
init_audio_filters(sh_audio, in_samplerate, in_channels, in_format,
|
||||
out_samplerate, out_channels, out_format, 0, 0);
|
||||
}
|
||||
|
||||
/* Init audio filters */
|
||||
int init_audio_filters(sh_audio_t *sh_audio,
|
||||
int in_samplerate, int in_channels, int in_format,
|
||||
int out_samplerate, int out_channels, int out_format,
|
||||
int *out_samplerate, int *out_channels, int *out_format,
|
||||
int out_minsize, int out_maxsize){
|
||||
af_stream_t* afs=sh_audio->afilter;
|
||||
if(!afs){
|
||||
|
@ -328,9 +293,9 @@ int init_audio_filters(sh_audio_t *sh_audio,
|
|||
af_fix_parameters(&(afs->input));
|
||||
|
||||
// output format: same as ao driver's input format (if missing, fallback to input)
|
||||
afs->output.rate = out_samplerate ? out_samplerate : afs->input.rate;
|
||||
afs->output.nch = out_channels ? out_channels : afs->input.nch;
|
||||
afs->output.format = out_format ? out_format : afs->input.format;
|
||||
afs->output.rate = *out_samplerate;
|
||||
afs->output.nch = *out_channels;
|
||||
afs->output.format = *out_format;
|
||||
af_fix_parameters(&(afs->output));
|
||||
|
||||
// filter config:
|
||||
|
@ -341,12 +306,17 @@ int init_audio_filters(sh_audio_t *sh_audio,
|
|||
afs->output.rate,afs->output.nch,af_fmt2str_short(afs->output.format));
|
||||
|
||||
// let's autoprobe it!
|
||||
if(0 != af_init(afs,1)){
|
||||
if(0 != af_init(afs)){
|
||||
sh_audio->afilter=NULL;
|
||||
free(afs);
|
||||
return 0; // failed :(
|
||||
}
|
||||
|
||||
*out_samplerate=afs->output.rate;
|
||||
*out_channels=afs->output.nch;
|
||||
*out_format=afs->output.format;
|
||||
|
||||
if (out_maxsize || out_minsize) {
|
||||
// allocate the a_out_* buffers:
|
||||
if(out_maxsize<out_minsize) out_maxsize=out_minsize;
|
||||
if(out_maxsize<8192) out_maxsize=MAX_OUTBURST; // not sure this is ok
|
||||
|
@ -355,6 +325,7 @@ int init_audio_filters(sh_audio_t *sh_audio,
|
|||
sh_audio->a_out_buffer=malloc(sh_audio->a_out_buffer_size);
|
||||
memset(sh_audio->a_out_buffer,0,sh_audio->a_out_buffer_size);
|
||||
sh_audio->a_out_buffer_len=0;
|
||||
}
|
||||
|
||||
// ok!
|
||||
sh_audio->afilter=(void*)afs;
|
||||
|
|
|
@ -12,7 +12,7 @@ extern void uninit_audio(sh_audio_t *sh_audio);
|
|||
|
||||
extern int init_audio_filters(sh_audio_t *sh_audio,
|
||||
int in_samplerate, int in_channels, int in_format,
|
||||
int out_samplerate, int out_channels, int out_format,
|
||||
int *out_samplerate, int *out_channels, int *out_format,
|
||||
int out_minsize, int out_maxsize);
|
||||
extern int preinit_audio_filters(sh_audio_t *sh_audio,
|
||||
int in_samplerate, int in_channels, int in_format,
|
||||
|
|
16
mencoder.c
16
mencoder.c
|
@ -819,9 +819,9 @@ mux_a->source=sh_audio;
|
|||
|
||||
mux_a->codec=out_audio_codec;
|
||||
|
||||
ao_data.samplerate = force_srate ? force_srate : new_srate;
|
||||
ao_data.channels = audio_output_channels ? audio_output_channels : sh_audio->channels;
|
||||
ao_data.format = audio_output_format ? audio_output_format : sh_audio->sample_format;
|
||||
ao_data.samplerate = force_srate;
|
||||
ao_data.channels = 0;
|
||||
ao_data.format = audio_output_format;
|
||||
if(!preinit_audio_filters(sh_audio,
|
||||
// input:
|
||||
new_srate,
|
||||
|
@ -833,7 +833,7 @@ if(!preinit_audio_filters(sh_audio,
|
|||
}
|
||||
|
||||
aparams.channels = ao_data.channels;
|
||||
aparams.sample_rate = force_srate ? force_srate : ao_data.samplerate;
|
||||
aparams.sample_rate = ao_data.samplerate;
|
||||
aparams.audio_preload = 1000 * audio_preload;
|
||||
if(mux_a->codec != ACODEC_COPY) {
|
||||
aencoder = new_audio_encoder(mux_a, &aparams);
|
||||
|
@ -841,7 +841,7 @@ if(mux_a->codec != ACODEC_COPY) {
|
|||
mencoder_exit(1, NULL);
|
||||
if(!init_audio_filters(sh_audio,
|
||||
new_srate, sh_audio->channels, sh_audio->sample_format,
|
||||
aparams.sample_rate, aparams.channels, aencoder->input_format,
|
||||
&aparams.sample_rate, &aparams.channels, &aencoder->input_format,
|
||||
aencoder->min_buffer_size, aencoder->max_buffer_size)) {
|
||||
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_NoMatchingFilter);
|
||||
mencoder_exit(1,NULL);
|
||||
|
@ -951,9 +951,9 @@ else if (sh_audio) {
|
|||
new_srate,
|
||||
sh_audio->channels,
|
||||
sh_audio->sample_format,
|
||||
mux_a->wf->nSamplesPerSec,
|
||||
mux_a->wf->nChannels,
|
||||
out_format,
|
||||
&mux_a->wf->nSamplesPerSec,
|
||||
&mux_a->wf->nChannels,
|
||||
&out_format,
|
||||
out_minsize,
|
||||
out_maxsize))
|
||||
{
|
||||
|
|
|
@ -955,7 +955,7 @@ static int build_afilter_chain(sh_audio_t *sh_audio, ao_data_t *ao_data)
|
|||
}
|
||||
result = init_audio_filters(sh_audio, new_srate,
|
||||
sh_audio->channels, sh_audio->sample_format,
|
||||
ao_data->samplerate, ao_data->channels, ao_data->format,
|
||||
&ao_data->samplerate, &ao_data->channels, &ao_data->format,
|
||||
ao_data->outburst * 4, ao_data->buffersize);
|
||||
mixer.afilter = sh_audio->afilter;
|
||||
#ifdef HAVE_NEW_GUI
|
||||
|
@ -2133,10 +2133,11 @@ osd_text_buffer[0]=0;
|
|||
if(sh_audio){
|
||||
//const ao_info_t *info=audio_out->info;
|
||||
current_module="af_preinit";
|
||||
ao_data.samplerate=force_srate?force_srate:sh_audio->samplerate*playback_speed;
|
||||
ao_data.channels=audio_output_channels?audio_output_channels:sh_audio->channels;
|
||||
ao_data.format=audio_output_format?audio_output_format:sh_audio->sample_format;
|
||||
ao_data.samplerate=force_srate;
|
||||
ao_data.channels=0;
|
||||
ao_data.format=audio_output_format;
|
||||
#if 1
|
||||
// first init to detect best values
|
||||
if(!preinit_audio_filters(sh_audio,
|
||||
// input:
|
||||
(int)(sh_audio->samplerate*playback_speed),
|
||||
|
|
Loading…
Reference in New Issue