Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
c39dbe1f
Commit
c39dbe1f
authored
May 23, 2022
by
Rémi Bernon
Committed by
Alexandre Julliard
May 25, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
qasf: Implement ASF Reader filter stream stubs.
Signed-off-by:
Rémi Bernon
<
rbernon@codeweavers.com
>
parent
e8bf5dcd
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
89 additions
and
9 deletions
+89
-9
asfreader.c
dlls/qasf/asfreader.c
+89
-3
asfreader.c
dlls/qasf/tests/asfreader.c
+0
-6
No files found.
dlls/qasf/asfreader.c
View file @
c39dbe1f
...
...
@@ -27,6 +27,12 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
quartz
);
struct
asf_stream
{
struct
strmbase_source
source
;
DWORD
index
;
};
struct
asf_reader
{
struct
strmbase_filter
filter
;
...
...
@@ -37,6 +43,9 @@ struct asf_reader
IWMReaderCallback
*
callback
;
IWMReader
*
reader
;
UINT
stream_count
;
struct
asf_stream
streams
[
16
];
};
static
inline
struct
asf_reader
*
impl_from_strmbase_filter
(
struct
strmbase_filter
*
iface
)
...
...
@@ -46,12 +55,31 @@ static inline struct asf_reader *impl_from_strmbase_filter(struct strmbase_filte
static
struct
strmbase_pin
*
asf_reader_get_pin
(
struct
strmbase_filter
*
iface
,
unsigned
int
index
)
{
return
NULL
;
struct
asf_reader
*
filter
=
impl_from_strmbase_filter
(
iface
);
struct
strmbase_pin
*
pin
=
NULL
;
TRACE
(
"iface %p, index %u.
\n
"
,
iface
,
index
);
EnterCriticalSection
(
&
filter
->
filter
.
filter_cs
);
if
(
index
<
filter
->
stream_count
)
pin
=
&
filter
->
streams
[
index
].
source
.
pin
;
LeaveCriticalSection
(
&
filter
->
filter
.
filter_cs
);
return
pin
;
}
static
void
asf_reader_destroy
(
struct
strmbase_filter
*
iface
)
{
struct
asf_reader
*
filter
=
impl_from_strmbase_filter
(
iface
);
struct
strmbase_source
*
source
;
while
(
filter
->
stream_count
--
)
{
source
=
&
filter
->
streams
[
filter
->
stream_count
].
source
;
if
(
source
->
pin
.
peer
)
IPin_Disconnect
(
source
->
pin
.
peer
);
IPin_Disconnect
(
&
source
->
pin
.
IPin_iface
);
strmbase_source_cleanup
(
source
);
}
free
(
filter
->
file_name
);
FreeMediaType
(
&
filter
->
media_type
);
...
...
@@ -83,6 +111,20 @@ static const struct strmbase_filter_ops filter_ops =
.
filter_query_interface
=
asf_reader_query_interface
,
};
static
HRESULT
WINAPI
asf_reader_DecideBufferSize
(
struct
strmbase_source
*
iface
,
IMemAllocator
*
allocator
,
ALLOCATOR_PROPERTIES
*
req_props
)
{
FIXME
(
"iface %p, allocator %p, req_props %p stub!
\n
"
,
iface
,
allocator
,
req_props
);
return
E_NOTIMPL
;
}
static
const
struct
strmbase_source_ops
source_ops
=
{
.
pfnDecideAllocator
=
BaseOutputPinImpl_DecideAllocator
,
.
pfnAttemptConnection
=
BaseOutputPinImpl_AttemptConnection
,
.
pfnDecideBufferSize
=
asf_reader_DecideBufferSize
,
};
static
inline
struct
asf_reader
*
impl_from_IFileSourceFilter
(
IFileSourceFilter
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
struct
asf_reader
,
IFileSourceFilter_iface
);
...
...
@@ -232,9 +274,51 @@ static ULONG WINAPI reader_callback_Release(IWMReaderCallback *iface)
static
HRESULT
WINAPI
reader_callback_OnStatus
(
IWMReaderCallback
*
iface
,
WMT_STATUS
status
,
HRESULT
hr
,
WMT_ATTR_DATATYPE
type
,
BYTE
*
value
,
void
*
context
)
{
FIXME
(
"iface %p, status %d, hr %#lx, type %d, value %p, context %p stub!
\n
"
,
struct
asf_reader
*
filter
=
impl_from_IWMReaderCallback
(
iface
)
->
filter
;
DWORD
i
,
stream_count
;
WCHAR
name
[
MAX_PATH
];
TRACE
(
"iface %p, status %d, hr %#lx, type %d, value %p, context %p.
\n
"
,
iface
,
status
,
hr
,
type
,
value
,
context
);
return
E_NOTIMPL
;
switch
(
status
)
{
case
WMT_OPENED
:
if
(
FAILED
(
hr
))
{
ERR
(
"Failed to open WMReader, hr %#lx.
\n
"
,
hr
);
break
;
}
if
(
FAILED
(
hr
=
IWMReader_GetOutputCount
(
filter
->
reader
,
&
stream_count
)))
{
ERR
(
"Failed to get WMReader output count, hr %#lx.
\n
"
,
hr
);
break
;
}
if
(
stream_count
>
ARRAY_SIZE
(
filter
->
streams
))
{
FIXME
(
"Found %lu streams, not supported!
\n
"
,
stream_count
);
stream_count
=
ARRAY_SIZE
(
filter
->
streams
);
}
EnterCriticalSection
(
&
filter
->
filter
.
filter_cs
);
for
(
i
=
0
;
i
<
stream_count
;
++
i
)
{
struct
asf_stream
*
stream
=
filter
->
streams
+
i
;
swprintf
(
name
,
ARRAY_SIZE
(
name
),
L"Raw Stream %u"
,
stream
->
index
);
strmbase_source_init
(
&
stream
->
source
,
&
filter
->
filter
,
name
,
&
source_ops
);
}
filter
->
stream_count
=
stream_count
;
LeaveCriticalSection
(
&
filter
->
filter
.
filter_cs
);
BaseFilterImpl_IncrementPinVersion
(
&
filter
->
filter
);
break
;
default:
WARN
(
"Ignoring status %#x.
\n
"
,
status
);
break
;
}
return
S_OK
;
}
static
HRESULT
WINAPI
reader_callback_OnSample
(
IWMReaderCallback
*
iface
,
DWORD
output
,
QWORD
time
,
...
...
@@ -273,6 +357,7 @@ HRESULT asf_reader_create(IUnknown *outer, IUnknown **out)
{
struct
asf_reader
*
object
;
HRESULT
hr
;
int
i
;
if
(
!
(
object
=
calloc
(
1
,
sizeof
(
*
object
))))
return
E_OUTOFMEMORY
;
...
...
@@ -289,6 +374,7 @@ HRESULT asf_reader_create(IUnknown *outer, IUnknown **out)
return
hr
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
object
->
streams
);
++
i
)
object
->
streams
[
i
].
index
=
i
;
strmbase_filter_init
(
&
object
->
filter
,
outer
,
&
CLSID_WMAsfReader
,
&
filter_ops
);
object
->
IFileSourceFilter_iface
.
lpVtbl
=
&
file_source_vtbl
;
...
...
dlls/qasf/tests/asfreader.c
View file @
c39dbe1f
...
...
@@ -242,9 +242,7 @@ static void check_pin(IPin *pin, IBaseFilter *expect_filter, PIN_DIRECTION expec
CoTaskMemFree
(
id
);
hr
=
IPin_EnumMediaTypes
(
pin
,
&
enum_mt
);
todo_wine
ok
(
hr
==
S_OK
,
"Got hr %#lx.
\n
"
,
hr
);
if
(
hr
!=
S_OK
)
goto
skip_enum_mt
;
for
(
i
=
0
;
(
hr
=
IEnumMediaTypes_Next
(
enum_mt
,
1
,
&
mt
,
NULL
))
==
S_OK
;
i
++
)
{
if
(
i
<
expect_mt_count
)
...
...
@@ -260,7 +258,6 @@ static void check_pin(IPin *pin, IBaseFilter *expect_filter, PIN_DIRECTION expec
ok
(
hr
==
S_FALSE
,
"Got hr %#lx.
\n
"
,
hr
);
IEnumMediaTypes_Release
(
enum_mt
);
skip_enum_mt:
check_interface
(
pin
,
&
IID_IPin
,
TRUE
);
check_interface
(
pin
,
&
IID_IUnknown
,
TRUE
);
todo_wine
...
...
@@ -499,9 +496,7 @@ static void test_filesourcefilter(void)
ok
(
hr
==
S_OK
,
"Got hr %#lx.
\n
"
,
hr
);
hr
=
IEnumPins_Next
(
enumpins
,
1
,
pins
,
NULL
);
todo_wine
ok
(
hr
==
S_OK
,
"Got hr %#lx.
\n
"
,
hr
);
if
(
hr
!=
S_OK
)
goto
skip_pins
;
check_pin
(
pins
[
0
],
filter
,
PINDIR_OUTPUT
,
L"Raw Video 0"
,
L"Raw Video 0"
,
video_mt
,
ARRAY_SIZE
(
video_mt
));
IPin_Release
(
pins
[
0
]);
...
...
@@ -511,7 +506,6 @@ static void test_filesourcefilter(void)
IPin_Release
(
pins
[
0
]);
hr
=
IEnumPins_Next
(
enumpins
,
1
,
pins
,
NULL
);
skip_pins:
ok
(
hr
==
S_FALSE
,
"Got hr %#lx.
\n
"
,
hr
);
IEnumPins_Release
(
enumpins
);
...
...
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