ReactOS 0.4.17-dev-934-g091855f
filesource.c File Reference
#include "quartz_private.h"
#include "wine/debug.h"
#include "uuids.h"
#include "vfwmsgs.h"
#include "winbase.h"
#include "winreg.h"
#include "shlwapi.h"
#include <assert.h>
Include dependency graph for filesource.c:

Go to the source code of this file.

Classes

struct  request
 
struct  async_reader
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (quartz)
 
static struct async_reader * impl_from_strmbase_filter (struct strmbase_filter *iface)
 
static struct async_reader * impl_from_IFileSourceFilter (IFileSourceFilter *iface)
 
static int byte_from_hex_char (WCHAR c)
 
static BOOL process_pattern_string (const WCHAR *pattern, HANDLE file)
 
BOOL get_media_type (const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid)
 
static struct strmbase_pin * async_reader_get_pin (struct strmbase_filter *iface, unsigned int index)
 
static void async_reader_destroy (struct strmbase_filter *iface)
 
static HRESULT async_reader_query_interface (struct strmbase_filter *iface, REFIID iid, void **out)
 
static DWORD CALLBACK io_thread (void *arg)
 
HRESULT async_reader_create (IUnknown *outer, IUnknown **out)
 
static HRESULT WINAPI FileSource_QueryInterface (IFileSourceFilter *iface, REFIID riid, LPVOID *ppv)
 
static ULONG WINAPI FileSource_AddRef (IFileSourceFilter *iface)
 
static ULONG WINAPI FileSource_Release (IFileSourceFilter *iface)
 
static HRESULT WINAPI FileSource_Load (IFileSourceFilter *iface, LPCOLESTR pszFileName, const AM_MEDIA_TYPE *pmt)
 
static HRESULT WINAPI FileSource_GetCurFile (IFileSourceFilter *iface, LPOLESTR *ppszFileName, AM_MEDIA_TYPE *mt)
 
static struct async_reader * impl_from_strmbase_pin (struct strmbase_pin *iface)
 
static struct async_reader * impl_from_IAsyncReader (IAsyncReader *iface)
 
