comparison libmpcodecs/dec_audio.c @ 5458:b3d1348b251f

audio input buffer allocation/free cleanup
author arpi
date Mon, 01 Apr 2002 17:58:04 +0000
parents c4cf81b3af71
children 14b46420840b
comparison
equal deleted inserted replaced
5457:f248c9e86423 5458:b3d1348b251f
38 sh_audio->codec->name, sh_audio->codec->driver); 38 sh_audio->codec->name, sh_audio->codec->driver);
39 return 0; // no such driver 39 return 0; // no such driver
40 } 40 }
41 41
42 printf("Selecting Audio Decoder: [%s] %s\n",mpadec->info->short_name,mpadec->info->name); 42 printf("Selecting Audio Decoder: [%s] %s\n",mpadec->info->short_name,mpadec->info->name);
43
44 // reset in/out buffer size/pointer:
45 sh_audio->a_buffer_size=0;
46 sh_audio->a_buffer=NULL;
47 sh_audio->a_in_buffer_size=0;
48 sh_audio->a_in_buffer=NULL;
49
50 // Set up some common usefull defaults. ad->preinit() can override these:
43 51
44 sh_audio->samplesize=2; 52 sh_audio->samplesize=2;
45 #ifdef WORDS_BIGENDIAN 53 #ifdef WORDS_BIGENDIAN
46 sh_audio->sample_format=AFMT_S16_BE; 54 sh_audio->sample_format=AFMT_S16_BE;
47 #else 55 #else
48 sh_audio->sample_format=AFMT_S16_LE; 56 sh_audio->sample_format=AFMT_S16_LE;
49 #endif 57 #endif
50 sh_audio->samplerate=0; 58 sh_audio->samplerate=0;
51 sh_audio->o_bps=0; 59 sh_audio->i_bps=0; // input rate (bytes/sec)
60 sh_audio->o_bps=0; // output rate (bytes/sec)
52 61
53 sh_audio->a_buffer_size=0;
54 sh_audio->a_buffer=NULL;
55
56 sh_audio->a_in_buffer_len=0;
57
58 /* setup required min. in/out buffer size:*/
59 sh_audio->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ 62 sh_audio->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/
63 sh_audio->audio_in_minsize=0;
60 64
61 if(!mpadec->preinit(sh_audio)) 65 if(!mpadec->preinit(sh_audio))
62 { 66 {
63 printf("ADecoder preinit failed :(\n"); 67 printf("ADecoder preinit failed :(\n");
64 return 0; 68 return 0;
69 }
70
71 /* allocate audio in buffer: */
72 if(sh_audio->audio_in_minsize>0){
73 sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize;
74 mp_msg(MSGT_DECAUDIO,MSGL_V,"dec_audio: Allocating %d bytes for input buffer\n",
75 sh_audio->a_in_buffer_size);
76 sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size);
77 memset(sh_audio->a_in_buffer,0,sh_audio->a_in_buffer_size);
78 sh_audio->a_in_buffer_len=0;
65 } 79 }
66 80
67 /* allocate audio out buffer: */ 81 /* allocate audio out buffer: */
68 sh_audio->a_buffer_size=sh_audio->audio_out_minsize+MAX_OUTBURST; /* worst case calc.*/ 82 sh_audio->a_buffer_size=sh_audio->audio_out_minsize+MAX_OUTBURST; /* worst case calc.*/
69 83
77 } 91 }
78 memset(sh_audio->a_buffer,0,sh_audio->a_buffer_size); 92 memset(sh_audio->a_buffer,0,sh_audio->a_buffer_size);
79 sh_audio->a_buffer_len=0; 93 sh_audio->a_buffer_len=0;
80 94
81 if(!mpadec->init(sh_audio)){ 95 if(!mpadec->init(sh_audio)){
82 printf("ADecoder init failed :(\n"); 96 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"ADecoder init failed :(\n");
97 uninit_audio(sh_audio); // free buffers
83 return 0; 98 return 0;
84 } 99 }
100
85 sh_audio->inited=1; 101 sh_audio->inited=1;
86 102
87 if(!sh_audio->channels || !sh_audio->samplerate){ 103 if(!sh_audio->channels || !sh_audio->samplerate){
88 mp_msg(MSGT_DECAUDIO,MSGL_WARN,MSGTR_UnknownAudio); 104 mp_msg(MSGT_DECAUDIO,MSGL_WARN,MSGTR_UnknownAudio);
89 if(sh_audio->a_buffer) free(sh_audio->a_buffer); 105 uninit_audio(sh_audio); // free buffers
90 sh_audio->a_buffer=NULL;
91 return 0; 106 return 0;
92 } 107 }
93 108
94 if(!sh_audio->o_bps) 109 if(!sh_audio->o_bps)
95 sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize; 110 sh_audio->o_bps=sh_audio->channels*sh_audio->samplerate*sh_audio->samplesize;
96 return sh_audio->codec->driver; 111
112 return 1;
97 } 113 }
98 114
99 void uninit_audio(sh_audio_t *sh_audio) 115 void uninit_audio(sh_audio_t *sh_audio)
100 { 116 {
117 if(sh_audio->a_buffer) free(sh_audio->a_buffer);
118 sh_audio->a_buffer=NULL;
119 if(sh_audio->a_in_buffer) free(sh_audio->a_in_buffer);
120 sh_audio->a_in_buffer=NULL;
101 if(!sh_audio->inited) return; 121 if(!sh_audio->inited) return;
102 mp_msg(MSGT_DECAUDIO,MSGL_V,"uninit audio: %d \n",sh_audio->codec->driver); 122 mp_msg(MSGT_DECAUDIO,MSGL_V,"uninit audio: %d \n",sh_audio->codec->driver);
103 mpadec->uninit(sh_audio); 123 mpadec->uninit(sh_audio);
104 if(sh_audio->a_buffer) free(sh_audio->a_buffer);
105 sh_audio->a_buffer=NULL;
106 sh_audio->inited=0; 124 sh_audio->inited=0;
107 } 125 }
108 126
109 int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) 127 int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
110 { 128 {