annotate stream/tvi_dshow.c @ 31254:e888e262e3f0

Remove colorspace conversion code from -vo yuv4mpeg, -vf scale should be able to handle this just as well (or better) including interlaced. If not, this needs to be fixed there instead of duplicating code.
author reimar
date Sat, 05 Jun 2010 06:45:01 +0000
parents 9fc9d1e788aa
children 016194f71de3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1 /*
26737
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
2 * TV support under Win32
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3 *
26737
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
4 * (C) 2007 Vladimir Voroshilov <voroshil@gmail.com>
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
5 *
26737
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
6 * Based on tvi_dummy.c with help of tv.c, tvi_v4l2.c code.
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
7 *
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
8 * This file is part of MPlayer.
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
9 *
26737
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
10 * MPlayer is free software; you can redistribute it and/or modify
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
11 * it under the terms of the GNU General Public License as published by
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
13 * (at your option) any later version.
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
14 *
26737
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
15 * MPlayer is distributed in the hope that it will be useful,
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
18 * GNU General Public License for more details.
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
19 *
26737
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
20 * You should have received a copy of the GNU General Public License along
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
21 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
23 */
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
24
a26e50cae389 Use standard license headers with standard formatting.
diego
parents: 25689
diff changeset
25 /*
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
26 * WARNING: This is alpha code!
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
27 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
28 * Abilities:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
29 * * Watching TV under Win32 using WDM Capture driver and DirectShow
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
30 * * Grabbing synchronized audio/video with mencoder (synchronization is beeing done by DirectShow)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
31 * * If device driver provides IAMStreamConfig interface, user can choose width/height with "-tv height=<h>:width=<w>"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
32 * * Adjusting BRIGHTNESS,HUE,SATURATION,CONTRAST if supported by device
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
33 * * Selecting Tuner,S-Video,... as media source
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
34 * * User can select used video capture device, passing -tv device=<dev#>
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
35 * * User can select used audio input, passing -tv audioid=<input#>
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
36 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
37 * options which will not be implemented (probably sometime in future, if possible):
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
38 * * alsa
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
39 * * mjpeg
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
40 * * decimation=<1|2|4>
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
41 * * quality=<0\-100>
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
42 * * forceaudio
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
43 * * forcechan=<1\-2>
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
44 * * [volume|bass|treble|balance]
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
45 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
46 * Works with:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
47 * - LifeView FlyTV Prime 34FM (SAA7134 based) with driver from Ivan Uskov
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
48 * Partially works with:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
49 * - ATI 9200 VIVO based card
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
50 * - ATI AIW 7500
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
51 * - nVidia Ti-4400
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
52 *
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
53 * Known bugs:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
54 * * stream goes with 24.93 FPS (NTSC), while reporting 25 FPS (PAL) ?!
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
55 * * direct set frequency call does not work ('Insufficient Buffer' error)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
56 * * audio stream goes with about 1 sample/sec rate when capturing sound from audio card
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
57 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
58 * TODO:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
59 * * check audio with small buffer on vivo !!!
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
60 * * norm for IAMVideoDecoder and for IAMTVtuner - differs !!
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
61 * * check how to change TVFormat on VIVO card without tuner
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
62 * * Flip image upside-down for RGB formats.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
63 * *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
64 * * remove debug sleep()
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
65 * * Add some notes to methods' parameters
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
66 * * refactor console messages
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
67 * * check using header files and keep only needed
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
68 * * add additional comments to methods' bodies
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
69 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
70 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
71
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
72
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
73 /// \ingroup tvi_dshow
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
74
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
75 #include "config.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
76
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
77 #include <stdio.h>
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
78 #include "libmpcodecs/img_format.h"
29759
d287e2785570 Move teletext specific code from stream into libmpcodecs.
cehoyos
parents: 29263
diff changeset
79 #include "libmpcodecs/dec_teletext.h"
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
80 #include "libaf/af_format.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
81 #include "help_mp.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
82 #include "osdep/timer.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
83
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
84
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
85 #include "tv.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
86 #include "mp_msg.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
87 #include "frequencies.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
88
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
89
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
90 #include "tvi_dshow.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
91
30127
774aa6f7399e Several hacks to fix compilation of tvi_dshow on MinGW64.
reimar
parents: 29809
diff changeset
92 #ifndef STDCALL
774aa6f7399e Several hacks to fix compilation of tvi_dshow on MinGW64.
reimar
parents: 29809
diff changeset
93 // mingw64 needs this
774aa6f7399e Several hacks to fix compilation of tvi_dshow on MinGW64.
reimar
parents: 29809
diff changeset
94 #define STDCALL __stdcall
774aa6f7399e Several hacks to fix compilation of tvi_dshow on MinGW64.
reimar
parents: 29809
diff changeset
95 #endif
774aa6f7399e Several hacks to fix compilation of tvi_dshow on MinGW64.
reimar
parents: 29809
diff changeset
96
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
97 static tvi_handle_t *tvi_init_dshow(tv_param_t* tv_param);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
98
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
99 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
100 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
101 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
102 * Data structures
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
103 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
104 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
105 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
106 /**
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
107 information about this file
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
108 */
25689
7d5823bd4517 Make all tvi_info_t const
reimar
parents: 25127
diff changeset
109 const tvi_info_t tvi_info_dshow = {
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
110 tvi_init_dshow,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
111 "DirectShow TV",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
112 "dshow",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
113 "Vladimir Voroshilov",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
114 "Very experimental!! Use with caution"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
115 };
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
116
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
117
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
118 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
119 ringbuffer related info
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
120 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
121 typedef struct {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
122 CRITICAL_SECTION *pMutex; ///< pointer to critical section (mutex)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
123 char **ringbuffer; ///< ringbuffer array
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
124 double*dpts; ///< samples' timestamps
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
125
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
126 int buffersize; ///< size of buffer in blocks
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
127 int blocksize; ///< size of individual block
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
128 int head; ///< index of first valid sample
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
129 int tail; ///< index of last valid sample
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
130 int count; ///< count of valid samples in ringbuffer
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
131 double tStart; ///< pts of first sample (first sample should have pts 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
132 } grabber_ringbuffer_t;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
133
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
134 typedef enum { unknown, video, audio, vbi } stream_type;
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
135
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
136 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
137 CSampleGrabberCD definition
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
138 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
139 typedef struct CSampleGrabberCB {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
140 ISampleGrabberCBVtbl *lpVtbl;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
141 int refcount;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
142 GUID interfaces[2];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
143 grabber_ringbuffer_t *pbuf;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
144 } CSampleGrabberCB;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
145
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
146 /**
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
147 Chain related structure
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
148 */
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
149 typedef struct {
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
150 stream_type type; ///< stream type
25080
bfebab93b11e Add major media type to chain structure
voroshil
parents: 25079
diff changeset
151 const GUID* majortype; ///< GUID of major mediatype (video/audio/vbi)
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
152 const GUID* pin_category; ///< pin category (pointer to one of PIN_CATEGORY_*)
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
153
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
154 IBaseFilter *pCaptureFilter; ///< capture device filter
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
155 IAMStreamConfig *pStreamConfig; ///< for configuring stream
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
156 ISampleGrabber *pSG; ///< ISampleGrabber interface of SampleGrabber filter
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
157 IBaseFilter *pSGF; ///< IBaseFilter interface of SampleGrabber filter
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
158 IPin *pCapturePin; ///< output capture pin
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
159 IPin *pSGIn; ///< input pin of SampleGrabber filter
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
160
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
161 grabber_ringbuffer_t *rbuf; ///< sample frabber data
25086
e91503fbf524 Move pointer to SampleGrabber filter into chain structure.
voroshil
parents: 25085
diff changeset
162 CSampleGrabberCB* pCSGCB; ///< callback object
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
163
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
164 AM_MEDIA_TYPE *pmt; ///< stream properties.
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
165 int nFormatUsed; ///< index of used format
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
166 AM_MEDIA_TYPE **arpmt; ///< available formats
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
167 void** arStreamCaps; ///< VIDEO_STREAM_CONFIG_CAPS or AUDIO_STREAM_CONFIG_CAPS
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
168 } chain_t;
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
169
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
170 typedef struct {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
171 int dev_index; ///< capture device index in device list (defaul: 0, first available device)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
172 int adev_index; ///< audio capture device index in device list (default: -1, not used)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
173 int immediate_mode; ///< immediate mode (no sound capture)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
174 int state; ///< state: 1-filter graph running, 0-filter graph stopped
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
175 int direct_setfreq_call; ///< 0-find nearest channels from system channel list(workaround),1-direct call to set frequency
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
176 int direct_getfreq_call; ///< 0-find frequncy from frequency table (workaround),1-direct call to get frequency
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
177
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
178 int fcc; ///< used video format code (FourCC)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
179 int width; ///< picture width (default: auto)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
180 int height; ///< picture height (default: auto)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
181
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
182 int channels; ///< number of audio channels (default: auto)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
183 int samplerate; ///< audio samplerate (default: auto)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
184
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
185 long *freq_table; ///< frequency table (in Hz)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
186 int freq_table_len; ///< length of freq table
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
187 int first_channel; ///< channel number of first entry in freq table
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
188 int input; ///< used input
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
189
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
190 chain_t* chains[3]; ///< chains' data (0-video, 1-audio, 2-vbi)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
191
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
192 IAMTVTuner *pTVTuner; ///< interface for tuner device
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
193 IGraphBuilder *pGraph; ///< filter graph
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
194 ICaptureGraphBuilder2 *pBuilder; ///< graph builder
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
195 IMediaControl *pMediaControl; ///< interface for controlling graph (start, stop,...)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
196 IAMVideoProcAmp *pVideoProcAmp; ///< for adjusting hue,saturation,etc
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
197 IAMCrossbar *pCrossbar; ///< for selecting input (Tuner,Composite,S-Video,...)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
198 DWORD dwRegister; ///< allow graphedit to connect to our graph
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
199 void *priv_vbi; ///< private VBI data structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
200 tt_stream_props tsp; ///< data for VBI initialization
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
201
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
202 tv_param_t* tv_param; ///< TV parameters
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
203 } priv_t;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
204
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
205 #include "tvi_def.h"
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
206
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
207 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
208 country table entry structure (for loading freq table stored in kstvtuner.ax
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
209
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
210 \note
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
211 structure have to be 2-byte aligned and have 10-byte length!!
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
212 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
213 typedef struct __attribute__((__packed__)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
214 WORD CountryCode; ///< Country code
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
215 WORD CableFreqTable; ///< index of resource with frequencies for cable channels
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
216 WORD BroadcastFreqTable; ///< index of resource with frequencies for broadcast channels
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
217 DWORD VideoStandard; ///< used video standard
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
218 } TRCCountryList;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
219 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
220 information about image formats
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
221 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
222 typedef struct {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
223 uint32_t fmt; ///< FourCC
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
224 const GUID *subtype; ///< DirectShow's subtype
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
225 int nBits; ///< number of bits
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
226 int nCompression; ///< complression
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
227 int tail; ///< number of additional bytes followed VIDEOINFOHEADER structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
228 } img_fmt;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
229
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
230 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
231 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
232 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
233 * Methods forward declaration
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
234 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
235 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
236 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
237 static HRESULT init_ringbuffer(grabber_ringbuffer_t * rb, int buffersize,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
238 int blocksize);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
239 static HRESULT show_filter_info(IBaseFilter * pFilter);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
240 #if 0
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
241 //defined in current MinGW release
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
242 HRESULT STDCALL GetRunningObjectTable(DWORD, IRunningObjectTable **);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
243 HRESULT STDCALL CreateItemMoniker(LPCOLESTR, LPCOLESTR, IMoniker **);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
244 #endif
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
245 static CSampleGrabberCB *CSampleGrabberCB_Create(grabber_ringbuffer_t *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
246 pbuf);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
247 static int set_crossbar_input(priv_t * priv, int input);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
248 static int subtype2imgfmt(const GUID * subtype);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
249
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
250 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
251 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
252 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
253 * Global constants and variables
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
254 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
255 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
256 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
257 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
258 lookup tables for physical connector types
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
259 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
260 static const struct {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
261 long type;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
262 char *name;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
263 } tv_physcon_types[]={
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
264 {PhysConn_Video_Tuner, "Tuner" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
265 {PhysConn_Video_Composite, "Composite" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
266 {PhysConn_Video_SVideo, "S-Video" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
267 {PhysConn_Video_RGB, "RGB" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
268 {PhysConn_Video_YRYBY, "YRYBY" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
269 {PhysConn_Video_SerialDigital, "SerialDigital" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
270 {PhysConn_Video_ParallelDigital, "ParallelDigital"},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
271 {PhysConn_Video_VideoDecoder, "VideoDecoder" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
272 {PhysConn_Video_VideoEncoder, "VideoEncoder" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
273 {PhysConn_Video_SCART, "SCART" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
274 {PhysConn_Video_Black, "Blaack" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
275 {PhysConn_Audio_Tuner, "Tuner" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
276 {PhysConn_Audio_Line, "Line" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
277 {PhysConn_Audio_Mic, "Mic" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
278 {PhysConn_Audio_AESDigital, "AESDiital" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
279 {PhysConn_Audio_SPDIFDigital, "SPDIFDigital" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
280 {PhysConn_Audio_AudioDecoder, "AudioDecoder" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
281 {PhysConn_Audio_SCSI, "SCSI" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
282 {PhysConn_Video_SCSI, "SCSI" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
283 {PhysConn_Audio_AUX, "AUX" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
284 {PhysConn_Video_AUX, "AUX" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
285 {PhysConn_Audio_1394, "1394" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
286 {PhysConn_Video_1394, "1394" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
287 {PhysConn_Audio_USB, "USB" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
288 {PhysConn_Video_USB, "USB" },
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
289 {-1, NULL }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
290 };
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
291
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
292 static const struct {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
293 char *chanlist_name;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
294 int country_code;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
295 } tv_chanlist2country[]={
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
296 {"us-bcast", 1},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
297 {"russia", 7},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
298 {"argentina", 54},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
299 {"japan-bcast", 81},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
300 {"china-bcast", 86},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
301 {"southafrica", 27},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
302 {"australia", 61},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
303 {"ireland", 353},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
304 {"france", 33},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
305 {"italy", 39},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
306 {"newzealand", 64},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
307 //directshow table uses eastern europe freq table for russia
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
308 {"europe-east", 7},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
309 //directshow table uses western europe freq table for germany
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
310 {"europe-west", 49},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
311 /* cable channels */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
312 {"us-cable", 1},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
313 {"us-cable-hrc", 1},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
314 {"japan-cable", 81},
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
315 //default is USA
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
316 {NULL, 1}
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
317 };
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
318
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
319 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
320 array, contains information about various supported (i hope) image formats
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
321 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
322 static const img_fmt img_fmt_list[] = {
25054
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
323 {IMGFMT_YUY2, &MEDIASUBTYPE_YUY2, 16, IMGFMT_YUY2, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
324 {IMGFMT_YV12, &MEDIASUBTYPE_YV12, 12, IMGFMT_YV12, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
325 {IMGFMT_IYUV, &MEDIASUBTYPE_IYUV, 12, IMGFMT_IYUV, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
326 {IMGFMT_I420, &MEDIASUBTYPE_I420, 12, IMGFMT_I420, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
327 {IMGFMT_UYVY, &MEDIASUBTYPE_UYVY, 16, IMGFMT_UYVY, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
328 {IMGFMT_YVYU, &MEDIASUBTYPE_YVYU, 16, IMGFMT_YVYU, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
329 {IMGFMT_YVU9, &MEDIASUBTYPE_YVU9, 9, IMGFMT_YVU9, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
330 {IMGFMT_BGR32, &MEDIASUBTYPE_RGB32, 32, 0, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
331 {IMGFMT_BGR24, &MEDIASUBTYPE_RGB24, 24, 0, 0},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
332 {IMGFMT_BGR16, &MEDIASUBTYPE_RGB565, 16, 3, 12},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
333 {IMGFMT_BGR15, &MEDIASUBTYPE_RGB555, 16, 3, 12},
8abe2ef6bee9 (cosmetics) Lookup table alignment.
voroshil
parents: 25053
diff changeset
334 {0, &GUID_NULL, 0, 0, 0}
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
335 };
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
336
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
337 #define TV_NORMS_COUNT 19
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
338 static const struct {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
339 long index;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
340 char *name;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
341 } tv_norms[TV_NORMS_COUNT] = {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
342 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
343 AnalogVideo_NTSC_M, "ntsc-m"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
344 AnalogVideo_NTSC_M_J, "ntsc-mj"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
345 AnalogVideo_NTSC_433, "ntsc-433"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
346 AnalogVideo_PAL_B, "pal-b"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
347 AnalogVideo_PAL_D, "pal-d"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
348 AnalogVideo_PAL_G, "pal-g"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
349 AnalogVideo_PAL_H, "pal-h"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
350 AnalogVideo_PAL_I, "pal-i"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
351 AnalogVideo_PAL_M, "pal-m"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
352 AnalogVideo_PAL_N, "pal-n"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
353 AnalogVideo_PAL_60, "pal-60"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
354 AnalogVideo_SECAM_B, "secam-b"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
355 AnalogVideo_SECAM_D, "secam-d"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
356 AnalogVideo_SECAM_G, "secam-g"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
357 AnalogVideo_SECAM_H, "secam-h"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
358 AnalogVideo_SECAM_K, "secam-k"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
359 AnalogVideo_SECAM_K1, "secam-k1"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
360 AnalogVideo_SECAM_L, "secam-l"}, {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
361 AnalogVideo_SECAM_L1, "secam-l1"}
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
362 };
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
363 static long tv_available_norms[TV_NORMS_COUNT];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
364 static int tv_available_norms_count = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
365
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
366
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
367 static long *tv_available_inputs;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
368 static int tv_available_inputs_count = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
369
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
370 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
371 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
372 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
373 * Various GUID definitions
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
374 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
375 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
376 */
30305
fd0de0336717 Add hack to fix tvi_dshow compilation with 64-bit MinGW
reimar
parents: 30300
diff changeset
377 // selectany can not be used with "static", fixes compilation with mingw-w64
fd0de0336717 Add hack to fix tvi_dshow compilation with 64-bit MinGW
reimar
parents: 30300
diff changeset
378 #undef DECLSPEC_SELECTANY
fd0de0336717 Add hack to fix tvi_dshow compilation with 64-bit MinGW
reimar
parents: 30300
diff changeset
379 #define DECLSPEC_SELECTANY
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
380 /// CLSID definitions (used for CoCreateInstance call)
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
381 #define CLSID_SampleGrabber MP_CLSID_SampleGrabber
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
382 static DEFINE_GUID(CLSID_SampleGrabber, 0xC1F400A0, 0x3F08, 0x11d3, 0x9F, 0x0B,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
383 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
384 #define CLSID_NullRenderer MP_CLSID_NullRenderer
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
385 static DEFINE_GUID(CLSID_NullRenderer, 0xC1F400A4, 0x3F08, 0x11d3, 0x9F, 0x0B,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
386 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
387 #define CLSID_SystemDeviceEnum MP_CLSID_SystemDeviceEnum
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
388 static DEFINE_GUID(CLSID_SystemDeviceEnum, 0x62BE5D10, 0x60EB, 0x11d0, 0xBD, 0x3B,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
389 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
390 #define CLSID_CaptureGraphBuilder2 MP_CLSID_CaptureGraphBuilder2
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
391 static DEFINE_GUID(CLSID_CaptureGraphBuilder2, 0xBF87B6E1, 0x8C27, 0x11d0, 0xB3,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
392 0xF0, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
393 #define CLSID_VideoInputDeviceCategory MP_CLSID_VideoInputDeviceCategory
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
394 static DEFINE_GUID(CLSID_VideoInputDeviceCategory, 0x860BB310, 0x5D01, 0x11d0,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
395 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
396 #define CLSID_AudioInputDeviceCategory MP_CLSID_AudioInputDeviceCategory
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
397 static DEFINE_GUID(CLSID_AudioInputDeviceCategory, 0x33d9a762, 0x90c8, 0x11d0,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
398 0xbd, 0x43, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
399 #define CLSID_FilterGraph MP_CLSID_FilterGraph
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
400 static DEFINE_GUID(CLSID_FilterGraph, 0xe436ebb3, 0x524f, 0x11ce, 0x9f, 0x53,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
401 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
402 #define CLSID_SystemClock MP_CLSID_SystemClock
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
403 static DEFINE_GUID(CLSID_SystemClock, 0xe436ebb1, 0x524f, 0x11ce, 0x9f, 0x53,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
404 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
405 #ifdef NOT_USED
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
406 #define CLSID_CaptureGraphBuilder MP_CLSID_CaptureGraphBuilder
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
407 static DEFINE_GUID(CLSID_CaptureGraphBuilder, 0xBF87B6E0, 0x8C27, 0x11d0, 0xB3,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
408 0xF0, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
409 #define CLSID_VideoPortManager MP_CLSID_VideoPortManager
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
410 static DEFINE_GUID(CLSID_VideoPortManager, 0x6f26a6cd, 0x967b, 0x47fd, 0x87, 0x4a,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
411 0x7a, 0xed, 0x2c, 0x9d, 0x25, 0xa2);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
412 #define IID_IPin MP_IID_IPin
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
413 static DEFINE_GUID(IID_IPin, 0x56a86891, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
414 0xaf, 0x0b, 0xa7, 0x70);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
415 #define IID_ICaptureGraphBuilder MP_IID_ICaptureGraphBuilder
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
416 static DEFINE_GUID(IID_ICaptureGraphBuilder, 0xbf87b6e0, 0x8c27, 0x11d0, 0xb3,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
417 0xf0, 0x00, 0xaa, 0x00, 0x37, 0x61, 0xc5);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
418 #define IID_IFilterGraph MP_IID_IFilterGraph
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
419 static DEFINE_GUID(IID_IFilterGraph, 0x56a8689f, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
420 0x20, 0xaf, 0x0b, 0xa7, 0x70);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
421 #define PIN_CATEGORY_PREVIEW MP_PIN_CATEGORY_PREVIEW
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
422 static DEFINE_GUID(PIN_CATEGORY_PREVIEW, 0xfb6c4282, 0x0353, 0x11d1, 0x90, 0x5f,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
423 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
424 #endif
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
425
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
426 /// IID definitions (used for QueryInterface call)
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
427 #define IID_IReferenceClock MP_IID_IReferenceClock
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
428 static DEFINE_GUID(IID_IReferenceClock, 0x56a86897, 0x0ad4, 0x11ce, 0xb0, 0x3a,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
429 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
430 #define IID_IAMBufferNegotiation MP_IID_IAMBufferNegotiation
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
431 static DEFINE_GUID(IID_IAMBufferNegotiation, 0x56ED71A0, 0xAF5F, 0x11D0, 0xB3, 0xF0,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
432 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
433 #define IID_IKsPropertySet MP_IID_IKsPropertySet
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
434 static DEFINE_GUID(IID_IKsPropertySet, 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
435 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
436 #define IID_ISampleGrabber MP_IID_ISampleGrabber
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
437 static DEFINE_GUID(IID_ISampleGrabber, 0x6B652FFF, 0x11FE, 0x4fce, 0x92, 0xAD,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
438 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
439 #define IID_ISampleGrabberCB MP_IID_ISampleGrabberCB
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
440 static DEFINE_GUID(IID_ISampleGrabberCB, 0x0579154A, 0x2B53, 0x4994, 0xB0, 0xD0,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
441 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
442 #define IID_ICaptureGraphBuilder2 MP_IID_ICaptureGraphBuilder2
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
443 static DEFINE_GUID(IID_ICaptureGraphBuilder2, 0x93e5a4e0, 0x2d50, 0x11d2, 0xab,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
444 0xfa, 0x00, 0xa0, 0xc9, 0xc6, 0xe3, 0x8d);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
445 #define IID_ICreateDevEnum MP_IID_ICreateDevEnum
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
446 static DEFINE_GUID(IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, 0xbd, 0x3b,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
447 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
448 #define IID_IGraphBuilder MP_IID_IGraphBuilder
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
449 static DEFINE_GUID(IID_IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, 0xb0, 0x3a,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
450 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
451 #define IID_IAMVideoProcAmp MP_IID_IAMVideoProcAmp
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
452 static DEFINE_GUID(IID_IAMVideoProcAmp, 0xC6E13360, 0x30AC, 0x11d0, 0xA1, 0x8C,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
453 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
454 #define IID_IVideoWindow MP_IID_IVideoWindow
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
455 static DEFINE_GUID(IID_IVideoWindow, 0x56a868b4, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
456 0x20, 0xaf, 0x0b, 0xa7, 0x70);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
457 #define IID_IMediaControl MP_IID_IMediaControl
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
458 static DEFINE_GUID(IID_IMediaControl, 0x56a868b1, 0x0ad4, 0x11ce, 0xb0, 0x3a,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
459 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
460 #define IID_IAMTVTuner MP_IID_IAMTVTuner
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
461 static DEFINE_GUID(IID_IAMTVTuner, 0x211A8766, 0x03AC, 0x11d1, 0x8D, 0x13, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
462 0xAA, 0x00, 0xBD, 0x83, 0x39);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
463 #define IID_IAMCrossbar MP_IID_IAMCrossbar
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
464 static DEFINE_GUID(IID_IAMCrossbar, 0xc6e13380, 0x30ac, 0x11d0, 0xa1, 0x8c, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
465 0xa0, 0xc9, 0x11, 0x89, 0x56);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
466 #define IID_IAMStreamConfig MP_IID_IAMStreamConfig
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
467 static DEFINE_GUID(IID_IAMStreamConfig, 0xc6e13340, 0x30ac, 0x11d0, 0xa1, 0x8c,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
468 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
469 #define IID_IAMAudioInputMixer MP_IID_IAMAudioInputMixer
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
470 static DEFINE_GUID(IID_IAMAudioInputMixer, 0x54C39221, 0x8380, 0x11d0, 0xB3, 0xF0,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
471 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
472 #define IID_IAMTVAudio MP_IID_IAMTVAudio
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
473 static DEFINE_GUID(IID_IAMTVAudio, 0x83EC1C30, 0x23D1, 0x11d1, 0x99, 0xE6, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
474 0xA0, 0xC9, 0x56, 0x02, 0x66);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
475 #define IID_IAMAnalogVideoDecoder MP_IID_IAMAnalogVideoDecoder
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
476 static DEFINE_GUID(IID_IAMAnalogVideoDecoder, 0xC6E13350, 0x30AC, 0x11d0, 0xA1,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
477 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
478 #define IID_IPropertyBag MP_IID_IPropertyBag
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
479 static DEFINE_GUID(IID_IPropertyBag, 0x55272a00, 0x42cb, 0x11ce, 0x81, 0x35, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
480 0xaa, 0x00, 0x4b, 0xb8, 0x51);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
481 #define PIN_CATEGORY_CAPTURE MP_PIN_CATEGORY_CAPTURE
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
482 static DEFINE_GUID(PIN_CATEGORY_CAPTURE, 0xfb6c4281, 0x0353, 0x11d1, 0x90, 0x5f,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
483 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
484 #define PIN_CATEGORY_VIDEOPORT MP_PIN_CATEGORY_VIDEOPORT
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
485 static DEFINE_GUID(PIN_CATEGORY_VIDEOPORT, 0xfb6c4285, 0x0353, 0x11d1, 0x90, 0x5f,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
486 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
487 #define PIN_CATEGORY_PREVIEW MP_PIN_CATEGORY_PREVIEW
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
488 static DEFINE_GUID(PIN_CATEGORY_PREVIEW, 0xfb6c4282, 0x0353, 0x11d1, 0x90, 0x5f,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
489 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
490 #define PIN_CATEGORY_VBI MP_PIN_CATEGORY_VBI
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
491 static DEFINE_GUID(PIN_CATEGORY_VBI, 0xfb6c4284, 0x0353, 0x11d1, 0x90, 0x5f,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
492 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
493 #define PROPSETID_TUNER MP_PROPSETID_TUNER
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
494 static DEFINE_GUID(PROPSETID_TUNER, 0x6a2e0605, 0x28e4, 0x11d0, 0xa1, 0x8c, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
495 0xa0, 0xc9, 0x11, 0x89, 0x56);
30300
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
496 #define MEDIATYPE_VBI MP_MEDIATYPE_VBI
191571148d95 Change GUID declarations in tvi_dshow so they are not exported and thus
reimar
parents: 30127
diff changeset
497 static DEFINE_GUID(MEDIATYPE_VBI, 0xf72a76e1, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
498 0x00, 0xc0, 0xcc, 0x16, 0xba);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
499
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
500 #define INSTANCEDATA_OF_PROPERTY_PTR(x) (((KSPROPERTY*)(x)) + 1)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
501 #define INSTANCEDATA_OF_PROPERTY_SIZE(x) (sizeof((x)) - sizeof(KSPROPERTY))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
502
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
503 #define DEVICE_NAME_MAX_LEN 2000
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
504
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
505 /*---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
506 * Methods, called only from this file
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
507 *---------------------------------------------------------------------------------------*/
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
508
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
509 void set_buffer_preference(int nDiv,WAVEFORMATEX* pWF,IPin* pOutPin,IPin* pInPin){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
510 ALLOCATOR_PROPERTIES prop;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
511 IAMBufferNegotiation* pBN;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
512 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
513
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
514 prop.cbAlign = -1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
515 prop.cbBuffer = pWF->nAvgBytesPerSec/nDiv;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
516 if (!prop.cbBuffer)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
517 prop.cbBuffer = 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
518 prop.cbBuffer += pWF->nBlockAlign - 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
519 prop.cbBuffer -= prop.cbBuffer % pWF->nBlockAlign;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
520 prop.cbPrefix = -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
521 prop.cBuffers = -1;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
522
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
523 hr=OLE_QUERYINTERFACE(pOutPin,IID_IAMBufferNegotiation,pBN);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
524 if(FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
525 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: pOutPin->QueryInterface(IID_IAMBufferNegotiation) Error: 0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
526 else{
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
527 hr=OLE_CALL_ARGS(pBN,SuggestAllocatorProperties,&prop);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
528 if(FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
529 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow:pOutPin->SuggestAllocatorProperties Error:0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
530 OLE_RELEASE_SAFE(pBN);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
531 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
532 hr=OLE_QUERYINTERFACE(pInPin,IID_IAMBufferNegotiation,pBN);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
533 if(FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
534 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: pInPin->QueryInterface(IID_IAMBufferNegotiation) Error: 0x%x",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
535 else{
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
536 hr=OLE_CALL_ARGS(pBN,SuggestAllocatorProperties,&prop);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
537 if(FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
538 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: pInPit->SuggestAllocatorProperties Error:0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
539 OLE_RELEASE_SAFE(pBN);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
540 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
541 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
542 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
543 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
544 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
545 * CSampleGrabberCD class. Used for receiving samples from DirectShow.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
546 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
547 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
548 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
549 /// CSampleGrabberCD destructor
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
550 static void CSampleGrabberCB_Destroy(CSampleGrabberCB * This)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
551 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
552 free(This->lpVtbl);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
553 free(This);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
554 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
555
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
556 /// CSampleGrabberCD IUnknown interface methods implementation
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
557 static long STDCALL CSampleGrabberCB_QueryInterface(ISampleGrabberCB *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
558 This,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
559 const GUID * riid,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
560 void **ppvObject)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
561 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
562 CSampleGrabberCB *me = (CSampleGrabberCB *) This;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
563 GUID *r;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
564 unsigned int i = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
565 Debug printf("CSampleGrabberCB_QueryInterface(%p) called\n", This);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
566 if (!ppvObject)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
567 return E_POINTER;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
568 for (r = me->interfaces;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
569 i < sizeof(me->interfaces) / sizeof(me->interfaces[0]); r++, i++)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
570 if (!memcmp(r, riid, sizeof(*r))) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
571 OLE_CALL(This, AddRef);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
572 *ppvObject = This;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
573 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
574 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
575 Debug printf("Query failed! (GUID: 0x%x)\n", *(unsigned int *) riid);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
576 return E_NOINTERFACE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
577 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
578
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
579 static long STDCALL CSampleGrabberCB_AddRef(ISampleGrabberCB * This)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
580 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
581 CSampleGrabberCB *me = (CSampleGrabberCB *) This;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
582 Debug printf("CSampleGrabberCB_AddRef(%p) called (ref:%d)\n", This,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
583 me->refcount);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
584 return ++(me->refcount);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
585 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
586
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
587 static long STDCALL CSampleGrabberCB_Release(ISampleGrabberCB * This)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
588 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
589 CSampleGrabberCB *me = (CSampleGrabberCB *) This;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
590 Debug printf("CSampleGrabberCB_Release(%p) called (new ref:%d)\n",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
591 This, me->refcount - 1);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
592 if (--(me->refcount) == 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
593 CSampleGrabberCB_Destroy(me);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
594 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
595 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
596
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
597
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
598 HRESULT STDCALL CSampleGrabberCB_BufferCB(ISampleGrabberCB * This,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
599 double SampleTime,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
600 BYTE * pBuffer, long lBufferLen)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
601 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
602 CSampleGrabberCB *this = (CSampleGrabberCB *) This;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
603 grabber_ringbuffer_t *rb = this->pbuf;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
604
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
605 if (!lBufferLen)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
606 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
607
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
608 if (!rb->ringbuffer) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
609 rb->buffersize /= lBufferLen;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
610 if (init_ringbuffer(rb, rb->buffersize, lBufferLen) != S_OK)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
611 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
612 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
613 mp_msg(MSGT_TV, MSGL_DBG4,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
614 "tvi_dshow: BufferCB(%p): len=%ld ts=%f\n", This, lBufferLen, SampleTime);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
615 EnterCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
616 if (rb->count >= rb->buffersize) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
617 rb->head = (rb->head + 1) % rb->buffersize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
618 rb->count--;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
619 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
620
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
621 memcpy(rb->ringbuffer[rb->tail], pBuffer,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
622 lBufferLen < rb->blocksize ? lBufferLen : rb->blocksize);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
623 rb->dpts[rb->tail] = SampleTime;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
624 rb->tail = (rb->tail + 1) % rb->buffersize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
625 rb->count++;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
626 LeaveCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
627
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
628 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
629 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
630
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
631 /// wrapper. directshow does the same when BufferCB callback is requested
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
632 HRESULT STDCALL CSampleGrabberCB_SampleCB(ISampleGrabberCB * This,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
633 double SampleTime,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
634 LPMEDIASAMPLE pSample)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
635 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
636 char* buf;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
637 long len;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
638 long long tStart,tEnd;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
639 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
640 grabber_ringbuffer_t *rb = ((CSampleGrabberCB*)This)->pbuf;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
641
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
642 len=OLE_CALL(pSample,GetSize);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
643 tStart=tEnd=0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
644 hr=OLE_CALL_ARGS(pSample,GetTime,&tStart,&tEnd);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
645 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
646 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
647 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
648 mp_msg(MSGT_TV, MSGL_DBG4,"tvi_dshow: SampleCB(%p): %d/%d %f\n", This,rb->count,rb->buffersize,1e-7*tStart);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
649 hr=OLE_CALL_ARGS(pSample,GetPointer,(void*)&buf);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
650 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
651 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
652 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
653 hr=CSampleGrabberCB_BufferCB(This,1e-7*tStart,buf,len);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
654 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
655
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
656 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
657
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
658 /// main grabbing routine
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
659 static CSampleGrabberCB *CSampleGrabberCB_Create(grabber_ringbuffer_t *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
660 pbuf)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
661 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
662 CSampleGrabberCB *This = malloc(sizeof(CSampleGrabberCB));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
663 if (!This)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
664 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
665
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
666 This->lpVtbl = malloc(sizeof(ISampleGrabberVtbl));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
667 if (!This->lpVtbl) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
668 CSampleGrabberCB_Destroy(This);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
669 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
670 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
671 This->refcount = 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
672 This->lpVtbl->QueryInterface = CSampleGrabberCB_QueryInterface;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
673 This->lpVtbl->AddRef = CSampleGrabberCB_AddRef;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
674 This->lpVtbl->Release = CSampleGrabberCB_Release;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
675 This->lpVtbl->SampleCB = CSampleGrabberCB_SampleCB;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
676 This->lpVtbl->BufferCB = CSampleGrabberCB_BufferCB;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
677
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
678 This->interfaces[0] = IID_IUnknown;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
679 This->interfaces[1] = IID_ISampleGrabberCB;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
680
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
681 This->pbuf = pbuf;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
682
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
683 return This;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
684 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
685
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
686 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
687 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
688 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
689 * ROT related methods (register, unregister)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
690 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
691 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
692 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
693 /**
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
694 Registering graph in ROT. User will be able to connect to graph from GraphEdit.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
695 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
696 static HRESULT AddToRot(IUnknown * pUnkGraph, DWORD * pdwRegister)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
697 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
698 IMoniker *pMoniker;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
699 IRunningObjectTable *pROT;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
700 WCHAR wsz[256];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
701 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
702
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
703 if (FAILED(GetRunningObjectTable(0, &pROT))) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
704 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
705 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
706 wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR) pUnkGraph,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
707 GetCurrentProcessId());
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
708 hr = CreateItemMoniker(L"!", wsz, &pMoniker);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
709 if (SUCCEEDED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
710 hr = OLE_CALL_ARGS(pROT, Register, ROTFLAGS_REGISTRATIONKEEPSALIVE,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
711 pUnkGraph, pMoniker, pdwRegister);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
712 OLE_RELEASE_SAFE(pMoniker);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
713 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
714 OLE_RELEASE_SAFE(pROT);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
715 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
716 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
717
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
718 /// Unregistering graph in ROT
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
719 static void RemoveFromRot(DWORD dwRegister)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
720 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
721 IRunningObjectTable *pROT;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
722 if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
723 OLE_CALL_ARGS(pROT, Revoke, dwRegister);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
724 OLE_RELEASE_SAFE(pROT);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
725 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
726 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
727
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
728 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
729 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
730 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
731 * ringbuffer related methods (init, destroy)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
732 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
733 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
734 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
735 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
736 * \brief ringbuffer destroying routine
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
737 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
738 * \param rb pointer to empty (just allocated) ringbuffer structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
739 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
740 * \note routine does not frees memory, allocated for grabber_rinbuffer_s structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
741 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
742 static void destroy_ringbuffer(grabber_ringbuffer_t * rb)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
743 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
744 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
745
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
746 if (!rb)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
747 return;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
748
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
749 if (rb->ringbuffer) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
750 for (i = 0; i < rb->buffersize; i++)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
751 if (rb->ringbuffer[i])
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
752 free(rb->ringbuffer[i]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
753 free(rb->ringbuffer);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
754 rb->ringbuffer = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
755 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
756 if (rb->dpts) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
757 free(rb->dpts);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
758 rb->dpts = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
759 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
760 if (rb->pMutex) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
761 DeleteCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
762 free(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
763 rb->pMutex = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
764 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
765
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
766 rb->blocksize = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
767 rb->buffersize = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
768 rb->head = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
769 rb->tail = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
770 rb->count = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
771 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
772
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
773 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
774 * \brief ringbuffer initialization
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
775 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
776 * \param rb pointer to empty (just allocated) ringbuffer structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
777 * \param buffersize size of buffer in blocks
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
778 * \param blocksize size of buffer's block
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
779 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
780 * \return S_OK if success
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
781 * \return E_OUTOFMEMORY not enough memory
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
782 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
783 * \note routine does not allocates memory for grabber_rinbuffer_s structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
784 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
785 static HRESULT init_ringbuffer(grabber_ringbuffer_t * rb, int buffersize,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
786 int blocksize)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
787 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
788 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
789
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
790 if (!rb)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
791 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
792
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
793 rb->buffersize = buffersize < 2 ? 2 : buffersize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
794 rb->blocksize = blocksize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
795
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
796 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Capture buffer: %d blocks of %d bytes.\n",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
797 rb->buffersize, rb->blocksize);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
798
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
799 rb->ringbuffer = malloc(rb->buffersize * sizeof(char *));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
800 if (!rb)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
801 return E_POINTER;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
802 memset(rb->ringbuffer, 0, rb->buffersize * sizeof(char *));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
803
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
804 for (i = 0; i < rb->buffersize; i++) {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
805 rb->ringbuffer[i] = malloc(rb->blocksize * sizeof(char));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
806 if (!rb->ringbuffer[i]) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
807 destroy_ringbuffer(rb);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
808 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
809 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
810 }
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
811 rb->dpts = malloc(rb->buffersize * sizeof(double));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
812 if (!rb->dpts) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
813 destroy_ringbuffer(rb);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
814 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
815 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
816 rb->head = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
817 rb->tail = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
818 rb->count = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
819 rb->tStart = -1;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
820 rb->pMutex = malloc(sizeof(CRITICAL_SECTION));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
821 if (!rb->pMutex) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
822 destroy_ringbuffer(rb);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
823 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
824 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
825 InitializeCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
826 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
827 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
828
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
829 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
830 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
831 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
832 * Tuner related methods (frequency, capabilities, etc
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
833 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
834 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
835 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
836 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
837 * \brief returns string with name for givend PsysCon_* constant
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
838 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
839 * \param lPhysicalType constant from PhysicalConnectorType enumeration
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
840 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
841 * \return pointer to string with apropriate name
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
842 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
843 * \note
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
844 * Caller should not free returned pointer
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
845 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
846 static char *physcon2str(const long lPhysicalType)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
847 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
848 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
849 for(i=0; tv_physcon_types[i].name; i++)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
850 if(tv_physcon_types[i].type==lPhysicalType)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
851 return tv_physcon_types[i].name;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
852 return "Unknown";
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
853 };
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
854
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
855 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
856 * \brief converts MPlayer's chanlist to system country code.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
857 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
858 * \param chanlist MPlayer's chanlist name
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
859 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
860 * \return system country code
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
861 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
862 * \remarks
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
863 * After call to IAMTVTuner::put_CountryCode with returned value tuner switches to frequency table used in specified
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
864 * country (which is usually larger then MPlayer's one, so workaround will work fine).
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
865 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
866 * \todo
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
867 * Resolve trouble with cable channels (DirectShow's tuners must be switched between broadcast and cable channels modes.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
868 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
869 static int chanlist2country(char *chanlist)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
870 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
871 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
872 for(i=0; tv_chanlist2country[i].chanlist_name; i++)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
873 if (!strcmp(chanlist, tv_chanlist2country[i].chanlist_name))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
874 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
875 return tv_chanlist2country[i].country_code;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
876 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
877
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
878 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
879 * \brief loads specified resource from module and return pointer to it
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
880 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
881 * \param hDLL valid module desriptor
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
882 * \param index index of resource. resource with name "#<index>" will be loaded
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
883 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
884 * \return pointer to loader resource or NULL if error occured
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
885 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
886 static void *GetRC(HMODULE hDLL, int index)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
887 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
888 char szRCDATA[10];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
889 char szName[10];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
890 HRSRC hRes;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
891 HGLOBAL hTable;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
892
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
893 snprintf(szRCDATA, 10, "#%d", (int)RT_RCDATA);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
894 snprintf(szName, 10, "#%d", index);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
895
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
896 hRes = FindResource(hDLL, szName, szRCDATA);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
897 if (!hRes) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
898 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
899 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
900 hTable = LoadResource(hDLL, hRes);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
901 if (!hTable) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
902 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
903 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
904 return LockResource(hTable);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
905 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
906
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
907 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
908 * \brief loads frequency table for given country from kstvtune.ax
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
909 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
910 * \param[in] nCountry - country code
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
911 * \param[in] nInputType (TunerInputCable or TunerInputAntenna)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
912 * \param[out] pplFreqTable - address of variable that receives pointer to array, containing frequencies
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
913 * \param[out] pnLen length of array
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
914 * \param[out] pnFirst - channel number of first entry in array (nChannelMax)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
915 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
916 * \return S_OK if success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
917 * \return E_POINTER pplFreqTable==NULL || plFirst==NULL || pnLen==NULL
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
918 * \return E_FAIL error occured during load
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
919 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
920 * \remarks
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
921 * - array must be freed by caller
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
922 * - MSDN says that it is not neccessery to unlock or free resource. It will be done after unloading DLL
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
923 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
924 static HRESULT load_freq_table(int nCountry, int nInputType,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
925 long **pplFreqTable, int *pnLen,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
926 int *pnFirst)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
927 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
928 HMODULE hDLL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
929 long *plFreqTable;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
930 TRCCountryList *pCountryList;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
931 int i, index;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
932
27630
6fe56f6147ea Add debug message about loaded frequency tables.
voroshil
parents: 27629
diff changeset
933 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: load_freq_table called %d (%s)\n",nCountry,nInputType == TunerInputAntenna ? "broadcast" : "cable");
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
934 /* ASSERT(sizeof(TRCCountryList)==10); // need properly aligned structure */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
935
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
936 if (!pplFreqTable || !pnFirst || !pnLen)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
937 return E_POINTER;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
938 if (!nCountry)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
939 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
940
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
941 hDLL = LoadLibrary("kstvtune.ax");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
942 if (!hDLL) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
943 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
944 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
945 pCountryList = GetRC(hDLL, 9999);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
946 if (!pCountryList) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
947 FreeLibrary(hDLL);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
948 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
949 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
950 for (i = 0; pCountryList[i].CountryCode != 0; i++)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
951 if (pCountryList[i].CountryCode == nCountry)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
952 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
953 if (pCountryList[i].CountryCode == 0) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
954 FreeLibrary(hDLL);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
955 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
956 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
957 if (nInputType == TunerInputCable)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
958 index = pCountryList[i].CableFreqTable;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
959 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
960 index = pCountryList[i].BroadcastFreqTable;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
961
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
962 plFreqTable = GetRC(hDLL, index); //First element is number of first channel, second - number of last channel
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
963 if (!plFreqTable) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
964 FreeLibrary(hDLL);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
965 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
966 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
967 *pnFirst = plFreqTable[0];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
968 *pnLen = (int) (plFreqTable[1] - plFreqTable[0] + 1);
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
969 *pplFreqTable = malloc((*pnLen) * sizeof(long));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
970 if (!*pplFreqTable) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
971 FreeLibrary(hDLL);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
972 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
973 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
974 for (i = 0; i < *pnLen; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
975 (*pplFreqTable)[i] = plFreqTable[i + 2];
27630
6fe56f6147ea Add debug message about loaded frequency tables.
voroshil
parents: 27629
diff changeset
976 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: load_freq_table #%d => (%ld)\n",i+*pnFirst,(*pplFreqTable)[i]);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
977 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
978 FreeLibrary(hDLL);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
979 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
980 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
981
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
982 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
983 * \brief tunes to given frequency through IKsPropertySet call
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
984 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
985 * \param pTVTuner IAMTVTuner interface of capture device
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
986 * \param lFreq frequency to tune (in Hz)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
987 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
988 * \return S_OK success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
989 * \return apropriate error code otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
990 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
991 * \note
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
992 * Due to either bug in driver or error in following code calll to IKsProperty::Set
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
993 * in this methods always fail with error 0x8007007a.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
994 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
995 * \todo test code on other machines and an error
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
996 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
997 static HRESULT set_frequency_direct(IAMTVTuner * pTVTuner, long lFreq)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
998 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
999 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1000 DWORD dwSupported = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1001 DWORD cbBytes = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1002 KSPROPERTY_TUNER_MODE_CAPS_S mode_caps;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1003 KSPROPERTY_TUNER_FREQUENCY_S frequency;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1004 IKsPropertySet *pKSProp;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1005
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1006 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: set_frequency_direct called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1007
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1008 memset(&mode_caps, 0, sizeof(mode_caps));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1009 memset(&frequency, 0, sizeof(frequency));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1010
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1011 hr = OLE_QUERYINTERFACE(pTVTuner, IID_IKsPropertySet, pKSProp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1012 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1013 return hr; //no IKsPropertySet interface
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1014
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1015 mode_caps.Mode = AMTUNER_MODE_TV;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1016 hr = OLE_CALL_ARGS(pKSProp, QuerySupported, &PROPSETID_TUNER,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1017 KSPROPERTY_TUNER_MODE_CAPS, &dwSupported);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1018 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1019 OLE_RELEASE_SAFE(pKSProp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1020 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1021 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1022
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1023 if (!dwSupported & KSPROPERTY_SUPPORT_GET) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1024 OLE_RELEASE_SAFE(pKSProp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1025 return E_FAIL; //PROPSETID_TINER not supported
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1026 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1027
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1028 hr = OLE_CALL_ARGS(pKSProp, Get, &PROPSETID_TUNER,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1029 KSPROPERTY_TUNER_MODE_CAPS,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1030 INSTANCEDATA_OF_PROPERTY_PTR(&mode_caps),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1031 INSTANCEDATA_OF_PROPERTY_SIZE(mode_caps),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1032 &mode_caps, sizeof(mode_caps), &cbBytes);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1033
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1034 frequency.Frequency = lFreq;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1035
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1036 if (mode_caps.Strategy == KS_TUNER_STRATEGY_DRIVER_TUNES)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1037 frequency.TuningFlags = KS_TUNER_TUNING_FINE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1038 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1039 frequency.TuningFlags = KS_TUNER_TUNING_EXACT;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1040
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1041 if (lFreq < mode_caps.MinFrequency || lFreq > mode_caps.MaxFrequency) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1042 OLE_RELEASE_SAFE(pKSProp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1043 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1044 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1045
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1046 hr = OLE_CALL_ARGS(pKSProp, Set, &PROPSETID_TUNER,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1047 KSPROPERTY_TUNER_FREQUENCY,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1048 INSTANCEDATA_OF_PROPERTY_PTR(&frequency),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1049 INSTANCEDATA_OF_PROPERTY_SIZE(frequency),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1050 &frequency, sizeof(frequency));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1051 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1052 OLE_RELEASE_SAFE(pKSProp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1053 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1054 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1055
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1056 OLE_RELEASE_SAFE(pKSProp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1057
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1058 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1059 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1060
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1061 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1062 * \brief find channel with nearest frequency and set it
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1063 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1064 * \param priv driver's private data
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1065 * \param lFreq frequency in Hz
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1066 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1067 * \return S_OK if success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1068 * \return E_FAIL if error occured
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1069 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1070 static HRESULT set_nearest_freq(priv_t * priv, long lFreq)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1071 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1072 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1073 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1074 long lFreqDiff=-1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1075 int nChannel;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1076 TunerInputType tunerInput;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1077 long lInput;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1078
27629
d04568721d39 Make output messages of frequency selection code more useful by
voroshil
parents: 27628
diff changeset
1079 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: set_nearest_freq called: %ld\n", lFreq);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1080 if(priv->freq_table_len == -1 && !priv->freq_table) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1081
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1082 hr = OLE_CALL_ARGS(priv->pTVTuner, get_ConnectInput, &lInput);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1083 if(FAILED(hr)){ //Falling back to 0
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1084 lInput=0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1085 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1086
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1087 hr = OLE_CALL_ARGS(priv->pTVTuner, get_InputType, lInput, &tunerInput);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1088
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1089 if (load_freq_table(chanlist2country(priv->tv_param->chanlist), tunerInput, &(priv->freq_table), &(priv->freq_table_len), &(priv->first_channel)) != S_OK) {//FIXME
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1090 priv->freq_table_len=0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1091 priv->freq_table=NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1092 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_UnableExtractFreqTable);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1093 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1094 };
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1095 mp_msg(MSGT_TV, MSGL_V, MSGTR_TVI_DS_FreqTableLoaded, tunerInput == TunerInputAntenna ? "broadcast" : "cable",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1096 chanlist2country(priv->tv_param->chanlist), priv->freq_table_len);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1097 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1098
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1099 if (priv->freq_table_len <= 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1100 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1101
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1102 //FIXME: rewrite search algo
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1103 nChannel = -1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1104 for (i = 0; i < priv->freq_table_len; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1105 if (nChannel == -1 || labs(lFreq - priv->freq_table[i]) < lFreqDiff) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1106 nChannel = priv->first_channel + i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1107 lFreqDiff = labs(lFreq - priv->freq_table[i]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1108 }
27629
d04568721d39 Make output messages of frequency selection code more useful by
voroshil
parents: 27628
diff changeset
1109 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: set_nearest_freq #%d (%ld) => %d (%ld)\n",i+priv->first_channel,priv->freq_table[i], nChannel,lFreqDiff);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1110 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1111 if (nChannel == -1) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1112 mp_msg(MSGT_TV,MSGL_ERR, MSGTR_TVI_DS_UnableFindNearestChannel);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1113 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1114 }
27629
d04568721d39 Make output messages of frequency selection code more useful by
voroshil
parents: 27628
diff changeset
1115 mp_msg(MSGT_TV, MSGL_V, "tvi_dshow: set_nearest_freq #%d (%ld)\n",nChannel,priv->freq_table[nChannel - priv->first_channel]);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1116 hr = OLE_CALL_ARGS(priv->pTVTuner, put_Channel, nChannel,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1117 AMTUNER_SUBCHAN_DEFAULT, AMTUNER_SUBCHAN_DEFAULT);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1118 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1119 mp_msg(MSGT_TV,MSGL_ERR,MSGTR_TVI_DS_UnableToSetChannel, (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1120 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1121 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1122 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1123 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1124
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1125 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1126 * \brief setting frequency. decides whether use direct call/workaround
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1127 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1128 * \param priv driver's private data
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1129 * \param lFreq frequency in Hz
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1130 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1131 * \return TVI_CONTROL_TRUE if success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1132 * \return TVI_CONTROL_FALSE if error occured
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1133 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1134 * \todo check for freq boundary
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1135 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1136 static int set_frequency(priv_t * priv, long lFreq)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1137 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1138 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1139
27629
d04568721d39 Make output messages of frequency selection code more useful by
voroshil
parents: 27628
diff changeset
1140 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: set_frequency called: %ld\n", lFreq);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1141 if (!priv->pTVTuner)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1142 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1143 if (priv->direct_setfreq_call) { //using direct call to set frequency
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1144 hr = set_frequency_direct(priv->pTVTuner, lFreq);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1145 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1146 mp_msg(MSGT_TV, MSGL_V, MSGTR_TVI_DS_DirectSetFreqFailed);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1147 priv->direct_setfreq_call = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1148 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1149 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1150 if (!priv->direct_setfreq_call) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1151 hr = set_nearest_freq(priv, lFreq);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1152 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1153 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1154 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1155 #ifdef DEPRECATED
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1156 priv->pGrabber->ClearBuffer(priv->pGrabber);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1157 #endif
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1158 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1159 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1160
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1161 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1162 * \brief return current frequency from tuner (in Hz)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1163 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1164 * \param pTVTuner IAMTVTuner interface of tuner
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1165 * \param plFreq address of variable that receives current frequency
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1166 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1167 * \return S_OK success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1168 * \return E_POINTER pTVTuner==NULL || plFreq==NULL
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1169 * \return apropriate error code otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1170 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1171 static HRESULT get_frequency_direct(IAMTVTuner * pTVTuner, long *plFreq)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1172 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1173 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1174 KSPROPERTY_TUNER_STATUS_S TunerStatus;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1175 DWORD cbBytes;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1176 IKsPropertySet *pKSProp;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1177 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: get_frequency_direct called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1178
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1179 if (!plFreq)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1180 return E_POINTER;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1181
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1182 hr = OLE_QUERYINTERFACE(pTVTuner, IID_IKsPropertySet, pKSProp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1183 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1184 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Get freq QueryInterface failed\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1185 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1186 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1187
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1188 hr = OLE_CALL_ARGS(pKSProp, Get, &PROPSETID_TUNER,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1189 KSPROPERTY_TUNER_STATUS,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1190 INSTANCEDATA_OF_PROPERTY_PTR(&TunerStatus),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1191 INSTANCEDATA_OF_PROPERTY_SIZE(TunerStatus),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1192 &TunerStatus, sizeof(TunerStatus), &cbBytes);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1193 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1194 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Get freq Get failure\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1195 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1196 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1197 *plFreq = TunerStatus.CurrentFrequency;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1198 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1199 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1200
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1201 /**
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1202 * \brief gets current frequency
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1203 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1204 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1205 * \param plFreq - pointer to long int to store frequency to (in Hz)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1206 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1207 * \return TVI_CONTROL_TRUE if success, TVI_CONTROL_FALSE otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1208 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1209 static int get_frequency(priv_t * priv, long *plFreq)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1210 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1211 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1212
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1213 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: get_frequency called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1214
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1215 if (!plFreq || !priv->pTVTuner)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1216 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1217
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1218 if (priv->direct_getfreq_call) { //using direct call to get frequency
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1219 hr = get_frequency_direct(priv->pTVTuner, plFreq);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1220 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1221 mp_msg(MSGT_TV, MSGL_INFO, MSGTR_TVI_DS_DirectGetFreqFailed);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1222 priv->direct_getfreq_call = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1223 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1224 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1225 if (!priv->direct_getfreq_call) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1226 hr=OLE_CALL_ARGS(priv->pTVTuner, get_VideoFrequency, plFreq);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1227 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1228 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1229
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1230 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1231 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1232 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1233
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1234 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1235 * \brief get tuner capabilities
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1236 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1237 * \param priv driver's private data
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1238 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1239 static void get_capabilities(priv_t * priv)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1240 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1241 long lAvailableFormats;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1242 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1243 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1244 long lInputPins, lOutputPins, lRelated, lPhysicalType;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1245 IEnumPins *pEnum;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1246 char tmp[200];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1247 IPin *pPin = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1248 PIN_DIRECTION ThisPinDir;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1249 PIN_INFO pi;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1250 IAMAudioInputMixer *pIAMixer;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1251
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1252 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: get_capabilities called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1253 if (priv->pTVTuner) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1254
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1255 mp_msg(MSGT_TV, MSGL_V, MSGTR_TVI_DS_SupportedNorms);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1256 hr = OLE_CALL_ARGS(priv->pTVTuner, get_AvailableTVFormats,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1257 &lAvailableFormats);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1258 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1259 tv_available_norms_count = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1260 else {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1261 for (i = 0; i < TV_NORMS_COUNT; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1262 if (lAvailableFormats & tv_norms[i].index) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1263 tv_available_norms[tv_available_norms_count] = i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1264 mp_msg(MSGT_TV, MSGL_V, " %d=%s;",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1265 tv_available_norms_count + 1, tv_norms[i].name);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1266 tv_available_norms_count++;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1267 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1268 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1269 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1270 mp_msg(MSGT_TV, MSGL_INFO, "\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1271 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1272 if (priv->pCrossbar) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1273 OLE_CALL_ARGS(priv->pCrossbar, get_PinCounts, &lOutputPins,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1274 &lInputPins);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1275
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
1276 tv_available_inputs = malloc(sizeof(long) * lInputPins);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1277 tv_available_inputs_count = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1278
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1279 mp_msg(MSGT_TV, MSGL_V, MSGTR_TVI_DS_AvailableVideoInputs);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1280 for (i = 0; i < lInputPins; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1281 OLE_CALL_ARGS(priv->pCrossbar, get_CrossbarPinInfo, 1, i,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1282 &lRelated, &lPhysicalType);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1283
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1284 if (lPhysicalType < 0x1000) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1285 tv_available_inputs[tv_available_inputs_count++] = i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1286 mp_msg(MSGT_TV, MSGL_V, " %d=%s;",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1287 tv_available_inputs_count - 1,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1288 physcon2str(lPhysicalType));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1289 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1290 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1291 mp_msg(MSGT_TV, MSGL_INFO, "\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1292
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1293 set_crossbar_input(priv, 0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1294 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1295
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1296 if (priv->adev_index != -1) {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
1297 hr = OLE_CALL_ARGS(priv->chains[1]->pCaptureFilter, EnumPins, &pEnum);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1298 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1299 return;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1300 mp_msg(MSGT_TV, MSGL_V, MSGTR_TVI_DS_AvailableAudioInputs);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1301 i = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1302 while (OLE_CALL_ARGS(pEnum, Next, 1, &pPin, NULL) == S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1303 memset(&pi, 0, sizeof(pi));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1304 memset(tmp, 0, 200);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1305 OLE_CALL_ARGS(pPin, QueryDirection, &ThisPinDir);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1306 if (ThisPinDir == PINDIR_INPUT) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1307 OLE_CALL_ARGS(pPin, QueryPinInfo, &pi);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1308 wtoa(pi.achName, tmp, 200);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1309 OLE_RELEASE_SAFE(pi.pFilter);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1310 mp_msg(MSGT_TV, MSGL_V, " %d=%s", i, tmp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1311 mp_msg(MSGT_TV, MSGL_DBG3, " (%p)", pPin);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1312 hr = OLE_QUERYINTERFACE(pPin, IID_IAMAudioInputMixer,pIAMixer);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1313 if (SUCCEEDED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1314 if (i == priv->tv_param->audio_id) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1315 OLE_CALL_ARGS(pIAMixer, put_Enable, TRUE);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1316 if(priv->tv_param->volume>0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1317 OLE_CALL_ARGS(pIAMixer, put_MixLevel, 0.01 * priv->tv_param->volume);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1318 #if 0
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1319 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1320 OLE_CALL_ARGS(pIAMixer, put_MixLevel, 1.0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1321 #endif
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1322 mp_msg(MSGT_TV, MSGL_V, MSGTR_TVI_DS_InputSelected);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1323 } else {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1324 OLE_CALL_ARGS(pIAMixer, put_Enable, FALSE);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1325 #if 0
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1326 OLE_CALL_ARGS(pIAMixer, put_MixLevel, 0.0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1327 #endif
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1328 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1329 OLE_RELEASE_SAFE(pIAMixer);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1330 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1331 mp_msg(MSGT_TV, MSGL_V, ";");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1332 OLE_RELEASE_SAFE(pPin);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1333 i++;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1334 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1335 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1336 mp_msg(MSGT_TV, MSGL_INFO, "\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1337 OLE_RELEASE_SAFE(pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1338 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1339 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1340
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1341 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1342 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1343 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1344 * Filter related methods
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1345 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1346 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1347 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1348 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1349 * \brief building in graph audio/video capture chain
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1350 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1351 * \param priv driver's private data
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1352 * \param pCaptureFilter pointer to capture device's IBaseFilter interface
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1353 * \param pbuf ringbuffer data structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1354 * \param pmt media type for chain (AM_MEDIA_TYPE)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1355 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1356 * \note routine does not frees memory, allocated for grabber_rinbuffer_s structure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1357 */
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1358 static HRESULT build_sub_graph(priv_t * priv, chain_t * chain, const GUID* ppin_category)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1359 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1360 HRESULT hr;
25063
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
1361 int nFormatProbed = 0;
25029
c9f20e41bc13 Make sure that mplayer will receive actual media type
voroshil
parents: 25028
diff changeset
1362
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1363 IPin *pSGOut;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1364 IPin *pNRIn=NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1365
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1366 IBaseFilter *pNR = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1367
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1368 hr=S_OK;
25063
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
1369
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
1370 //No supported formats
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1371 if(!chain->arpmt[0])
25063
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
1372 return E_FAIL;
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
1373
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1374 do{
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1375 hr = OLE_CALL_ARGS(priv->pBuilder, FindPin,
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1376 (IUnknown *) chain->pCaptureFilter,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1377 PINDIR_OUTPUT, ppin_category,
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1378 chain->majortype, FALSE, 0, &chain->pCapturePin);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1379 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1380 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: FindPin(pCapturePin) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1381 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1382 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1383 /* Addinf SampleGrabber filter for video stream */
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1384 hr = CoCreateInstance((GUID *) & CLSID_SampleGrabber, NULL,CLSCTX_INPROC_SERVER, &IID_IBaseFilter,(void *) &chain->pSGF);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1385 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1386 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: CoCreateInstance(SampleGrabber) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1387 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1388 }
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1389 hr = OLE_CALL_ARGS(priv->pGraph, AddFilter, chain->pSGF, L"Sample Grabber");
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1390 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1391 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: AddFilter(SampleGrabber) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1392 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1393 }
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1394 hr = OLE_CALL_ARGS(priv->pBuilder, FindPin, (IUnknown *) chain->pSGF,PINDIR_INPUT, NULL, NULL, FALSE, 0, &chain->pSGIn);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1395 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1396 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: FindPin(pSGIn) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1397 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1398 }
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1399 hr = OLE_CALL_ARGS(priv->pBuilder, FindPin, (IUnknown *) chain->pSGF,PINDIR_OUTPUT, NULL, NULL, FALSE, 0, &pSGOut);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1400 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1401 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: FindPin(pSGOut) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1402 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1403 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1404
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1405 /* creating ringbuffer for video samples */
25086
e91503fbf524 Move pointer to SampleGrabber filter into chain structure.
voroshil
parents: 25085
diff changeset
1406 chain->pCSGCB = CSampleGrabberCB_Create(chain->rbuf);
e91503fbf524 Move pointer to SampleGrabber filter into chain structure.
voroshil
parents: 25085
diff changeset
1407 if(!chain->pCSGCB){
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1408 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: CSampleGrabberCB_Create(pbuf) call failed. Error:0x%x\n", (unsigned int)E_OUTOFMEMORY);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1409 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1410 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1411
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1412 /* initializing SampleGrabber filter */
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1413 hr = OLE_QUERYINTERFACE(chain->pSGF, IID_ISampleGrabber, chain->pSG);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1414 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1415 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: QueryInterface(IID_ISampleGrabber) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1416 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1417 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1418 // hr = OLE_CALL_ARGS(pSG, SetCallback, (ISampleGrabberCB *) pCSGCB, 1); //we want to receive copy of sample's data
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1419 hr = OLE_CALL_ARGS(chain->pSG, SetCallback, (ISampleGrabberCB *) chain->pCSGCB, 0); //we want to receive sample
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1420
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1421 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1422 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: SetCallback(pSG) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1423 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1424 }
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1425 hr = OLE_CALL_ARGS(chain->pSG, SetOneShot, FALSE); //... for all frames
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1426 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1427 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: SetOneShot(pSG) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1428 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1429 }
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1430 hr = OLE_CALL_ARGS(chain->pSG, SetBufferSamples, FALSE); //... do not buffer samples in sample grabber
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1431 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1432 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: SetBufferSamples(pSG) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1433 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1434 }
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1435
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1436 if(priv->tv_param->normalize_audio_chunks && chain->type==audio){
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1437 set_buffer_preference(20,(WAVEFORMATEX*)(chain->arpmt[nFormatProbed]->pbFormat),chain->pCapturePin,chain->pSGIn);
25048
280fc0e914f3 (cosmetics) Indentation fix
voroshil
parents: 25029
diff changeset
1438 }
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1439
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1440 for(nFormatProbed=0; chain->arpmt[nFormatProbed]; nFormatProbed++)
25065
54dba785e683 New media format negotiation code:
voroshil
parents: 25064
diff changeset
1441 {
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1442 DisplayMediaType("Probing format", chain->arpmt[nFormatProbed]);
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1443 hr = OLE_CALL_ARGS(chain->pSG, SetMediaType, chain->arpmt[nFormatProbed]); //set desired mediatype
25066
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1444 if(FAILED(hr)){
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1445 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: SetMediaType(pSG) call failed. Error:0x%x\n", (unsigned int)hr);
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1446 continue;
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1447 }
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1448 /* connecting filters together: VideoCapture --> SampleGrabber */
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1449 hr = OLE_CALL_ARGS(priv->pGraph, Connect, chain->pCapturePin, chain->pSGIn);
25066
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1450 if(FAILED(hr)){
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1451 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: Unable to create pCapturePin<->pSGIn connection. Error:0x%x\n", (unsigned int)hr);
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1452 continue;
89c42f6f6e89 (cosmetics) Indentation fix of previous commit.
voroshil
parents: 25065
diff changeset
1453 }
25065
54dba785e683 New media format negotiation code:
voroshil
parents: 25064
diff changeset
1454 break;
54dba785e683 New media format negotiation code:
voroshil
parents: 25064
diff changeset
1455 }
54dba785e683 New media format negotiation code:
voroshil
parents: 25064
diff changeset
1456
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
1457 if(!chain->arpmt[nFormatProbed])
25065
54dba785e683 New media format negotiation code:
voroshil
parents: 25064
diff changeset
1458 {
54dba785e683 New media format negotiation code:
voroshil
parents: 25064
diff changeset
1459 mp_msg(MSGT_TV, MSGL_WARN, "tvi_dshow: Unable to negotiate media format\n");
54dba785e683 New media format negotiation code:
voroshil
parents: 25064
diff changeset
1460 hr = E_FAIL;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1461 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1462 }
25063
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
1463
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1464 hr = OLE_CALL_ARGS(chain->pCapturePin, ConnectionMediaType, chain->pmt);
25029
c9f20e41bc13 Make sure that mplayer will receive actual media type
voroshil
parents: 25028
diff changeset
1465 if(FAILED(hr))
c9f20e41bc13 Make sure that mplayer will receive actual media type
voroshil
parents: 25028
diff changeset
1466 {
c9f20e41bc13 Make sure that mplayer will receive actual media type
voroshil
parents: 25028
diff changeset
1467 mp_msg(MSGT_TV, MSGL_WARN, MSGTR_TVI_DS_GetActualMediatypeFailed, (unsigned int)hr);
c9f20e41bc13 Make sure that mplayer will receive actual media type
voroshil
parents: 25028
diff changeset
1468 }
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1469
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1470 if(priv->tv_param->hidden_video_renderer){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1471 IEnumFilters* pEnum;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1472 IBaseFilter* pFilter;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1473
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
1474 hr=OLE_CALL_ARGS(priv->pBuilder,RenderStream,NULL,NULL,(IUnknown*)chain->pCapturePin,NULL,NULL);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1475
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1476 OLE_CALL_ARGS(priv->pGraph, EnumFilters, &pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1477 while (OLE_CALL_ARGS(pEnum, Next, 1, &pFilter, NULL) == S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1478 LPVIDEOWINDOW pVideoWindow;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1479 hr = OLE_QUERYINTERFACE(pFilter, IID_IVideoWindow, pVideoWindow);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1480 if (SUCCEEDED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1481 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1482 OLE_CALL_ARGS(pVideoWindow,put_Visible,/* OAFALSE*/ 0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1483 OLE_CALL_ARGS(pVideoWindow,put_AutoShow,/* OAFALSE*/ 0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1484 OLE_RELEASE_SAFE(pVideoWindow);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1485 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1486 OLE_RELEASE_SAFE(pFilter);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1487 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1488 OLE_RELEASE_SAFE(pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1489 }else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1490 {
25052
7b2b17b57cf7 Disable terminating directshow chains with NullRenderer filter,
voroshil
parents: 25051
diff changeset
1491 #if 0
7b2b17b57cf7 Disable terminating directshow chains with NullRenderer filter,
voroshil
parents: 25051
diff changeset
1492 /*
7b2b17b57cf7 Disable terminating directshow chains with NullRenderer filter,
voroshil
parents: 25051
diff changeset
1493 Code below is disabled, because terminating chain with NullRenderer leads to jerky video.
7b2b17b57cf7 Disable terminating directshow chains with NullRenderer filter,
voroshil
parents: 25051
diff changeset
1494 Perhaps, this happens because NullRenderer filter discards each received
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1495 frame while discarded frames causes live source filter to dramatically reduce frame rate.
25052
7b2b17b57cf7 Disable terminating directshow chains with NullRenderer filter,
voroshil
parents: 25051
diff changeset
1496 */
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1497 /* adding sink for video stream */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1498 hr = CoCreateInstance((GUID *) & CLSID_NullRenderer, NULL,CLSCTX_INPROC_SERVER, &IID_IBaseFilter,(void *) &pNR);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1499 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1500 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: CoCreateInstance(NullRenderer) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1501 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1502 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1503 hr = OLE_CALL_ARGS(priv->pGraph, AddFilter, pNR, L"Null Renderer");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1504 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1505 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: AddFilter(NullRenderer) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1506 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1507 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1508 hr = OLE_CALL_ARGS(priv->pBuilder, FindPin, (IUnknown *) pNR,PINDIR_INPUT, NULL, NULL, FALSE, 0, &pNRIn);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1509 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1510 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: FindPin(pNRIn) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1511 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1512 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1513 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1514 Prevent ending VBI chain with NullRenderer filter, because this causes VBI pin disconnection
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1515 */
25063
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
1516 if(memcmp(&(arpmt[nFormatProbed]->majortype),&MEDIATYPE_VBI,16)){
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1517 /* connecting filters together: SampleGrabber --> NullRenderer */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1518 hr = OLE_CALL_ARGS(priv->pGraph, Connect, pSGOut, pNRIn);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1519 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1520 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: Unable to create pSGOut<->pNRIn connection. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1521 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1522 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1523 }
25052
7b2b17b57cf7 Disable terminating directshow chains with NullRenderer filter,
voroshil
parents: 25051
diff changeset
1524 #endif
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1525 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1526
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1527 hr = S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1528 } while(0);
25029
c9f20e41bc13 Make sure that mplayer will receive actual media type
voroshil
parents: 25028
diff changeset
1529
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1530 OLE_RELEASE_SAFE(pSGOut);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1531 OLE_RELEASE_SAFE(pNR);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1532 OLE_RELEASE_SAFE(pNRIn);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1533
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1534 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1535 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1536
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1537 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1538 * \brief configures crossbar for grabbing video stream from given input
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1539 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1540 * \param priv driver's private data
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1541 * \param input index of available video input to get data from
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1542 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1543 * \return TVI_CONTROL_TRUE success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1544 * \return TVI_CONTROL_FALSE error
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1545 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1546 static int set_crossbar_input(priv_t * priv, int input)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1547 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1548 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1549 int i, nVideoDecoder, nAudioDecoder;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1550 long lInput, lInputRelated, lRelated, lPhysicalType, lOutputPins,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1551 lInputPins;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1552
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1553 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: Configuring crossbar\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1554 if (!priv->pCrossbar || input < 0
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1555 || input >= tv_available_inputs_count)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1556 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1557
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1558 OLE_CALL_ARGS(priv->pCrossbar, get_PinCounts, &lOutputPins, &lInputPins);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1559
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1560 lInput = tv_available_inputs[input];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1561
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1562 if (lInput < 0 || lInput >= lInputPins)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1563 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1564
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1565 OLE_CALL_ARGS(priv->pCrossbar, get_CrossbarPinInfo, 1 /* input */ , lInput,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1566 &lInputRelated, &lPhysicalType);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1567
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1568 nVideoDecoder = nAudioDecoder = -1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1569 for (i = 0; i < lOutputPins; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1570 OLE_CALL_ARGS(priv->pCrossbar, get_CrossbarPinInfo, 0 /*output */ , i,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1571 &lRelated, &lPhysicalType);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1572 if (lPhysicalType == PhysConn_Video_VideoDecoder)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1573 nVideoDecoder = i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1574 if (lPhysicalType == PhysConn_Audio_AudioDecoder)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1575 nAudioDecoder = i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1576 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1577 if (nVideoDecoder >= 0) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1578 //connecting given input with video decoder
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1579 hr = OLE_CALL_ARGS(priv->pCrossbar, Route, nVideoDecoder, lInput);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1580 if (hr != S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1581 mp_msg(MSGT_TV,MSGL_ERR,MSGTR_TVI_DS_UnableConnectInputVideoDecoder, (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1582 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1583 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1584 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1585 if (nAudioDecoder >= 0 && lInputRelated >= 0) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1586 hr = OLE_CALL_ARGS(priv->pCrossbar, Route, nAudioDecoder,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1587 lInputRelated);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1588 if (hr != S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1589 mp_msg(MSGT_TV,MSGL_ERR,MSGTR_TVI_DS_UnableConnectInputAudioDecoder, (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1590 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1591 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1592 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1593 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1594 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1595
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1596 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1597 * \brief adjusts video control (hue,saturation,contrast,brightess)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1598 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1599 * \param priv driver's private data
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1600 * \param control which control to adjust
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1601 * \param value new value for control (0-100)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1602 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1603 * \return TVI_CONTROL_TRUE success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1604 * \return TVI_CONTROL_FALSE error
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1605 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1606 static int set_control(priv_t * priv, int control, int value)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1607 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1608 long lMin, lMax, lStepping, lDefault, lFlags, lValue;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1609 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1610
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1611 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: set_control called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1612 if (value < -100 || value > 100 || !priv->pVideoProcAmp)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1613 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1614
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1615 hr = OLE_CALL_ARGS(priv->pVideoProcAmp, GetRange, control,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1616 &lMin, &lMax, &lStepping, &lDefault, &lFlags);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1617 if (FAILED(hr) || lFlags != VideoProcAmp_Flags_Manual)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1618 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1619
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1620 lValue = lMin + (value + 100) * (lMax - lMin) / 200;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1621 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1622 Workaround for ATI AIW 7500. The driver reports: max=255, stepping=256
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1623 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1624 if (lStepping > lMax) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1625 mp_msg(MSGT_TV, MSGL_DBG3,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1626 "tvi_dshow: Stepping (%ld) is bigger than max value (%ld) for control %d. Assuming 1\n",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1627 lStepping, lMax,control);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1628 lStepping = 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1629 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1630 lValue -= lValue % lStepping;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1631 hr = OLE_CALL_ARGS(priv->pVideoProcAmp, Set, control, lValue,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1632 VideoProcAmp_Flags_Manual);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1633 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1634 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1635
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1636 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1637 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1638
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1639 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1640 * \brief get current value of video control (hue,saturation,contrast,brightess)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1641 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1642 * \param priv driver's private data
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1643 * \param control which control to adjust
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1644 * \param pvalue address of variable thar receives current value
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1645 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1646 * \return TVI_CONTROL_TRUE success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1647 * \return TVI_CONTROL_FALSE error
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1648 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1649 static int get_control(priv_t * priv, int control, int *pvalue)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1650 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1651 long lMin, lMax, lStepping, lDefault, lFlags, lValue;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1652 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1653
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1654 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: get_control called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1655 if (!pvalue || !priv->pVideoProcAmp)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1656 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1657
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1658 hr = OLE_CALL_ARGS(priv->pVideoProcAmp, GetRange, control,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1659 &lMin, &lMax, &lStepping, &lDefault, &lFlags);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1660 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1661 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1662 if (lMin == lMax) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1663 *pvalue = lMin;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1664 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1665 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1666
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1667 hr = OLE_CALL_ARGS(priv->pVideoProcAmp, Get, control, &lValue, &lFlags);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1668 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1669 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1670
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1671 *pvalue = 200 * (lValue - lMin) / (lMax - lMin) - 100;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1672
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1673 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1674 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1675
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1676 /**
25053
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1677 * \brief create AM_MEDIA_TYPE structure, corresponding to given FourCC code and width/height/fps
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1678 * \param fcc FourCC code for video format
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1679 * \param width picture width
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1680 * \param height pciture height
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1681 * \param fps frames per second (required for bitrate calculation)
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1682 *
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1683 * \return pointer to AM_MEDIA_TYPE structure if success, NULL - otherwise
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1684 */
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1685 static AM_MEDIA_TYPE* create_video_format(int fcc, int width, int height, int fps)
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1686 {
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1687 int i;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1688 AM_MEDIA_TYPE mt;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1689 VIDEOINFOHEADER vHdr;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1690
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1691 /* Check given fcc in lookup table*/
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1692 for(i=0; img_fmt_list[i].fmt && img_fmt_list[i].fmt!=fcc; i++) /* NOTHING */;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1693 if(!img_fmt_list[i].fmt)
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1694 return NULL;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1695
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1696 memset(&mt, 0, sizeof(AM_MEDIA_TYPE));
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1697 memset(&vHdr, 0, sizeof(VIDEOINFOHEADER));
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1698
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1699 vHdr.bmiHeader.biSize = sizeof(vHdr.bmiHeader);
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1700 vHdr.bmiHeader.biWidth = width;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1701 vHdr.bmiHeader.biHeight = height;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1702 //FIXME: is biPlanes required too?
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1703 //vHdr.bmiHeader.biPlanes = img_fmt_list[i].nPlanes;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1704 vHdr.bmiHeader.biBitCount = img_fmt_list[i].nBits;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1705 vHdr.bmiHeader.biCompression = img_fmt_list[i].nCompression;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1706 vHdr.bmiHeader.biSizeImage = width * height * img_fmt_list[i].nBits / 8;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1707 vHdr.dwBitRate = vHdr.bmiHeader.biSizeImage * 8 * fps;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1708
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1709 mt.pbFormat = (char*)&vHdr;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1710 mt.cbFormat = sizeof(vHdr);
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1711
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1712 mt.majortype = MEDIATYPE_Video;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1713 mt.subtype = *img_fmt_list[i].subtype;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1714 mt.formattype = FORMAT_VideoInfo;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1715
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1716 mt.bFixedSizeSamples = 1;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1717 mt.bTemporalCompression = 0;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1718 mt.lSampleSize = vHdr.bmiHeader.biSizeImage;
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1719
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1720 return CreateMediaType(&mt);
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1721 }
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1722
086c2accaaa2 Service routine for constructing AM_MEDIA_TYPE structure from
voroshil
parents: 25052
diff changeset
1723 /**
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1724 * \brief extracts fcc,width,height from AM_MEDIA_TYPE
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1725 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1726 * \param pmt pointer to AM_MEDIA_TYPE to extract data from
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1727 * \param pfcc address of variable that receives FourCC
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1728 * \param pwidth address of variable that receives width
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1729 * \param pheight address of variable that recevies height
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1730 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1731 * \return 1 if data extracted successfully, 0 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1732 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1733 static int extract_video_format(AM_MEDIA_TYPE * pmt, int *pfcc,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1734 int *pwidth, int *pheight)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1735 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1736 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: extract_video_format called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1737 if (!pmt)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1738 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1739 if (!pmt->pbFormat)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1740 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1741 if (memcmp(&(pmt->formattype), &FORMAT_VideoInfo, 16) != 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1742 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1743 if (pfcc)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1744 *pfcc = subtype2imgfmt(&(pmt->subtype));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1745 if (pwidth)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1746 *pwidth = ((VIDEOINFOHEADER *) pmt->pbFormat)->bmiHeader.biWidth;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1747 if (pheight)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1748 *pheight = ((VIDEOINFOHEADER *) pmt->pbFormat)->bmiHeader.biHeight;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1749 return 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1750 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1751
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1752 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1753 * \brief extracts samplerate,bits,channels from AM_MEDIA_TYPE
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1754 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1755 * \param pmt pointer to AM_MEDIA_TYPE to extract data from
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1756 * \param pfcc address of variable that receives samplerate
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1757 * \param pwidth address of variable that receives number of bits per sample
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1758 * \param pheight address of variable that recevies number of channels
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1759 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1760 * \return 1 if data extracted successfully, 0 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1761 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1762 static int extract_audio_format(AM_MEDIA_TYPE * pmt, int *psamplerate,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1763 int *pbits, int *pchannels)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1764 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1765 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: extract_audio_format called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1766 if (!pmt)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1767 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1768 if (!pmt->pbFormat)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1769 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1770 if (memcmp(&(pmt->formattype), &FORMAT_WaveFormatEx, 16) != 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1771 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1772 if (psamplerate)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1773 *psamplerate = ((WAVEFORMATEX *) pmt->pbFormat)->nSamplesPerSec;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1774 if (pbits)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1775 *pbits = ((WAVEFORMATEX *) pmt->pbFormat)->wBitsPerSample;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1776 if (pchannels)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1777 *pchannels = ((WAVEFORMATEX *) pmt->pbFormat)->nChannels;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1778 return 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1779 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1780
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1781 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1782 * \brief checks if AM_MEDIA_TYPE compatible with given samplerate,bits,channels
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1783 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1784 * \param pmt pointer to AM_MEDIA_TYPE for check
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1785 * \param samplerate audio samplerate
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1786 * \param bits bits per sample
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1787 * \param channels number of audio channels
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1788 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1789 * \return 1 if AM_MEDIA_TYPE compatible
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1790 * \return 0 if not
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1791 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1792 static int check_audio_format(AM_MEDIA_TYPE * pmt, int samplerate,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1793 int bits, int channels)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1794 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1795 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: check_audio_format called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1796 if (!pmt)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1797 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1798 if (memcmp(&(pmt->majortype), &MEDIATYPE_Audio, 16) != 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1799 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1800 if (memcmp(&(pmt->subtype), &MEDIASUBTYPE_PCM, 16) != 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1801 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1802 if (memcmp(&(pmt->formattype), &FORMAT_WaveFormatEx, 16) != 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1803 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1804 if (!pmt->pbFormat)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1805 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1806 if (((WAVEFORMATEX *) pmt->pbFormat)->nSamplesPerSec != samplerate)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1807 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1808 if (((WAVEFORMATEX *) pmt->pbFormat)->wBitsPerSample != bits)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1809 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1810 if (channels > 0
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1811 && ((WAVEFORMATEX *) pmt->pbFormat)->nChannels != channels)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1812 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1813
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1814 return 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1815 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1816
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1817 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1818 * \brief checks if AM_MEDIA_TYPE compatible with given fcc,width,height
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1819 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1820 * \param pmt pointer to AM_MEDIA_TYPE for check
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1821 * \param fcc FourCC (compression)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1822 * \param width width of picture
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1823 * \param height height of picture
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1824 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1825 * \return 1 if AM_MEDIA_TYPE compatible
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1826 & \return 0 if not
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1827 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1828 * \note
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1829 * width and height are currently not used
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1830 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1831 * \todo
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1832 * add width/height check
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1833 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1834 static int check_video_format(AM_MEDIA_TYPE * pmt, int fcc, int width,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1835 int height)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1836 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1837 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: check_video_format called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1838 if (!pmt)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1839 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1840 if (memcmp(&(pmt->majortype), &MEDIATYPE_Video, 16) != 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1841 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1842 if (subtype2imgfmt(&(pmt->subtype)) != fcc)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1843 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1844 return 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1845 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1846
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1847 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1848 * \brief converts DirectShow subtype to MPlayer's IMGFMT
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1849 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1850 * \param subtype DirectShow subtype for video format
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1851 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1852 * \return MPlayer's IMGFMT or 0 if error occured
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1853 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1854 static int subtype2imgfmt(const GUID * subtype)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1855 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1856 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1857 for (i = 0; img_fmt_list[i].fmt; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1858 if (memcmp(subtype, img_fmt_list[i].subtype, 16) == 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1859 return img_fmt_list[i].fmt;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1860 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1861 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1862 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1863
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1864 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1865 * \brief prints filter name and it pins
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1866 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1867 * \param pFilter - IBaseFilter to get data from
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1868 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1869 * \return S_OK if success, error code otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1870 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1871 static HRESULT show_filter_info(IBaseFilter * pFilter)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1872 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1873 char tmp[200];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1874 FILTER_INFO fi;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1875 LPENUMPINS pEnum = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1876 IPin *pPin = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1877 PIN_DIRECTION ThisPinDir;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1878 PIN_INFO pi;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1879 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1880 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1881
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1882 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: show_filter_info called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1883 memset(&fi, 0, sizeof(fi));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1884 memset(tmp, 0, 200);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1885
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1886 OLE_CALL_ARGS(pFilter, QueryFilterInfo, &fi);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1887 OLE_RELEASE_SAFE(fi.pGraph);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1888 wtoa(fi.achName, tmp, 200);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1889 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: BaseFilter (%p): Name=%s, Graph=%p output pins:",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1890 pFilter, tmp, fi.pGraph);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1891 hr = OLE_CALL_ARGS(pFilter, EnumPins, &pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1892 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1893 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1894 i = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1895 while (OLE_CALL_ARGS(pEnum, Next, 1, &pPin, NULL) == S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1896 memset(&pi, 0, sizeof(pi));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1897 memset(tmp, 0, 200);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1898 OLE_CALL_ARGS(pPin, QueryDirection, &ThisPinDir);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1899 if (ThisPinDir == PINDIR_OUTPUT) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1900 OLE_CALL_ARGS(pPin, QueryPinInfo, &pi);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1901 wtoa(pi.achName, tmp, 200);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1902 OLE_RELEASE_SAFE(pi.pFilter);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1903 mp_msg(MSGT_TV, MSGL_DBG2, " %d=%s", i, tmp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1904 mp_msg(MSGT_TV, MSGL_DBG3, " (%p)", pPin);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1905 mp_msg(MSGT_TV, MSGL_DBG2, ";");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1906 OLE_RELEASE_SAFE(pPin);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1907 i++;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1908 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1909 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1910 mp_msg(MSGT_TV, MSGL_DBG2, "\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1911 OLE_RELEASE_SAFE(pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1912 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1913 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1914
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1915 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1916 * \brief gets device's frendly in ANSI encoding
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1917 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1918 * \param pM IMoniker interface, got in enumeration process
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1919 * \param category device category
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1920 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1921 * \return TVI_CONTROL_TRUE if operation succeded, TVI_CONTROL_FALSE - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1922 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1923 static int get_device_name(IMoniker * pM, char *pBuf, int nLen)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1924 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1925 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1926 VARIANT var;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1927 IPropertyBag *pPropBag;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1928 hr = OLE_CALL_ARGS(pM, BindToStorage, 0, 0, &IID_IPropertyBag,(void *) &pPropBag);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1929 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1930 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Call to BindToStorage failed\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1931 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1932 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1933 var.vt = VT_BSTR;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1934 hr = OLE_CALL_ARGS(pPropBag, Read, L"Description", (LPVARIANT) & var,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1935 NULL);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1936 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1937 hr = OLE_CALL_ARGS(pPropBag, Read, L"FriendlyName", (LPVARIANT) & var,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1938 NULL);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1939 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1940 OLE_RELEASE_SAFE(pPropBag);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1941 if (SUCCEEDED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1942 wtoa(var.bstrVal, pBuf, nLen);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1943 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1944 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1945 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1946 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1947
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1948 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1949 * \brief find capture device at given index
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1950 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1951 * \param index device index to search for (-1 mean only print available)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1952 * \param category device category
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1953 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1954 * \return IBaseFilter interface for capture device with given index
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
1955 *
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1956 * Sample values for category:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1957 * CLSID_VideoInputDeviceCategory - Video Capture Sources
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1958 * CLSID_AudioInputDeviceCategory - Audio Capture Sources
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1959 * See DirectShow SDK documentation for other possible values
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1960 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1961 static IBaseFilter *find_capture_device(int index, REFCLSID category)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1962 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1963 IBaseFilter *pFilter = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1964 ICreateDevEnum *pDevEnum = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1965 IEnumMoniker *pClassEnum = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1966 IMoniker *pM;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1967 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1968 ULONG cFetched;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1969 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1970 char tmp[DEVICE_NAME_MAX_LEN + 1];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1971 hr = CoCreateInstance((GUID *) & CLSID_SystemDeviceEnum, NULL,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1972 CLSCTX_INPROC_SERVER, &IID_ICreateDevEnum,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1973 (void *) &pDevEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1974 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1975 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Unable to create device enumerator\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1976 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1977 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1978
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1979 hr = OLE_CALL_ARGS(pDevEnum, CreateClassEnumerator, category, &pClassEnum, 0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1980 OLE_RELEASE_SAFE(pDevEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1981 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1982 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Unable to create class enumerator\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1983 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1984 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1985 if (hr == S_FALSE) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1986 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: No capture devices found\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1987 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1988 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1989
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1990 OLE_CALL(pClassEnum,Reset);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1991 for (i = 0; OLE_CALL_ARGS(pClassEnum, Next, 1, &pM, &cFetched) == S_OK; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1992 if(get_device_name(pM, tmp, DEVICE_NAME_MAX_LEN)!=TVI_CONTROL_TRUE)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1993 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_UnableGetDeviceName, i);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1994 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1995 mp_msg(MSGT_TV, MSGL_V, MSGTR_TVI_DS_DeviceName, i, tmp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1996 if (index != -1 && i == index) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1997 mp_msg(MSGT_TV, MSGL_INFO, MSGTR_TVI_DS_UsingDevice, index, tmp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1998 hr = OLE_CALL_ARGS(pM, BindToObject, 0, 0, &IID_IBaseFilter,(void *) &pFilter);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
1999 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2000 pFilter = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2001 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2002 OLE_RELEASE_SAFE(pM);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2003 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2004 if (index != -1 && !pFilter) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2005 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_DeviceNotFound,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2006 index);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2007 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2008 OLE_RELEASE_SAFE(pClassEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2009
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2010 return pFilter;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2011 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2012
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2013 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2014 * \brief get array of available formats through call to IAMStreamConfig::GetStreamCaps
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2015 *
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2016 * \praram[in] chain chain data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2017 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2018 * \return S_OK success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2019 * \return E_POINTER one of parameters is NULL
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2020 * \return E_FAIL required size of buffer is unknown for given media type
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2021 * \return E_OUTOFMEMORY not enough memory
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2022 * \return other error code from called methods
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2023 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2024 * \remarks
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2025 * last items of chain->arpmt and chain->arStreamCaps will be NULL
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2026 */
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2027 static HRESULT get_available_formats_stream(chain_t *chain)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2028 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2029 AM_MEDIA_TYPE **arpmt;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2030 void **pBuf=NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2031
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2032 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2033 int i, count, size;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2034 int done;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2035
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2036 mp_msg(MSGT_TV, MSGL_DBG4,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2037 "tvi_dshow: get_available_formats_stream called\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2038
25090
7f044afbbb43 Remove no more needed check
voroshil
parents: 25089
diff changeset
2039 if (!chain->pStreamConfig)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2040 return E_POINTER;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2041
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2042 hr=OLE_CALL_ARGS(chain->pStreamConfig, GetNumberOfCapabilities, &count, &size);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2043 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2044 mp_msg(MSGT_TV, MSGL_DBG4,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2045 "tvi_dshow: Call to GetNumberOfCapabilities failed (get_available_formats_stream)\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2046 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2047 }
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2048 if (chain->type == video){
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2049 if (size != sizeof(VIDEO_STREAM_CONFIG_CAPS)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2050 mp_msg(MSGT_TV, MSGL_DBG4,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2051 "tvi_dshow: Wrong video structure size for GetNumberOfCapabilities (get_available_formats_stream)\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2052 return E_FAIL;
25089
791f867d0124 Fix totally wrong (due to mess of brackets) structures size check.
voroshil
parents: 25088
diff changeset
2053 }
791f867d0124 Fix totally wrong (due to mess of brackets) structures size check.
voroshil
parents: 25088
diff changeset
2054 } else if (chain->type == audio){
791f867d0124 Fix totally wrong (due to mess of brackets) structures size check.
voroshil
parents: 25088
diff changeset
2055 if (size != sizeof(AUDIO_STREAM_CONFIG_CAPS)) {
791f867d0124 Fix totally wrong (due to mess of brackets) structures size check.
voroshil
parents: 25088
diff changeset
2056 mp_msg(MSGT_TV, MSGL_DBG4,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2057 "tvi_dshow: Wrong audio structure size for GetNumberOfCapabilities (get_available_formats_stream)\n");
25089
791f867d0124 Fix totally wrong (due to mess of brackets) structures size check.
voroshil
parents: 25088
diff changeset
2058 return E_FAIL;
791f867d0124 Fix totally wrong (due to mess of brackets) structures size check.
voroshil
parents: 25088
diff changeset
2059 }
791f867d0124 Fix totally wrong (due to mess of brackets) structures size check.
voroshil
parents: 25088
diff changeset
2060 } else {
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2061 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_UnsupportedMediaType,"get_available_formats_stream");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2062 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2063 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2064 done = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2065
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
2066 arpmt = malloc((count + 1) * sizeof(AM_MEDIA_TYPE *));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2067 if (arpmt) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2068 memset(arpmt, 0, (count + 1) * sizeof(AM_MEDIA_TYPE *));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2069
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
2070 pBuf = malloc((count + 1) * sizeof(void *));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2071 if (pBuf) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2072 memset(pBuf, 0, (count + 1) * sizeof(void *));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2073
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2074 for (i = 0; i < count; i++) {
25127
6e039dd0b5d8 Revert r25089 (Ignore video formats which are supported by device
voroshil
parents: 25126
diff changeset
2075 pBuf[i] = malloc(size);
6e039dd0b5d8 Revert r25089 (Ignore video formats which are supported by device
voroshil
parents: 25126
diff changeset
2076
6e039dd0b5d8 Revert r25089 (Ignore video formats which are supported by device
voroshil
parents: 25126
diff changeset
2077 if (!pBuf[i])
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2078 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2079
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2080 hr = OLE_CALL_ARGS(chain->pStreamConfig, GetStreamCaps, i,
25127
6e039dd0b5d8 Revert r25089 (Ignore video formats which are supported by device
voroshil
parents: 25126
diff changeset
2081 &(arpmt[i]), pBuf[i]);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2082 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2083 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2084 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2085 if (i == count) {
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2086 chain->arpmt = arpmt;
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2087 chain->arStreamCaps = pBuf;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2088 done = 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2089 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2090 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2091 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2092 if (!done) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2093 for (i = 0; i < count; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2094 if (pBuf && pBuf[i])
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2095 free(pBuf[i]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2096 if (arpmt && arpmt[i])
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2097 DeleteMediaType(arpmt[i]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2098 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2099 if (pBuf)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2100 free(pBuf);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2101 if (arpmt)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2102 free(arpmt);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2103 if (hr != S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2104 mp_msg(MSGT_TV, MSGL_DBG4, "tvi_dshow: Call to GetStreamCaps failed (get_available_formats_stream)\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2105 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2106 } else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2107 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2108 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2109 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2110 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2111
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2112 /**
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2113 * \brief returns allocates an array and store available media formats for given pin type to it
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2114 *
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2115 * \param pBuilder ICaptureGraphBuilder2 interface of graph builder
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2116 * \param chain chain data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2117 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2118 * \return S_OK success
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2119 * \return E_POINTER one of given pointers is null
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2120 * \return apropriate error code otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2121 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2122 static HRESULT get_available_formats_pin(ICaptureGraphBuilder2 * pBuilder,
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2123 chain_t *chain)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2124 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2125 IEnumMediaTypes *pEnum;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2126 int i, count, size;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2127 ULONG cFetched;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2128 AM_MEDIA_TYPE *pmt;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2129 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2130 void **pBuf;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2131 AM_MEDIA_TYPE **arpmt; //This will be real array
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2132 VIDEO_STREAM_CONFIG_CAPS *pVideoCaps;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2133 AUDIO_STREAM_CONFIG_CAPS *pAudioCaps;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2134 int p1, p2, p3;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2135
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2136 mp_msg(MSGT_TV, MSGL_DBG4,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2137 "tvi_dshow: get_available_formats_pin called\n");
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2138 if (!pBuilder || !chain->pCaptureFilter)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2139 return E_POINTER;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2140
25093
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2141 if (!chain->pCapturePin)
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2142 {
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2143 hr = OLE_CALL_ARGS(pBuilder, FindPin,
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2144 (IUnknown *) chain->pCaptureFilter,
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2145 PINDIR_OUTPUT, &PIN_CATEGORY_CAPTURE,
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2146 chain->majortype, FALSE, 0, &chain->pCapturePin);
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2147
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2148 if (!chain->pCapturePin)
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2149 return E_POINTER;
e701372dad8b Fix mplayer crash caused by r25116
voroshil
parents: 25090
diff changeset
2150 }
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2151 if (chain->type == video) {
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2152 size = sizeof(VIDEO_STREAM_CONFIG_CAPS);
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2153 } else if (chain->type == audio) {
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2154 size = sizeof(AUDIO_STREAM_CONFIG_CAPS);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2155 } else {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2156 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_UnsupportedMediaType,"get_available_formats_pin");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2157 return E_FAIL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2158 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2159
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2160 hr = OLE_CALL_ARGS(chain->pCapturePin, EnumMediaTypes, &pEnum);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2161 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2162 mp_msg(MSGT_TV, MSGL_DBG4,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2163 "tvi_dshow: Call to EnumMediaTypes failed (get_available_formats_pin)\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2164 return hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2165 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2166 for (i = 0; OLE_CALL_ARGS(pEnum, Next, 1, &pmt, &cFetched) == S_OK; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2167 if (!pmt)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2168 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2169 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2170 OLE_CALL(pEnum,Reset);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2171
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2172 count = i;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
2173 arpmt = malloc((count + 1) * sizeof(AM_MEDIA_TYPE *));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2174 if (!arpmt)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2175 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2176 memset(arpmt, 0, (count + 1) * sizeof(AM_MEDIA_TYPE *));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2177
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2178 for (i = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2179 i < count
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2180 && OLE_CALL_ARGS(pEnum, Next, 1, &(arpmt[i]), &cFetched) == S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2181 i++);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2182
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2183 OLE_RELEASE_SAFE(pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2184
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2185
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30305
diff changeset
2186 pBuf = malloc((count + 1) * sizeof(void *));
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2187 if (!pBuf) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2188 for (i = 0; i < count; i++)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2189 if (arpmt[i])
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2190 DeleteMediaType(arpmt[i]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2191 free(arpmt);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2192 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2193 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2194 memset(pBuf, 0, (count + 1) * sizeof(void *));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2195
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2196 for (i = 0; i < count; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2197 pBuf[i] = malloc(size);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2198 if (!pBuf[i])
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2199 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2200 memset(pBuf[i], 0, size);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2201
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2202 if (chain->type == video) {
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2203 pVideoCaps = (VIDEO_STREAM_CONFIG_CAPS *) pBuf[i];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2204 extract_video_format(arpmt[i], NULL, &p1, &p2);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2205 pVideoCaps->MaxOutputSize.cx = pVideoCaps->MinOutputSize.cx =
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2206 p1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2207 pVideoCaps->MaxOutputSize.cy = pVideoCaps->MinOutputSize.cy =
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2208 p2;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2209 } else {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2210 pAudioCaps = (AUDIO_STREAM_CONFIG_CAPS *) pBuf[i];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2211 extract_audio_format(arpmt[i], &p1, &p2, &p3);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2212 pAudioCaps->MaximumSampleFrequency =
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2213 pAudioCaps->MinimumSampleFrequency = p1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2214 pAudioCaps->MaximumBitsPerSample =
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2215 pAudioCaps->MinimumBitsPerSample = p2;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2216 pAudioCaps->MaximumChannels = pAudioCaps->MinimumChannels = p3;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2217 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2218
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2219 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2220 if (i != count) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2221 for (i = 0; i < count; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2222 if (arpmt[i])
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2223 DeleteMediaType(arpmt[i]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2224 if (pBuf[i])
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2225 free(pBuf[i]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2226 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2227 free(arpmt);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2228 free(pBuf);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2229 return E_OUTOFMEMORY;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2230 }
25088
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2231 chain->arpmt = arpmt;
554bbb45a2f2 Replace several parameters for get_available_formats_stream
voroshil
parents: 25087
diff changeset
2232 chain->arStreamCaps = pBuf;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2233
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2234 return S_OK;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2235 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2236
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2237 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2238 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2239 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2240 * Public methods
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2241 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2242 *---------------------------------------------------------------------------------------
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2243 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2244 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2245 * \brief fills given buffer with audio data (usually one block)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2246 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2247 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2248 * \param buffer buffer to store data to
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2249 * \param len buffer's size in bytes (usually one block size)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2250 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2251 * \return audio pts if audio present, 1 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2252 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2253 static double grab_audio_frame(priv_t * priv, char *buffer, int len)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2254 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2255 int bytes = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2256 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2257 double pts;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2258 grabber_ringbuffer_t *rb = priv->chains[1]->rbuf;
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2259 grabber_ringbuffer_t *vrb = priv->chains[0]->rbuf;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2260
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2261 if (!rb || !rb->ringbuffer)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2262 return 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2263
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2264 if(vrb && vrb->tStart<0){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2265 memset(buffer,0,len);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2266 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2267 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2268 if(vrb && rb->tStart<0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2269 rb->tStart=vrb->tStart;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2270
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2271 if (len < rb->blocksize)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2272 bytes = len;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2273 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2274 bytes = rb->blocksize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2275
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2276 mp_msg(MSGT_TV, MSGL_DBG3,"tvi_dshow: FillBuffer (audio) called. %d blocks in buffer, %d bytes requested\n",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2277 rb->count, len);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2278 if(!rb->count){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2279 mp_msg(MSGT_TV,MSGL_DBG4,"tvi_dshow: waiting for frame\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2280 for(i=0;i<1000 && !rb->count;i++) usec_sleep(1000);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2281 if(!rb->count){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2282 mp_msg(MSGT_TV,MSGL_DBG4,"tvi_dshow: waiting timeout\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2283 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2284 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2285 mp_msg(MSGT_TV,MSGL_DBG4,"tvi_dshow: got frame!\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2286 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2287
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2288 EnterCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2289 pts=rb->dpts[rb->head]-rb->tStart;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2290 memcpy(buffer, rb->ringbuffer[rb->head], bytes);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2291 rb->head = (rb->head + 1) % rb->buffersize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2292 rb->count--;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2293 LeaveCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2294 return pts;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2295 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2296
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2297 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2298 * \brief returns audio frame size
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2299 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2300 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2301 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2302 * \return audio block size if audio enabled and 1 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2303 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2304 static int get_audio_framesize(priv_t * priv)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2305 {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2306 if (!priv->chains[1]->rbuf)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2307 return 1; //no audio
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2308 mp_msg(MSGT_TV,MSGL_DBG3,"get_audio_framesize: %d\n",priv->chains[1]->rbuf->blocksize);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2309 return priv->chains[1]->rbuf->blocksize;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2310 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2311
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2312 static int vbi_get_props(priv_t* priv,tt_stream_props* ptsp)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2313 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2314 if(!priv || !ptsp)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2315 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2316
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2317 //STUBS!!!
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2318 ptsp->interlaced=0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2319 ptsp->offset=256;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2320
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2321 ptsp->sampling_rate=27e6;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2322 ptsp->samples_per_line=720;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2323
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2324 ptsp->count[0]=16;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2325 ptsp->count[1]=16;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2326 //END STUBS!!!
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2327 ptsp->bufsize = ptsp->samples_per_line * (ptsp->count[0] + ptsp->count[1]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2328
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2329 mp_msg(MSGT_TV,MSGL_V,"vbi_get_props: sampling_rate=%d,offset:%d,samples_per_line: %d\n interlaced:%s, count=[%d,%d]\n",
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2330 ptsp->sampling_rate,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2331 ptsp->offset,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2332 ptsp->samples_per_line,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2333 ptsp->interlaced?"Yes":"No",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2334 ptsp->count[0],
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2335 ptsp->count[1]);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2336
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2337 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2338 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2339
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2340 static void vbi_grabber(priv_t* priv)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2341 {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2342 grabber_ringbuffer_t *rb = priv->chains[2]->rbuf;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2343 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2344 unsigned char* buf;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2345 if (!rb || !rb->ringbuffer)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2346 return;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2347
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2348 buf=calloc(1,rb->blocksize);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2349 for(i=0; i<23 && rb->count; i++){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2350 memcpy(buf,rb->ringbuffer[rb->head],rb->blocksize);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2351 teletext_control(priv->priv_vbi,TV_VBI_CONTROL_DECODE_PAGE,&buf);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2352 rb->head = (rb->head + 1) % rb->buffersize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2353 rb->count--;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2354 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2355 free(buf);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2356 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2357
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2358 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2359 * \brief fills given buffer with video data (usually one frame)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2360 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2361 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2362 * \param buffer buffer to store data to
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2363 * \param len buffer's size in bytes (usually one frame size)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2364 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2365 * \return frame size if video present, 0 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2366 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2367 static double grab_video_frame(priv_t * priv, char *buffer, int len)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2368 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2369 int bytes = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2370 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2371 double pts;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2372 grabber_ringbuffer_t *rb = priv->chains[0]->rbuf;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2373
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2374 if (!rb || !rb->ringbuffer)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2375 return 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2376 if (len < rb->blocksize)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2377 bytes = len;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2378 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2379 bytes = rb->blocksize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2380
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2381 mp_msg(MSGT_TV, MSGL_DBG3,"tvi_dshow: FillBuffer (video) called. %d blocks in buffer, %d bytes requested\n",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2382 rb->count, len);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2383 if(!rb->count){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2384 mp_msg(MSGT_TV,MSGL_DBG4,"tvi_dshow: waiting for frame\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2385 for(i=0;i<1000 && !rb->count;i++) usec_sleep(1000);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2386 if(!rb->count){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2387 mp_msg(MSGT_TV,MSGL_DBG4,"tvi_dshow: waiting timeout\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2388 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2389 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2390 mp_msg(MSGT_TV,MSGL_DBG4,"tvi_dshow: got frame!\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2391 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2392 EnterCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2393 if(rb->tStart<0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2394 rb->tStart=rb->dpts[rb->head];
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2395 pts=rb->dpts[rb->head]-rb->tStart;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2396 memcpy(buffer, rb->ringbuffer[rb->head], bytes);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2397 rb->head = (rb->head + 1) % rb->buffersize;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2398 rb->count--;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2399 LeaveCriticalSection(rb->pMutex);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2400
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2401 vbi_grabber(priv);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2402 return pts;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2403 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2404
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2405 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2406 * \brief returns frame size
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2407 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2408 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2409 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2410 * \return frame size if video present, 0 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2411 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2412 static int get_video_framesize(priv_t * priv)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2413 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2414 // if(!priv->pmtVideo) return 1; //no video
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
2415 // return priv->pmtVideo->lSampleSize;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2416 if (!priv->chains[0]->rbuf)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2417 return 1; //no video
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2418 mp_msg(MSGT_TV,MSGL_DBG3,"geT_video_framesize: %d\n",priv->chains[0]->rbuf->blocksize);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2419 return priv->chains[0]->rbuf->blocksize;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2420 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2421
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2422 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2423 * \brief calculate audio buffer size
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2424 * \param video_buf_size size of video buffer in bytes
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2425 * \param video_bitrate video bit rate
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2426 * \param audio_bitrate audio bit rate
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2427 * \return audio buffer isze in bytes
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2428 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2429 * \remarks length of video buffer and resulted audio buffer calculated in
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2430 * seconds will be the same.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2431 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2432 static inline int audio_buf_size_from_video(int video_buf_size, int video_bitrate, int audio_bitrate)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2433 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2434 int audio_buf_size = audio_bitrate * (video_buf_size / video_bitrate);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2435 mp_msg(MSGT_TV,MSGL_DBG2,"tvi_dshow: Audio capture buffer: %d * %d / %d = %d\n",
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2436 audio_bitrate,video_buf_size,video_bitrate,audio_buf_size);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2437 return audio_buf_size;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2438 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2439
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2440 /**
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2441 * \brief common chain initialization routine
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2442 * \param chain chain data structure
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2443 *
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2444 * \note pCaptureFilter member should be initialized before call to this routine
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2445 */
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2446 static HRESULT init_chain_common(ICaptureGraphBuilder2 *pBuilder, chain_t *chain)
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2447 {
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2448 HRESULT hr;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2449 int i;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2450
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2451 if(!chain->pCaptureFilter)
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2452 return E_POINTER;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2453
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2454 show_filter_info(chain->pCaptureFilter);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2455
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2456 hr = OLE_CALL_ARGS(pBuilder, FindPin,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2457 (IUnknown *) chain->pCaptureFilter,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2458 PINDIR_OUTPUT, chain->pin_category,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2459 chain->majortype, FALSE, 0, &chain->pCapturePin);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2460
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2461 if (FAILED(hr)) {
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2462 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: FindPin(pCapturePin) call failed. Error:0x%x\n", (unsigned int)hr);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2463 return hr;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2464 }
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2465
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2466 hr = OLE_CALL_ARGS(pBuilder, FindInterface,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2467 chain->pin_category,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2468 chain->majortype,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2469 chain->pCaptureFilter,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2470 &IID_IAMStreamConfig,
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2471 (void **) &(chain->pStreamConfig));
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2472 if (FAILED(hr))
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2473 chain->pStreamConfig = NULL;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2474
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2475 /*
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2476 Getting available video formats (last pointer in array will be NULL)
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2477 First tryin to call IAMStreamConfig::GetStreamCaos. this will give us additional information such as
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2478 min/max picture dimensions, etc. If this call fails trying IPIn::EnumMediaTypes with default
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2479 min/max values.
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2480 */
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2481 hr = get_available_formats_stream(chain);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2482 if (FAILED(hr)) {
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2483 mp_msg(MSGT_TV, MSGL_DBG2, "Unable to use IAMStreamConfig for retriving available formats (Error:0x%x). Using EnumMediaTypes instead\n", (unsigned int)hr);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2484 hr = get_available_formats_pin(pBuilder, chain);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2485 if(FAILED(hr)){
25125
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2486 return hr;
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2487 }
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2488 }
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2489 chain->nFormatUsed = 0;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2490
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2491 //If argument to CreateMediaType is NULL then result will be NULL too.
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2492 chain->pmt = CreateMediaType(chain->arpmt[0]);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2493
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2494 for (i = 0; chain->arpmt[i]; i++)
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2495 DisplayMediaType("Available format", chain->arpmt[i]);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2496
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2497 return S_OK;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2498 }
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2499 /**
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2500 * \brief build video stream chain in graph
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2501 * \param priv private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2502 *
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2503 * \return S_OK if chain was built successfully, apropriate error code otherwise
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2504 */
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2505 static HRESULT build_video_chain(priv_t *priv)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2506 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2507 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2508
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2509 if(priv->chains[0]->rbuf)
25059
501f31700e77 Prevent chains from building more than once.
voroshil
parents: 25058
diff changeset
2510 return S_OK;
501f31700e77 Prevent chains from building more than once.
voroshil
parents: 25058
diff changeset
2511
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2512 if (priv->chains[0]->pStreamConfig) {
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2513 hr = OLE_CALL_ARGS(priv->chains[0]->pStreamConfig, SetFormat, priv->chains[0]->pmt);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2514 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2515 mp_msg(MSGT_TV,MSGL_ERR,MSGTR_TVI_DS_UnableSelectVideoFormat, (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2516 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2517 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2518
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2519 priv->chains[0]->rbuf=calloc(1,sizeof(grabber_ringbuffer_t));
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2520 if(!priv->chains[0]->rbuf)
25058
ac9507b338ac Handle "out of memory" error.
voroshil
parents: 25057
diff changeset
2521 return E_OUTOFMEMORY;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2522
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2523 if (priv->tv_param->buffer_size >= 0) {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2524 priv->chains[0]->rbuf->buffersize = priv->tv_param->buffer_size;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2525 } else {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2526 priv->chains[0]->rbuf->buffersize = 16;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2527 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2528
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2529 priv->chains[0]->rbuf->buffersize *= 1024 * 1024;
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
2530 hr=build_sub_graph(priv, priv->chains[0], &PIN_CATEGORY_CAPTURE);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2531 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2532 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_UnableBuildVideoSubGraph,(unsigned int)hr);
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2533 return hr;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2534 }
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2535 return S_OK;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2536 }
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2537
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2538 /**
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2539 * \brief build audio stream chain in graph
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2540 * \param priv private data structure
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2541 *
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2542 * \return S_OK if chain was built successfully, apropriate error code otherwise
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2543 */
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2544 static HRESULT build_audio_chain(priv_t *priv)
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2545 {
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2546 HRESULT hr;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2547
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2548 if(priv->chains[1]->rbuf)
25059
501f31700e77 Prevent chains from building more than once.
voroshil
parents: 25058
diff changeset
2549 return S_OK;
501f31700e77 Prevent chains from building more than once.
voroshil
parents: 25058
diff changeset
2550
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2551 if(priv->immediate_mode)
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2552 return S_OK;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2553
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2554 if (priv->chains[1]->pStreamConfig) {
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2555 hr = OLE_CALL_ARGS(priv->chains[1]->pStreamConfig, SetFormat,
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2556 priv->chains[1]->pmt);
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2557 if (FAILED(hr)) {
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2558 mp_msg(MSGT_TV,MSGL_ERR,MSGTR_TVI_DS_UnableSelectAudioFormat, (unsigned int)hr);
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2559 }
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2560 }
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2561
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2562 if(priv->chains[1]->pmt){
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2563 priv->chains[1]->rbuf=calloc(1,sizeof(grabber_ringbuffer_t));
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2564 if(!priv->chains[1]->rbuf)
25058
ac9507b338ac Handle "out of memory" error.
voroshil
parents: 25057
diff changeset
2565 return E_OUTOFMEMORY;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2566
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2567 /* let the audio buffer be the same size (in seconds) than video one */
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2568 priv->chains[1]->rbuf->buffersize=audio_buf_size_from_video(
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2569 priv->chains[0]->rbuf->buffersize,
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2570 (((VIDEOINFOHEADER *) priv->chains[0]->pmt->pbFormat)->dwBitRate),
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2571 (((WAVEFORMATEX *) (priv->chains[1]->pmt->pbFormat))->nAvgBytesPerSec));
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2572
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
2573 hr=build_sub_graph(priv, priv->chains[1],&PIN_CATEGORY_CAPTURE);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2574 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2575 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_UnableBuildAudioSubGraph,(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2576 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2577 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2578 }
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2579 return S_OK;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2580 }
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2581
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2582 /**
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2583 * \brief build VBI stream chain in graph
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2584 * \param priv private data structure
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2585 *
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2586 * \return S_OK if chain was built successfully, apropriate error code otherwise
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2587 */
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2588 static HRESULT build_vbi_chain(priv_t *priv)
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2589 {
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2590 HRESULT hr;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2591
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2592 if(priv->chains[2]->rbuf)
25059
501f31700e77 Prevent chains from building more than once.
voroshil
parents: 25058
diff changeset
2593 return S_OK;
501f31700e77 Prevent chains from building more than once.
voroshil
parents: 25058
diff changeset
2594
29806
a5e7590ffdbd Separate teletext from tv support.
cehoyos
parents: 29760
diff changeset
2595 if(priv->tv_param->teletext.device)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2596 {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2597 priv->chains[2]->rbuf=calloc(1,sizeof(grabber_ringbuffer_t));
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2598 if(!priv->chains[2]->rbuf)
25058
ac9507b338ac Handle "out of memory" error.
voroshil
parents: 25057
diff changeset
2599 return E_OUTOFMEMORY;
ac9507b338ac Handle "out of memory" error.
voroshil
parents: 25057
diff changeset
2600
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2601 init_ringbuffer(priv->chains[2]->rbuf,24,priv->tsp.bufsize);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2602
25084
f72ebba1e6d1 pass chain structure instead of several variables to build_sub_graph
voroshil
parents: 25083
diff changeset
2603 hr=build_sub_graph(priv, priv->chains[2],&PIN_CATEGORY_VBI);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2604 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2605 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_UnableBuildVBISubGraph,(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2606 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2607 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2608 }
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2609 return S_OK;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2610 }
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2611
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2612 /**
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2613 * \brief playback/capture real start
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2614 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2615 * \param priv driver's private data structure
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2616 *
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2617 * \return 1 if success, 0 - otherwise
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2618 *
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2619 * TODO: move some code from init() here
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2620 */
25057
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2621 static int start(priv_t * priv)
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2622 {
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2623 HRESULT hr;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2624
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2625 hr = build_video_chain(priv);
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2626 if(FAILED(hr))
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2627 return 0;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2628
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2629 hr = build_audio_chain(priv);
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2630 if(FAILED(hr))
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2631 return 0;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2632
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2633 hr = build_vbi_chain(priv);
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2634 if(FAILED(hr))
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2635 return 0;
7d74c1a2c840 Move chains building code into separate routines.
voroshil
parents: 25054
diff changeset
2636
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2637 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2638 Graph is ready to capture. Starting graph.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2639 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2640 if (mp_msg_test(MSGT_TV, MSGL_DBG2)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2641 mp_msg(MSGT_TV, MSGL_DBG2, "Debug pause 10sec\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2642 usec_sleep(10000000);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2643 mp_msg(MSGT_TV, MSGL_DBG2, "Debug pause end\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2644 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2645 if (!priv->pMediaControl) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2646 mp_msg(MSGT_TV,MSGL_ERR,MSGTR_TVI_DS_UnableGetMediaControlInterface,(unsigned int)E_POINTER);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2647 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2648 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2649 hr = OLE_CALL(priv->pMediaControl, Run);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2650 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2651 mp_msg(MSGT_TV,MSGL_ERR,MSGTR_TVI_DS_UnableStartGraph, (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2652 return 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2653 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2654 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Graph is started.\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2655 priv->state = 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2656
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
2657 return 1;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2658 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2659
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2660 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2661 * \brief driver initialization
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2662 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2663 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2664 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2665 * \return 1 if success, 0 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2666 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2667 static int init(priv_t * priv)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2668 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2669 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2670 int result = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2671 long lInput, lTunerInput;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2672 IEnumFilters *pEnum;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2673 IBaseFilter *pFilter;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2674 IPin *pVPOutPin;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2675 int i;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2676
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2677 priv->state=0;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2678
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2679 CoInitialize(NULL);
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2680
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2681 for(i=0; i<3;i++)
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2682 priv->chains[i] = calloc(1, sizeof(chain_t));
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2683
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2684 priv->chains[0]->type=video;
25080
bfebab93b11e Add major media type to chain structure
voroshil
parents: 25079
diff changeset
2685 priv->chains[0]->majortype=&MEDIATYPE_Video;
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2686 priv->chains[0]->pin_category=&PIN_CATEGORY_CAPTURE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2687 priv->chains[1]->type=audio;
25080
bfebab93b11e Add major media type to chain structure
voroshil
parents: 25079
diff changeset
2688 priv->chains[1]->majortype=&MEDIATYPE_Audio;
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2689 priv->chains[1]->pin_category=&PIN_CATEGORY_CAPTURE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2690 priv->chains[2]->type=vbi;
25080
bfebab93b11e Add major media type to chain structure
voroshil
parents: 25079
diff changeset
2691 priv->chains[2]->majortype=&MEDIATYPE_VBI;
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2692 priv->chains[2]->pin_category=&PIN_CATEGORY_VBI;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2693
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2694 do{
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2695 hr = CoCreateInstance((GUID *) & CLSID_FilterGraph, NULL,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2696 CLSCTX_INPROC_SERVER, &IID_IGraphBuilder,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2697 (void **) &priv->pGraph);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2698 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2699 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: CoCreateInstance(FilterGraph) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2700 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2701 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2702 //Debug
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2703 if (mp_msg_test(MSGT_TV, MSGL_DBG2)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2704 AddToRot((IUnknown *) priv->pGraph, &(priv->dwRegister));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2705 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2706
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2707 hr = CoCreateInstance((GUID *) & CLSID_CaptureGraphBuilder2, NULL,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2708 CLSCTX_INPROC_SERVER, &IID_ICaptureGraphBuilder2,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2709 (void **) &priv->pBuilder);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2710 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2711 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: CoCreateInstance(CaptureGraphBuilder) call failed. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2712 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2713 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2714
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2715 hr = OLE_CALL_ARGS(priv->pBuilder, SetFiltergraph, priv->pGraph);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2716 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2717 mp_msg(MSGT_TV,MSGL_ERR, "tvi_dshow: SetFiltergraph call failed. Error:0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2718 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2719 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
2720
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2721 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Searching for available video capture devices\n");
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2722 priv->chains[0]->pCaptureFilter = find_capture_device(priv->dev_index, &CLSID_VideoInputDeviceCategory);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2723 if(!priv->chains[0]->pCaptureFilter){
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2724 mp_msg(MSGT_TV,MSGL_ERR, MSGTR_TVI_DS_NoVideoCaptureDevice);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2725 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2726 }
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2727 hr = OLE_CALL_ARGS(priv->pGraph, AddFilter, priv->chains[0]->pCaptureFilter, NULL);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2728 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2729 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Unable to add video capture device to Directshow graph. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2730 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2731 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2732 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Searching for available audio capture devices\n");
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2733 if (priv->adev_index != -1) {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2734 priv->chains[1]->pCaptureFilter = find_capture_device(priv->adev_index, &CLSID_AudioInputDeviceCategory); //output available audio edevices
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2735 if(!priv->chains[1]->pCaptureFilter){
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2736 mp_msg(MSGT_TV,MSGL_ERR, MSGTR_TVI_DS_NoAudioCaptureDevice);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2737 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2738 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2739
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2740 hr = OLE_CALL_ARGS(priv->pGraph, AddFilter, priv->chains[1]->pCaptureFilter, NULL);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2741 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2742 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: Unable to add audio capture device to Directshow graph. Error:0x%x\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2743 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2744 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2745 } else
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2746 hr = OLE_QUERYINTERFACE(priv->chains[0]->pCaptureFilter, IID_IBaseFilter, priv->chains[1]->pCaptureFilter);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2747
25082
b63b4b599cbe Add capture filter's pointer to vbi chain structure too.
voroshil
parents: 25081
diff changeset
2748 /* increase refrence counter for capture filter ad store pointer into vbi chain structure too */
b63b4b599cbe Add capture filter's pointer to vbi chain structure too.
voroshil
parents: 25081
diff changeset
2749 hr = OLE_QUERYINTERFACE(priv->chains[0]->pCaptureFilter, IID_IBaseFilter, priv->chains[2]->pCaptureFilter);
b63b4b599cbe Add capture filter's pointer to vbi chain structure too.
voroshil
parents: 25081
diff changeset
2750
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2751 hr = OLE_QUERYINTERFACE(priv->chains[0]->pCaptureFilter, IID_IAMVideoProcAmp,priv->pVideoProcAmp);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2752 if (FAILED(hr) && hr != E_NOINTERFACE)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2753 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Get IID_IAMVideoProcAmp failed (0x%x).\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2754
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2755 if (hr != S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2756 mp_msg(MSGT_TV, MSGL_INFO, MSGTR_TVI_DS_VideoAdjustigNotSupported);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2757 priv->pVideoProcAmp = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2758 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2759
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2760 hr = OLE_CALL_ARGS(priv->pBuilder, FindInterface,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2761 &PIN_CATEGORY_CAPTURE,
25080
bfebab93b11e Add major media type to chain structure
voroshil
parents: 25079
diff changeset
2762 priv->chains[0]->majortype,
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2763 priv->chains[0]->pCaptureFilter,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2764 &IID_IAMCrossbar, (void **) &(priv->pCrossbar));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2765 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2766 mp_msg(MSGT_TV, MSGL_INFO, MSGTR_TVI_DS_SelectingInputNotSupported);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2767 priv->pCrossbar = NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2768 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2769
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2770 if (priv->tv_param->amode >= 0) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2771 IAMTVAudio *pTVAudio;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2772 hr = OLE_CALL_ARGS(priv->pBuilder, FindInterface, NULL, NULL,priv->chains[0]->pCaptureFilter,&IID_IAMTVAudio, (void *) &pTVAudio);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2773 if (hr == S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2774 switch (priv->tv_param->amode) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2775 case 0:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2776 hr = OLE_CALL_ARGS(pTVAudio, put_TVAudioMode, AMTVAUDIO_MODE_MONO);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2777 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2778 case 1:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2779 hr = OLE_CALL_ARGS(pTVAudio, put_TVAudioMode, AMTVAUDIO_MODE_STEREO);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2780 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2781 case 2:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2782 hr = OLE_CALL_ARGS(pTVAudio, put_TVAudioMode,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2783 AMTVAUDIO_MODE_LANG_A);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2784 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2785 case 3:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2786 hr = OLE_CALL_ARGS(pTVAudio, put_TVAudioMode,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2787 AMTVAUDIO_MODE_LANG_B);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2788 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2789 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2790 OLE_RELEASE_SAFE(pTVAudio);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2791 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2792 mp_msg(MSGT_TV, MSGL_WARN, MSGTR_TVI_DS_UnableSetAudioMode, priv->tv_param->amode,(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2793 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2794 }
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2795
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2796 // Video chain initialization
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2797 hr = init_chain_common(priv->pBuilder, priv->chains[0]);
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2798 if(FAILED(hr))
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2799 break;
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2800
25125
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2801 /*
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2802 Audio chain initialization
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2803 Since absent audio stream is not fatal,
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2804 at least one NULL pointer should be kept in format arrays
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2805 (to avoid another additional check everywhere for array presence).
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2806 */
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2807 hr = init_chain_common(priv->pBuilder, priv->chains[1]);
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2808 if(FAILED(hr))
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2809 {
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2810 mp_msg(MSGT_TV, MSGL_V, "tvi_dshow: Unable to initialize audio chain (Error:0x%x). Audio disabled\n", (unsigned long)hr);
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2811 priv->chains[1]->arpmt=calloc(1, sizeof(AM_MEDIA_TYPE*));
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2812 priv->chains[1]->arStreamCaps=calloc(1, sizeof(void*));
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2813 }
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2814
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2815 /*
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2816 VBI chain initialization
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2817 Since absent VBI stream is not fatal,
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2818 at least one NULL pointer should be kept in format arrays
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2819 (to avoid another additional check everywhere for array presence).
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2820 */
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2821 hr = init_chain_common(priv->pBuilder, priv->chains[2]);
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2822 if(FAILED(hr))
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2823 {
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2824 mp_msg(MSGT_TV, MSGL_V, "tvi_dshow: Unable to initialize VBI chain (Error:0x%x). Teletext disabled\n", (unsigned long)hr);
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2825 priv->chains[2]->arpmt=calloc(1, sizeof(AM_MEDIA_TYPE*));
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2826 priv->chains[2]->arStreamCaps=calloc(1, sizeof(void*));
a1e6345207a1 §³reate empty format arrays in case of error in init_chain_common.
voroshil
parents: 25105
diff changeset
2827 }
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2828
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2829 if (!priv->chains[0]->pStreamConfig)
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2830 mp_msg(MSGT_TV, MSGL_INFO, MSGTR_TVI_DS_ChangingWidthHeightNotSupported);
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2831
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2832 if (!priv->chains[0]->arpmt[priv->chains[0]->nFormatUsed]
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2833 || !extract_video_format(priv->chains[0]->arpmt[priv->chains[0]->nFormatUsed],
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2834 &(priv->fcc), &(priv->width),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2835 &(priv->height))) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2836 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_ErrorParsingVideoFormatStruct);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2837 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2838 }
25094
e27cb70d2302 Move code related to chain initialization and similar
voroshil
parents: 25093
diff changeset
2839
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2840 if (priv->chains[1]->arpmt[priv->chains[1]->nFormatUsed]) {
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2841 if (!extract_audio_format(priv->chains[1]->pmt, &(priv->samplerate), NULL, NULL)) {
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2842 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_ErrorParsingAudioFormatStruct);
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2843 DisplayMediaType("audio format failed",priv->chains[1]->arpmt[priv->chains[1]->nFormatUsed]);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2844 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2845 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2846 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2847
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2848 hr = OLE_QUERYINTERFACE(priv->pGraph, IID_IMediaControl,priv->pMediaControl);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2849 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2850 mp_msg(MSGT_TV,MSGL_ERR, MSGTR_TVI_DS_UnableGetMediaControlInterface,(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2851 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2852 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2853 hr = OLE_CALL_ARGS(priv->pBuilder, FindInterface,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2854 &PIN_CATEGORY_CAPTURE, NULL,
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2855 priv->chains[0]->pCaptureFilter,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2856 &IID_IAMTVTuner, (void **) &(priv->pTVTuner));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2857
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2858 if (!priv->pTVTuner) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2859 mp_msg(MSGT_TV, MSGL_DBG2, "tvi_dshow: Unable to access IAMTVTuner (0x%x)\n", (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2860 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2861
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2862 // shows Tuner capabilities
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2863 get_capabilities(priv);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2864
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2865 if (priv->pTVTuner) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2866 hr = OLE_CALL_ARGS(priv->pTVTuner, put_CountryCode,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2867 chanlist2country(priv->tv_param->chanlist));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2868 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2869 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: Call to put_CountryCode failed. Error:0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2870 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2871
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2872 hr = OLE_CALL_ARGS(priv->pTVTuner, put_Mode, AMTUNER_MODE_TV);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2873 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2874 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: Call to put_Mode failed. Error:0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2875 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2876 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2877
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2878 hr = OLE_CALL_ARGS(priv->pTVTuner, get_ConnectInput, &lInput);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2879 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2880 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: Call to get_ConnectInput failed. Error:0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2881 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2882 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2883
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2884 /* small hack */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2885 lTunerInput = strstr(priv->tv_param->chanlist, "cable") ? TunerInputCable : TunerInputAntenna;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2886
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2887 hr = OLE_CALL_ARGS(priv->pTVTuner, put_InputType, lInput, lTunerInput);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2888 if(FAILED(hr)){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2889 mp_msg(MSGT_TV,MSGL_DBG2, "tvi_dshow: Call to put_InputType failed. Error:0x%x\n",(unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2890 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2891 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2892
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2893 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2894
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2895 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2896 for VIVO cards we should check if preview pin is available on video capture device.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2897 If it is not, we have to connect Video Port Manager filter to VP pin of capture device filter.
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2898 Otherwise we will get 0x8007001f (Device is not functioning properly) when attempting to start graph
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2899 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2900 hr = OLE_CALL_ARGS(priv->pBuilder, FindPin,
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
2901 (IUnknown *) priv->chains[0]->pCaptureFilter,
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2902 PINDIR_OUTPUT,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2903 &PIN_CATEGORY_VIDEOPORT, NULL, FALSE,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2904 0, (IPin **) & pVPOutPin);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2905 if (SUCCEEDED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2906 hr = OLE_CALL_ARGS(priv->pGraph, Render, pVPOutPin);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2907 OLE_RELEASE_SAFE(pVPOutPin);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2908
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2909 if (FAILED(hr)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2910 mp_msg(MSGT_TV,MSGL_ERR, MSGTR_TVI_DS_UnableTerminateVPPin, (unsigned int)hr);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2911 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2912 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2913 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2914
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2915 OLE_CALL_ARGS(priv->pGraph, EnumFilters, &pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2916 while (OLE_CALL_ARGS(pEnum, Next, 1, &pFilter, NULL) == S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2917 LPVIDEOWINDOW pVideoWindow;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2918 hr = OLE_QUERYINTERFACE(pFilter, IID_IVideoWindow, pVideoWindow);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2919 if (SUCCEEDED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2920 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2921 if(priv->tv_param->hidden_vp_renderer){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2922 OLE_CALL_ARGS(pVideoWindow,put_Visible,/* OAFALSE*/ 0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2923 OLE_CALL_ARGS(pVideoWindow,put_AutoShow,/* OAFALSE*/ 0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2924 }else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2925 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2926 OLE_CALL_ARGS(priv->pGraph, RemoveFilter, pFilter);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2927 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2928 OLE_RELEASE_SAFE(pVideoWindow);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2929 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2930 OLE_RELEASE_SAFE(pFilter);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2931 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2932 OLE_RELEASE_SAFE(pEnum);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2933 if(priv->tv_param->system_clock)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2934 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2935 LPREFERENCECLOCK rc;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2936 IBaseFilter* pBF;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2937 hr = CoCreateInstance((GUID *) & CLSID_SystemClock, NULL,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2938 CLSCTX_INPROC_SERVER, &IID_IReferenceClock,
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2939 (void *) &rc);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2940
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2941 OLE_QUERYINTERFACE(priv->pBuilder,IID_IBaseFilter,pBF);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2942 OLE_CALL_ARGS(pBF,SetSyncSource,rc);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2943 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2944 if(vbi_get_props(priv,&(priv->tsp))!=TVI_CONTROL_TRUE)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2945 break;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2946 result = 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2947 } while(0);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2948
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2949 if (!result){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2950 mp_msg(MSGT_TV,MSGL_ERR, MSGTR_TVI_DS_GraphInitFailure);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2951 uninit(priv);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2952 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2953 return result;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2954 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2955
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
2956 /**
25085
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2957 * \brief chain uninitialization
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2958 * \param chain chain data structure
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2959 */
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2960 static void destroy_chain(chain_t *chain)
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2961 {
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2962 int i;
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2963
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2964 if(!chain)
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2965 return;
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2966
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2967 OLE_RELEASE_SAFE(chain->pStreamConfig);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2968 OLE_RELEASE_SAFE(chain->pCaptureFilter);
25086
e91503fbf524 Move pointer to SampleGrabber filter into chain structure.
voroshil
parents: 25085
diff changeset
2969 OLE_RELEASE_SAFE(chain->pCSGCB);
25087
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
2970 OLE_RELEASE_SAFE(chain->pCapturePin);
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
2971 OLE_RELEASE_SAFE(chain->pSGIn);
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
2972 OLE_RELEASE_SAFE(chain->pSG);
edc7391db7f5 New routine for reconnecting two pins with new media type
voroshil
parents: 25086
diff changeset
2973 OLE_RELEASE_SAFE(chain->pSGF);
25086
e91503fbf524 Move pointer to SampleGrabber filter into chain structure.
voroshil
parents: 25085
diff changeset
2974
25085
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2975 if (chain->pmt)
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2976 DeleteMediaType(chain->pmt);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2977
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2978 if (chain->arpmt) {
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2979 for (i = 0; chain->arpmt[i]; i++) {
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2980 DeleteMediaType(chain->arpmt[i]);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2981 }
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2982 free(chain->arpmt);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2983 }
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2984
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2985 if (chain->arStreamCaps) {
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2986 for (i = 0; chain->arStreamCaps[i]; i++) {
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2987 free(chain->arStreamCaps[i]);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2988 }
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2989 free(chain->arStreamCaps);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2990 }
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2991
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2992 if (chain->rbuf) {
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2993 destroy_ringbuffer(chain->rbuf);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2994 free(chain->rbuf);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2995 chain->rbuf = NULL;
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2996 }
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2997 free(chain);
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2998 }
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
2999 /**
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3000 * \brief driver uninitialization
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3001 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
3002 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3003 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3004 * \return always 1
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3005 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3006 static int uninit(priv_t * priv)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3007 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3008 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3009 if (!priv)
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3010 return 1;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3011 //Debug
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3012 if (priv->dwRegister) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3013 RemoveFromRot(priv->dwRegister);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3014 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3015 teletext_control(priv->priv_vbi,TV_VBI_CONTROL_STOP,(void*)1);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3016 //stop audio grabber thread
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3017
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3018 if (priv->state && priv->pMediaControl) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3019 OLE_CALL(priv->pMediaControl, Stop);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3020 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3021 OLE_RELEASE_SAFE(priv->pMediaControl);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3022 priv->state = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3023
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3024 if (priv->pGraph) {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3025 if (priv->chains[0]->pCaptureFilter)
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3026 OLE_CALL_ARGS(priv->pGraph, RemoveFilter, priv->chains[0]->pCaptureFilter);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3027 if (priv->chains[1]->pCaptureFilter)
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3028 OLE_CALL_ARGS(priv->pGraph, RemoveFilter, priv->chains[1]->pCaptureFilter);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3029 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3030 OLE_RELEASE_SAFE(priv->pCrossbar);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3031 OLE_RELEASE_SAFE(priv->pVideoProcAmp);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3032 OLE_RELEASE_SAFE(priv->pGraph);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3033 OLE_RELEASE_SAFE(priv->pBuilder);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3034 if(priv->freq_table){
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3035 priv->freq_table_len=-1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3036 free(priv->freq_table);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3037 priv->freq_table=NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3038 }
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3039
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3040 for(i=0; i<3;i++)
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3041 {
25085
da7c8d1b7a36 Move common chain uninit code into separate routine.
voroshil
parents: 25084
diff changeset
3042 destroy_chain(priv->chains[i]);
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3043 priv->chains[i] = NULL;
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3044 }
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3045 CoUninitialize();
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3046 return 1;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3047 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3048
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3049 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3050 * \brief driver pre-initialization
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3051 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3052 * \param device string, containing device name in form "x[.y]", where x is video capture device
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3053 * (default: 0, first available); y (if given) sets audio capture device
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3054 *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3055 * \return 1 if success,0 - otherwise
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3056 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3057 static tvi_handle_t *tvi_init_dshow(tv_param_t* tv_param)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3058 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3059 tvi_handle_t *h;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3060 priv_t *priv;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3061 int a;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3062
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3063 h = new_handle();
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3064 if (!h)
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3065 return NULL;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3066
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3067 priv = h->priv;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3068
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3069 memset(priv, 0, sizeof(priv_t));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3070 priv->direct_setfreq_call = 1; //first using direct call. if it fails, workaround will be enabled
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3071 priv->direct_getfreq_call = 1; //first using direct call. if it fails, workaround will be enabled
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3072 priv->adev_index = -1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3073 priv->freq_table_len=-1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3074 priv->tv_param=tv_param;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3075
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3076 if (tv_param->device) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3077 if (sscanf(tv_param->device, "%d", &a) == 1) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3078 priv->dev_index = a;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3079 } else {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3080 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_WrongDeviceParam, tv_param->device);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3081 free_handle(h);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3082 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3083 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3084 if (priv->dev_index < 0) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3085 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_WrongDeviceIndex, a);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3086 free_handle(h);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3087 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3088 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3089 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3090 if (tv_param->adevice) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3091 if (sscanf(tv_param->adevice, "%d", &a) == 1) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3092 priv->adev_index = a;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3093 } else {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3094 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_WrongADeviceParam, tv_param->adevice);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3095 free_handle(h);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3096 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3097 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3098 if (priv->dev_index < 0) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3099 mp_msg(MSGT_TV, MSGL_ERR, MSGTR_TVI_DS_WrongADeviceIndex, a);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3100 free_handle(h);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3101 return NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3102 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3103 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3104 return h;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3105 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3106
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3107 /**
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3108 * \brief driver's ioctl handler
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3109 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
3110 * \param priv driver's private data structure
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3111 * \param cmd ioctl command
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3112 * \param arg ioct command's parameter
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3113 *
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
3114 * \return TVI_CONTROL_TRUE if success
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3115 * \return TVI_CONTROL_FALSE if failure
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3116 * \return TVI_CONTROL_UNKNOWN if unknowm cmd called
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3117 */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3118 static int control(priv_t * priv, int cmd, void *arg)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3119 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3120 switch (cmd) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3121 /* need rewrite */
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3122 case TVI_CONTROL_VID_SET_FORMAT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3123 {
25126
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3124 int fcc, i,j;
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3125 void* tmp,*tmp2;
25068
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3126 int result = TVI_CONTROL_TRUE;
25063
29260745e4fa Pass all available formats to chain building routine and
voroshil
parents: 25061
diff changeset
3127
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3128 if (priv->state)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3129 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3130 fcc = *(int *) arg;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3131
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3132 if(!priv->chains[0]->arpmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3133 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3134 for (i = 0; priv->chains[0]->arpmt[i]; i++)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3135 if (check_video_format
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3136 (priv->chains[0]->arpmt[i], fcc, priv->width, priv->height))
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3137 break;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3138 if (!priv->chains[0]->arpmt[i])
25068
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3139 {
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3140 int fps = 0;
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3141 VIDEOINFOHEADER* Vhdr = NULL;
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3142 AM_MEDIA_TYPE *pmt;
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3143
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3144 mp_msg(MSGT_TV, MSGL_V, "tvi_dshow: will try also use undeclared video format: %dx%d, %s\n",priv->width, priv->height, vo_format_name(fcc));
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3145
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3146 if (priv->chains[0]->arpmt[0])
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3147 Vhdr = (VIDEOINFOHEADER *) priv->chains[0]->arpmt[0]->pbFormat;
25068
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3148
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3149 if(Vhdr && Vhdr->bmiHeader.biSizeImage)
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3150 fps = Vhdr->dwBitRate / (8 * Vhdr->bmiHeader.biSizeImage);
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3151
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3152 pmt=create_video_format(fcc, priv->width, priv->height, fps);
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3153 if(!pmt)
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3154 {
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3155 mp_msg(MSGT_TV, MSGL_V, "tvi_dshow: Unable to create AM_MEDIA_TYPE structure for given format\n");
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3156 return TVI_CONTROL_FALSE;
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3157 }
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3158 priv->chains[0]->arpmt=realloc(priv->chains[0]->arpmt, (i+2)*sizeof(AM_MEDIA_TYPE*));
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3159 priv->chains[0]->arpmt[i+1] = NULL;
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3160 priv->chains[0]->arpmt[i] = pmt;
25068
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3161
25105
472629081e38 Compilation fix (typo)
voroshil
parents: 25096
diff changeset
3162 priv->chains[0]->arStreamCaps=realloc(priv->chains[0]->arStreamCaps, (i+2)*sizeof(void*));
25096
554985a6bbb2 Sizes of arpmt and arStreamCaps must be equal.
voroshil
parents: 25094
diff changeset
3163 priv->chains[0]->arpmt[i+1] = NULL;
554985a6bbb2 Sizes of arpmt and arStreamCaps must be equal.
voroshil
parents: 25094
diff changeset
3164
25068
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3165 result = TVI_CONTROL_FALSE;
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3166 }
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3167
25126
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3168
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3169 tmp=priv->chains[0]->arpmt[i];
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3170 tmp2=priv->chains[0]->arStreamCaps[i];
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3171 for(j=i; j>0; j--)
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3172 {
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3173 priv->chains[0]->arpmt[j] = priv->chains[0]->arpmt[j-1];
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3174 priv->chains[0]->arStreamCaps[j] = priv->chains[0]->arStreamCaps[j-1];
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3175 }
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3176 priv->chains[0]->arpmt[0] = tmp;
8152446e42b1 Move requested format at top and shift all oters down
voroshil
parents: 25125
diff changeset
3177 priv->chains[0]->arStreamCaps[0] = tmp2;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3178
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3179 priv->chains[0]->nFormatUsed = 0;
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3180
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3181 if (priv->chains[0]->pmt)
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3182 DeleteMediaType(priv->chains[0]->pmt);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3183 priv->chains[0]->pmt =
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3184 CreateMediaType(priv->chains[0]->arpmt[priv->chains[0]->nFormatUsed]);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3185 DisplayMediaType("VID_SET_FORMAT", priv->chains[0]->pmt);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3186 /*
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3187 Setting width & height to preferred by driver values
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3188 */
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3189 extract_video_format(priv->chains[0]->arpmt[priv->chains[0]->nFormatUsed],
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3190 &(priv->fcc), &(priv->width),
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3191 &(priv->height));
25068
4b14d188ed34 Add all passed to VID_SET_FORMAT formats to the end of
voroshil
parents: 25067
diff changeset
3192 return result;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3193 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3194 case TVI_CONTROL_VID_GET_FORMAT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3195 {
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3196 if(!priv->chains[0]->pmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3197 return TVI_CONTROL_FALSE;
25067
5abe2c29b7d8 Ensure that when VID_GET_FORMAT ioctl is called,
voroshil
parents: 25066
diff changeset
3198 /*
5abe2c29b7d8 Ensure that when VID_GET_FORMAT ioctl is called,
voroshil
parents: 25066
diff changeset
3199 Build video chain (for video format negotiation).
5abe2c29b7d8 Ensure that when VID_GET_FORMAT ioctl is called,
voroshil
parents: 25066
diff changeset
3200 If this was done before, routine will do nothing.
5abe2c29b7d8 Ensure that when VID_GET_FORMAT ioctl is called,
voroshil
parents: 25066
diff changeset
3201 */
5abe2c29b7d8 Ensure that when VID_GET_FORMAT ioctl is called,
voroshil
parents: 25066
diff changeset
3202 build_video_chain(priv);
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3203 DisplayMediaType("VID_GET_FORMAT", priv->chains[0]->pmt);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3204 if (priv->fcc) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3205 *(int *) arg = priv->fcc;
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3206 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3207 } else
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3208 return TVI_CONTROL_FALSE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3209 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3210 case TVI_CONTROL_VID_SET_WIDTH:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3211 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3212 VIDEO_STREAM_CONFIG_CAPS *pCaps;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3213 VIDEOINFOHEADER *Vhdr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3214 int width = *(int *) arg;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3215 if (priv->state)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3216 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3217
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3218 pCaps = priv->chains[0]->arStreamCaps[priv->chains[0]->nFormatUsed];
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3219 if (!pCaps)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3220 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3221 if (width < pCaps->MinOutputSize.cx
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3222 || width > pCaps->MaxOutputSize.cx)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3223 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3224
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3225 if (width % pCaps->OutputGranularityX)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3226 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3227
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3228 if (!priv->chains[0]->pmt || !priv->chains[0]->pmt->pbFormat)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3229 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3230 Vhdr = (VIDEOINFOHEADER *) priv->chains[0]->pmt->pbFormat;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3231 Vhdr->bmiHeader.biWidth = width;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3232 priv->chains[0]->pmt->lSampleSize = Vhdr->bmiHeader.biSizeImage =
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3233 labs(Vhdr->bmiHeader.biBitCount * Vhdr->bmiHeader.biWidth *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3234 Vhdr->bmiHeader.biHeight) >> 3;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3235
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3236 priv->width = width;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3237
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3238 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3239 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3240 case TVI_CONTROL_VID_GET_WIDTH:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3241 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3242 if (priv->width) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3243 *(int *) arg = priv->width;
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3244 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3245 } else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3246 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3247 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3248 case TVI_CONTROL_VID_CHK_WIDTH:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3249 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3250 VIDEO_STREAM_CONFIG_CAPS *pCaps;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3251 int width = *(int *) arg;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3252 pCaps = priv->chains[0]->arStreamCaps[priv->chains[0]->nFormatUsed];
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3253 if (!pCaps)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3254 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3255 if (width < pCaps->MinOutputSize.cx
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3256 || width > pCaps->MaxOutputSize.cx)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3257 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3258
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3259 if (width % pCaps->OutputGranularityX)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3260 return TVI_CONTROL_FALSE;
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3261 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3262 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3263 case TVI_CONTROL_VID_SET_HEIGHT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3264 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3265 VIDEO_STREAM_CONFIG_CAPS *pCaps;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3266 VIDEOINFOHEADER *Vhdr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3267 int height = *(int *) arg;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3268 if (priv->state)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3269 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3270
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3271 pCaps = priv->chains[0]->arStreamCaps[priv->chains[0]->nFormatUsed];
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3272 if (!pCaps)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3273 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3274 if (height < pCaps->MinOutputSize.cy
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3275 || height > pCaps->MaxOutputSize.cy)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3276 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3277
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3278 if (height % pCaps->OutputGranularityY)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3279 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3280
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3281 if (!priv->chains[0]->pmt || !priv->chains[0]->pmt->pbFormat)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3282 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3283 Vhdr = (VIDEOINFOHEADER *) priv->chains[0]->pmt->pbFormat;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3284
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3285 if (Vhdr->bmiHeader.biHeight < 0)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3286 Vhdr->bmiHeader.biHeight = -height;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3287 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3288 Vhdr->bmiHeader.biHeight = height;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3289 priv->chains[0]->pmt->lSampleSize = Vhdr->bmiHeader.biSizeImage =
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3290 labs(Vhdr->bmiHeader.biBitCount * Vhdr->bmiHeader.biWidth *
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3291 Vhdr->bmiHeader.biHeight) >> 3;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3292
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3293 priv->height = height;
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3294 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3295 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3296 case TVI_CONTROL_VID_GET_HEIGHT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3297 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3298 if (priv->height) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3299 *(int *) arg = priv->height;
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3300 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3301 } else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3302 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3303 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3304 case TVI_CONTROL_VID_CHK_HEIGHT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3305 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3306 VIDEO_STREAM_CONFIG_CAPS *pCaps;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3307 int height = *(int *) arg;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3308 pCaps = priv->chains[0]->arStreamCaps[priv->chains[0]->nFormatUsed];
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3309 if (!pCaps)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3310 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3311 if (height < pCaps->MinOutputSize.cy
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3312 || height > pCaps->MaxOutputSize.cy)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3313 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3314
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3315 if (height % pCaps->OutputGranularityY)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3316 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3317
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3318 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3319 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3320 case TVI_CONTROL_IS_AUDIO:
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3321 if (!priv->chains[1]->pmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3322 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3323 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3324 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3325 case TVI_CONTROL_IS_VIDEO:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3326 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3327 case TVI_CONTROL_AUD_GET_FORMAT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3328 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3329 *(int *) arg = AF_FORMAT_S16_LE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3330 if (!priv->chains[1]->pmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3331 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3332 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3333 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3334 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3335 case TVI_CONTROL_AUD_GET_CHANNELS:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3336 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3337 *(int *) arg = priv->channels;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3338 if (!priv->chains[1]->pmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3339 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3340 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3341 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3342 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3343 case TVI_CONTROL_AUD_SET_SAMPLERATE:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3344 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3345 int i, samplerate;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3346 if (priv->state)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3347 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3348 if (!priv->chains[1]->arpmt[0])
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3349 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3350
28576
a6b506faeb34 Replace double semicolon by single semicolon.
diego
parents: 27724
diff changeset
3351 samplerate = *(int *) arg;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3352
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3353 for (i = 0; priv->chains[1]->arpmt[i]; i++)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3354 if (check_audio_format
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3355 (priv->chains[1]->arpmt[i], samplerate, 16, priv->channels))
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3356 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
3357 if (!priv->chains[1]->arpmt[i]) {
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3358 //request not found. failing back to first available
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3359 mp_msg(MSGT_TV, MSGL_WARN, MSGTR_TVI_DS_SamplerateNotsupported, samplerate);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3360 i = 0;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3361 }
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3362 if (priv->chains[1]->pmt)
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3363 DeleteMediaType(priv->chains[1]->pmt);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3364 priv->chains[1]->pmt = CreateMediaType(priv->chains[1]->arpmt[i]);
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3365 extract_audio_format(priv->chains[1]->arpmt[i], &(priv->samplerate),
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3366 NULL, &(priv->channels));
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3367 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3368 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3369 case TVI_CONTROL_AUD_GET_SAMPLERATE:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3370 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3371 *(int *) arg = priv->samplerate;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3372 if (!priv->samplerate)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3373 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3374 if (!priv->chains[1]->pmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3375 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3376 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3377 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3378 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3379 case TVI_CONTROL_AUD_GET_SAMPLESIZE:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3380 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3381 WAVEFORMATEX *pWF;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3382 if (!priv->chains[1]->pmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3383 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3384 if (!priv->chains[1]->pmt->pbFormat)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3385 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3386 pWF = (WAVEFORMATEX *) priv->chains[1]->pmt->pbFormat;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3387 *(int *) arg = pWF->wBitsPerSample / 8;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3388 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3389 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3390 case TVI_CONTROL_IS_TUNER:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3391 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3392 if (!priv->pTVTuner)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3393 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3394
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3395 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3396 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3397 case TVI_CONTROL_TUN_SET_NORM:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3398 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3399 IAMAnalogVideoDecoder *pVD;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3400 long lAnalogFormat;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3401 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3402 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3403
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3404 i = *(int *) arg;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3405 i--;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3406 if (i < 0 || i >= tv_available_norms_count)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3407 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3408 lAnalogFormat = tv_norms[tv_available_norms[i]].index;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3409
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3410 hr = OLE_QUERYINTERFACE(priv->chains[0]->pCaptureFilter,IID_IAMAnalogVideoDecoder, pVD);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28576
diff changeset
3411 if (hr != S_OK)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3412 return TVI_CONTROL_FALSE;
25077
82884fde28eb 100l: Fix long standing copy-paste error:
voroshil
parents: 25068
diff changeset
3413 hr = OLE_CALL_ARGS(pVD, put_TVFormat, lAnalogFormat);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3414 OLE_RELEASE_SAFE(pVD);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3415 if (FAILED(hr))
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3416 return TVI_CONTROL_FALSE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3417 else
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3418 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3419 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3420 case TVI_CONTROL_TUN_GET_NORM:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3421 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3422 long lAnalogFormat;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3423 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3424 HRESULT hr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3425 IAMAnalogVideoDecoder *pVD;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3426
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3427 hr = OLE_QUERYINTERFACE(priv->chains[0]->pCaptureFilter,IID_IAMAnalogVideoDecoder, pVD);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3428 if (hr == S_OK) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3429 hr = OLE_CALL_ARGS(pVD, get_TVFormat, &lAnalogFormat);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3430 OLE_RELEASE_SAFE(pVD);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3431 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3432
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3433 if (FAILED(hr)) { //trying another method
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3434 if (!priv->pTVTuner)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3435 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3436 hr=OLE_CALL_ARGS(priv->pTVTuner, get_TVFormat, &lAnalogFormat);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3437 if (FAILED(hr))
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3438 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3439 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3440 for (i = 0; i < tv_available_norms_count; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3441 if (tv_norms[tv_available_norms[i]].index == lAnalogFormat) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3442 *(int *) arg = i + 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3443 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3444 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3445 }
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3446 return TVI_CONTROL_FALSE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3447 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3448 case TVI_CONTROL_SPC_GET_NORMID:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3449 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3450 int i;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3451 if (!priv->pTVTuner)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3452 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3453 for (i = 0; i < tv_available_norms_count; i++) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3454 if (!strcasecmp
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3455 (tv_norms[tv_available_norms[i]].name, (char *) arg)) {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3456 *(int *) arg = i + 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3457 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3458 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3459 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3460 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3461 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3462 case TVI_CONTROL_SPC_SET_INPUT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3463 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3464 return set_crossbar_input(priv, *(int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3465 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3466 case TVI_CONTROL_TUN_GET_FREQ:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3467 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3468 unsigned long lFreq;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3469 int ret;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3470 if (!priv->pTVTuner)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3471 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3472
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3473 ret = get_frequency(priv, &lFreq);
27628
1779bbc0733a Fix overflow in frequency conversion code inside tvi_dshow.
voroshil
parents: 27370
diff changeset
3474 lFreq = lFreq / (1000000/16); //convert from Hz to 1/16 MHz units
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3475
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3476 *(unsigned long *) arg = lFreq;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3477 return ret;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3478 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3479 case TVI_CONTROL_TUN_SET_FREQ:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3480 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3481 unsigned long nFreq = *(unsigned long *) arg;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3482 if (!priv->pTVTuner)
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3483 return TVI_CONTROL_FALSE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3484 //convert to Hz
27628
1779bbc0733a Fix overflow in frequency conversion code inside tvi_dshow.
voroshil
parents: 27370
diff changeset
3485 nFreq = (1000000/16) * nFreq; //convert from 1/16 MHz units to Hz
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3486 return set_frequency(priv, nFreq);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3487 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3488 case TVI_CONTROL_VID_SET_HUE:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3489 return set_control(priv, VideoProcAmp_Hue, *(int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3490 case TVI_CONTROL_VID_GET_HUE:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3491 return get_control(priv, VideoProcAmp_Hue, (int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3492 case TVI_CONTROL_VID_SET_CONTRAST:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3493 return set_control(priv, VideoProcAmp_Contrast, *(int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3494 case TVI_CONTROL_VID_GET_CONTRAST:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3495 return get_control(priv, VideoProcAmp_Contrast, (int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3496 case TVI_CONTROL_VID_SET_SATURATION:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3497 return set_control(priv, VideoProcAmp_Saturation, *(int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3498 case TVI_CONTROL_VID_GET_SATURATION:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3499 return get_control(priv, VideoProcAmp_Saturation, (int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3500 case TVI_CONTROL_VID_SET_BRIGHTNESS:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3501 return set_control(priv, VideoProcAmp_Brightness, *(int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3502 case TVI_CONTROL_VID_GET_BRIGHTNESS:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3503 return get_control(priv, VideoProcAmp_Brightness, (int *) arg);
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3504
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3505 case TVI_CONTROL_VID_GET_FPS:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3506 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3507 VIDEOINFOHEADER *Vhdr;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3508 if (!priv->chains[0]->pmt)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3509 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3510 if (!priv->chains[0]->pmt->pbFormat)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3511 return TVI_CONTROL_FALSE;
25079
3dcf8e3e65d9 One step of code cleanup: move all variables, related
voroshil
parents: 25077
diff changeset
3512 Vhdr = (VIDEOINFOHEADER *) priv->chains[0]->pmt->pbFormat;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3513 *(float *) arg =
25028
2cae9470f53b Fix FPS from bitrate calculation (was 8 times larger than real value).
voroshil
parents: 25019
diff changeset
3514 (1.0 * Vhdr->dwBitRate) / (Vhdr->bmiHeader.biSizeImage * 8);
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3515 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3516 }
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3517 case TVI_CONTROL_IMMEDIATE:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3518 priv->immediate_mode = 1;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3519 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3520 case TVI_CONTROL_VBI_INIT:
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3521 {
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3522 void* ptr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3523 ptr=&(priv->tsp);
29760
1cc8a20520e8 Add MSGT_TELETEXT, rename TVI_CONTROL as VBI_CONTROL and fix some paths
cehoyos
parents: 29759
diff changeset
3524 if(teletext_control(NULL,TV_VBI_CONTROL_START,&ptr)==VBI_CONTROL_TRUE)
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3525 priv->priv_vbi=ptr;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3526 else
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3527 priv->priv_vbi=NULL;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3528 return TVI_CONTROL_TRUE;
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3529 }
29806
a5e7590ffdbd Separate teletext from tv support.
cehoyos
parents: 29760
diff changeset
3530 case TVI_CONTROL_GET_VBI_PTR:
a5e7590ffdbd Separate teletext from tv support.
cehoyos
parents: 29760
diff changeset
3531 *(void **)arg=priv->priv_vbi;
a5e7590ffdbd Separate teletext from tv support.
cehoyos
parents: 29760
diff changeset
3532 return TVI_CONTROL_TRUE;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3533 }
26756
c43ce7268677 cosmetics: Remove useless parentheses from return statements.
diego
parents: 26737
diff changeset
3534 return TVI_CONTROL_UNKNOWN;
24744
d81eef9beb1b DirectShow based tv:// driver for win32
voroshil
parents:
diff changeset
3535 }