annotate libmpcodecs/dec_audio.c @ 29516:87897065b7d7

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