annotate stream/tvi_dshow.c @ 32860:77dd2bb3fd02

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