Mercurial > mplayer.hg
annotate libmpcodecs/ad_dmo.c @ 27815:f92271dc5f17
Remove X11 backing store: this is now a useless flag.
Also, it is mandatory for Xserver 1.5.x (part of Xorg 7.4, shipped on all
Linux distributions starting from Oct. 08) and will be removed
from Xserver 1.6 anyhow ...
Patch by Stephane Marchesin (marchesin at icps dot u dash strasbg dot fr).
For more info, see long flame thread at:
http://lists.mplayerhq.hu/pipermail/mplayer-dev-eng/2008-August/058323.html
author | ben |
---|---|
date | Wed, 29 Oct 2008 22:03:36 +0000 |
parents | dfa8a510c81c |
children | 0f1b5b68af32 |
rev | line source |
---|---|
8326 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <unistd.h> | |
4 | |
5 #include "config.h" | |
6 #include "mp_msg.h" | |
7 #include "help_mp.h" | |
8 | |
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 | 11 |
12 static ad_info_t info = | |
13 { | |
8327 | 14 "Win32/DMO decoders", |
8326 | 15 "dmo", |
16 "A'rpi", | |
17 "avifile.sf.net", | |
18 "" | |
19 }; | |
20 | |
21 LIBAD_EXTERN(dmo) | |
22 | |
22577
a033e5519802
Include loader/ prefix in #include path everywhere.
diego
parents:
18765
diff
changeset
|
23 #include "loader/dmo/DMO_AudioDecoder.h" |
8326 | 24 |
25 static int init(sh_audio_t *sh) | |
26 { | |
27 return 1; | |
28 } | |
29 | |
30 static int preinit(sh_audio_t *sh_audio) | |
31 { | |
32 DMO_AudioDecoder* ds_adec; | |
33 int chans=(audio_output_channels==sh_audio->wf->nChannels) ? | |
34 audio_output_channels : (sh_audio->wf->nChannels>=2 ? 2 : 1); | |
35 if(!(ds_adec=DMO_AudioDecoder_Open(sh_audio->codec->dll,&sh_audio->codec->guid,sh_audio->wf,chans))) | |
36 { | |
37 mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_MissingDLLcodec,sh_audio->codec->dll); | |
38 return 0; | |
39 } | |
40 sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec; | |
41 sh_audio->channels=chans; | |
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 | 44 sh_audio->audio_in_minsize=4*sh_audio->wf->nBlockAlign; |
45 if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192; | |
46 sh_audio->audio_out_minsize=4*16384; | |
47 sh_audio->context = ds_adec; | |
48 mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: Win32/DMO audio codec init OK!\n"); | |
49 return 1; | |
50 } | |
51 | |
52 static void uninit(sh_audio_t *sh) | |
53 { | |
54 DMO_AudioDecoder* ds_adec = sh->context; | |
55 DMO_AudioDecoder_Destroy(ds_adec); | |
56 } | |
57 | |
58 static int control(sh_audio_t *sh_audio,int cmd,void* arg, ...) | |
59 { | |
60 int skip; | |
61 switch(cmd) | |
62 { | |
63 case ADCTRL_SKIP_FRAME: | |
64 skip=sh_audio->wf->nBlockAlign; | |
65 if(skip<16){ | |
66 skip=(sh_audio->wf->nAvgBytesPerSec/16)&(~7); | |
67 if(skip<16) skip=16; | |
68 } | |
69 demux_read_data(sh_audio->ds,NULL,skip); | |
70 return CONTROL_TRUE; | |
71 } | |
72 return CONTROL_UNKNOWN; | |
73 } | |
74 | |
75 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) | |
76 { | |
77 DMO_AudioDecoder* ds_adec = sh_audio->context; | |
78 // int len=-1; | |
79 int size_in=0; | |
80 int size_out=0; | |
81 int srcsize=DMO_AudioDecoder_GetSrcSize(ds_adec, maxlen); | |
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); | |
83 if(srcsize>sh_audio->a_in_buffer_size) srcsize=sh_audio->a_in_buffer_size; // !!!!!! | |
84 if(sh_audio->a_in_buffer_len<srcsize){ | |
85 sh_audio->a_in_buffer_len+= | |
86 demux_read_data(sh_audio->ds,&sh_audio->a_in_buffer[sh_audio->a_in_buffer_len], | |
87 srcsize-sh_audio->a_in_buffer_len); | |
88 } | |
89 DMO_AudioDecoder_Convert(ds_adec, sh_audio->a_in_buffer,sh_audio->a_in_buffer_len, | |
90 buf,maxlen, &size_in,&size_out); | |
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)); | |
92 if(size_in>=sh_audio->a_in_buffer_len){ | |
93 sh_audio->a_in_buffer_len=0; | |
94 } else { | |
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 | 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 | 105 // len=size_out; |
106 return size_out; | |
107 } |