static HRESULT source_query_accept (struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
 
static HRESULT source_get_media_type (struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
 
static HRESULT source_query_interface (struct strmbase_pin *iface, REFIID iid, void **out)
 
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 ULONG WINAPI FileAsyncReader_AddRef (IAsyncReader *iface)
 
static ULONG WINAPI FileAsyncReader_Release (IAsyncReader *iface)
 
static HRESULT WINAPI FileAsyncReader_RequestAllocator (IAsyncReader *iface, IMemAllocator *preferred, ALLOCATOR_PROPERTIES *props, IMemAllocator **ret_allocator)
 
static HRESULT WINAPI FileAsyncReader_Request (IAsyncReader *iface, IMediaSample *sample, DWORD_PTR cookie)
 
static HRESULT WINAPI FileAsyncReader_WaitForNext (IAsyncReader *iface, DWORD timeout, IMediaSample **sample, DWORD_PTR *cookie)
 
static BOOL sync_read (HANDLE file, LONGLONG offset, LONG length, BYTE *buffer, DWORD *read_len)
 
static HRESULT WINAPI FileAsyncReader_SyncReadAligned (IAsyncReader *iface, IMediaSample *sample)
 
static HRESULT WINAPI FileAsyncReader_SyncRead (IAsyncReader *iface, LONGLONG offset, LONG length, BYTE *buffer)
 
static HRESULT WINAPI FileAsyncReader_Length (IAsyncReader *iface, LONGLONG *total, LONGLONG *available)
 
static HRESULT WINAPI FileAsyncReader_BeginFlush (IAsyncReader *iface)
 
static HRESULT WINAPI FileAsyncReader_EndFlush (IAsyncReader *iface)
 

Variables

static const AM_MEDIA_TYPE default_mt
 
static const struct strmbase_source_ops source_ops
 
static const IFileSourceFilterVtbl FileSource_Vtbl
 
static const IAsyncReaderVtbl FileAsyncReader_Vtbl
 
static const struct strmbase_filter_ops filter_ops
 

Function Documentation

◆ async_reader_create()

HRESULT async_reader_create ( IUnknown *  outer,
IUnknown **  out 
)

Definition at line 430 of file filesource.c.

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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define NULL
Definition: types.h:112
static const IAsyncReaderVtbl FileAsyncReader_Vtbl
Definition: filesource.c:102
static DWORD CALLBACK io_thread(void *arg)
Definition: filesource.c:392
static const IFileSourceFilterVtbl FileSource_Vtbl
Definition: filesource.c:101
static const struct strmbase_filter_ops filter_ops
Definition: filesource.c:385
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
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
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
#define S_OK
Definition: intsafe.h:52
HANDLE WINAPI CreateIoCompletionPort(IN HANDLE FileHandle, IN HANDLE ExistingCompletionPort, IN ULONG_PTR CompletionKey, IN DWORD NumberOfConcurrentThreads)
Definition: iocompl.c:65
static IUnknown * outer
Definition: compobj.c:82
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
void strmbase_filter_init(struct strmbase_filter *filter, IUnknown *outer, const CLSID *clsid, const struct strmbase_filter_ops *func_table)
Definition: filter.c:517
#define DWORD_PTR
Definition: treelist.c:76
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156

◆ async_reader_destroy()

static void async_reader_destroy ( struct strmbase_filter *  iface)
static

Definition at line 333 of file filesource.c.

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}
#define free
Definition: debug_ros.c:5
static struct async_reader * impl_from_strmbase_filter(struct strmbase_filter *iface)
Definition: filesource.c:91
#define CloseHandle
Definition: compat.h:739
#define INFINITE
Definition: serial.h:102
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
BOOL WINAPI PostQueuedCompletionStatus(IN HANDLE CompletionHandle, IN DWORD dwNumberOfBytesTransferred, IN ULONG_PTR dwCompletionKey, IN LPOVERLAPPED lpOverlapped)
Definition: iocompl.c:192
void WINAPI FreeMediaType(AM_MEDIA_TYPE *pMediaType)
Definition: mediatype.c:165
void strmbase_filter_cleanup(struct strmbase_filter *filter)
Definition: filter.c:540
void strmbase_source_cleanup(struct strmbase_source *pin)
Definition: pin.c:778
Definition: filter.c:165
IBaseFilter * filter
Definition: filtergraph.c:75
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)

◆ async_reader_get_pin()

static struct strmbase_pin * async_reader_get_pin ( struct strmbase_filter *  iface,
unsigned int  index 
)
static

Definition at line 324 of file filesource.c.

325{
327
328 if (!index && filter->pszFileName)
329 return &filter->source.pin;
330 return NULL;
331}
GLuint index
Definition: glext.h:6031

◆ async_reader_query_interface()

static HRESULT async_reader_query_interface ( struct strmbase_filter *  iface,
REFIID  iid,
void **  out 
)
static

Definition at line 371 of file filesource.c.

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}
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ byte_from_hex_char()

static int byte_from_hex_char ( WCHAR  c)
static

Definition at line 104 of file filesource.c.

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}
const GLubyte * c
Definition: glext.h:8905

Referenced by process_pattern_string().

◆ FileAsyncReader_AddRef()

static ULONG WINAPI FileAsyncReader_AddRef ( IAsyncReader *  iface)
static

Definition at line 661 of file filesource.c.

662{
664 return IPin_AddRef(&filter->source.pin.IPin_iface);
665}
static struct async_reader * impl_from_IAsyncReader(IAsyncReader *iface)
Definition: filesource.c:573

◆ FileAsyncReader_BeginFlush()

static HRESULT WINAPI FileAsyncReader_BeginFlush ( IAsyncReader *  iface)
static

Definition at line 917 of file filesource.c.

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}
#define TRUE
Definition: types.h:120
VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:91
BOOL WINAPI DECLSPEC_HOTPATCH CancelIoEx(HANDLE handle, LPOVERLAPPED overlapped)
Definition: file.c:3005
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

◆ FileAsyncReader_EndFlush()

static HRESULT WINAPI FileAsyncReader_EndFlush ( IAsyncReader *  iface)
static

Definition at line 937 of file filesource.c.

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}
#define FALSE
Definition: types.h:117

◆ FileAsyncReader_Length()

