Mercurial > mplayer.hg
annotate libao2/ao_mpegpes.c @ 16946:47c5e9846cd3
ultra simple&slow pp filter, yes yet another spp like filter :)
this one does actually compress&decompress the video at various shifts with lavc while the other spp filters are doing optimized intra only filtering
limitations:
mpeg4 is hardcoded, all options too, pretty trivial to change though, even filtering with non dct codecs like snow could be tried ...
the qscale/qp is only taken fron the first MB of each image and then used for the whole image (would needs some small changes to lavc to let the user set the qscales for the mbs themselfs but iam to lazy ...)
this needs ALOT of cpu time and memory especially at uspp=8 ...
author | michael |
---|---|
date | Tue, 08 Nov 2005 13:15:19 +0000 |
parents | 815f03b7cee5 |
children | f580a7755ac5 |
rev | line source |
---|---|
2708 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7164
diff
changeset
|
3 #include <string.h> |
9411 | 4 |
14123 | 5 #include "config.h" |
9411 | 6 |
7 #ifdef HAVE_DVB_HEAD | |
8594 | 8 #define HAVE_DVB 1 |
9 #endif | |
10 | |
6856 | 11 #ifdef HAVE_DVB |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
12 #include <sys/ioctl.h> |
6856 | 13 #endif |
2708 | 14 |
15 #include "audio_out.h" | |
16 #include "audio_out_internal.h" | |
17 | |
14245 | 18 #include "libaf/af_format.h" |
2708 | 19 |
14123 | 20 #include "mp_msg.h" |
21 #include "help_mp.h" | |
7161 | 22 |
4792 | 23 #ifdef HAVE_DVB |
8594 | 24 #ifndef HAVE_DVB_HEAD |
4792 | 25 #include <ost/audio.h> |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
26 audioMixer_t dvb_mixer={255,255}; |
8594 | 27 #else |
9411 | 28 #include <linux/dvb/audio.h> |
8594 | 29 audio_mixer_t dvb_mixer={255,255}; |
30 #endif | |
7609 | 31 #endif |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
32 extern int vo_mpegpes_fd; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
33 extern int vo_mpegpes_fd2; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
34 |
7164 | 35 #include <errno.h> |
36 | |
2708 | 37 static ao_info_t info = |
38 { | |
4792 | 39 #ifdef HAVE_DVB |
40 "DVB audio output", | |
41 #else | |
42 "Mpeg-PES audio output", | |
43 #endif | |
2708 | 44 "mpegpes", |
45 "A'rpi", | |
46 "" | |
47 }; | |
48 | |
49 LIBAO_EXTERN(mpegpes) | |
50 | |
51 | |
52 // to set/get/query special features/parameters | |
9633
12b1790038b0
64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents:
9411
diff
changeset
|
53 static int control(int cmd,void *arg){ |
4792 | 54 #ifdef HAVE_DVB |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
55 switch(cmd){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
56 case AOCONTROL_GET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
57 if(vo_mpegpes_fd2>=0){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
58 ((ao_control_vol_t*)(arg))->left=dvb_mixer.volume_left/2.56; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
59 ((ao_control_vol_t*)(arg))->right=dvb_mixer.volume_right/2.56; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
60 return CONTROL_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
61 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
62 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
63 case AOCONTROL_SET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
64 if(vo_mpegpes_fd2>=0){ |
5060 | 65 dvb_mixer.volume_left=((ao_control_vol_t*)(arg))->left*2.56; |
66 dvb_mixer.volume_right=((ao_control_vol_t*)(arg))->right*2.56; | |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
67 if(dvb_mixer.volume_left>255) dvb_mixer.volume_left=255; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
68 if(dvb_mixer.volume_right>255) dvb_mixer.volume_right=255; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
69 // printf("Setting DVB volume: %d ; %d \n",dvb_mixer.volume_left,dvb_mixer.volume_right); |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
70 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_MIXER, &dvb_mixer) < 0)){ |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12145
diff
changeset
|
71 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_CantSetMixer, |
7161 | 72 strerror(errno)); |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
73 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
74 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
75 return CONTROL_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
76 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
77 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
78 } |
4792 | 79 #endif |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
80 return CONTROL_UNKNOWN; |
2708 | 81 } |
82 | |
4331 | 83 static int freq=0; |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
84 static int freq_id=0; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
85 |
2708 | 86 // open & setup audio device |
87 // return: 1=success 0=fail | |
88 static int init(int rate,int channels,int format,int flags){ | |
89 | |
7607 | 90 #ifdef HAVE_DVB |
91 if(vo_mpegpes_fd2<0) return 0; // couldn't open audio dev | |
92 #else | |
93 if(vo_mpegpes_fd<0) return 0; // no file | |
94 #endif | |
95 | |
96 ao_data.channels=2; | |
3095 | 97 ao_data.outburst=2000; |
7607 | 98 switch(format){ |
14245 | 99 case AF_FORMAT_S16_LE: |
100 case AF_FORMAT_S16_BE: | |
101 case AF_FORMAT_MPEG2: | |
102 case AF_FORMAT_AC3: | |
7607 | 103 ao_data.format=format; |
104 break; | |
105 default: | |
14245 | 106 ao_data.format=AF_FORMAT_S16_BE; |
7607 | 107 } |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
108 |
7607 | 109 retry: |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
110 switch(rate){ |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
111 case 48000: freq_id=0;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
112 case 96000: freq_id=1;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
113 case 44100: freq_id=2;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
114 case 32000: freq_id=3;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
115 default: |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12145
diff
changeset
|
116 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_UnsupSamplerate, rate); |
7607 | 117 #if 0 |
118 if(rate>48000) rate=96000; else | |
119 if(rate>44100) rate=48000; else | |
120 if(rate>32000) rate=44100; else | |
121 rate=32000; | |
122 goto retry; | |
123 #else | |
124 rate=48000; freq_id=0; | |
125 #endif | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
126 } |
2708 | 127 |
7607 | 128 ao_data.bps=rate*2*2; |
129 freq=ao_data.samplerate=rate; | |
130 | |
2708 | 131 return 1; |
132 } | |
133 | |
134 // close audio device | |
12145 | 135 static void uninit(int immed){ |
2708 | 136 |
137 } | |
138 | |
139 // stop playing and empty buffers (for seeking/pause) | |
140 static void reset(){ | |
141 | |
142 } | |
143 | |
144 // stop playing, keep buffers (for pause) | |
145 static void audio_pause() | |
146 { | |
147 // for now, just call reset(); | |
148 reset(); | |
149 } | |
150 | |
151 // resume playing, after audio_pause() | |
152 static void audio_resume() | |
153 { | |
154 } | |
155 | |
156 void send_pes_packet(unsigned char* data,int len,int id,int timestamp); | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
157 void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id); |
2708 | 158 extern int vo_pts; |
159 | |
160 // return: how many bytes can be played without blocking | |
161 static int get_space(){ | |
4331 | 162 float x=(float)(vo_pts-ao_data.pts)/90000.0; |
2708 | 163 int y; |
7607 | 164 // printf("vo_pts: %5.3f ao_pts: %5.3f\n",vo_pts/90000.0,ao_data.pts/90000.0); |
2708 | 165 if(x<=0) return 0; |
4331 | 166 y=freq*4*x;y/=ao_data.outburst;y*=ao_data.outburst; |
167 if(y>32000) y=32000; | |
2708 | 168 // printf("diff: %5.3f -> %d \n",x,y); |
169 return y; | |
170 } | |
171 | |
172 // plays 'len' bytes of 'data' | |
173 // it should round it down to outburst*n | |
174 // return: number of bytes played | |
175 static int play(void* data,int len,int flags){ | |
7607 | 176 // printf("\nao_mpegpes: play(%d) freq=%d\n",len,freq_id); |
14245 | 177 if(ao_data.format==AF_FORMAT_MPEG2) |
3095 | 178 send_pes_packet(data,len,0x1C0,ao_data.pts); |
2708 | 179 else { |
180 int i; | |
181 unsigned short *s=data; | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
182 // if(len>2000) len=2000; |
4305 | 183 // printf("ao_mpegpes: len=%d \n",len); |
14245 | 184 if(ao_data.format==AF_FORMAT_S16_LE || ao_data.format==AF_FORMAT_AC3) |
7607 | 185 for(i=0;i<len/2;i++) s[i]=(s[i]>>8)|(s[i]<<8); // le<->be |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
186 send_lpcm_packet(data,len,0xA0,ao_data.pts,freq_id); |
2708 | 187 } |
188 return len; | |
189 } | |
190 | |
3095 | 191 // return: delay in seconds between first and last sample in buffer |
192 static float get_delay(){ | |
2708 | 193 |
3095 | 194 return 0.0; |
2708 | 195 } |