annotate libmpcodecs/dec_audio.c @ 36963:e539d330c7be

Remove unnecessary bounds checks in Win32 GUI. The checks that the rendered potmeter button doesn't exceed the bounds is not necessary as the item value is already limited within the range of 0 to 100. Patch by Hans-Dieter Kosch, hdkosch kabelbw de.
author ib
date Mon, 24 Mar 2014 12:52:01 +0000
parents d29d116c0818
children
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;
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32727
diff changeset
89 mp_msg(MSGT_DECAUDIO, MSGL_V, "dec_audio: Allocating %d bytes for input buffer.\n",
24883
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
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32727
diff changeset
97 mp_msg(MSGT_DECAUDIO, MSGL_V, "dec_audio: Allocating %d + %d = %d bytes for output buffer.\n",
24883
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 }
35304
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34650
diff changeset
224 /* only allow dummy codecs if specified via -ac */
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34650
diff changeset
225 if (sh_audio->codec->flags & CODECS_FLAG_DUMMY && !codecname) {
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34650
diff changeset
226 continue;
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34650
diff changeset
227 }
d29d116c0818 libmpcodecs: Only choose dummy codecs if forced
al
parents: 34650
diff changeset
228
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
229 // 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
230 // init()
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
231 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_OpeningAudioDecoder,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
232 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
233 sh_audio->ad_driver = mpadec;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
234 if (!init_audio_codec(sh_audio)) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
235 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_ADecoderInitFailed);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
236 continue; // try next...
7522
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 // Yeah! We got it!
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
239 return 1;
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
240 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
241 return 0;
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
242 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
243
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
244 int init_best_audio_codec(sh_audio_t *sh_audio, char **audio_codec_list,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
245 char **audio_fm_list)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
246 {
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
247 stringset_t selected;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
248 char *ac_l_default[2] = { "", (char *) NULL };
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
249 // hack:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
250 if (!audio_codec_list)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
251 audio_codec_list = ac_l_default;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
252 // Go through the codec.conf and find the best codec...
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
253 sh_audio->initialized = 0;
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
254 stringset_init(&selected);
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
255 while (!sh_audio->initialized && *audio_codec_list) {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
256 char *audio_codec = *(audio_codec_list++);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
257 if (audio_codec[0]) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
258 if (audio_codec[0] == '-') {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
259 // disable this codec:
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
260 stringset_add(&selected, audio_codec + 1);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
261 } else {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
262 // forced codec by name:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
263 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_ForcedAudioCodec,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
264 audio_codec);
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
265 init_audio(sh_audio, audio_codec, NULL, -1, &selected);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
266 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
267 } else {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
268 int status;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
269 // try in stability order: UNTESTED, WORKING, BUGGY.
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
270 // never try CRASHING.
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
271 if (audio_fm_list) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
272 char **fmlist = audio_fm_list;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
273 // try first the preferred codec families:
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
274 while (!sh_audio->initialized && *fmlist) {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
275 char *audio_fm = *(fmlist++);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
276 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_TryForceAudioFmtStr,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
277 audio_fm);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
278 for (status = CODECS_STATUS__MAX;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
279 status >= CODECS_STATUS__MIN; --status)
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
280 if (init_audio(sh_audio, NULL, audio_fm, status, &selected))
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
281 break;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
282 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
283 }
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
284 if (!sh_audio->initialized)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
285 for (status = CODECS_STATUS__MAX; status >= CODECS_STATUS__MIN;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
286 --status)
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
287 if (init_audio(sh_audio, NULL, NULL, status, &selected))
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
288 break;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
289 }
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
290 }
25661
293aeec83153 Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with
reimar
parents: 25254
diff changeset
291 stringset_free(&selected);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
292
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
293 if (!sh_audio->initialized) {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
294 mp_msg(MSGT_DECAUDIO, MSGL_ERR, MSGTR_CantFindAudioCodec,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
295 sh_audio->format);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
296 return 0; // failed
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
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
299 mp_msg(MSGT_DECAUDIO, MSGL_INFO, MSGTR_SelectedAudioCodec,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
300 sh_audio->codec->name, sh_audio->codec->drv, sh_audio->codec->info);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
301 return 1; // success
7522
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
302 }
aa1a1249f239 -ac/-afm rewrite, now works the same way as -vc/-vfm
arpi
parents: 7502
diff changeset
303
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
304 void uninit_audio(sh_audio_t *sh_audio)
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
305 {
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
306 if (sh_audio->afilter) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
307 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
308 af_uninit(sh_audio->afilter);
10803
15425a07e13f minor leak fix
alex
parents: 10683
diff changeset
309 free(sh_audio->afilter);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
310 sh_audio->afilter = NULL;
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
311 }
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
312 if (sh_audio->initialized) {
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32727
diff changeset
313 mp_msg(MSGT_DECAUDIO, MSGL_V, "Uninit audio: %s\n",
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
314 sh_audio->codec->drv);
14819
601e2c8a2922 Remove file-global mpadec, add ad_driver member to sh_audio_t instead.
hzoli
parents: 14818
diff changeset
315 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
316 #ifdef CONFIG_DYNAMIC_PLUGINS
8152
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
317 if (sh_audio->dec_handle)
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
318 dlclose(sh_audio->dec_handle);
4b02f73cb4b9 dlopen() support for ad and vd
alex
parents: 8123
diff changeset
319 #endif
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
320 sh_audio->initialized = 0;
7240
a1ae7d811e35 fixed uninit order
arpi
parents: 7191
diff changeset
321 }
24884
17c6e0a372f4 Simplify audio buffer allocation logic
uau
parents: 24883
diff changeset
322 free(sh_audio->a_out_buffer);
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
323 sh_audio->a_out_buffer = NULL;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
324 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
325 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
326 av_freep(&sh_audio->a_in_buffer);
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
327 }
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
328
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
329
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
330 int init_audio_filters(sh_audio_t *sh_audio, int in_samplerate,
24894
2bfc75674b71 Simplify init_audio_filters() arguments
uau
parents: 24893
diff changeset
331 int *out_samplerate, int *out_channels, int *out_format)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
332 {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
333 af_stream_t *afs = sh_audio->afilter;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
334 if (!afs) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
335 afs = malloc(sizeof(af_stream_t));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
336 memset(afs, 0, sizeof(af_stream_t));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
337 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
338 // input format: same as codec's output format:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
339 afs->input.rate = in_samplerate;
24894
2bfc75674b71 Simplify init_audio_filters() arguments
uau
parents: 24893
diff changeset
340 afs->input.nch = sh_audio->channels;
2bfc75674b71 Simplify init_audio_filters() arguments
uau
parents: 24893
diff changeset
341 afs->input.format = sh_audio->sample_format;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
342 af_fix_parameters(&(afs->input));
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
343
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
344 // output format: same as ao driver's input format (if missing, fallback to input)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
345 afs->output.rate = *out_samplerate;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
346 afs->output.nch = *out_channels;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
347 afs->output.format = *out_format;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
348 af_fix_parameters(&(afs->output));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
349
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
350 // filter config:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
351 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
352
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32727
diff changeset
353 mp_msg(MSGT_DECAUDIO, MSGL_V,
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32727
diff changeset
354 "Building audio filter chain for %dHz/%dch/%s -> %dHz/%dch/%s...\n",
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
355 afs->input.rate, afs->input.nch,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
356 af_fmt2str_short(afs->input.format), afs->output.rate,
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
357 afs->output.nch, af_fmt2str_short(afs->output.format));
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
358
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
359 // let's autoprobe it!
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
360 if (0 != af_init(afs)) {
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
361 sh_audio->afilter = NULL;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
362 free(afs);
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
363 return 0; // failed :(
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
364 }
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
365
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
366 *out_samplerate = afs->output.rate;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
367 *out_channels = afs->output.nch;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
368 *out_format = afs->output.format;
15811
9b4bbb6098f6 make -srate work again, unify audio filter init and preinit.
reimar
parents: 15789
diff changeset
369
32727
470867f7e1df Remove resetting of a_out_buffer_len in init_audio_filters.
reimar
parents: 31977
diff changeset
370 // 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
371 // 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
372 // 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
373
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
374 // ok!
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
375 sh_audio->afilter = (void *) afs;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
376 return 1;
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
377 }
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
378
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
379 static int filter_n_bytes(sh_audio_t *sh, int len)
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
380 {
25252
ca7e863c97bb fix declaration after statement
rfelker
parents: 24961
diff changeset
381 int error = 0;
25253
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
382 // Filter
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
383 af_data_t filter_input = {
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
384 .audio = sh->a_buffer,
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
385 .rate = sh->samplerate,
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
386 .nch = sh->channels,
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
387 .format = sh->sample_format
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
388 };
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
389 af_data_t *filter_output;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
390
25252
ca7e863c97bb fix declaration after statement
rfelker
parents: 24961
diff changeset
391 assert(len-1 + sh->audio_out_minsize <= sh->a_buffer_size);
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
392
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
393 // Decode more bytes if needed
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
394 while (sh->a_buffer_len < len) {
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
395 unsigned char *buf = sh->a_buffer + sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
396 int minlen = len - sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
397 int maxlen = sh->a_buffer_size - sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
398 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
399 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
400 sh->channels != filter_input.nch ||
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
401 sh->sample_format != filter_input.format;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
402 if (ret <= 0 || format_change) {
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
403 error = format_change ? -2 : -1;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
404 len = sh->a_buffer_len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
405 break;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
406 }
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
407 sh->a_buffer_len += ret;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
408 }
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
409
25254
f1da4024c3ab 10l, len may change after initialization time
rfelker
parents: 25253
diff changeset
410 filter_input.len = len;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
411 af_fix_parameters(&filter_input);
25253
7862500323c5 fix declaration after statement, take 2
rfelker
parents: 25252
diff changeset
412 filter_output = af_play(sh->afilter, &filter_input);
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
413 if (!filter_output)
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
414 return -1;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
415 if (sh->a_out_buffer_size < sh->a_out_buffer_len + filter_output->len) {
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
416 int newlen = sh->a_out_buffer_len + filter_output->len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
417 mp_msg(MSGT_DECAUDIO, MSGL_V, "Increasing filtered audio buffer size "
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
418 "from %d to %d\n", sh->a_out_buffer_size, newlen);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
419 sh->a_out_buffer = realloc(sh->a_out_buffer, newlen);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
420 sh->a_out_buffer_size = newlen;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
421 }
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
422 memcpy(sh->a_out_buffer + sh->a_out_buffer_len, filter_output->audio,
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
423 filter_output->len);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
424 sh->a_out_buffer_len += filter_output->len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
425
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
426 // remove processed data from decoder buffer:
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
427 sh->a_buffer_len -= len;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
428 memmove(sh->a_buffer, sh->a_buffer + len, sh->a_buffer_len);
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
429
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
430 return error;
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
431 }
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
432
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
433 /* 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
434 * (total length including possible existing data).
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
435 * Return 0 on success, -1 on error/EOF (not distinguished).
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
436 * In the former case sh_audio->a_out_buffer_len is always >= minlen
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
437 * on return. In case of EOF/error it might or might not be.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
438 * 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
439 int mp_decode_audio(sh_audio_t *sh_audio, int minlen)
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
440 {
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
441 // Indicates that a filter seems to be buffering large amounts of data
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
442 int huge_filter_buffer = 0;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
443 // 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
444 int unitsize = sh_audio->channels * sh_audio->samplesize * 16;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
445
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
446 /* Filter output size will be about filter_multiplier times input size.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
447 * If some filter buffers audio in big blocks this might only hold
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
448 * as average over time. */
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
449 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
450
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
451 /* If the decoder set audio_out_minsize then it can do the equivalent of
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
452 * "while (output_len < target_len) output_len += audio_out_minsize;",
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
453 * so we must guarantee there is at least audio_out_minsize-1 bytes
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
454 * more space in the output buffer than the minimum length we try to
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
455 * decode. */
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
456 int max_decode_len = sh_audio->a_buffer_size - sh_audio->audio_out_minsize;
34650
dc78fbe1f17f Add a safeguard to avoid crash if the decoder e.g. claims 0 channels.
reimar
parents: 33827
diff changeset
457 if (!unitsize)
dc78fbe1f17f Add a safeguard to avoid crash if the decoder e.g. claims 0 channels.
reimar
parents: 33827
diff changeset
458 return -1;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
459 max_decode_len -= max_decode_len % unitsize;
7604
32efb806436e aufio filter layer (libaf) integration to libmpcodecs, mplayer and mencoder
arpi
parents: 7561
diff changeset
460
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
461 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
462 int res;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
463 int declen = (minlen - sh_audio->a_out_buffer_len) / filter_multiplier
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
464 + (unitsize << 5); // some extra for possible filter buffering
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
465 if (huge_filter_buffer)
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
466 /* Some filter must be doing significant buffering if the estimated
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
467 * input length didn't produce enough output from filters.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
468 * Feed the filters 2k bytes at a time until we have enough output.
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
469 * Very small amounts could make filtering inefficient while large
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
470 * amounts can make MPlayer demux the file unnecessarily far ahead
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
471 * to get audio data and buffer video frames in memory while doing
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
472 * so. However the performance impact of either is probably not too
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
473 * significant as long as the value is not completely insane. */
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
474 declen = 2000;
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
475 declen -= declen % unitsize;
24961
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
476 if (declen > max_decode_len)
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
477 declen = max_decode_len;
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
478 else
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
479 /* if this iteration does not fill buffer, we must have lots
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
480 * of buffering in filters */
de251a0b5228 Simplify decode_audio function a bit.
reimar
parents: 24918
diff changeset
481 huge_filter_buffer = 1;
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
482 res = filter_n_bytes(sh_audio, declen);
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
483 if (res < 0)
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31540
diff changeset
484 return res;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
485 }
24892
80180dc13565 Change decode_audio() interface
uau
parents: 24886
diff changeset
486 return 0;
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
487 }
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
488
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
489 void resync_audio_stream(sh_audio_t *sh_audio)
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
490 {
30378
8339bca8e4b4 Move the resync-related code into more consistent places instead of having it
reimar
parents: 29168
diff changeset
491 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
492 sh_audio->a_out_buffer_len = 0;
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
493 sh_audio->a_in_buffer_len = 0; // clear audio input buffer
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
494 if (!sh_audio->initialized)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
495 return;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
496 sh_audio->ad_driver->control(sh_audio, ADCTRL_RESYNC_STREAM, NULL);
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
497 }
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
498
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
499 void skip_audio_frame(sh_audio_t *sh_audio)
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
500 {
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25661
diff changeset
501 if (!sh_audio->initialized)
24883
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
502 return;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
503 if (sh_audio->ad_driver->control(sh_audio, ADCTRL_SKIP_FRAME, NULL) ==
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
504 CONTROL_TRUE)
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
505 return;
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
506 // default skip code:
9d5f2d383382 Reindent dec_audio.c
uau
parents: 24242
diff changeset
507 ds_fill_buffer(sh_audio->ds); // skip block
5342
c4cf81b3af71 imporetd from MPlayerXP, with small modification
arpi
parents:
diff changeset
508 }