static HRESULT WINAPI FileAsyncReader_Length ( IAsyncReader *  iface,
LONGLONG *  total,
LONGLONG *  available 
)
static

Definition at line 906 of file filesource.c.

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}
static WCHAR available[MAX_STRING_RESOURCE_LEN]
Definition: object.c:2402
size_t total

◆ FileAsyncReader_QueryInterface()

static HRESULT WINAPI FileAsyncReader_QueryInterface ( IAsyncReader *  iface,
REFIID  iid,
void **  out 
)
static

Definition at line 655 of file filesource.c.

656{
658 return IPin_QueryInterface(&filter->source.pin.IPin_iface, iid, out);
659}

◆ FileAsyncReader_Release()

static ULONG WINAPI FileAsyncReader_Release ( IAsyncReader *  iface)
static

Definition at line 667 of file filesource.c.

668{
670 return IPin_Release(&filter->source.pin.IPin_iface);
671}

◆ FileAsyncReader_Request()

static HRESULT WINAPI FileAsyncReader_Request ( IAsyncReader *  iface,
IMediaSample *  sample,
DWORD_PTR  cookie 
)
static

Definition at line 722 of file filesource.c.

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}
#define ERROR_IO_PENDING
Definition: dderror.h:15
HRESULT hr
Definition: delayimp.cpp:582
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define assert(_expr)
Definition: assert.h:32
LONGLONG REFERENCE_TIME
Definition: dmusicks.h:9
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
#define FAILED(hr)
Definition: intsafe.h:51
#define BYTES_FROM_MEDIATIME(time)
DWORD OffsetHigh
Definition: minwinbase.h:226
DWORD Offset
Definition: minwinbase.h:225
Definition: cookie.c:34
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
#define VFW_E_WRONG_STATE
Definition: vfwmsgs.h:78
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_HANDLE_EOF
Definition: winerror.h:262
#define E_POINTER
Definition: winerror.h:3480
unsigned char BYTE
Definition: xxhash.c:193

◆ FileAsyncReader_RequestAllocator()

static HRESULT WINAPI FileAsyncReader_RequestAllocator ( IAsyncReader *  iface,
IMemAllocator *  preferred,
ALLOCATOR_PROPERTIES *  props,
IMemAllocator **  ret_allocator 
)
static

Definition at line 673 of file filesource.c.

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}
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
static const WCHAR props[]
Definition: wbemdisp.c:288

◆ FileAsyncReader_SyncRead()

static HRESULT WINAPI FileAsyncReader_SyncRead ( IAsyncReader *  iface,
LONGLONG  offset,
LONG  length,
BYTE *  buffer 
)
static

Definition at line 884 of file filesource.c.

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}
static BOOL sync_read(HANDLE file, LONGLONG offset, LONG length, BYTE *buffer, DWORD *read_len)
Definition: filesource.c:828
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
return ret
Definition: mutex.c:147
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint buffer
Definition: glext.h:5915
GLintptr offset
Definition: glext.h:5920
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
#define S_FALSE
Definition: winerror.h:3451

◆ FileAsyncReader_SyncReadAligned()

static HRESULT WINAPI FileAsyncReader_SyncReadAligned ( IAsyncReader *  iface,
IMediaSample *  sample 
)
static

Definition at line 849 of file filesource.c.

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}
#define SUCCEEDED(hr)
Definition: intsafe.h:50
long LONG
Definition: pedump.c:60

◆ FileAsyncReader_WaitForNext()

static HRESULT WINAPI FileAsyncReader_WaitForNext ( IAsyncReader *  iface,
DWORD  timeout,
IMediaSample **  sample,
DWORD_PTR *  cookie 
)
static

Definition at line 778 of file filesource.c.

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}
BOOL WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD Timeout)
Definition: sync.c:59
GLsizeiptr size
Definition: glext.h:5919
BOOL WINAPI GetOverlappedResult(IN HANDLE hFile, IN LPOVERLAPPED lpOverlapped, OUT LPDWORD lpNumberOfBytesTransferred, IN BOOL bWait)
Definition: iocompl.c:221
#define MEDIATIME_FROM_BYTES(x)
Definition: dhcpd.h:248
uint64_t ULONGLONG
Definition: typedefs.h:67
#define VFW_E_TIMEOUT
Definition: vfwmsgs.h:85

