summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-06-24 10:50:53 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-06-24 10:50:53 +0000
commitd22ae4a4d9a4f573602ad2ea8178810aaf7f69d2 (patch)
tree0a3bfb4247f5c02e0d9a585655755c3b5f6ad065
parent2f79d1aa8d7d27047b50be6ae22de220ebec2cf6 (diff)
downloadmpv-d22ae4a4d9a4f573602ad2ea8178810aaf7f69d2.tar.bz2
mpv-d22ae4a4d9a4f573602ad2ea8178810aaf7f69d2.tar.xz
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
-rw-r--r--libaf/af.c26
-rw-r--r--libaf/af.h2
-rw-r--r--libmpcodecs/dec_audio.c57
-rw-r--r--libmpcodecs/dec_audio.h2
-rw-r--r--mencoder.c16
-rw-r--r--mplayer.c9
6 files changed, 40 insertions, 72 deletions
diff --git a/libaf/af.c b/libaf/af.c
index 3d50f2b283..ff11c413c5 100644
--- a/libaf/af.c
+++ b/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)) {
diff --git a/libaf/af.h b/libaf/af.h
index cb6e381911..d0911ceae4 100644
--- a/libaf/af.h
+++ b/libaf/af.h
@@ -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);
diff --git a/libmpcodecs/dec_audio.c b/libmpcodecs/dec_audio.c
index f3a7c86fee..ce61d94d50 100644
--- a/libmpcodecs/dec_audio.c
+++ b/libmpcodecs/dec_audio.c
@@ -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;
diff --git a/libmpcodecs/dec_audio.h b/libmpcodecs/dec_audio.h
index ad8872737e..2ee8688e52 100644
--- a/libmpcodecs/dec_audio.h
+++ b/libmpcodecs/dec_audio.h
@@ -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,
diff --git a/mencoder.c b/mencoder.c
index 70470cccfc..1e8251a400 100644
--- a/mencoder.c
+++ b/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))
{
diff --git a/mplayer.c b/mplayer.c
index 5bdcd853a8..ee53be1d7a 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -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),