Mercurial > mplayer.hg
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 { |