◆ FileAsyncReaderPin_AttemptConnection()

static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection ( struct strmbase_source *  This,
IPin *  pReceivePin,
const AM_MEDIA_TYPE *  pmt 
)
static

Definition at line 621 of file filesource.c.

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}
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pDest, const AM_MEDIA_TYPE *pSrc)
Definition: mediatype.c:150
#define VFW_E_TYPE_NOT_ACCEPTED
Definition: vfwmsgs.h:81

◆ FileSource_AddRef()

static ULONG WINAPI FileSource_AddRef ( IFileSourceFilter *  iface)
static

Definition at line 459 of file filesource.c.

460{
462 return IBaseFilter_AddRef(&filter->filter.IBaseFilter_iface);
463}
static struct async_reader * impl_from_IFileSourceFilter(IFileSourceFilter *iface)
Definition: filesource.c:96

◆ FileSource_GetCurFile()

static HRESULT WINAPI FileSource_GetCurFile ( IFileSourceFilter *  iface,
LPOLESTR *  ppszFileName,
AM_MEDIA_TYPE *  mt 
)
static

Definition at line 532 of file filesource.c.

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}
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
short WCHAR
Definition: pedump.c:58
wcscpy
#define memset(x, y, z)
Definition: compat.h:39
AM_MEDIA_TYPE mt
Definition: filesource.c:79

◆ FileSource_Load()

static HRESULT WINAPI FileSource_Load ( IFileSourceFilter *  iface,
LPCOLESTR  pszFileName,
const AM_MEDIA_TYPE *  pmt 
)
static

Definition at line 471 of file filesource.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
static const struct strmbase_source_ops source_ops
Definition: filesource.c:89
static const AM_MEDIA_TYPE default_mt
Definition: filesource.c:50
BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid)
Definition: filesource.c:198
#define OPEN_EXISTING
Definition: compat.h:775
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define GetFileSizeEx
Definition: compat.h:757
#define FILE_SHARE_READ
Definition: compat.h:136
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
#define L(x)
Definition: resources.c:13
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define FILE_FLAG_OVERLAPPED
Definition: disk.h:46
_In_ HANDLE hFile
Definition: mswsock.h:90
#define FILE_SHARE_DELETE
Definition: nt_native.h:682
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 WINAPI BaseFilterImpl_IncrementPinVersion(struct strmbase_filter *filter)
Definition: filter.c:512
WORD WORD PSZ PSZ pszFileName
Definition: vdmdbg.h:44

◆ FileSource_QueryInterface()

static HRESULT WINAPI FileSource_QueryInterface ( IFileSourceFilter *  iface,
REFIID  riid,
LPVOID *  ppv 
)
static

Definition at line 453 of file filesource.c.

454{
456 return IBaseFilter_QueryInterface(&filter->filter.IBaseFilter_iface, riid, ppv);
457}
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39

◆ FileSource_Release()

static ULONG WINAPI FileSource_Release ( IFileSourceFilter *  iface)
static

Definition at line 465 of file filesource.c.

466{
468 return IBaseFilter_Release(&filter->filter.IBaseFilter_iface);
469}

◆ get_media_type()

BOOL get_media_type ( const WCHAR *  filename,
GUID *  majortype,
GUID *  subtype,
GUID *  source_clsid 
)

Definition at line 198 of file filesource.c.

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}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define ARRAY_SIZE(A)
Definition: main.h:20
static INT max_size
Definition: history.c:51
#define RegCloseKey(hKey)
Definition: registry.h:49
static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file)
Definition: filesource.c:112
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
#define wcsrchr
Definition: compat.h:16
static const WCHAR *const ext[]
Definition: module.c:53
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
GLubyte * pattern
Definition: glext.h:7787
const char * filename
Definition: ioapi.h:137
const GUID * subtype
Definition: mpegvideo.c:120
#define KEY_READ
Definition: nt_native.h:1026
wcscat
Definition: fci.c:123
Definition: copy.c:22
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

Referenced by FileSource_Load(), FilterGraph2_AddSourceFilter(), and source_get_media_type().

◆ impl_from_IAsyncReader()

◆ impl_from_IFileSourceFilter()

