annotate stream/tvi_dshow.c @ 34115:3d7ee643b110

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