Mercurial > mplayer.hg
annotate libao2/ao_ivtv.c @ 27645:83d915449a10
Remove IWMMXT optimizations through libavcodec from libmpeg2.
According to Siarhei Siamashka libavcodec is faster on ARM so it is better to
use it directly instead of creating this hackish mix of two libraries.
Plus, these local changes would never be acceptable upstream, so no good
reason for keeping it in our local patchset remains.
author | diego |
---|---|
date | Wed, 01 Oct 2008 01:01:59 +0000 |
parents | 0f42fb42843c |
children | 9e739bdb049c |
rev | line source |
---|---|
19224 | 1 /* |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
2 * audio output for WinTV PVR-150/250/350 (a.k.a IVTV) cards |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
3 * through Connexant hardware MPEG decoder |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
4 * See http://ivtvdriver.org/index.php/Main_Page for more details on the |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
5 * cards supported by the ivtv driver. |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
6 * |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
7 * WARNING: You need to force -ac hwmpa for audio output to work. |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
8 * |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
9 * Copyright (C) 2006 Benjamin Zores |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
10 * |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
11 * This file is part of MPlayer. |
19224 | 12 * |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
13 * MPlayer is free software; you can redistribute it and/or modify |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
14 * it under the terms of the GNU General Public License as published by |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
15 * the Free Software Foundation; either version 2 of the License, or |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
16 * (at your option) any later version. |
19224 | 17 * |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
18 * MPlayer is distributed in the hope that it will be useful, |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
21 * GNU General Public License for more details. |
19224 | 22 * |
26743
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
23 * You should have received a copy of the GNU General Public License along |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
24 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
0f42fb42843c
Use standard license headers with standard formatting.
diego
parents:
19224
diff
changeset
|
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
19224 | 26 */ |
27 | |
28 #include <inttypes.h> | |
29 | |
30 #include "config.h" | |
31 | |
32 #include "mp_msg.h" | |
33 #include "help_mp.h" | |
34 | |
35 #include "audio_out.h" | |
36 #include "audio_out_internal.h" | |
37 #include "libaf/af_format.h" | |
38 #include "libmpdemux/mpeg_packetizer.h" | |
39 | |
40 #define MPEG_AUDIO_ID 0x1C0 | |
41 | |
42 static int freq = 0; | |
43 | |
44 static ao_info_t info = | |
45 { | |
46 "IVTV MPEG Audio Decoder output", | |
47 "ivtv", | |
48 "Benjamin Zores", | |
49 "" | |
50 }; | |
51 | |
52 LIBAO_EXTERN(ivtv) | |
53 | |
54 /* to set/get/query special features/parameters */ | |
55 static int | |
56 control (int cmd,void *arg) | |
57 { | |
58 return CONTROL_UNKNOWN; | |
59 } | |
60 | |
61 /* open & setup audio device */ | |
62 static int | |
63 init (int rate, int channels, int format, int flags) | |
64 { | |
65 extern int ivtv_fd; | |
66 | |
67 if (ivtv_fd < 0) | |
68 return 0; | |
69 | |
70 if (format != AF_FORMAT_MPEG2) | |
71 { | |
72 mp_msg (MSGT_AO, MSGL_FATAL, | |
73 "AO: [ivtv] can only handle MPEG audio streams.\n"); | |
74 return 0; | |
75 } | |
76 | |
77 ao_data.outburst = 2048; | |
78 ao_data.samplerate = rate; | |
79 ao_data.channels = channels; | |
80 ao_data.format = AF_FORMAT_MPEG2; | |
81 ao_data.buffersize = 2048; | |
82 ao_data.bps = rate * 2 * 2; | |
83 ao_data.pts = 0; | |
84 freq = rate; | |
85 | |
86 /* check for supported audio rate */ | |
87 if (rate != 32000 || rate != 41000 || rate != 48000) | |
88 { | |
89 mp_msg (MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_UnsupSamplerate, rate); | |
90 rate = 48000; | |
91 } | |
92 | |
93 return 1; | |
94 } | |
95 | |
96 /* close audio device */ | |
97 static void | |
98 uninit (int immed) | |
99 { | |
100 /* nothing to do */ | |
101 } | |
102 | |
103 /* stop playing and empty buffers (for seeking/pause) */ | |
104 static void | |
105 reset (void) | |
106 { | |
107 /* nothing to do */ | |
108 } | |
109 | |
110 /* stop playing, keep buffers (for pause) */ | |
111 static void | |
112 audio_pause (void) | |
113 { | |
114 reset (); | |
115 } | |
116 | |
117 /* resume playing, after audio_pause() */ | |
118 static void | |
119 audio_resume (void) | |
120 { | |
121 /* nothing to do */ | |
122 } | |
123 | |
124 /* how many bytes can be played without blocking */ | |
125 static int | |
126 get_space (void) | |
127 { | |
128 extern int vo_pts; | |
129 float x; | |
130 int y; | |
131 | |
132 x = (float) (vo_pts - ao_data.pts) / 90000.0; | |
133 if (x <= 0) | |
134 return 0; | |
135 | |
136 y = freq * 4 * x; | |
137 y /= ao_data.outburst; | |
138 y *= ao_data.outburst; | |
139 | |
140 if (y > 32000) | |
141 y = 32000; | |
142 | |
143 return y; | |
144 } | |
145 | |
146 /* number of bytes played */ | |
147 static int | |
148 play (void *data, int len, int flags) | |
149 { | |
150 extern int ivtv_write (unsigned char *data, int len); | |
151 | |
152 if (ao_data.format != AF_FORMAT_MPEG2) | |
153 return 0; | |
154 | |
155 send_mpeg_pes_packet (data, len, MPEG_AUDIO_ID, ao_data.pts, 2, ivtv_write); | |
156 | |
157 return len; | |
158 } | |
159 | |
160 /* delay in seconds between first and last sample in buffer */ | |
161 static float | |
162 get_delay (void) | |
163 { | |
164 return 0.0; | |
165 } |