Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
07f50ee6
Commit
07f50ee6
authored
Sep 16, 2023
by
Alistair Leslie-Hughes
Committed by
Alexandre Julliard
Sep 18, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mfreadwrite/reader: Update to IMFSourceReaderEx.
Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
parent
67fbcff7
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
96 additions
and
37 deletions
+96
-37
reader.c
dlls/mfreadwrite/reader.c
+73
-37
mfplat.c
dlls/mfreadwrite/tests/mfplat.c
+23
-0
No files found.
dlls/mfreadwrite/reader.c
View file @
07f50ee6
...
...
@@ -145,7 +145,7 @@ enum source_reader_flags
struct
source_reader
{
IMFSourceReader
IMFSourceReader
_iface
;
IMFSourceReader
Ex
IMFSourceReaderEx
_iface
;
IMFAsyncCallback
source_events_callback
;
IMFAsyncCallback
stream_events_callback
;
IMFAsyncCallback
async_commands_callback
;
...
...
@@ -170,9 +170,9 @@ struct source_reader
CONDITION_VARIABLE
stop_event
;
};
static
inline
struct
source_reader
*
impl_from_IMFSourceReader
(
IMFSourceReader
*
iface
)
static
inline
struct
source_reader
*
impl_from_IMFSourceReader
Ex
(
IMFSourceReaderEx
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
struct
source_reader
,
IMFSourceReader_iface
);
return
CONTAINING_RECORD
(
iface
,
struct
source_reader
,
IMFSourceReader
Ex
_iface
);
}
static
struct
source_reader
*
impl_from_source_callback_IMFAsyncCallback
(
IMFAsyncCallback
*
iface
)
...
...
@@ -1329,16 +1329,17 @@ static const IMFAsyncCallbackVtbl async_commands_callback_vtbl =
source_reader_async_commands_callback_Invoke
,
};
static
HRESULT
WINAPI
src_reader_QueryInterface
(
IMFSourceReader
*
iface
,
REFIID
riid
,
void
**
out
)
static
HRESULT
WINAPI
src_reader_QueryInterface
(
IMFSourceReader
Ex
*
iface
,
REFIID
riid
,
void
**
out
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
TRACE
(
"%p, %s, %p.
\n
"
,
iface
,
debugstr_guid
(
riid
),
out
);
if
(
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
||
IsEqualGUID
(
riid
,
&
IID_IMFSourceReader
))
if
(
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
||
IsEqualGUID
(
riid
,
&
IID_IMFSourceReader
)
||
IsEqualGUID
(
riid
,
&
IID_IMFSourceReaderEx
))
{
*
out
=
&
reader
->
IMFSourceReader_iface
;
*
out
=
&
reader
->
IMFSourceReader
Ex
_iface
;
}
else
{
...
...
@@ -1351,9 +1352,9 @@ static HRESULT WINAPI src_reader_QueryInterface(IMFSourceReader *iface, REFIID r
return
S_OK
;
}
static
ULONG
WINAPI
src_reader_AddRef
(
IMFSourceReader
*
iface
)
static
ULONG
WINAPI
src_reader_AddRef
(
IMFSourceReader
Ex
*
iface
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
ULONG
refcount
=
InterlockedIncrement
(
&
reader
->
public_refcount
);
TRACE
(
"%p, refcount %lu.
\n
"
,
iface
,
refcount
);
...
...
@@ -1377,9 +1378,9 @@ static BOOL source_reader_is_source_stopped(const struct source_reader *reader)
return
TRUE
;
}
static
ULONG
WINAPI
src_reader_Release
(
IMFSourceReader
*
iface
)
static
ULONG
WINAPI
src_reader_Release
(
IMFSourceReader
Ex
*
iface
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
ULONG
refcount
=
InterlockedDecrement
(
&
reader
->
public_refcount
);
unsigned
int
i
;
...
...
@@ -1423,9 +1424,9 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
return
refcount
;
}
static
HRESULT
WINAPI
src_reader_GetStreamSelection
(
IMFSourceReader
*
iface
,
DWORD
index
,
BOOL
*
selected
)
static
HRESULT
WINAPI
src_reader_GetStreamSelection
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
BOOL
*
selected
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
TRACE
(
"%p, %#lx, %p.
\n
"
,
iface
,
index
,
selected
);
...
...
@@ -1444,9 +1445,9 @@ static HRESULT WINAPI src_reader_GetStreamSelection(IMFSourceReader *iface, DWOR
return
source_reader_get_stream_selection
(
reader
,
index
,
selected
);
}
static
HRESULT
WINAPI
src_reader_SetStreamSelection
(
IMFSourceReader
*
iface
,
DWORD
index
,
BOOL
selection
)
static
HRESULT
WINAPI
src_reader_SetStreamSelection
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
BOOL
selection
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
HRESULT
hr
=
S_OK
;
BOOL
selection_changed
=
FALSE
,
selected
;
unsigned
int
i
;
...
...
@@ -1554,19 +1555,19 @@ static HRESULT source_reader_get_native_media_type(struct source_reader *reader,
return
hr
;
}
static
HRESULT
WINAPI
src_reader_GetNativeMediaType
(
IMFSourceReader
*
iface
,
DWORD
index
,
DWORD
type_index
,
static
HRESULT
WINAPI
src_reader_GetNativeMediaType
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
DWORD
type_index
,
IMFMediaType
**
type
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
TRACE
(
"%p, %#lx, %#lx, %p.
\n
"
,
iface
,
index
,
type_index
,
type
);
return
source_reader_get_native_media_type
(
reader
,
index
,
type_index
,
type
);
}
static
HRESULT
WINAPI
src_reader_GetCurrentMediaType
(
IMFSourceReader
*
iface
,
DWORD
index
,
IMFMediaType
**
type
)
static
HRESULT
WINAPI
src_reader_GetCurrentMediaType
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
IMFMediaType
**
type
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
HRESULT
hr
;
TRACE
(
"%p, %#lx, %p.
\n
"
,
iface
,
index
,
type
);
...
...
@@ -1846,10 +1847,10 @@ static HRESULT source_reader_create_decoder_for_stream(struct source_reader *rea
return
MF_E_TOPO_CODEC_NOT_FOUND
;
}
static
HRESULT
WINAPI
src_reader_SetCurrentMediaType
(
IMFSourceReader
*
iface
,
DWORD
index
,
DWORD
*
reserved
,
static
HRESULT
WINAPI
src_reader_SetCurrentMediaType
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
DWORD
*
reserved
,
IMFMediaType
*
type
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
HRESULT
hr
;
TRACE
(
"%p, %#lx, %p, %p.
\n
"
,
iface
,
index
,
reserved
,
type
);
...
...
@@ -1884,9 +1885,9 @@ static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReader *iface, DWO
return
hr
;
}
static
HRESULT
WINAPI
src_reader_SetCurrentPosition
(
IMFSourceReader
*
iface
,
REFGUID
format
,
REFPROPVARIANT
position
)
static
HRESULT
WINAPI
src_reader_SetCurrentPosition
(
IMFSourceReader
Ex
*
iface
,
REFGUID
format
,
REFPROPVARIANT
position
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
struct
source_reader_async_command
*
command
;
unsigned
int
i
;
DWORD
flags
;
...
...
@@ -2036,10 +2037,10 @@ static HRESULT source_reader_read_sample_async(struct source_reader *reader, uns
return
hr
;
}
static
HRESULT
WINAPI
src_reader_ReadSample
(
IMFSourceReader
*
iface
,
DWORD
index
,
DWORD
flags
,
DWORD
*
actual_index
,
static
HRESULT
WINAPI
src_reader_ReadSample
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
DWORD
flags
,
DWORD
*
actual_index
,
DWORD
*
stream_flags
,
LONGLONG
*
timestamp
,
IMFSample
**
sample
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
HRESULT
hr
;
TRACE
(
"%p, %#lx, %#lx, %p, %p, %p, %p
\n
"
,
iface
,
index
,
flags
,
actual_index
,
stream_flags
,
timestamp
,
sample
);
...
...
@@ -2098,9 +2099,9 @@ static HRESULT source_reader_flush_async(struct source_reader *reader, unsigned
return
hr
;
}
static
HRESULT
WINAPI
src_reader_Flush
(
IMFSourceReader
*
iface
,
DWORD
index
)
static
HRESULT
WINAPI
src_reader_Flush
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
HRESULT
hr
;
TRACE
(
"%p, %#lx.
\n
"
,
iface
,
index
);
...
...
@@ -2117,10 +2118,10 @@ static HRESULT WINAPI src_reader_Flush(IMFSourceReader *iface, DWORD index)
return
hr
;
}
static
HRESULT
WINAPI
src_reader_GetServiceForStream
(
IMFSourceReader
*
iface
,
DWORD
index
,
REFGUID
service
,
static
HRESULT
WINAPI
src_reader_GetServiceForStream
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
REFGUID
service
,
REFIID
riid
,
void
**
object
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
IUnknown
*
obj
=
NULL
;
HRESULT
hr
=
S_OK
;
...
...
@@ -2179,10 +2180,10 @@ static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReader *iface, DWO
return
hr
;
}
static
HRESULT
WINAPI
src_reader_GetPresentationAttribute
(
IMFSourceReader
*
iface
,
DWORD
index
,
static
HRESULT
WINAPI
src_reader_GetPresentationAttribute
(
IMFSourceReader
Ex
*
iface
,
DWORD
index
,
REFGUID
guid
,
PROPVARIANT
*
value
)
{
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
(
iface
);
struct
source_reader
*
reader
=
impl_from_IMFSourceReader
Ex
(
iface
);
IMFStreamDescriptor
*
sd
;
BOOL
selected
;
HRESULT
hr
;
...
...
@@ -2227,7 +2228,38 @@ static HRESULT WINAPI src_reader_GetPresentationAttribute(IMFSourceReader *iface
return
hr
;
}
static
const
IMFSourceReaderVtbl
srcreader_vtbl
=
static
HRESULT
WINAPI
src_reader_SetNativeMediaType
(
IMFSourceReaderEx
*
iface
,
DWORD
stream_index
,
IMFMediaType
*
media_type
,
DWORD
*
stream_flags
)
{
FIXME
(
"%p, %#lx, %p, %p.
\n
"
,
iface
,
stream_index
,
media_type
,
stream_flags
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
src_reader_AddTransformForStream
(
IMFSourceReaderEx
*
iface
,
DWORD
stream_index
,
IUnknown
*
transform
)
{
FIXME
(
"%p, %#lx, %p.
\n
"
,
iface
,
stream_index
,
transform
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
src_reader_RemoveAllTransformsForStream
(
IMFSourceReaderEx
*
iface
,
DWORD
stream_index
)
{
FIXME
(
"%p, %#lx.
\n
"
,
iface
,
stream_index
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
src_reader_GetTransformForStream
(
IMFSourceReaderEx
*
iface
,
DWORD
stream_index
,
DWORD
transform_index
,
GUID
*
category
,
IMFTransform
**
transform
)
{
FIXME
(
"%p, %#lx, %#lx, %p, %p.
\n
"
,
iface
,
stream_index
,
transform_index
,
category
,
transform
);
return
E_NOTIMPL
;
}
static
const
IMFSourceReaderExVtbl
srcreader_vtbl
=
{
src_reader_QueryInterface
,
src_reader_AddRef
,
...
...
@@ -2241,7 +2273,11 @@ static const IMFSourceReaderVtbl srcreader_vtbl =
src_reader_ReadSample
,
src_reader_Flush
,
src_reader_GetServiceForStream
,
src_reader_GetPresentationAttribute
src_reader_GetPresentationAttribute
,
src_reader_SetNativeMediaType
,
src_reader_AddTransformForStream
,
src_reader_RemoveAllTransformsForStream
,
src_reader_GetTransformForStream
,
};
static
DWORD
reader_get_first_stream_index
(
IMFPresentationDescriptor
*
descriptor
,
const
GUID
*
major
)
...
...
@@ -2295,7 +2331,7 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
if
(
!
object
)
return
E_OUTOFMEMORY
;
object
->
IMFSourceReader_iface
.
lpVtbl
=
&
srcreader_vtbl
;
object
->
IMFSourceReader
Ex
_iface
.
lpVtbl
=
&
srcreader_vtbl
;
object
->
source_events_callback
.
lpVtbl
=
&
source_events_callback_vtbl
;
object
->
stream_events_callback
.
lpVtbl
=
&
stream_events_callback_vtbl
;
object
->
async_commands_callback
.
lpVtbl
=
&
async_commands_callback_vtbl
;
...
...
@@ -2414,10 +2450,10 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
WARN
(
"Failed to acquired shared queue, hr %#lx.
\n
"
,
hr
);
if
(
SUCCEEDED
(
hr
))
hr
=
IMFSourceReader
_QueryInterface
(
&
object
->
IMFSourceReader
_iface
,
riid
,
out
);
hr
=
IMFSourceReader
Ex_QueryInterface
(
&
object
->
IMFSourceReaderEx
_iface
,
riid
,
out
);
failed:
IMFSourceReader
_Release
(
&
object
->
IMFSourceReader
_iface
);
IMFSourceReader
Ex_Release
(
&
object
->
IMFSourceReaderEx
_iface
);
return
hr
;
}
...
...
dlls/mfreadwrite/tests/mfplat.c
View file @
07f50ee6
...
...
@@ -1505,6 +1505,28 @@ static void test_sink_writer_mp4(void)
IMFAttributes_Release
(
attr
);
}
static
void
test_interfaces
(
void
)
{
IMFSourceReader
*
reader
;
IMFMediaSource
*
source
;
IUnknown
*
unk
;
HRESULT
hr
;
source
=
create_test_source
(
1
);
ok
(
!!
source
,
"Failed to create test source.
\n
"
);
hr
=
MFCreateSourceReaderFromMediaSource
(
source
,
NULL
,
&
reader
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#lx.
\n
"
,
hr
);
hr
=
IMFSourceReader_QueryInterface
(
reader
,
&
IID_IMFSourceReaderEx
,
(
void
**
)
&
unk
);
ok
(
hr
==
S_OK
||
broken
(
hr
==
E_NOINTERFACE
)
/* Windows 7 and below.*/
,
"Unexpected hr %#lx.
\n
"
,
hr
);
if
(
unk
)
IUnknown_Release
(
unk
);
IMFSourceReader_Release
(
reader
);
IMFMediaSource_Release
(
source
);
}
START_TEST
(
mfplat
)
{
HRESULT
hr
;
...
...
@@ -1514,6 +1536,7 @@ START_TEST(mfplat)
init_functions
();
test_interfaces
();
test_factory
();
test_source_reader
(
"test.wav"
,
false
);
test_source_reader
(
"test.mp4"
,
true
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment