summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-04-01 17:58:04 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-04-01 17:58:04 +0000
commitaff40c7823d8bcbe1c1d2c259601150bdeffa998 (patch)
tree98dbf28ee8afa11095544a0cb68b22921d34cba1 /libmpcodecs
parente8236a8ab65e16a8d131f16ce6b892b71299ca02 (diff)
downloadmpv-aff40c7823d8bcbe1c1d2c259601150bdeffa998.tar.bz2
mpv-aff40c7823d8bcbe1c1d2c259601150bdeffa998.tar.xz
audio input buffer allocation/free cleanup
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5459 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/ad_a52.c4
-rw-r--r--libmpcodecs/ad_dk3adpcm.c7
-rw-r--r--libmpcodecs/ad_dk4adpcm.c8
-rw-r--r--libmpcodecs/ad_dshow.c6
-rw-r--r--libmpcodecs/ad_faad.c11
-rw-r--r--libmpcodecs/ad_hwac3.c4
-rw-r--r--libmpcodecs/ad_imaadpcm.c6
-rw-r--r--libmpcodecs/ad_msadpcm.c7
-rw-r--r--libmpcodecs/ad_roqaudio.c7
-rw-r--r--libmpcodecs/dec_audio.c44
10 files changed, 40 insertions, 64 deletions
diff --git a/libmpcodecs/ad_a52.c b/libmpcodecs/ad_a52.c
index e4ab235ff6..4add05c09f 100644
--- a/libmpcodecs/ad_a52.c
+++ b/libmpcodecs/ad_a52.c
@@ -96,6 +96,7 @@ static int preinit(sh_audio_t *sh)
/* Dolby AC3 audio: */
/* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */
sh->audio_out_minsize=audio_output_channels*2*256*6;
+ sh->audio_in_minsize=3840;
return 1;
}
@@ -115,9 +116,6 @@ static int init(sh_audio_t *sh_audio)
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 init failed\n");
return 0;
}
- sh_audio->a_in_buffer_size=3840;
- sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size);
- sh_audio->a_in_buffer_len=0;
if(a52_fillbuff(sh_audio)<0){
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 sync failed\n");
return 0;
diff --git a/libmpcodecs/ad_dk3adpcm.c b/libmpcodecs/ad_dk3adpcm.c
index d940ec3748..449397f673 100644
--- a/libmpcodecs/ad_dk3adpcm.c
+++ b/libmpcodecs/ad_dk3adpcm.c
@@ -71,6 +71,7 @@ static int preinit(sh_audio_t *sh_audio)
sh_audio->audio_out_minsize = sh_audio->wf->nBlockAlign * 6;
sh_audio->ds->ss_div =
(sh_audio->wf->nBlockAlign - DK3_ADPCM_PREAMBLE_SIZE) * 8 / 3;
+ sh_audio->audio_in_minsize=
sh_audio->ds->ss_mul = sh_audio->wf->nBlockAlign;
return 1;
}
@@ -81,17 +82,11 @@ static int init(sh_audio_t *sh_audio)
sh_audio->samplerate = sh_audio->wf->nSamplesPerSec;
sh_audio->i_bps =
(sh_audio->ds->ss_mul * sh_audio->samplerate) / sh_audio->ds->ss_div;
-
- if ((sh_audio->a_in_buffer =
- (unsigned char *)malloc(sh_audio->ds->ss_mul)) == NULL)
- return 0;
-
return 1;
}
static void uninit(sh_audio_t *sh_audio)
{
- free(sh_audio->a_in_buffer);
}
static int control(sh_audio_t *sh,int cmd,void* arg, ...)
diff --git a/libmpcodecs/ad_dk4adpcm.c b/libmpcodecs/ad_dk4adpcm.c
index 1c3a379644..b92b2dba6b 100644
--- a/libmpcodecs/ad_dk4adpcm.c
+++ b/libmpcodecs/ad_dk4adpcm.c
@@ -25,8 +25,8 @@ static int preinit(sh_audio_t *sh_audio)
(((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1) * 4;
sh_audio->ds->ss_div =
((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1;
+ sh_audio->audio_in_minsize=
sh_audio->ds->ss_mul=sh_audio->wf->nBlockAlign;
-
return 1;
}
@@ -37,17 +37,11 @@ static int init(sh_audio_t *sh_audio)
sh_audio->i_bps = sh_audio->wf->nBlockAlign *
(sh_audio->channels*sh_audio->samplerate) /
(((sh_audio->wf->nBlockAlign - DK4_ADPCM_PREAMBLE_SIZE) * 2) + 1);
-
- if ((sh_audio->a_in_buffer =
- (unsigned char *)malloc(sh_audio->ds->ss_mul)) == NULL)
- return 0;
-
return 1;
}
static void uninit(sh_audio_t *sh_audio)
{
- free(sh_audio->a_in_buffer);
}
static int control(sh_audio_t *sh,int cmd,void* arg, ...)
diff --git a/libmpcodecs/ad_dshow.c b/libmpcodecs/ad_dshow.c
index 3358c498be..208a927814 100644
--- a/libmpcodecs/ad_dshow.c
+++ b/libmpcodecs/ad_dshow.c
@@ -36,18 +36,14 @@ static int preinit(sh_audio_t *sh_audio)
{
mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_MissingDLLcodec,sh_audio->codec->dll);
return 0;
- } else {
+ }
sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec;
sh_audio->channels=sh_audio->wf->nChannels;
sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
sh_audio->audio_in_minsize=2*sh_audio->wf->nBlockAlign;
if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192;
- sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize;
- sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size);
- sh_audio->a_in_buffer_len=0;
sh_audio->audio_out_minsize=16384;
sh_audio->context = ds_adec;
- }
mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Win32/DShow audio codec init OK!\n");
return 1;
}
diff --git a/libmpcodecs/ad_faad.c b/libmpcodecs/ad_faad.c
index f841fda481..1fa621e10b 100644
--- a/libmpcodecs/ad_faad.c
+++ b/libmpcodecs/ad_faad.c
@@ -39,13 +39,8 @@ static faacDecFrameInfo faac_finfo;
static int preinit(sh_audio_t *sh)
{
- sh->audio_in_minsize=FAAD_BUFFLEN;
sh->audio_out_minsize=2048*FAAD_MAX_CHANNELS;
-
- // XXX: why is this duplicated in sh struct? ::atmos
- sh->a_in_buffer_size=sh->audio_in_minsize;
- sh->a_in_buffer=malloc(sh->a_in_buffer_size);
- sh->a_in_buffer_len=0;
+ sh->audio_in_minsize=FAAD_BUFFLEN;
return 1;
}
@@ -126,10 +121,6 @@ static void uninit(sh_audio_t *sh)
{
mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Closing decoder!\n");
faacDecClose(faac_hdec);
- if(sh->a_in_buffer_size) {
- free(sh->a_in_buffer);
- sh->a_in_buffer = NULL;
- }
}
static int control(sh_audio_t *sh,int cmd,void* arg, ...)
diff --git a/libmpcodecs/ad_hwac3.c b/libmpcodecs/ad_hwac3.c
index eaf2cf1d3e..7e93c0ced5 100644
--- a/libmpcodecs/ad_hwac3.c
+++ b/libmpcodecs/ad_hwac3.c
@@ -32,6 +32,7 @@ static int preinit(sh_audio_t *sh)
{
/* Dolby AC3 audio: */
sh->audio_out_minsize=4*256*6;
+ sh->audio_in_minsize=3840;
sh->channels=2;
return 1;
}
@@ -44,9 +45,6 @@ static int init(sh_audio_t *sh_audio)
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 init failed\n");
return 0;
}
- sh_audio->a_in_buffer_size=3840;
- sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size);
- sh_audio->a_in_buffer_len=0;
if(a52_fillbuff(sh_audio)<0) {
mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 sync failed\n");
return 0;
diff --git a/libmpcodecs/ad_imaadpcm.c b/libmpcodecs/ad_imaadpcm.c
index 7f9e076eb0..555b91ad17 100644
--- a/libmpcodecs/ad_imaadpcm.c
+++ b/libmpcodecs/ad_imaadpcm.c
@@ -98,6 +98,7 @@ static int preinit(sh_audio_t *sh_audio)
sh_audio->ds->ss_div = QT_IMA_ADPCM_SAMPLES_PER_BLOCK;
sh_audio->ds->ss_mul = QT_IMA_ADPCM_BLOCK_SIZE * sh_audio->wf->nChannels;
}
+ sh_audio->audio_in_minsize=sh_audio->ds->ss_mul;
return 1;
}
@@ -110,16 +111,11 @@ static int init(sh_audio_t *sh_audio)
sh_audio->i_bps =
(sh_audio->ds->ss_mul * sh_audio->samplerate) / sh_audio->ds->ss_div;
- if ((sh_audio->a_in_buffer =
- (unsigned char *)malloc(sh_audio->ds->ss_mul)) == NULL)
- return 0;
-
return 1;
}
static void uninit(sh_audio_t *sh_audio)
{
- free(sh_audio->a_in_buffer);
}
static int control(sh_audio_t *sh,int cmd,void* arg, ...)
diff --git a/libmpcodecs/ad_msadpcm.c b/libmpcodecs/ad_msadpcm.c
index 4a56c4c1fc..0c662ec945 100644
--- a/libmpcodecs/ad_msadpcm.c
+++ b/libmpcodecs/ad_msadpcm.c
@@ -66,8 +66,8 @@ static int preinit(sh_audio_t *sh_audio)
sh_audio->audio_out_minsize = sh_audio->wf->nBlockAlign * 4;
sh_audio->ds->ss_div =
(sh_audio->wf->nBlockAlign - MS_ADPCM_PREAMBLE_SIZE) * 2;
+ sh_audio->audio_in_minsize =
sh_audio->ds->ss_mul = sh_audio->wf->nBlockAlign;
-
return 1;
}
@@ -78,16 +78,11 @@ static int init(sh_audio_t *sh_audio)
sh_audio->i_bps = sh_audio->wf->nBlockAlign *
(sh_audio->channels*sh_audio->samplerate) / sh_audio->ds->ss_div;
- if ((sh_audio->a_in_buffer =
- (unsigned char *)malloc(sh_audio->ds->ss_mul)) == NULL)
- return 0;
-
return 1;
}
static void uninit(sh_audio_t *sh_audio)
{
- free(sh_audio->a_in_buffer);
}
static int control(sh_audio_t *sh,int cmd,void* arg, ...)
diff --git a/libmpcodecs/ad_roqaudio.c b/libmpcodecs/ad_roqaudio.c
index d390d13724..8d30d63b83 100644
--- a/libmpcodecs/ad_roqaudio.c
+++ b/libmpcodecs/ad_roqaudio.c
@@ -22,6 +22,7 @@ static int preinit(sh_audio_t *sh_audio)
{
// minsize was stored in wf->nBlockAlign by the RoQ demuxer
sh_audio->audio_out_minsize=sh_audio->wf->nBlockAlign;
+ sh_audio->audio_in_minsize=sh_audio->audio_out_minsize / 2; // FIXME?
sh_audio->context = roq_decode_audio_init();
return 1;
}
@@ -31,17 +32,11 @@ static int init(sh_audio_t *sh_audio)
sh_audio->channels=sh_audio->wf->nChannels;
sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
sh_audio->i_bps = 44100;
-
- if ((sh_audio->a_in_buffer =
- (unsigned char *)malloc(sh_audio->audio_out_minsize / 2)) == NULL)
- return 0;
-
return 1;
}
static void uninit(sh_audio_t *sh_audio)
{
- free(sh_audio->a_in_buffer);
}
static int control(sh_audio_t *sh,int cmd,void* arg, ...)
diff --git a/libmpcodecs/dec_audio.c b/libmpcodecs/dec_audio.c
index 835e5b870f..352ee4f89a 100644
--- a/libmpcodecs/dec_audio.c
+++ b/libmpcodecs/dec_audio.c
@@ -40,6 +40,14 @@ int init_audio(sh_audio_t *sh_audio)
}
printf("Selecting Audio Decoder: [%s] %s\n",mpadec->info->short_name,mpadec->info->name);
+
+ // reset in/out buffer size/pointer:
+ sh_audio->a_buffer_size=0;
+ sh_audio->a_buffer=NULL;
+ sh_audio->a_in_buffer_size=0;
+ sh_audio->a_in_buffer=NULL;
+
+ // Set up some common usefull defaults. ad->preinit() can override these:
sh_audio->samplesize=2;
#ifdef WORDS_BIGENDIAN
@@ -48,15 +56,11 @@ int init_audio(sh_audio_t *sh_audio)
sh_audio->sample_format=AFMT_S16_LE;
#endif
sh_audio->samplerate=0;
- sh_audio->o_bps=0;
+ sh_audio->i_bps=0; // input rate (bytes/sec)
+ sh_audio->o_bps=0; // output rate (bytes/sec)
- sh_audio->a_buffer_size=0;
- sh_audio->a_buffer=NULL;
-
- sh_audio->a_in_buffer_len=0;
-
- /* setup required min. in/out buffer size:*/
sh_audio->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/
+ sh_audio->audio_in_minsize=0;
if(!mpadec->preinit(sh_audio))
{
@@ -64,6 +68,16 @@ int init_audio(sh_audio_t *sh_audio)
return 0;
}
+/* allocate audio in buffer: */
+ if(sh_audio->audio_in_minsize>0){
+ sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize;
+ mp_msg(MSGT_DECAUDIO,MSGL_V,"dec_audio: Allocating %d bytes for input buffer\n",
+ sh_audio->a_in_buffer_size);
+ sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size);
+ memset(sh_audio->a_in_buffer,0,sh_audio->a_in_buffer_size);
+ sh_audio->a_in_buffer_len=0;
+ }
+
/* allocate audio out buffer: */
sh_audio->a_buffer_size=sh_audio->audio_out_minsize+MAX_OUTBURST; /* worst case calc.*/
@@ -79,30 +93,34 @@ int init_audio(sh_audio_t *sh_audio)
sh_audio->a_buffer_len=0;
if(!mpadec->init(sh_audio)){
- printf("ADecoder init failed :(\n");
+ mp_msg(MSGT_DECAUDIO,MSGL_WARN,"ADecoder init failed :(\n");
+ uninit_audio(sh_audio); // free buffers
return 0;
}
+
sh_audio->inited=1;
if(!sh_audio->channels || !sh_audio->samplerate){
mp_msg(MSGT_DECAUDIO,MSGL_WARN,MSGTR_UnknownAudio);
- if(sh_audio->a_buffer) free(sh_audio->a_buffer);
- sh_audio->a_buffer=NULL;
+ uninit_audio(sh_audio); // free buffers
return 0;
}
if(!sh_audio->o_bps)
sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize;
- return sh_audio->codec->driver;
+
+ return 1;
}
void uninit_audio(sh_audio_t *sh_audio)
{
+ 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);
+ sh_audio->a_in_buffer=NULL;
if(!sh_audio->inited) return;
mp_msg(MSGT_DECAUDIO,MSGL_V,"uninit audio: %d \n",sh_audio->codec->driver);
mpadec->uninit(sh_audio);
- if(sh_audio->a_buffer) free(sh_audio->a_buffer);
- sh_audio->a_buffer=NULL;
sh_audio->inited=0;
}