47#define CancelIoEx CancelIoEx_
52 {0xe436eb83,0x524f,0x11ce,{0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70}},
53 {0,0,0,{0,0,0,0,0,0,0,0}},
57 {0,0,0,{0,0,0,0,0,0,0,0}},
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;
200 WCHAR extensions_path[278] =
L"Media Type\\Extensions\\";
214 size =
sizeof(guidstr);
218 size =
sizeof(guidstr);
222 size =
sizeof(guidstr);
244 for (majortype_idx = 0; ; ++majortype_idx)
246 WCHAR majortype_str[39];
254 if (!
wcscmp(majortype_str,
L"Extensions"))
260 for (subtype_idx = 0; ; ++subtype_idx)
273 if (
RegQueryInfoKeyW(subtype_key,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL, &
max_size,
NULL,
NULL))
278 for (value_idx = 0; ; ++value_idx)
281 WCHAR value_name[14], source_clsid_str[39];
285 if (
RegEnumValueW(subtype_key, value_idx, value_name, &value_len,
289 if (!
wcscmp(value_name,
L"Source Filter"))
299 size =
sizeof(source_clsid_str);
329 return &
filter->source.pin;
341 if (
filter->source.pin.peer)
342 IPin_Disconnect(
filter->source.pin.peer);
344 IPin_Disconnect(&
filter->source.pin.IPin_iface);
348 for (
i = 0;
i <
filter->max_requests; ++
i)
359 filter->sample_cs.DebugInfo->Spare[0] = 0;
413 TRACE(
"Got sample %Iu.\n", req -
filter->requests);
420 ERR(
"GetQueuedCompletionStatus() returned failure, error %lu.\n",
GetLastError());
434 if (!(
object =
calloc(1,
sizeof(*
object))))
443 object->sample_cs.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": FileAsyncReader.sample_cs");
448 TRACE(
"Created file source %p.\n",
object);
449 *
out = &
object->filter.IUnknown_inner;
462 return IBaseFilter_AddRef(&
filter->
filter.IBaseFilter_iface);
468 return IBaseFilter_Release(&
filter->
filter.IBaseFilter_iface);
493 WARN(
"Could not get file size.\n");
498 if (
This->pszFileName)
522 TRACE(
"Found major type %s, subtype %s.\n",
536 TRACE(
"filter %p, filename %p, mt %p.\n",
This, ppszFileName,
mt);
542 if (
This->pszFileName)
551 *ppszFileName =
NULL;
626 TRACE(
"%p->(%p, %p)\n",
This, pReceivePin, pmt);
628 if (
This->pin.ops->pin_query_accept(&
This->pin, pmt) !=
S_OK)
631 This->pin.peer = pReceivePin;
632 IPin_AddRef(pReceivePin);
635 hr = IPin_ReceiveConnection(pReceivePin, &
This->pin.IPin_iface, pmt);
639 IPin_Release(
This->pin.peer);
658 return IPin_QueryInterface(&
filter->source.pin.IPin_iface, iid,
out);
664 return IPin_AddRef(&
filter->source.pin.IPin_iface);
670 return IPin_Release(&
filter->source.pin.IPin_iface);
681 TRACE(
"filter %p, preferred %p, props %p, ret_allocator %p.\n",
filter, preferred,
props, ret_allocator);
686 *ret_allocator =
NULL;
689 IMemAllocator_AddRef(
allocator = preferred);
691 CLSCTX_INPROC, &IID_IMemAllocator, (
void **)&
allocator)))
702 for (
i = 0;
i <
filter->max_requests; ++
i)
708 TRACE(
"Maximum request count: %u.\n",
filter->max_requests);
715 for (
i = 0;
i <
filter->max_requests; ++
i)
752 for (
i = 0;
i <
filter->max_requests; ++
i)
754 if (!
filter->requests[
i].sample)
757 assert(i < filter->max_requests);
799 for (
i = 0;
i <
filter->max_requests; ++
i)
808 IMediaSample_SetActualDataLength(req->
sample,
size);
818 TRACE(
"Returning sample %u.\n",
i);
843 TRACE(
"Returning %lu bytes.\n", *read_len);
861 hr = IMediaSample_GetTime(
sample, &start_time, &end_time);
879 IMediaSample_SetActualDataLength(
sample, read_len);
892 TRACE(
"filter %p, offset %s, length %ld, buffer %p.\n",
922 TRACE(
"iface %p.\n", iface);
927 for (
i = 0;
i <
filter->max_requests; ++
i)
941 TRACE(
"iface %p.\n", iface);
HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription(_In_ HANDLE hThread, _In_ PCWSTR lpThreadDescription)
static void * heap_alloc(size_t len)
static BOOL heap_free(void *mem)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define RegCloseKey(hKey)
const GUID IID_IAsyncReader
static const IAsyncReaderVtbl FileAsyncReader_Vtbl
static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface, LONGLONG offset, LONG length, BYTE *buffer)
static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader *iface, DWORD timeout, IMediaSample **sample, DWORD_PTR *cookie)
static int byte_from_hex_char(WCHAR c)
static DWORD CALLBACK io_thread(void *arg)
static HRESULT WINAPI FileSource_GetCurFile(IFileSourceFilter *iface, LPOLESTR *ppszFileName, AM_MEDIA_TYPE *mt)
static const IFileSourceFilterVtbl FileSource_Vtbl
static ULONG WINAPI FileSource_AddRef(IFileSourceFilter *iface)
static struct async_reader * impl_from_strmbase_filter(struct strmbase_filter *iface)
static HRESULT WINAPI FileAsyncReader_Length(IAsyncReader *iface, LONGLONG *total, LONGLONG *available)
static ULONG WINAPI FileSource_Release(IFileSourceFilter *iface)
static struct async_reader * impl_from_IAsyncReader(IAsyncReader *iface)
static BOOL sync_read(HANDLE file, LONGLONG offset, LONG length, BYTE *buffer, DWORD *read_len)
static HRESULT WINAPI FileSource_QueryInterface(IFileSourceFilter *iface, REFIID riid, LPVOID *ppv)
static ULONG WINAPI FileAsyncReader_Release(IAsyncReader *iface)
static const struct strmbase_source_ops source_ops
static HRESULT async_reader_query_interface(struct strmbase_filter *iface, REFIID iid, void **out)
static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
static struct async_reader * impl_from_IFileSourceFilter(IFileSourceFilter *iface)
static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file)
static HRESULT WINAPI FileAsyncReader_BeginFlush(IAsyncReader *iface)
static HRESULT source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
static void async_reader_destroy(struct strmbase_filter *iface)
HRESULT async_reader_create(IUnknown *outer, IUnknown **out)
static const struct strmbase_filter_ops filter_ops
static HRESULT WINAPI FileAsyncReader_EndFlush(IAsyncReader *iface)
static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(struct strmbase_source *This, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
static HRESULT WINAPI FileAsyncReader_QueryInterface(IAsyncReader *iface, REFIID iid, void **out)
static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader *iface, IMediaSample *sample, DWORD_PTR cookie)
static const AM_MEDIA_TYPE default_mt
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
static HRESULT WINAPI FileSource_Load(IFileSourceFilter *iface, LPCOLESTR pszFileName, const AM_MEDIA_TYPE *pmt)
BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid)
static struct async_reader * impl_from_strmbase_pin(struct strmbase_pin *iface)
static HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMediaSample *sample)
static struct strmbase_pin * async_reader_get_pin(struct strmbase_filter *iface, unsigned int index)
static HRESULT WINAPI FileAsyncReader_RequestAllocator(IAsyncReader *iface, IMemAllocator *preferred, ALLOCATOR_PROPERTIES *props, IMemAllocator **ret_allocator)
static ULONG WINAPI FileAsyncReader_AddRef(IAsyncReader *iface)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
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)
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)
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)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
void *WINAPI CoTaskMemAlloc(SIZE_T size)
static WCHAR available[MAX_STRING_RESOURCE_LEN]
#define ReadFile(a, b, c, d, e)
#define INVALID_HANDLE_VALUE
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
static const WCHAR *const ext[]
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)
BOOL WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
VOID WINAPI InitializeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
BOOL WINAPI DECLSPEC_HOTPATCH CancelIoEx(HANDLE handle, LPOVERLAPPED overlapped)
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
static wchar_t * wcsdup(const wchar_t *str)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLsizei GLsizei * length
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
BOOL WINAPI PostQueuedCompletionStatus(IN HANDLE CompletionHandle, IN DWORD dwNumberOfBytesTransferred, IN ULONG_PTR dwCompletionKey, IN LPOVERLAPPED lpOverlapped)
HANDLE WINAPI CreateIoCompletionPort(IN HANDLE FileHandle, IN HANDLE ExistingCompletionPort, IN ULONG_PTR CompletionKey, IN DWORD NumberOfConcurrentThreads)
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
BOOL WINAPI GetQueuedCompletionStatus(IN HANDLE CompletionHandle, IN LPDWORD lpNumberOfBytesTransferred, OUT PULONG_PTR lpCompletionKey, OUT LPOVERLAPPED *lpOverlapped, IN DWORD dwMilliseconds)
#define FILE_FLAG_OVERLAPPED
static HANDLE PIO_APC_ROUTINE void PIO_STATUS_BLOCK io_status
static void ULONG ULONG * ret_size
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED lpOverlapped
#define FILE_SHARE_DELETE
NTSTATUS NTAPI NtCancelIoFile(IN HANDLE FileHandle, OUT PIO_STATUS_BLOCK IoStatusBlock)
#define IsEqualGUID(rguid1, rguid2)
#define MEDIATIME_FROM_BYTES(x)
#define BYTES_FROM_MEDIATIME(time)
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pDest, const AM_MEDIA_TYPE *pSrc)
void WINAPI FreeMediaType(AM_MEDIA_TYPE *pMediaType)
void strmbase_source_init(struct strmbase_source *pin, struct strmbase_filter *filter, const WCHAR *name, const struct strmbase_source_ops *func_table)
void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt)
void strmbase_filter_cleanup(struct strmbase_filter *filter)
void strmbase_source_cleanup(struct strmbase_source *pin)
void strmbase_filter_init(struct strmbase_filter *filter, IUnknown *outer, const CLSID *clsid, const struct strmbase_filter_ops *func_table)
VOID WINAPI BaseFilterImpl_IncrementPinVersion(struct strmbase_filter *filter)
IAsyncReader IAsyncReader_iface
CRITICAL_SECTION sample_cs
struct request * requests
IFileSourceFilter IFileSourceFilter_iface
CONDITION_VARIABLE sample_cv
unsigned int max_requests
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
#define CONTAINING_RECORD(address, type, field)
WORD WORD PSZ PSZ pszFileName
#define VFW_E_TYPE_NOT_ACCEPTED
#define VFW_E_WRONG_STATE
#define VFW_S_NO_MORE_ITEMS
static const WCHAR props[]
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
DWORD WINAPI GetLastError(void)
HANDLE WINAPI GetCurrentThread(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
#define HKEY_CLASSES_ROOT