ReactOS 0.4.17-dev-923-g4c9a150
filesource.c
Go to the documentation of this file.
1/*
2 * File Source Filter
3 *
4 * Copyright 2003 Robert Shearman
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include "quartz_private.h"
22
23#include "wine/debug.h"
24#include "uuids.h"
25#include "vfwmsgs.h"
26#include "winbase.h"
27#include "winreg.h"
28#include "shlwapi.h"
29#include <assert.h>
30
32
33#ifdef __REACTOS__
34#include "winternl.h"
36{
38
40 if (io_status.Status)
41 {
43 return FALSE;
44 }
45 return TRUE;
46}
47#define CancelIoEx CancelIoEx_
48#endif
49
51{
52 {0xe436eb83,0x524f,0x11ce,{0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70}}, /* MEDIATYPE_Stream */
53 {0,0,0,{0,0,0,0,0,0,0,0}},
54 TRUE,
55 FALSE,
56 1,
57 {0,0,0,{0,0,0,0,0,0,0,0}},
58 NULL,
59 0,
60 NULL
61};
62
63struct request
64{
68};
69
71{
74
77
78 LPOLESTR pszFileName;
85 unsigned int max_requests;
86 CONDITION_VARIABLE sample_cv;
87};
88
89static const struct strmbase_source_ops source_ops;
90
91static inline struct async_reader *impl_from_strmbase_filter(struct strmbase_filter *iface)
92{
93 return CONTAINING_RECORD(iface, struct async_reader, filter);
94}
95
97{
99}
100
101static const IFileSourceFilterVtbl FileSource_Vtbl;
102static const IAsyncReaderVtbl FileAsyncReader_Vtbl;
103
105{
106 if ('0' <= c && c <= '9') return c - '0';
107 if ('a' <= c && c <= 'f') return c - 'a' + 10;
108 if ('A' <= c && c <= 'F') return c - 'A' + 10;
109 return -1;
110}
111
113{
115 BYTE *mask, *expect, *actual;
116 int d;
117 BOOL ret = TRUE;
118
119 /* format: "offset, size, mask, value" */
120
121 offset = wcstol(pattern, NULL, 10);
122
123 if (!(pattern = wcschr(pattern, ',')))
124 return FALSE;
125 pattern++;
126
127 size = wcstol(pattern, NULL, 10);
130 memset(mask, 0xff, size);
131
132 if (!(pattern = wcschr(pattern, ',')))
133 {
136 return FALSE;
137 }
138 pattern++;
139 while (byte_from_hex_char(*pattern) == -1 && (*pattern != ','))
140 pattern++;
141
142 for (i = 0; (d = byte_from_hex_char(*pattern)) != -1 && (i/2 < size); pattern++, i++)
143 {
144 if (i % 2)
145 mask[i / 2] |= d;
146 else
147 mask[i / 2] = d << 4;
148 }
149
150 if (!(pattern = wcschr(pattern, ',')))
151 {
154 return FALSE;
155 }
156 pattern++;
157 while (byte_from_hex_char(*pattern) == -1 && (*pattern != ','))
158 pattern++;
159
160 for (i = 0; (d = byte_from_hex_char(*pattern)) != -1 && (i/2 < size); pattern++, i++)
161 {
162 if (i % 2)
163 expect[i / 2] |= d;
164 else
165 expect[i / 2] = d << 4;
166 }
167
168 actual = heap_alloc(size);
170 if (!ReadFile(file, actual, size, &ret_size, NULL) || ret_size != size)
171 {
172 heap_free(actual);
175 return FALSE;
176 }
177
178 for (i = 0; i < size; ++i)
179 {
180 if ((actual[i] & mask[i]) != expect[i])
181 {
182 ret = FALSE;
183 break;
184 }
185 }
186
187 heap_free(actual);
190
191 /* If there is a following tuple, then we must match that as well. */
192 if (ret && (pattern = wcschr(pattern, ',')))
194
195 return ret;
196}
197
198BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid)
199{
200 WCHAR extensions_path[278] = L"Media Type\\Extensions\\";
201 DWORD majortype_idx, size;
202 const WCHAR *ext;
203 HKEY parent_key;
204 HANDLE file;
205
206 if ((ext = wcsrchr(filename, '.')))
207 {
208 WCHAR guidstr[39];
209 HKEY key;
210
211 wcscat(extensions_path, ext);
212 if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, extensions_path, 0, KEY_READ, &key))
213 {
214 size = sizeof(guidstr);
215 if (majortype && !RegQueryValueExW(key, L"Media Type", NULL, NULL, (BYTE *)guidstr, &size))
216 CLSIDFromString(guidstr, majortype);
217
218 size = sizeof(guidstr);
219 if (subtype && !RegQueryValueExW(key, L"Subtype", NULL, NULL, (BYTE *)guidstr, &size))
220 CLSIDFromString(guidstr, subtype);
221
222 size = sizeof(guidstr);
223 if (source_clsid && !RegQueryValueExW(key, L"Source Filter", NULL, NULL, (BYTE *)guidstr, &size))
224 CLSIDFromString(guidstr, source_clsid);
225
227 return FALSE;
228 }
229 }
230
233 {
234 WARN("Failed to open file %s, error %lu.\n", debugstr_w(filename), GetLastError());
235 return FALSE;
236 }
237
238 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Media Type", 0, KEY_READ, &parent_key))
239 {
241 return FALSE;
242 }
243
244 for (majortype_idx = 0; ; ++majortype_idx)
245 {
246 WCHAR majortype_str[39];
247 HKEY majortype_key;
248 DWORD subtype_idx;
249
250 size = ARRAY_SIZE(majortype_str);
251 if (RegEnumKeyExW(parent_key, majortype_idx, majortype_str, &size, NULL, NULL, NULL, NULL))
252 break;
253
254 if (!wcscmp(majortype_str, L"Extensions"))
255 continue;
256
257 if (RegOpenKeyExW(parent_key, majortype_str, 0, KEY_READ, &majortype_key))
258 continue;
259
260 for (subtype_idx = 0; ; ++subtype_idx)
261 {
262 WCHAR subtype_str[39], *pattern;
263 DWORD value_idx, max_size;
264 HKEY subtype_key;
265
266 size = ARRAY_SIZE(subtype_str);
267 if (RegEnumKeyExW(majortype_key, subtype_idx, subtype_str, &size, NULL, NULL, NULL, NULL))
268 break;
269
270 if (RegOpenKeyExW(majortype_key, subtype_str, 0, KEY_READ, &subtype_key))
271 continue;
272
273 if (RegQueryInfoKeyW(subtype_key, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &max_size, NULL, NULL))
274 continue;
275
277
278 for (value_idx = 0; ; ++value_idx)
279 {
280 /* The longest name we should encounter is "Source Filter". */
281 WCHAR value_name[14], source_clsid_str[39];
282 DWORD value_len = ARRAY_SIZE(value_name);
283
284 size = max_size;
285 if (RegEnumValueW(subtype_key, value_idx, value_name, &value_len,
286 NULL, NULL, (BYTE *)pattern, &max_size))
287 break;
288
289 if (!wcscmp(value_name, L"Source Filter"))
290 continue;
291
293 continue;
294
295 if (majortype)
296 CLSIDFromString(majortype_str, majortype);
297 if (subtype)
298 CLSIDFromString(subtype_str, subtype);
299 size = sizeof(source_clsid_str);
300 if (source_clsid && !RegQueryValueExW(subtype_key, L"Source Filter",
301 NULL, NULL, (BYTE *)source_clsid_str, &size))
302 CLSIDFromString(source_clsid_str, source_clsid);
303
305 RegCloseKey(subtype_key);
306 RegCloseKey(majortype_key);
307 RegCloseKey(parent_key);
309 return TRUE;
310 }
311
313 RegCloseKey(subtype_key);
314 }
315
316 RegCloseKey(majortype_key);
317 }
318
319 RegCloseKey(parent_key);
321 return FALSE;
322}
323
324static struct strmbase_pin *async_reader_get_pin(struct strmbase_filter *iface, unsigned int index)
325{
327
328 if (!index && filter->pszFileName)
329 return &filter->source.pin;
330 return NULL;
331}
332
333static void async_reader_destroy(struct strmbase_filter *iface)
334{
336
337 if (filter->pszFileName)
338 {
339 unsigned int i;
340
341 if (filter->source.pin.peer)
342 IPin_Disconnect(filter->source.pin.peer);
343
344 IPin_Disconnect(&filter->source.pin.IPin_iface);
345
346 if (filter->requests)
347 {
348 for (i = 0; i < filter->max_requests; ++i)
349 CloseHandle(filter->requests[i].ovl.hEvent);
350 free(filter->requests);
351 }
352 CloseHandle(filter->file);
354
355 free(filter->pszFileName);
356 FreeMediaType(&filter->mt);
357 }
358
359 filter->sample_cs.DebugInfo->Spare[0] = 0;
360 DeleteCriticalSection(&filter->sample_cs);
361
364 CloseHandle(filter->io_thread);
365 CloseHandle(filter->port);
366
368 free(filter);
369}
370
372{
374
375 if (IsEqualGUID(iid, &IID_IFileSourceFilter))
376 {
377 *out = &filter->IFileSourceFilter_iface;
378 IUnknown_AddRef((IUnknown *)*out);
379 return S_OK;
380 }
381
382 return E_NOINTERFACE;
383}
384
385static const struct strmbase_filter_ops filter_ops =
386{
387 .filter_get_pin = async_reader_get_pin,
388 .filter_destroy = async_reader_destroy,
389 .filter_query_interface = async_reader_query_interface,
390};
391
393{
394 struct async_reader *filter = arg;
395 struct request *req;
398 DWORD size;
399 BOOL ret;
400
401 SetThreadDescription(GetCurrentThread(), L"wine_qz_async_reader_io");
402
403 for (;;)
404 {
406
407 if (ret && key)
408 break;
409
410 EnterCriticalSection(&filter->sample_cs);
411
412 req = CONTAINING_RECORD(ovl, struct request, ovl);
413 TRACE("Got sample %Iu.\n", req - filter->requests);
414 assert(req >= filter->requests && req < filter->requests + filter->max_requests);
415
416 if (ret)
417 WakeConditionVariable(&filter->sample_cv);
418 else
419 {
420 ERR("GetQueuedCompletionStatus() returned failure, error %lu.\n", GetLastError());
421 req->sample = NULL;
422 }
423
424 LeaveCriticalSection(&filter->sample_cs);
425 }
426
427 return 0;
428}
429
431{
432 struct async_reader *object;
433
434 if (!(object = calloc(1, sizeof(*object))))
435 return E_OUTOFMEMORY;
436
437 strmbase_filter_init(&object->filter, outer, &CLSID_AsyncReader, &filter_ops);
438
439 object->IFileSourceFilter_iface.lpVtbl = &FileSource_Vtbl;
440 object->IAsyncReader_iface.lpVtbl = &FileAsyncReader_Vtbl;
441
443 object->sample_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FileAsyncReader.sample_cs");
445 object->port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
446 object->io_thread = CreateThread(NULL, 0, io_thread, object, 0, NULL);
447
448 TRACE("Created file source %p.\n", object);
449 *out = &object->filter.IUnknown_inner;
450 return S_OK;
451}
452
454{
456 return IBaseFilter_QueryInterface(&filter->filter.IBaseFilter_iface, riid, ppv);
457}
458
460{
462 return IBaseFilter_AddRef(&filter->filter.IBaseFilter_iface);
463}
464
466{
468 return IBaseFilter_Release(&filter->filter.IBaseFilter_iface);
469}
470
472{
475
476 TRACE("%p->(%s, %p)\n", This, debugstr_w(pszFileName), pmt);
478
479 if (!pszFileName)
480 return E_POINTER;
481
482 /* open file */
483 /* FIXME: check the sharing values that native uses */
485
487 {
489 }
490
491 if (!GetFileSizeEx(hFile, &This->file_size))
492 {
493 WARN("Could not get file size.\n");
496 }
497
498 if (This->pszFileName)
499 {
500 free(This->pszFileName);
501 FreeMediaType(&This->mt);
502 }
503
504 if (!(This->pszFileName = wcsdup(pszFileName)))
505 {
507 return E_OUTOFMEMORY;
508 }
509
510 strmbase_source_init(&This->source, &This->filter, L"Output", &source_ops);
512
513 This->file = hFile;
514 This->flushing = FALSE;
515 This->requests = NULL;
516
517 if (!pmt)
518 {
520 if (get_media_type(pszFileName, &This->mt.majortype, &This->mt.subtype, NULL))
521 {
522 TRACE("Found major type %s, subtype %s.\n",
523 debugstr_guid(&This->mt.majortype), debugstr_guid(&This->mt.subtype));
524 }
525 }
526 else
527 CopyMediaType(&This->mt, pmt);
528
529 return S_OK;
530}
531
533{
535
536 TRACE("filter %p, filename %p, mt %p.\n", This, ppszFileName, mt);
537
538 if (!ppszFileName)
539 return E_POINTER;
540
541 /* copy file name & media type if available, otherwise clear the outputs */
542 if (This->pszFileName)
543 {
544 *ppszFileName = CoTaskMemAlloc((wcslen(This->pszFileName) + 1) * sizeof(WCHAR));
545 wcscpy(*ppszFileName, This->pszFileName);
546 if (mt)
547 CopyMediaType(mt, &This->mt);
548 }
549 else
550 {
551 *ppszFileName = NULL;
552 if (mt)
553 memset(mt, 0, sizeof(AM_MEDIA_TYPE));
554 }
555
556 return S_OK;
557}
558
559static const IFileSourceFilterVtbl FileSource_Vtbl =
560{
566};
567
568static inline struct async_reader *impl_from_strmbase_pin(struct strmbase_pin *iface)
569{
570 return CONTAINING_RECORD(iface, struct async_reader, source.pin);
571}
572
574{
576}
577
579{
581
582 if (IsEqualGUID(&mt->majortype, &filter->mt.majortype)
583 && (!IsEqualGUID(&mt->subtype, &GUID_NULL)
584 || IsEqualGUID(&filter->mt.subtype, &GUID_NULL)))
585 return S_OK;
586
587 return S_FALSE;
588}
589
590static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
591{
593
594 if (index > 1)
595 return VFW_S_NO_MORE_ITEMS;
596
597 if (index == 0)
598 CopyMediaType(mt, &filter->mt);
599 else if (index == 1)
601 return S_OK;
602}
603
604static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
605{
607
608 if (IsEqualGUID(iid, &IID_IAsyncReader))
609 *out = &filter->IAsyncReader_iface;
610 else
611 return E_NOINTERFACE;
612
613 IUnknown_AddRef((IUnknown *)*out);
614 return S_OK;
615}
616
617/* Function called as a helper to IPin_Connect */
618/* specific AM_MEDIA_TYPE - it cannot be NULL */
619/* this differs from standard OutputPin_AttemptConnection only in that it
620 * doesn't need the IMemInputPin interface on the receiving pin */
622 IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
623{
624 HRESULT hr;
625
626 TRACE("%p->(%p, %p)\n", This, pReceivePin, pmt);
627
628 if (This->pin.ops->pin_query_accept(&This->pin, pmt) != S_OK)
630
631 This->pin.peer = pReceivePin;
632 IPin_AddRef(pReceivePin);
633 CopyMediaType(&This->pin.mt, pmt);
634
635 hr = IPin_ReceiveConnection(pReceivePin, &This->pin.IPin_iface, pmt);
636
637 if (FAILED(hr))
638 {
639 IPin_Release(This->pin.peer);
640 This->pin.peer = NULL;
641 FreeMediaType(&This->pin.mt);
642 }
643
644 return hr;
645}
646
647static const struct strmbase_source_ops source_ops =
648{
649 .base.pin_query_accept = source_query_accept,
650 .base.pin_get_media_type = source_get_media_type,
651 .base.pin_query_interface = source_query_interface,
652 .pfnAttemptConnection = FileAsyncReaderPin_AttemptConnection,
653};
654
656{
658 return IPin_QueryInterface(&filter->source.pin.IPin_iface, iid, out);
659}
660
662{
664 return IPin_AddRef(&filter->source.pin.IPin_iface);
665}
666
668{
670 return IPin_Release(&filter->source.pin.IPin_iface);
671}
672
674 IMemAllocator *preferred, ALLOCATOR_PROPERTIES *props, IMemAllocator **ret_allocator)
675{
678 unsigned int i;
679 HRESULT hr;
680
681 TRACE("filter %p, preferred %p, props %p, ret_allocator %p.\n", filter, preferred, props, ret_allocator);
682
683 if (!props->cbAlign)
684 props->cbAlign = 1;
685
686 *ret_allocator = NULL;
687
688 if (preferred)
689 IMemAllocator_AddRef(allocator = preferred);
690 else if (FAILED(hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL,
691 CLSCTX_INPROC, &IID_IMemAllocator, (void **)&allocator)))
692 return hr;
693
694 if (FAILED(hr = IMemAllocator_SetProperties(allocator, props, props)))
695 {
696 IMemAllocator_Release(allocator);
697 return hr;
698 }
699
700 if (filter->requests)
701 {
702 for (i = 0; i < filter->max_requests; ++i)
703 CloseHandle(filter->requests[i].ovl.hEvent);
704 free(filter->requests);
705 }
706
707 filter->max_requests = props->cBuffers;
708 TRACE("Maximum request count: %u.\n", filter->max_requests);
709 if (!(filter->requests = calloc(filter->max_requests, sizeof(filter->requests[0]))))
710 {
711 IMemAllocator_Release(allocator);
712 return E_OUTOFMEMORY;
713 }
714
715 for (i = 0; i < filter->max_requests; ++i)
716 filter->requests[i].ovl.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
717
718 *ret_allocator = allocator;
719 return S_OK;
720}
721
723{
726 struct request *req;
727 unsigned int i;
728 HRESULT hr;
729 BYTE *data;
730
731 TRACE("filter %p, sample %p, cookie %#Ix.\n", filter, sample, cookie);
732
733 if (!sample)
734 return E_POINTER;
735
736 if (FAILED(hr = IMediaSample_GetTime(sample, &start, &end)))
737 return hr;
738
739 if (BYTES_FROM_MEDIATIME(start) >= filter->file_size.QuadPart)
741
742 if (FAILED(hr = IMediaSample_GetPointer(sample, &data)))
743 return hr;
744
745 EnterCriticalSection(&filter->sample_cs);
746 if (filter->flushing)
747 {
748 LeaveCriticalSection(&filter->sample_cs);
749 return VFW_E_WRONG_STATE;
750 }
751
752 for (i = 0; i < filter->max_requests; ++i)
753 {
754 if (!filter->requests[i].sample)
755 break;
756 }
757 assert(i < filter->max_requests);
758 req = &filter->requests[i];
759
762 /* No reference is taken. */
763
764 if (ReadFile(filter->file, data, BYTES_FROM_MEDIATIME(end - start), NULL, &req->ovl)
766 {
767 hr = S_OK;
768 req->sample = sample;
769 req->cookie = cookie;
770 }
771 else
773
774 LeaveCriticalSection(&filter->sample_cs);
775 return hr;
776}
777
780{
782 unsigned int i;
783
784 TRACE("filter %p, timeout %lu, sample %p, cookie %p.\n", filter, timeout, sample, cookie);
785
786 *sample = NULL;
787 *cookie = 0;
788
789 EnterCriticalSection(&filter->sample_cs);
790
791 do
792 {
793 if (filter->flushing)
794 {
795 LeaveCriticalSection(&filter->sample_cs);
796 return VFW_E_WRONG_STATE;
797 }
798
799 for (i = 0; i < filter->max_requests; ++i)
800 {
801 struct request *req = &filter->requests[i];
802 DWORD size;
803
804 if (req->sample && GetOverlappedResult(filter->file, &req->ovl, &size, FALSE))
805 {
807
808 IMediaSample_SetActualDataLength(req->sample, size);
811 IMediaSample_SetTime(req->sample, &start, &end);
812
813 *sample = req->sample;
814 *cookie = req->cookie;
815 req->sample = NULL;
816
817 LeaveCriticalSection(&filter->sample_cs);
818 TRACE("Returning sample %u.\n", i);
819 return S_OK;
820 }
821 }
822 } while (SleepConditionVariableCS(&filter->sample_cv, &filter->sample_cs, timeout));
823
824 LeaveCriticalSection(&filter->sample_cs);
825 return VFW_E_TIMEOUT;
826}
827
829{
830 OVERLAPPED ovl = {0};
831 BOOL ret;
832
835 ovl.OffsetHigh = offset >> 32;
836
837 *read_len = 0;
838
841 ret = GetOverlappedResult(file, &ovl, read_len, TRUE);
842
843 TRACE("Returning %lu bytes.\n", *read_len);
844
846 return ret;
847}
848
850{
852 REFERENCE_TIME start_time, end_time;
853 DWORD read_len;
854 BYTE *buffer;
855 LONG length;
856 HRESULT hr;
857 BOOL ret;
858
859 TRACE("filter %p, sample %p.\n", filter, sample);
860
861 hr = IMediaSample_GetTime(sample, &start_time, &end_time);
862
863 if (SUCCEEDED(hr))
864 hr = IMediaSample_GetPointer(sample, &buffer);
865
866 if (SUCCEEDED(hr))
867 {
868 length = BYTES_FROM_MEDIATIME(end_time - start_time);
869 ret = sync_read(filter->file, BYTES_FROM_MEDIATIME(start_time), length, buffer, &read_len);
870 if (ret)
871 hr = (read_len == length) ? S_OK : S_FALSE;
872 else if (GetLastError() == ERROR_HANDLE_EOF)
873 hr = S_OK;
874 else
876 }
877
878 if (SUCCEEDED(hr))
879 IMediaSample_SetActualDataLength(sample, read_len);
880
881 return hr;
882}
883
886{
888 DWORD read_len;
889 HRESULT hr;
890 BOOL ret;
891
892 TRACE("filter %p, offset %s, length %ld, buffer %p.\n",
894
895 ret = sync_read(filter->file, offset, length, buffer, &read_len);
896 if (ret)
897 hr = (read_len == length) ? S_OK : S_FALSE;
898 else if (GetLastError() == ERROR_HANDLE_EOF)
899 hr = S_FALSE;
900 else
902
903 return hr;
904}
905
907{
909
910 TRACE("iface %p, total %p, available %p.\n", iface, total, available);
911
912 *available = *total = filter->file_size.QuadPart;
913
914 return S_OK;
915}
916
918{
920 unsigned int i;
921
922 TRACE("iface %p.\n", iface);
923
924 EnterCriticalSection(&filter->sample_cs);
925
926 filter->flushing = TRUE;
927 for (i = 0; i < filter->max_requests; ++i)
928 filter->requests[i].sample = NULL;
929 CancelIoEx(filter->file, NULL);
930 WakeAllConditionVariable(&filter->sample_cv);
931
932 LeaveCriticalSection(&filter->sample_cs);
933
934 return S_OK;
935}
936
938{
940
941 TRACE("iface %p.\n", iface);
942
943 EnterCriticalSection(&filter->sample_cs);
944
945 filter->flushing = FALSE;
946
947 LeaveCriticalSection(&filter->sample_cs);
948
949 return S_OK;
950}
951
952static const IAsyncReaderVtbl FileAsyncReader_Vtbl =
953{
965};
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription(_In_ HANDLE hThread, _In_ PCWSTR lpThreadDescription)
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static INT max_size
Definition: history.c:51
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
const GUID IID_IAsyncReader
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static const IAsyncReaderVtbl FileAsyncReader_Vtbl
Definition: filesource.c:102
static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface, LONGLONG offset, LONG length, BYTE *buffer)
Definition: filesource.c:884
static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader *iface, DWORD timeout, IMediaSample **sample, DWORD_PTR *cookie)
Definition: filesource.c:778
static int byte_from_hex_char(WCHAR c)
Definition: filesource.c:104
static DWORD CALLBACK io_thread(void *arg)
Definition: filesource.c:392
static HRESULT WINAPI FileSource_GetCurFile(IFileSourceFilter *iface, LPOLESTR *ppszFileName, AM_MEDIA_TYPE *mt)
Definition: filesource.c:532
static const IFileSourceFilterVtbl FileSource_Vtbl
Definition: filesource.c:101
static ULONG WINAPI FileSource_AddRef(IFileSourceFilter *iface)
Definition: filesource.c:459
static struct async_reader * impl_from_strmbase_filter(struct strmbase_filter *iface)
Definition: filesource.c:91
static HRESULT WINAPI FileAsyncReader_Length(IAsyncReader *iface, LONGLONG *total, LONGLONG *available)
Definition: filesource.c:906
static ULONG WINAPI FileSource_Release(IFileSourceFilter *iface)
Definition: filesource.c:465
static struct async_reader * impl_from_IAsyncReader(IAsyncReader *iface)
Definition: filesource.c:573
static BOOL sync_read(HANDLE file, LONGLONG offset, LONG length, BYTE *buffer, DWORD *read_len)
Definition: filesource.c:828
static HRESULT WINAPI FileSource_QueryInterface(IFileSourceFilter *iface, REFIID riid, LPVOID *ppv)
Definition: filesource.c:453
static ULONG WINAPI FileAsyncReader_Release(IAsyncReader *iface)
Definition: filesource.c:667
static const struct strmbase_source_ops source_ops
Definition: filesource.c:89
static HRESULT async_reader_query_interface(struct strmbase_filter *iface, REFIID iid, void **out)
Definition: filesource.c:371
static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
Definition: filesource.c:590
static struct async_reader * impl_from_IFileSourceFilter(IFileSourceFilter *iface)
Definition: filesource.c:96
static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file)
Definition: filesource.c:112
static HRESULT WINAPI FileAsyncReader_BeginFlush(IAsyncReader *iface)
Definition: filesource.c:917
static HRESULT source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
Definition: filesource.c:578
static void async_reader_destroy(struct strmbase_filter *iface)
Definition: filesource.c:333
HRESULT async_reader_create(IUnknown *outer, IUnknown **out)
Definition: filesource.c:430
static const struct strmbase_filter_ops filter_ops
Definition: filesource.c:385
static HRESULT WINAPI FileAsyncReader_EndFlush(IAsyncReader *iface)
Definition: filesource.c:937
static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(struct strmbase_source *This, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: filesource.c:621
static HRESULT WINAPI FileAsyncReader_QueryInterface(IAsyncReader *iface, REFIID iid, void **out)
Definition: filesource.c:655
static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader *iface, IMediaSample *sample, DWORD_PTR cookie)
Definition: filesource.c:722
static const AM_MEDIA_TYPE default_mt
Definition: filesource.c:50
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
Definition: filesource.c:604
static HRESULT WINAPI FileSource_Load(IFileSourceFilter *iface, LPCOLESTR pszFileName, const AM_MEDIA_TYPE *pmt)
Definition: filesource.c:471
BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid)
Definition: filesource.c:198
static struct async_reader * impl_from_strmbase_pin(struct strmbase_pin *iface)
Definition: filesource.c:568
static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMediaSample *sample)
Definition: filesource.c:849
static struct strmbase_pin * async_reader_get_pin(struct strmbase_filter *iface, unsigned int index)
Definition: filesource.c:324
static HRESULT WINAPI FileAsyncReader_RequestAllocator(IAsyncReader *iface, IMemAllocator *preferred, ALLOCATOR_PROPERTIES *props, IMemAllocator **ret_allocator)
Definition: filesource.c:673
static ULONG WINAPI FileAsyncReader_AddRef(IAsyncReader *iface)
Definition: filesource.c:661
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2830
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3662
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
Definition: combase.c:1470
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
static WCHAR available[MAX_STRING_RESOURCE_LEN]
Definition: object.c:2402
#define CloseHandle
Definition: compat.h:739
#define wcschr
Definition: compat.h:17
#define FILE_BEGIN
Definition: compat.h:761
#define wcsrchr
Definition: compat.h:16
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define SetFilePointer
Definition: compat.h:743
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define GetFileSizeEx
Definition: compat.h:757
#define CALLBACK
Definition: compat.h:35
#define FILE_SHARE_READ
Definition: compat.h:136
static const WCHAR *const ext[]
Definition: module.c:53
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
BOOL WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
Definition: sync.c:59
VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:91
VOID WINAPI InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:22
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:98
BOOL WINAPI DECLSPEC_HOTPATCH CancelIoEx(HANDLE handle, LPOVERLAPPED overlapped)
Definition: file.c:3005
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
#define INFINITE
Definition: serial.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
size_t total
GLuint start
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
const GLubyte * c
Definition: glext.h:8905
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
GLubyte * pattern
Definition: glext.h:7787
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
Definition: axcore.idl:92
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
BOOL WINAPI PostQueuedCompletionStatus(IN HANDLE CompletionHandle, IN DWORD dwNumberOfBytesTransferred, IN ULONG_PTR dwCompletionKey, IN LPOVERLAPPED lpOverlapped)
Definition: iocompl.c:192
HANDLE WINAPI CreateIoCompletionPort(IN HANDLE FileHandle, IN HANDLE ExistingCompletionPort, IN ULONG_PTR CompletionKey, IN DWORD NumberOfConcurrentThreads)
Definition: iocompl.c:65
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
Definition: iocompl.c:221
BOOL WINAPI GetQueuedCompletionStatus(IN HANDLE CompletionHandle, IN LPDWORD lpNumberOfBytesTransferred, OUT PULONG_PTR lpCompletionKey, OUT LPOVERLAPPED *lpOverlapped, IN DWORD dwMilliseconds)
Definition: iocompl.c:131
#define d
Definition: ke_i.h:81
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define GUID_NULL
Definition: ks.h:106
#define FILE_FLAG_OVERLAPPED
Definition: disk.h:46
static HANDLE PIO_APC_ROUTINE void PIO_STATUS_BLOCK io_status
Definition: comm.c:56
static void ULONG ULONG * ret_size
Definition: time.c:40
static IUnknown * outer
Definition: compobj.c:82
const GUID * subtype
Definition: mpegvideo.c:120
_In_ HANDLE hFile
Definition: mswsock.h:90
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED lpOverlapped
Definition: mswsock.h:93
#define KEY_READ
Definition: nt_native.h:1026
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
#define DWORD
Definition: nt_native.h:44
NTSTATUS NTAPI NtCancelIoFile(IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock)
Definition: file.c:4018
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define MEDIATIME_FROM_BYTES(x)
#define BYTES_FROM_MEDIATIME(time)
#define calloc
Definition: rosglue.h:14
wcscat
wcscpy
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pDest, const AM_MEDIA_TYPE *pSrc)
Definition: mediatype.c:150
void WINAPI FreeMediaType(AM_MEDIA_TYPE *pMediaType)
Definition: mediatype.c:165
void strmbase_source_init(struct strmbase_source *pin, struct strmbase_filter *filter, const WCHAR *name, const struct strmbase_source_ops *func_table)
Definition: pin.c:765
void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt)
Definition: mediatype.c:58
void strmbase_filter_cleanup(struct strmbase_filter *filter)
Definition: filter.c:540
void strmbase_source_cleanup(struct strmbase_source *pin)
Definition: pin.c:778
void strmbase_filter_init(struct strmbase_filter *filter, IUnknown *outer, const CLSID *clsid, const struct strmbase_filter_ops *func_table)
Definition: filter.c:517
VOID WINAPI BaseFilterImpl_IncrementPinVersion(struct strmbase_filter *filter)
Definition: filter.c:512
DWORD OffsetHigh
Definition: minwinbase.h:226
DWORD Offset
Definition: minwinbase.h:225
HANDLE hEvent
Definition: minwinbase.h:230
IAsyncReader IAsyncReader_iface
Definition: filesource.c:76
CRITICAL_SECTION sample_cs
Definition: filesource.c:82
HANDLE io_thread
Definition: filesource.c:80
HANDLE port
Definition: filesource.c:80
HANDLE file
Definition: filesource.c:80
struct request * requests
Definition: filesource.c:84
IFileSourceFilter IFileSourceFilter_iface
Definition: filesource.c:73
LPOLESTR pszFileName
Definition: filesource.c:78
BOOL flushing
Definition: filesource.c:83
CONDITION_VARIABLE sample_cv
Definition: filesource.c:86
unsigned int max_requests
Definition: filesource.c:85
LARGE_INTEGER file_size
Definition: filesource.c:81
AM_MEDIA_TYPE mt
Definition: filesource.c:79
Definition: cookie.c:34
Definition: fci.c:123
Definition: filter.c:165
IBaseFilter * filter
Definition: filtergraph.c:75
Definition: copy.c:22
Definition: tftpd.h:86
IMediaSample * sample
Definition: filesource.c:65
OVERLAPPED ovl
Definition: filesource.c:67
DWORD_PTR cookie
Definition: filesource.c:66
Definition: wave.c:25
Definition: dhcpd.h:248
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
#define DWORD_PTR
Definition: treelist.c:76
uint32_t DWORD_PTR
Definition: typedefs.h:65
int64_t LONGLONG
Definition: typedefs.h:68
PVOID HANDLE
Definition: typedefs.h:73
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44
#define VFW_E_TYPE_NOT_ACCEPTED
Definition: vfwmsgs.h:81
#define VFW_E_TIMEOUT
Definition: vfwmsgs.h:85
#define VFW_E_WRONG_STATE
Definition: vfwmsgs.h:78
#define VFW_S_NO_MORE_ITEMS
Definition: vfwmsgs.h:19
static const WCHAR props[]
Definition: wbemdisp.c:288
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1195
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
void * arg
Definition: msvc.h:10
#define WINAPI
Definition: msvc.h:6
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define ERROR_HANDLE_EOF
Definition: winerror.h:262
#define E_POINTER
Definition: winerror.h:3480
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
unsigned char BYTE
Definition: xxhash.c:193