annotate libmpcodecs/ad_dmo.c @ 34102:dd8320c2a2cb

libmpcodec: add vf_lavfi. This filter wraps a complete libavfilter filter graph. As the API of libavfilter is not completely stable yet, the filter is not enabled by default, so as not to let mplayer unbuildable. Some strange behaviours may appear due to the very different model of buffer allocation between mplayer and lavfi.
author cigaes
date Wed, 12 Oct 2011 11:38:10 +0000
parents 9986a61354e6
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: 29263
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
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: 29263
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: 29263
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: 29263
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
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: 29263
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: 29263
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: 29263
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
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: 29263
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: 29263
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: 29263
diff changeset
17 */
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 29263
diff changeset
18
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
19 #include <stdio.h>
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
20 #include <stdlib.h>
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
21 #include <unistd.h>
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
22
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
23 #include "config.h"
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
24 #include "mp_msg.h"
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
25 #include "help_mp.h"
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
26
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
27 #include "ad_internal.h"
31986
9986a61354e6 Remove duplicated audio_output_channels extern variable declaration.
diego
parents: 30504
diff changeset
28 #include "dec_audio.h"
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
29 #include "libaf/reorder_ch.h"
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
30
30504
cc27da5d7286 Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents: 30421
diff changeset
31 static const ad_info_t info =
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
32 {
8327
arpi
parents: 8326
diff changeset
33 "Win32/DMO decoders",
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
34 "dmo",
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
35 "A'rpi",
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
36 "avifile.sf.net",
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
37 ""
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
38 };
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
39
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
40 LIBAD_EXTERN(dmo)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
41
22577
a033e5519802 Include loader/ prefix in #include path everywhere.
diego
parents: 18765
diff changeset
42 #include "loader/dmo/DMO_AudioDecoder.h"
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
43
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
44 static int init(sh_audio_t *sh)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
45 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
46 return 1;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
47 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
48
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
49 static int preinit(sh_audio_t *sh_audio)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
50 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
51 DMO_AudioDecoder* ds_adec;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
52 int chans=(audio_output_channels==sh_audio->wf->nChannels) ?
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
53 audio_output_channels : (sh_audio->wf->nChannels>=2 ? 2 : 1);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
54 if(!(ds_adec=DMO_AudioDecoder_Open(sh_audio->codec->dll,&sh_audio->codec->guid,sh_audio->wf,chans)))
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
55 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
56 mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_MissingDLLcodec,sh_audio->codec->dll);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
57 return 0;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
58 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
59 sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
60 sh_audio->channels=chans;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
61 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
13427
9d0b052c4f74 setting samplesize to 2 in decoders where neccessary.
reimar
parents: 8327
diff changeset
62 sh_audio->samplesize=2;
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
63 sh_audio->audio_in_minsize=4*sh_audio->wf->nBlockAlign;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
64 if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
65 sh_audio->audio_out_minsize=4*16384;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
66 sh_audio->context = ds_adec;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
67 mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Win32/DMO audio codec init OK!\n");
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
68 return 1;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
69 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
70
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
71 static void uninit(sh_audio_t *sh)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
72 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
73 DMO_AudioDecoder* ds_adec = sh->context;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
74 DMO_AudioDecoder_Destroy(ds_adec);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
75 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
76
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
77 static int control(sh_audio_t *sh_audio,int cmd,void* arg, ...)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
78 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
79 int skip;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
80 switch(cmd)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
81 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
82 case ADCTRL_SKIP_FRAME:
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
83 skip=sh_audio->wf->nBlockAlign;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
84 if(skip<16){
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
85 skip=(sh_audio->wf->nAvgBytesPerSec/16)&(~7);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
86 if(skip<16) skip=16;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
87 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
88 demux_read_data(sh_audio->ds,NULL,skip);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
89 return CONTROL_TRUE;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
90 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
91 return CONTROL_UNKNOWN;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
92 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
93
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
94 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
95 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
96 DMO_AudioDecoder* ds_adec = sh_audio->context;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
97 // int len=-1;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
98 int size_in=0;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
99 int size_out=0;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
100 int srcsize=DMO_AudioDecoder_GetSrcSize(ds_adec, maxlen);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
101 mp_msg(MSGT_DECAUDIO,MSGL_DBG3,"DMO says: srcsize=%d (buffsize=%d) out_size=%d\n",srcsize,sh_audio->a_in_buffer_size,maxlen);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
102 if(srcsize>sh_audio->a_in_buffer_size) srcsize=sh_audio->a_in_buffer_size; // !!!!!!
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
103 if(sh_audio->a_in_buffer_len<srcsize){
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
104 sh_audio->a_in_buffer_len+=
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
105 demux_read_data(sh_audio->ds,&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len],
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
106 srcsize-sh_audio->a_in_buffer_len);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
107 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
108 DMO_AudioDecoder_Convert(ds_adec, sh_audio->a_in_buffer,sh_audio->a_in_buffer_len,
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
109 buf,maxlen, &size_in,&size_out);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
110 mp_dbg(MSGT_DECAUDIO,MSGL_DBG2,"DMO: audio %d -> %d converted (in_buf_len=%d of %d) %d\n",size_in,size_out,sh_audio->a_in_buffer_len,sh_audio->a_in_buffer_size,ds_tell_pts(sh_audio->ds));
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
111 if(size_in>=sh_audio->a_in_buffer_len){
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
112 sh_audio->a_in_buffer_len=0;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
113 } else {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
114 sh_audio->a_in_buffer_len-=size_in;
15552
7867e143a557 Use memmove instead of memcpy for overlapping areas.
reimar
parents: 13427
diff changeset
115 memmove(sh_audio->a_in_buffer,&sh_audio->a_in_buffer[size_in],sh_audio->a_in_buffer_len);
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
116 }
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
117 if (size_out > 0 && sh_audio->channels >= 5) {
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
118 reorder_channel_nch(buf, AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
119 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
120 sh_audio->channels,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
121 size_out / sh_audio->samplesize,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
122 sh_audio->samplesize);
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
123 }
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
124 // len=size_out;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
125 return size_out;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
126 }