annotate libmpcodecs/ad_dmo.c @ 25357:b265c001e64a

Add new audio filter for encoding multi-channel audio into ac3 at runtime. And if set first parameter of this filter to 1, it will do ac3 passthrough like hwac3 did.
author ulion
date Thu, 13 Dec 2007 12:38:17 +0000
parents dfa8a510c81c
children 0f1b5b68af32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
1 #include <stdio.h>
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
2 #include <stdlib.h>
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
3 #include <unistd.h>
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
4
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
5 #include "config.h"
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
6 #include "mp_msg.h"
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
7 #include "help_mp.h"
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
8
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
9 #include "ad_internal.h"
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
10 #include "libaf/reorder_ch.h"
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
11
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
12 static ad_info_t info =
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
13 {
8327
arpi
parents: 8326
diff changeset
14 "Win32/DMO decoders",
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
15 "dmo",
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
16 "A'rpi",
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
17 "avifile.sf.net",
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
18 ""
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
19 };
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
20
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
21 LIBAD_EXTERN(dmo)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
22
22577
a033e5519802 Include loader/ prefix in #include path everywhere.
diego
parents: 18765
diff changeset
23 #include "loader/dmo/DMO_AudioDecoder.h"
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
24
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
25 static int init(sh_audio_t *sh)
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 return 1;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
28 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
29
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
30 static int preinit(sh_audio_t *sh_audio)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
31 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
32 DMO_AudioDecoder* ds_adec;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
33 int chans=(audio_output_channels==sh_audio->wf->nChannels) ?
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
34 audio_output_channels : (sh_audio->wf->nChannels>=2 ? 2 : 1);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
35 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
36 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
37 mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_MissingDLLcodec,sh_audio->codec->dll);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
38 return 0;
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 sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
41 sh_audio->channels=chans;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
42 sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
13427
9d0b052c4f74 setting samplesize to 2 in decoders where neccessary.
reimar
parents: 8327
diff changeset
43 sh_audio->samplesize=2;
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
44 sh_audio->audio_in_minsize=4*sh_audio->wf->nBlockAlign;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
45 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
46 sh_audio->audio_out_minsize=4*16384;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
47 sh_audio->context = ds_adec;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
48 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
49 return 1;
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
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
52 static void uninit(sh_audio_t *sh)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
53 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
54 DMO_AudioDecoder* ds_adec = sh->context;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
55 DMO_AudioDecoder_Destroy(ds_adec);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
56 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
57
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
58 static int control(sh_audio_t *sh_audio,int cmd,void* arg, ...)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
59 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
60 int skip;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
61 switch(cmd)
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
62 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
63 case ADCTRL_SKIP_FRAME:
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
64 skip=sh_audio->wf->nBlockAlign;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
65 if(skip<16){
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
66 skip=(sh_audio->wf->nAvgBytesPerSec/16)&(~7);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
67 if(skip<16) skip=16;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
68 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
69 demux_read_data(sh_audio->ds,NULL,skip);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
70 return CONTROL_TRUE;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
71 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
72 return CONTROL_UNKNOWN;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
73 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
74
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
75 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
76 {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
77 DMO_AudioDecoder* ds_adec = sh_audio->context;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
78 // int len=-1;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
79 int size_in=0;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
80 int size_out=0;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
81 int srcsize=DMO_AudioDecoder_GetSrcSize(ds_adec, maxlen);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
82 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
83 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
84 if(sh_audio->a_in_buffer_len<srcsize){
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
85 sh_audio->a_in_buffer_len+=
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
86 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
87 srcsize-sh_audio->a_in_buffer_len);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
88 }
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
89 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
90 buf,maxlen, &size_in,&size_out);
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
91 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
92 if(size_in>=sh_audio->a_in_buffer_len){
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
93 sh_audio->a_in_buffer_len=0;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
94 } else {
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
95 sh_audio->a_in_buffer_len-=size_in;
15552
7867e143a557 Use memmove instead of memcpy for overlapping areas.
reimar
parents: 13427
diff changeset
96 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
97 }
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
98 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
99 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
100 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
101 sh_audio->channels,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
102 size_out / sh_audio->samplesize,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
103 sh_audio->samplesize);
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 23918
diff changeset
104 }
8326
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
105 // len=size_out;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
106 return size_out;
4849a0cfc2aa DMO audio support (including 6ch support too)
arpi
parents:
diff changeset
107 }