static struct async_reader * impl_from_IFileSourceFilter ( IFileSourceFilter *  iface)
inlinestatic

Definition at line 96 of file filesource.c.

97{
98 return CONTAINING_RECORD(iface, struct async_reader, IFileSourceFilter_iface);
99}

Referenced by FileSource_AddRef(), FileSource_GetCurFile(), FileSource_Load(), FileSource_QueryInterface(), and FileSource_Release().

◆ impl_from_strmbase_filter()

static struct async_reader * impl_from_strmbase_filter ( struct strmbase_filter *  iface)
inlinestatic

Definition at line 91 of file filesource.c.

92{
93 return CONTAINING_RECORD(iface, struct async_reader, filter);
94}

Referenced by async_reader_destroy(), async_reader_get_pin(), and async_reader_query_interface().

◆ impl_from_strmbase_pin()

static struct async_reader * impl_from_strmbase_pin ( struct strmbase_pin *  iface)
inlinestatic

Definition at line 568 of file filesource.c.

569{
570 return CONTAINING_RECORD(iface, struct async_reader, source.pin);
571}

Referenced by source_get_media_type(), source_query_accept(), and source_query_interface().

◆ io_thread()

static DWORD CALLBACK io_thread ( void *  arg)
static

Definition at line 392 of file filesource.c.

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}
HRESULT WINAPI DECLSPEC_HOTPATCH SetThreadDescription(_In_ HANDLE hThread, _In_ PCWSTR lpThreadDescription)
#define ERR(fmt,...)
Definition: precomp.h:57
VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE ConditionVariable)
Definition: sync.c:98
BOOL WINAPI GetQueuedCompletionStatus(IN HANDLE CompletionHandle, IN LPDWORD lpNumberOfBytesTransferred, OUT PULONG_PTR lpCompletionKey, OUT LPOVERLAPPED *lpOverlapped, IN DWORD dwMilliseconds)
Definition: iocompl.c:131
uint32_t ULONG_PTR
Definition: typedefs.h:65
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1195
void * arg
Definition: msvc.h:10

Referenced by async_reader_create().

◆ process_pattern_string()

static BOOL process_pattern_string ( const WCHAR *  pattern,
HANDLE  file 
)
static

Definition at line 112 of file filesource.c.

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}
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
static int byte_from_hex_char(WCHAR c)
Definition: filesource.c:104
#define wcschr
Definition: compat.h:17
#define FILE_BEGIN
Definition: compat.h:761
#define SetFilePointer
Definition: compat.h:743
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
GLenum GLint GLuint mask
Definition: glext.h:6028
#define d
Definition: ke_i.h:81
static void ULONG ULONG * ret_size
Definition: time.c:40
uint32_t ULONG
Definition: typedefs.h:59

Referenced by get_media_type(), and process_pattern_string().

◆ source_get_media_type()

static HRESULT source_get_media_type ( struct strmbase_pin *  iface,
unsigned int  index,
AM_MEDIA_TYPE *  mt 
)
static

Definition at line 590 of file filesource.c.

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}
static struct async_reader * impl_from_strmbase_pin(struct strmbase_pin *iface)
Definition: filesource.c:568
#define VFW_S_NO_MORE_ITEMS
Definition: vfwmsgs.h:19

◆ source_query_accept()

static HRESULT source_query_accept ( struct strmbase_pin *  iface,
const AM_MEDIA_TYPE *  mt 
)
static

Definition at line 578 of file filesource.c.

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}
#define GUID_NULL
Definition: ks.h:106

◆ source_query_interface()

static HRESULT source_query_interface ( struct strmbase_pin *  iface,
REFIID  iid,
void **  out 
)
static

Definition at line 604 of file filesource.c.

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}
const GUID IID_IAsyncReader

◆ sync_read()

static BOOL sync_read ( HANDLE  file,
LONGLONG  offset,
LONG  length,
BYTE *  buffer,
DWORD *  read_len 
)
static

Definition at line 828 of file filesource.c.

