annotate libmpcodecs/dec_audio.c @ 32972:fbaae7fe1a13

Fix several issues with Translate(). 1. The "Unsafe!" comment has been removed, because the strings passed to the function are strcpy'd. 2. The needless memsets (one of which with wrong size) have been removed in favor of a sufficiently simple initialization of trbuf. 3. The array indices are unsigned now, and the manual optimization of having strlen() outside the for loop has been removed in favor of optimization performed by the compiler. 4. There is a check now to prevent an out-of-bounds array access.
author ib
date Tue, 08 Mar 2011 20:56:51 +0000
parents 470867f7e1df
children 277ec491a8a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30421
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
5 * it under the terms of the GNU General Public License as published by
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
14 * You should have received a copy of the GNU General Public License along
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
17 */
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30378
diff changeset
18
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
19 #include <stdio.h>
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
20 #include <stdlib.h>
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
21 #include <unistd.h>
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
22 #include <assert.h>
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
23
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
24 #include "config.h"
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
25 #include "mp_msg.h"
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
26 #include "help_mp.h"
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
27
22599
4faee1254928 Add explicit location for headers from the stream/ directory.
diego
parents: 22180
diff changeset
28 #include "stream/stream.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22599
diff changeset
29 #include "libmpdemux/demuxer.h"
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
30
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
31 #include "codec-cfg.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22599
diff changeset
32 #include "libmpdemux/stheader.h"
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
33
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
34 #include "dec_audio.h"
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
35 #include "ad.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16793
diff changeset
36 #include "libaf/af_format.h"
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
37
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16793
diff changeset
38 #include "libaf/af.h"
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
39
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
40 #ifdef CONFIG_DYNAMIC_PLUGINS
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
41 #include <dlfcn.h>
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
42 #endif
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
43
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 27249
diff changeset
44 #ifdef CONFIG_FAKE_MONO
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
45 int fakemono = 0;
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
46 #endif
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
47
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
48 /* used for ac3surround decoder - set using -channels option */
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
49 int audio_output_channels = 2;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
50 af_cfg_t af_cfg = { 1, NULL }; // Configuration for audio filters
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
51
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
52 void afm_help(void)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
53 {
7191
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
54 int i;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
55 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_AvailableAudioFm);
18237
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 17635
diff changeset
56 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_DRIVERS\n");
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
57 mp_msg(MSGT_DECAUDIO, MSGL_INFO, " afm: info: (comment)\n");
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
58 for (i = 0; mpcodecs_ad_drivers[i] != NULL; i++)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
59 if (mpcodecs_ad_drivers[i]->info->comment
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
60 && mpcodecs_ad_drivers[i]->info->comment[0])
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
61 mp_msg(MSGT_DECAUDIO, MSGL_INFO, "%9s %s (%s)\n",
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
62 mpcodecs_ad_drivers[i]->info->short_name,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
63 mpcodecs_ad_drivers[i]->info->name,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
64 mpcodecs_ad_drivers[i]->info->comment);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
65 else
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
66 mp_msg(MSGT_DECAUDIO, MSGL_INFO, "%9s %s\n",
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
67 mpcodecs_ad_drivers[i]->info->short_name,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
68 mpcodecs_ad_drivers[i]->info->name);
7191
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
69 }
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
70
24885
cd55d31cecb2 dec_audio.c: Make some functions static
uau
parents: 24884
diff changeset
71 static int init_audio_codec(sh_audio_t *sh_audio)
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
72 {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
73 if ((af_cfg.force & AF_INIT_FORMAT_MASK) == AF_INIT_FLOAT) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
74 int fmt = AF_FORMAT_FLOAT_NE;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
75 if (sh_audio->ad_driver->control(sh_audio, ADCTRL_QUERY_FORMAT,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
76 &fmt) == CONTROL_TRUE) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
77 sh_audio->sample_format = fmt;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
78 sh_audio->samplesize = 4;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
79 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
80 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
81 if (!sh_audio->ad_driver->preinit(sh_audio)) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
82 mp_msg(MSGT_DECAUDIO, MSGL_ERR, MSGTR_ADecoderPreinitFailed);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
83 return 0;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
84 }
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
85
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
86 /* allocate audio in buffer: */
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
87 if (sh_audio->audio_in_minsize > 0) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
88 sh_audio->a_in_buffer_size = sh_audio->audio_in_minsize;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
89 mp_msg(MSGT_DECAUDIO, MSGL_V, MSGTR_AllocatingBytesForInputBuffer,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
90 sh_audio->a_in_buffer_size);
27765
03bb6c3945ff Use av_malloc/av_free for audio-related buffers to avoid crashes due to
reimar
parents: 27397
diff changeset
91 sh_audio->a_in_buffer = av_mallocz(sh_audio->a_in_buffer_size);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
92 sh_audio->a_in_buffer_len = 0;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
93 }
5458
b3d1348b251f audio input buffer allocation/free cleanup
arpi
parents: 5342
diff changeset
94
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
95 sh_audio->a_buffer_size = sh_audio->audio_out_minsize + MAX_OUTBURST;
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
96
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
97 mp_msg(MSGT_DECAUDIO, MSGL_V, MSGTR_AllocatingBytesForOutputBuffer,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
98 sh_audio->audio_out_minsize, MAX_OUTBURST, sh_audio->a_buffer_size);
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
99
27765
03bb6c3945ff Use av_malloc/av_free for audio-related buffers to avoid crashes due to
reimar
parents: 27397
diff changeset
100 sh_audio->a_buffer = av_mallocz(sh_audio->a_buffer_size);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
101 if (!sh_audio->a_buffer) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
102 mp_msg(MSGT_DECAUDIO, MSGL_ERR, MSGTR_CantAllocAudioBuf);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
103 return 0;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
104 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
105 sh_audio->a_buffer_len = 0;
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
106
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
107 if (!sh_audio->ad_driver->init(sh_audio)) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
108 mp_msg(MSGT_DECAUDIO, MSGL_WARN, MSGTR_ADecoderInitFailed);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
109 uninit_audio(sh_audio); // free buffers
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
110 return 0;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
111 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
112
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
113 sh_audio->initialized = 1;
5458
b3d1348b251f audio input buffer allocation/free cleanup
arpi
parents: 5342
diff changeset
114
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
115 if (!sh_audio->channels || !sh_audio->samplerate) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
116 mp_msg(MSGT_DECAUDIO, MSGL_WARN, MSGTR_UnknownAudio);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
117 uninit_audio(sh_audio); // free buffers
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
118 return 0;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
119 }
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
120
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
121 if (!sh_audio->o_bps)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
122 sh_audio->o_bps = sh_audio->channels * sh_audio->samplerate
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
123 * sh_audio->samplesize;
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
124
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
125 mp_msg(MSGT_DECAUDIO, MSGL_INFO,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
126 "AUDIO: %d Hz, %d ch, %s, %3.1f kbit/%3.2f%% (ratio: %d->%d)\n",
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
127 sh_audio->samplerate, sh_audio->channels,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
128 af_fmt2str_short(sh_audio->sample_format),
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
129 sh_audio->i_bps * 8 * 0.001,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
130 ((float) sh_audio->i_bps / sh_audio->o_bps) * 100.0,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
131 sh_audio->i_bps, sh_audio->o_bps);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
132 mp_msg(MSGT_IDENTIFY, MSGL_INFO,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
133 "ID_AUDIO_BITRATE=%d\nID_AUDIO_RATE=%d\n" "ID_AUDIO_NCH=%d\n",
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
134 sh_audio->i_bps * 8, sh_audio->samplerate, sh_audio->channels);
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
135
24884
17c6e0a372f4 Simplify audio buffer allocation logic
uau
parents: 24883
diff changeset
136 sh_audio->a_out_buffer_size = 0;
17c6e0a372f4 Simplify audio buffer allocation logic
uau
parents: 24883
diff changeset
137 sh_audio->a_out_buffer = NULL;
17c6e0a372f4 Simplify audio buffer allocation logic
uau
parents: 24883
diff changeset
138 sh_audio->a_out_buffer_len = 0;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
139
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
140 return 1;
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
141 }
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
142
24885
cd55d31cecb2 dec_audio.c: Make some functions static
uau
parents: 24884
diff changeset
143 static int init_audio(sh_audio_t *sh_audio, char *codecname, char *afm,
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
144 int status, stringset_t *selected)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
145 {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
146 unsigned int orig_fourcc = sh_audio->wf ? sh_audio->wf->wFormatTag : 0;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16306
diff changeset
147 int force = 0;
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16306
diff changeset
148 if (codecname && codecname[0] == '+') {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
149 codecname = &codecname[1];
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
150 force = 1;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16306
diff changeset
151 }
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
152 sh_audio->codec = NULL;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
153 while (1) {
31540
7f1c8212e3cf Add some const, the ad_functions structs are in rodata.
reimar
parents: 30421
diff changeset
154 const ad_functions_t *mpadec;
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
155 int i;
14819
601e2c8a2922 Remove file-global mpadec, add ad_driver member to sh_audio_t instead.
hzoli
parents: 14818
diff changeset
156 sh_audio->ad_driver = 0;
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
157 // restore original fourcc:
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
158 if (sh_audio->wf)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
159 sh_audio->wf->wFormatTag = i = orig_fourcc;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
160 if (!(sh_audio->codec = find_audio_codec(sh_audio->format,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
161 sh_audio->wf ? (&i) : NULL,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
162 sh_audio->codec, force)))
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
163 break;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
164 if (sh_audio->wf)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
165 sh_audio->wf->wFormatTag = i;
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
166 // ok we found one codec
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
167 if (stringset_test(selected, sh_audio->codec->name))
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
168 continue; // already tried & failed
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
169 if (codecname && strcmp(sh_audio->codec->name, codecname))
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
170 continue; // -ac
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
171 if (afm && strcmp(sh_audio->codec->drv, afm))
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
172 continue; // afm doesn't match
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
173 if (!force && sh_audio->codec->status < status)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
174 continue; // too unstable
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
175 stringset_add(selected, sh_audio->codec->name); // tagging it
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
176 // ok, it matches all rules, let's find the driver!
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
177 for (i = 0; mpcodecs_ad_drivers[i] != NULL; i++)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
178 if (!strcmp(mpcodecs_ad_drivers[i]->info->short_name,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
179 sh_audio->codec->drv))
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
180 break;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
181 mpadec = mpcodecs_ad_drivers[i];
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
182 #ifdef CONFIG_DYNAMIC_PLUGINS
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
183 if (!mpadec) {
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
184 /* try to open shared decoder plugin */
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
185 int buf_len;
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
186 char *buf;
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
187 ad_functions_t *funcs_sym;
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
188 ad_info_t *info_sym;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
189
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
190 buf_len =
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
191 strlen(MPLAYER_LIBDIR) + strlen(sh_audio->codec->drv) + 16;
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
192 buf = malloc(buf_len);
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
193 if (!buf)
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
194 break;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
195 snprintf(buf, buf_len, "%s/mplayer/ad_%s.so", MPLAYER_LIBDIR,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
196 sh_audio->codec->drv);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
197 mp_msg(MSGT_DECAUDIO, MSGL_DBG2,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
198 "Trying to open external plugin: %s\n", buf);
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
199 sh_audio->dec_handle = dlopen(buf, RTLD_LAZY);
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
200 if (!sh_audio->dec_handle)
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
201 break;
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
202 snprintf(buf, buf_len, "mpcodecs_ad_%s", sh_audio->codec->drv);
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
203 funcs_sym = dlsym(sh_audio->dec_handle, buf);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
204 if (!funcs_sym || !funcs_sym->info || !funcs_sym->preinit
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
205 || !funcs_sym->init || !funcs_sym->uninit
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
206 || !funcs_sym->control || !funcs_sym->decode_audio)
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
207 break;
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
208 info_sym = funcs_sym->info;
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
209 if (strcmp(info_sym->short_name, sh_audio->codec->drv))
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
210 break;
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
211 free(buf);
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
212 mpadec = funcs_sym;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
213 mp_msg(MSGT_DECAUDIO, MSGL_V,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
214 "Using external decoder plugin (%s/mplayer/ad_%s.so)!\n",
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
215 MPLAYER_LIBDIR, sh_audio->codec->drv);
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
216 }
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
217 #endif
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
218 if (!mpadec) { // driver not available (==compiled in)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
219 mp_msg(MSGT_DECAUDIO, MSGL_ERR,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
220 MSGTR_AudioCodecFamilyNotAvailableStr,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
221 sh_audio->codec->name, sh_audio->codec->drv);
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
222 continue;
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
223 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
224 // it's available, let's try to init!
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
225 // init()
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
226 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_OpeningAudioDecoder,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
227 mpadec->info->short_name, mpadec->info->name);
14819
601e2c8a2922 Remove file-global mpadec, add ad_driver member to sh_audio_t instead.
hzoli
parents: 14818
diff changeset
228 sh_audio->ad_driver = mpadec;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
229 if (!init_audio_codec(sh_audio)) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
230 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_ADecoderInitFailed);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
231 continue; // try next...
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
232 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
233 // Yeah! We got it!
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
234 return 1;
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
235 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
236 return 0;
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
237 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
238
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
239 int init_best_audio_codec(sh_audio_t *sh_audio, char **audio_codec_list,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
240 char **audio_fm_list)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
241 {
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
242 stringset_t selected;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
243 char *ac_l_default[2] = { "", (char *) NULL };
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
244 // hack:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
245 if (!audio_codec_list)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
246 audio_codec_list = ac_l_default;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
247 // Go through the codec.conf and find the best codec...
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
248 sh_audio->initialized = 0;
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
249 stringset_init(&selected);
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
250 while (!sh_audio->initialized && *audio_codec_list) {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
251 char *audio_codec = *(audio_codec_list++);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
252 if (audio_codec[0]) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
253 if (audio_codec[0] == '-') {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
254 // disable this codec:
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
255 stringset_add(&selected, audio_codec + 1);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
256 } else {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
257 // forced codec by name:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
258 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_ForcedAudioCodec,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
259 audio_codec);
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
260 init_audio(sh_audio, audio_codec, NULL, -1, &selected);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
261 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
262 } else {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
263 int status;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
264 // try in stability order: UNTESTED, WORKING, BUGGY.
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
265 // never try CRASHING.
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
266 if (audio_fm_list) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
267 char **fmlist = audio_fm_list;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
268 // try first the preferred codec families:
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
269 while (!sh_audio->initialized && *fmlist) {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
270 char *audio_fm = *(fmlist++);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
271 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_TryForceAudioFmtStr,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
272 audio_fm);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
273 for (status = CODECS_STATUS__MAX;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
274 status >= CODECS_STATUS__MIN; --status)
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
275 if (init_audio(sh_audio, NULL, audio_fm, status, &selected))
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
276 break;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
277 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
278 }
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
279 if (!sh_audio->initialized)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
280 for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
281 --status)
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
282 if (init_audio(sh_audio, NULL, NULL, status, &selected))
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
283 break;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
284 }
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
285 }
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
286 stringset_free(&selected);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
287
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
288 if (!sh_audio->initialized) {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
289 mp_msg(MSGT_DECAUDIO, MSGL_ERR, MSGTR_CantFindAudioCodec,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
290 sh_audio->format);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
291 return 0; // failed
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
292 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
293
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
294 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_SelectedAudioCodec,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
295 sh_audio->codec->name, sh_audio->codec->drv, sh_audio->codec->info);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
296 return 1; // success
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
297 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
298
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
299 void uninit_audio(sh_audio_t *sh_audio)
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
300 {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
301 if (sh_audio->afilter) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
302 mp_msg(MSGT_DECAUDIO, MSGL_V, "Uninit audio filters...\n");
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
303 af_uninit(sh_audio->afilter);
10803
15425a07e13f minor leak fix
alex
parents: 10683
diff changeset
304 free(sh_audio->afilter);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
305 sh_audio->afilter = NULL;
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
306 }
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
307 if (sh_audio->initialized) {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
308 mp_msg(MSGT_DECAUDIO, MSGL_V, MSGTR_UninitAudioStr,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
309 sh_audio->codec->drv);
14819
601e2c8a2922 Remove file-global mpadec, add ad_driver member to sh_audio_t instead.
hzoli
parents: 14818
diff changeset
310 sh_audio->ad_driver->uninit(sh_audio);
27397
d47744b95b78 Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents: 27341
diff changeset
311 #ifdef CONFIG_DYNAMIC_PLUGINS
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
312 if (sh_audio->dec_handle)
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
313 dlclose(sh_audio->dec_handle);
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
314 #endif
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
315 sh_audio->initialized = 0;
7240
a1ae7d811e35 fixed uninit order
arpi
parents: 7191
diff changeset
316 }
24884
17c6e0a372f4 Simplify audio buffer allocation logic
uau
parents: 24883
diff changeset
317 free(sh_audio->a_out_buffer);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
318 sh_audio->a_out_buffer = NULL;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
319 sh_audio->a_out_buffer_size = 0;
27765
03bb6c3945ff Use av_malloc/av_free for audio-related buffers to avoid crashes due to
reimar
parents: 27397
diff changeset
320 av_freep(&sh_audio->a_buffer);
03bb6c3945ff Use av_malloc/av_free for audio-related buffers to avoid crashes due to
reimar
parents: 27397
diff changeset
321 av_freep(&sh_audio->a_in_buffer);
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
322 }
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
323
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
324
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
325 int init_audio_filters(sh_audio_t *sh_audio, int in_samplerate,
24894
2bfc75674b71 Simplify init_audio_filters() arguments
uau
parents: 24893
diff changeset
326 int *out_samplerate, int *out_channels, int *out_format)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
327 {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
328 af_stream_t *afs = sh_audio->afilter;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
329 if (!afs) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
330 afs = malloc(sizeof(af_stream_t));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
331 memset(afs, 0, sizeof(af_stream_t));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
332 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
333 // input format: same as codec's output format:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
334 afs->input.rate = in_samplerate;
24894
2bfc75674b71 Simplify init_audio_filters() arguments
uau
parents: 24893
diff changeset
335 afs->input.nch = sh_audio->channels;
2bfc75674b71 Simplify init_audio_filters() arguments
uau
parents: 24893
diff changeset
336 afs->input.format = sh_audio->sample_format;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
337 af_fix_parameters(&(afs->input));
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
338
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
339 // output format: same as ao driver's input format (if missing, fallback to input)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
340 afs->output.rate = *out_samplerate;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
341 afs->output.nch = *out_channels;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
342 afs->output.format = *out_format;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
343 af_fix_parameters(&(afs->output));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
344
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
345 // filter config:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
346 memcpy(&afs->cfg, &af_cfg, sizeof(af_cfg_t));
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
347
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
348 mp_msg(MSGT_DECAUDIO, MSGL_V, MSGTR_BuildingAudioFilterChain,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
349 afs->input.rate, afs->input.nch,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
350 af_fmt2str_short(afs->input.format), afs->output.rate,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
351 afs->output.nch, af_fmt2str_short(afs->output.format));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
352
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
353 // let's autoprobe it!
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
354 if (0 != af_init(afs)) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
355 sh_audio->afilter = NULL;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
356 free(afs);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
357 return 0; // failed :(
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
358 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
359
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
360 *out_samplerate = afs->output.rate;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
361 *out_channels = afs->output.nch;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
362 *out_format = afs->output.format;
15811
9b4bbb6098f6 make -srate work again, unify audio filter init and preinit.
reimar
parents: 15789
diff changeset
363
32727
470867f7e1df Remove resetting of a_out_buffer_len in init_audio_filters.
reimar
parents: 31977
diff changeset
364 // Do not reset a_out_buffer_len. This may cause some
470867f7e1df Remove resetting of a_out_buffer_len in init_audio_filters.
reimar
parents: 31977
diff changeset
365 // glitches/slow adaption of changes but it is better than
470867f7e1df Remove resetting of a_out_buffer_len in init_audio_filters.
reimar
parents: 31977
diff changeset
366 // losing audio even for minor adjustments and avoids sync issues.
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
367
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
368 // ok!
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
369 sh_audio->afilter = (void *) afs;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
370 return 1;
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
371 }
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
372
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
373 static int filter_n_bytes(sh_audio_t *sh, int len)
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
374 {
25252
ca7e863c97bb fix declaration after statement
rfelker
parents: 24961
diff changeset
375 int error = 0;
25253
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
376 // Filter
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
377 af_data_t filter_input = {
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
378 .audio = sh->a_buffer,
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
379 .rate = sh->samplerate,
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
380 .nch = sh->channels,
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
381 .format = sh->sample_format
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
382 };
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
383 af_data_t *filter_output;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
384
25252
ca7e863c97bb fix declaration after statement
rfelker
parents: 24961
diff changeset
385 assert(len-1 + sh->audio_out_minsize <= sh->a_buffer_size);
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
386
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
387 // Decode more bytes if needed
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
388 while (sh->a_buffer_len < len) {
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
389 unsigned char *buf = sh->a_buffer + sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
390 int minlen = len - sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
391 int maxlen = sh->a_buffer_size - sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
392 int ret = sh->ad_driver->decode_audio(sh, buf, minlen, maxlen);
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
393 int format_change = sh->samplerate != filter_input.rate ||
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
394 sh->channels != filter_input.nch ||
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
395 sh->sample_format != filter_input.format;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
396 if (ret <= 0 || format_change) {
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
397 error = format_change ? -2 : -1;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
398 len = sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
399 break;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
400 }
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
401 sh->a_buffer_len += ret;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
402 }
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
403
25254
f1da4024c3ab 10l, len may change after initialization time
rfelker
parents: 25253
diff changeset
404 filter_input.len = len;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
405 af_fix_parameters(&filter_input);
25253
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
406 filter_output = af_play(sh->afilter, &filter_input);
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
407 if (!filter_output)
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
408 return -1;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
409 if (sh->a_out_buffer_size < sh->a_out_buffer_len + filter_output->len) {
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
410 int newlen = sh->a_out_buffer_len + filter_output->len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
411 mp_msg(MSGT_DECAUDIO, MSGL_V, "Increasing filtered audio buffer size "
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
412 "from %d to %d\n", sh->a_out_buffer_size, newlen);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
413 sh->a_out_buffer = realloc(sh->a_out_buffer, newlen);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
414 sh->a_out_buffer_size = newlen;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
415 }
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
416 memcpy(sh->a_out_buffer + sh->a_out_buffer_len, filter_output->audio,
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
417 filter_output->len);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
418 sh->a_out_buffer_len += filter_output->len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
419
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
420 // remove processed data from decoder buffer:
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
421 sh->a_buffer_len -= len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
422 memmove(sh->a_buffer, sh->a_buffer + len, sh->a_buffer_len);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
423
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
424 return error;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
425 }
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
426
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
427 /* Try to get at least minlen decoded+filtered bytes in sh_audio->a_out_buffer
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
428 * (total length including possible existing data).
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
429 * Return 0 on success, -1 on error/EOF (not distinguished).
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
430 * In the former case sh_audio->a_out_buffer_len is always >= minlen
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
431 * on return. In case of EOF/error it might or might not be.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
432 * Can reallocate sh_audio->a_out_buffer if needed to fit all filter output. */
31977
4a4dcc72da52 Rename decode_audio() to mp_decode_audio().
diego
parents: 31671
diff changeset
433 int mp_decode_audio(sh_audio_t *sh_audio, int minlen)
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
434 {
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
435 // Indicates that a filter seems to be buffering large amounts of data
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
436 int huge_filter_buffer = 0;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
437 // Decoded audio must be cut at boundaries of this many bytes
27249
4be2b34aa431 Try to keep decoded audio buffer aligned.
reimar
parents: 25962
diff changeset
438 int unitsize = sh_audio->channels * sh_audio->samplesize * 16;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
439
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
440 /* Filter output size will be about filter_multiplier times input size.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
441 * If some filter buffers audio in big blocks this might only hold
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
442 * as average over time. */
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
443 double filter_multiplier = af_calc_filter_multiplier(sh_audio->afilter);
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
444
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
445 /* If the decoder set audio_out_minsize then it can do the equivalent of
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
446 * "while (output_len < target_len) output_len += audio_out_minsize;",
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
447 * so we must guarantee there is at least audio_out_minsize-1 bytes
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
448 * more space in the output buffer than the minimum length we try to
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
449 * decode. */
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
450 int max_decode_len = sh_audio->a_buffer_size - sh_audio->audio_out_minsize;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
451 max_decode_len -= max_decode_len % unitsize;
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
452
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
453 while (sh_audio->a_out_buffer_len < minlen) {
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
454 int res;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
455 int declen = (minlen - sh_audio->a_out_buffer_len) / filter_multiplier
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
456 + (unitsize << 5); // some extra for possible filter buffering
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
457 if (huge_filter_buffer)
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
458 /* Some filter must be doing significant buffering if the estimated
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
459 * input length didn't produce enough output from filters.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
460 * Feed the filters 2k bytes at a time until we have enough output.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
461 * Very small amounts could make filtering inefficient while large
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
462 * amounts can make MPlayer demux the file unnecessarily far ahead
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
463 * to get audio data and buffer video frames in memory while doing
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
464 * so. However the performance impact of either is probably not too
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
465 * significant as long as the value is not completely insane. */
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
466 declen = 2000;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
467 declen -= declen % unitsize;
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
468 if (declen > max_decode_len)
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
469 declen = max_decode_len;
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
470 else
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
471 /* if this iteration does not fill buffer, we must have lots
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
472 * of buffering in filters */
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
473 huge_filter_buffer = 1;
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
474 res = filter_n_bytes(sh_audio, declen);
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
475 if (res < 0)
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
476 return res;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
477 }
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
478 return 0;
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
479 }
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
480
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
481 void resync_audio_stream(sh_audio_t *sh_audio)
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
482 {
30378
8339bca8e4b4 Move the resync-related code into more consistent places instead of having it
reimar
parents: 29168
diff changeset
483 sh_audio->a_buffer_len = 0;
8339bca8e4b4 Move the resync-related code into more consistent places instead of having it
reimar
parents: 29168
diff changeset
484 sh_audio->a_out_buffer_len = 0;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
485 sh_audio->a_in_buffer_len = 0; // clear audio input buffer
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
486 if (!sh_audio->initialized)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
487 return;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
488 sh_audio->ad_driver->control(sh_audio, ADCTRL_RESYNC_STREAM, NULL);
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
489 }
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
490
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
491 void skip_audio_frame(sh_audio_t *sh_audio)
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
492 {
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
493 if (!sh_audio->initialized)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
494 return;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
495 if (sh_audio->ad_driver->control(sh_audio, ADCTRL_SKIP_FRAME, NULL) ==
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
496 CONTROL_TRUE)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
497 return;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
498 // default skip code:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
499 ds_fill_buffer(sh_audio->ds); // skip block
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
500 }