829{
830 OVERLAPPED ovl = {0};
831 BOOL ret;
832
834 ovl.Offset = (DWORD)offset;
835 ovl.OffsetHigh = offset >> 32;
836
837 *read_len = 0;
838
839 ret = ReadFile(file, buffer, length, NULL, &ovl);
841 ret = GetOverlappedResult(file, &ovl, read_len, TRUE);
842
843 TRACE("Returning %lu bytes.\n", *read_len);
844
845 CloseHandle(ovl.hEvent);
846 return ret;
847}
#define DWORD
Definition: nt_native.h:44
HANDLE hEvent
Definition: minwinbase.h:230
PVOID HANDLE
Definition: typedefs.h:73

Referenced by FileAsyncReader_SyncRead(), and FileAsyncReader_SyncReadAligned().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( quartz  )

Variable Documentation

◆ default_mt

const AM_MEDIA_TYPE default_mt
static
Initial value:
=
{
{0xe436eb83,0x524f,0x11ce,{0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70}},
{0,0,0,{0,0,0,0,0,0,0,0}},
1,
{0,0,0,{0,0,0,0,0,0,0,0}},
0,
}

Definition at line 50 of file filesource.c.

Referenced by FileSource_Load(), and source_get_media_type().

◆ FileAsyncReader_Vtbl

static const IAsyncReaderVtbl FileAsyncReader_Vtbl
static
Initial value:
=
{
}
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 HRESULT WINAPI FileAsyncReader_Length(IAsyncReader *iface, LONGLONG *total, LONGLONG *available)
Definition: filesource.c:906
static ULONG WINAPI FileAsyncReader_Release(IAsyncReader *iface)
Definition: filesource.c:667
static HRESULT WINAPI FileAsyncReader_BeginFlush(IAsyncReader *iface)
Definition: filesource.c:917
static HRESULT WINAPI FileAsyncReader_EndFlush(IAsyncReader *iface)
Definition: filesource.c:937
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 HRESULT WINAPI FileAsyncReader_SyncReadAligned(IAsyncReader *iface, IMediaSample *sample)
Definition: filesource.c:849
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

Definition at line 102 of file filesource.c.

Referenced by async_reader_create().

◆ FileSource_Vtbl

static const IFileSourceFilterVtbl FileSource_Vtbl
static
Initial value:
=
{
}
static HRESULT WINAPI FileSource_GetCurFile(IFileSourceFilter *iface, LPOLESTR *ppszFileName, AM_MEDIA_TYPE *mt)
Definition: filesource.c:532
static ULONG WINAPI FileSource_AddRef(IFileSourceFilter *iface)
Definition: filesource.c:459
static ULONG WINAPI FileSource_Release(IFileSourceFilter *iface)
Definition: filesource.c:465
static HRESULT WINAPI FileSource_QueryInterface(IFileSourceFilter *iface, REFIID riid, LPVOID *ppv)
Definition: filesource.c:453
static HRESULT WINAPI FileSource_Load(IFileSourceFilter *iface, LPCOLESTR pszFileName, const AM_MEDIA_TYPE *pmt)
Definition: filesource.c:471

Definition at line 101 of file filesource.c.

Referenced by async_reader_create().

◆ filter_ops

const struct strmbase_filter_ops filter_ops
static
Initial value:
=
{
.filter_get_pin = async_reader_get_pin,
.filter_destroy = async_reader_destroy,
.filter_query_interface = async_reader_query_interface,
}
static HRESULT async_reader_query_interface(struct strmbase_filter *iface, REFIID iid, void **out)
Definition: filesource.c:371
static void async_reader_destroy(struct strmbase_filter *iface)
Definition: filesource.c:333
static struct strmbase_pin * async_reader_get_pin(struct strmbase_filter *iface, unsigned int index)
Definition: filesource.c:324

Definition at line 385 of file filesource.c.

Referenced by async_reader_create().

◆ source_ops

static const struct strmbase_source_ops source_ops
static
Initial value:
=
{
.base.pin_query_accept = source_query_accept,
.base.pin_get_media_type = source_get_media_type,
.base.pin_query_interface = source_query_interface,
.pfnAttemptConnection = FileAsyncReaderPin_AttemptConnection,
}
static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
Definition: filesource.c:590
static HRESULT source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
Definition: filesource.c:578
static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(struct strmbase_source *This, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
Definition: filesource.c:621
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
Definition: filesource.c:604

Definition at line 89 of file filesource.c.

Referenced by FileSource_Load().