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
61f76829
Commit
61f76829
authored
Mar 12, 2019
by
Nikolay Sivov
Committed by
Alexandre Julliard
Mar 12, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mfplat: Implement equality test for media types.
Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
922698a9
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
188 additions
and
5 deletions
+188
-5
mediatype.c
dlls/mfplat/mediatype.c
+99
-2
mfplat.c
dlls/mfplat/tests/mfplat.c
+86
-3
mfapi.h
include/mfapi.h
+3
-0
No files found.
dlls/mfplat/mediatype.c
View file @
61f76829
...
...
@@ -332,9 +332,106 @@ static HRESULT WINAPI mediatype_IsCompressedFormat(IMFMediaType *iface, BOOL *co
static
HRESULT
WINAPI
mediatype_IsEqual
(
IMFMediaType
*
iface
,
IMFMediaType
*
type
,
DWORD
*
flags
)
{
FIXME
(
"%p, %p, %p.
\n
"
,
iface
,
type
,
flags
);
const
DWORD
full_equality_flags
=
MF_MEDIATYPE_EQUAL_MAJOR_TYPES
|
MF_MEDIATYPE_EQUAL_FORMAT_TYPES
|
MF_MEDIATYPE_EQUAL_FORMAT_DATA
|
MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA
;
struct
media_type
*
media_type
=
impl_from_IMFMediaType
(
iface
);
struct
comparand
{
IMFAttributes
*
type
;
PROPVARIANT
value
;
UINT32
count
;
GUID
guid
;
HRESULT
hr
;
}
left
,
right
,
swp
;
unsigned
int
i
;
BOOL
result
;
return
E_NOTIMPL
;
TRACE
(
"%p, %p, %p.
\n
"
,
iface
,
type
,
flags
);
*
flags
=
0
;
left
.
type
=
&
media_type
->
attributes
.
IMFAttributes_iface
;
right
.
type
=
(
IMFAttributes
*
)
type
;
if
(
FAILED
(
IMFAttributes_GetGUID
(
left
.
type
,
&
MF_MT_MAJOR_TYPE
,
&
left
.
guid
)))
return
E_INVALIDARG
;
if
(
FAILED
(
IMFAttributes_GetGUID
(
right
.
type
,
&
MF_MT_MAJOR_TYPE
,
&
right
.
guid
)))
return
E_INVALIDARG
;
if
(
IsEqualGUID
(
&
left
.
guid
,
&
right
.
guid
))
*
flags
|=
MF_MEDIATYPE_EQUAL_MAJOR_TYPES
;
/* Subtypes equal or both missing. */
left
.
hr
=
IMFAttributes_GetGUID
(
left
.
type
,
&
MF_MT_SUBTYPE
,
&
left
.
guid
);
right
.
hr
=
IMFAttributes_GetGUID
(
right
.
type
,
&
MF_MT_SUBTYPE
,
&
right
.
guid
);
if
((
SUCCEEDED
(
left
.
hr
)
&&
SUCCEEDED
(
right
.
hr
)
&&
IsEqualGUID
(
&
left
.
guid
,
&
right
.
guid
))
||
(
FAILED
(
left
.
hr
)
&&
FAILED
(
right
.
hr
)))
{
*
flags
|=
MF_MEDIATYPE_EQUAL_FORMAT_TYPES
;
}
/* Format data */
IMFAttributes_GetCount
(
left
.
type
,
&
left
.
count
);
IMFAttributes_GetCount
(
right
.
type
,
&
right
.
count
);
if
(
right
.
count
<
left
.
count
)
{
swp
=
left
;
left
=
right
;
right
=
swp
;
}
*
flags
|=
MF_MEDIATYPE_EQUAL_FORMAT_DATA
;
for
(
i
=
0
;
i
<
left
.
count
;
++
i
)
{
PROPVARIANT
value
;
GUID
key
;
if
(
SUCCEEDED
(
IMFAttributes_GetItemByIndex
(
left
.
type
,
i
,
&
key
,
&
value
)))
{
if
(
IsEqualGUID
(
&
key
,
&
MF_MT_USER_DATA
)
||
IsEqualGUID
(
&
key
,
&
MF_MT_FRAME_RATE_RANGE_MIN
)
||
IsEqualGUID
(
&
key
,
&
MF_MT_FRAME_RATE_RANGE_MAX
))
{
PropVariantClear
(
&
value
);
continue
;
}
result
=
FALSE
;
IMFAttributes_CompareItem
(
right
.
type
,
&
key
,
&
value
,
&
result
);
PropVariantClear
(
&
value
);
if
(
!
result
)
{
*
flags
&=
~
MF_MEDIATYPE_EQUAL_FORMAT_DATA
;
break
;
}
}
}
/* User data */
PropVariantInit
(
&
left
.
value
);
left
.
hr
=
IMFAttributes_GetItem
(
left
.
type
,
&
MF_MT_USER_DATA
,
&
left
.
value
);
PropVariantInit
(
&
right
.
value
);
right
.
hr
=
IMFAttributes_GetItem
(
right
.
type
,
&
MF_MT_USER_DATA
,
&
right
.
value
);
if
(
SUCCEEDED
(
left
.
hr
)
&&
SUCCEEDED
(
left
.
hr
))
{
result
=
FALSE
;
IMFAttributes_CompareItem
(
left
.
type
,
&
MF_MT_USER_DATA
,
&
left
.
value
,
&
result
);
}
else
if
(
FAILED
(
left
.
hr
)
&&
FAILED
(
left
.
hr
))
result
=
TRUE
;
PropVariantClear
(
&
left
.
value
);
PropVariantClear
(
&
right
.
value
);
if
(
result
)
*
flags
|=
MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA
;
return
*
flags
==
full_equality_flags
?
S_OK
:
S_FALSE
;
}
static
HRESULT
WINAPI
mediatype_GetRepresentation
(
IMFMediaType
*
iface
,
GUID
guid
,
void
**
representation
)
...
...
dlls/mfplat/tests/mfplat.c
View file @
61f76829
...
...
@@ -328,10 +328,13 @@ static void init_functions(void)
is_win8_plus
=
pMFPutWaitingWorkItem
!=
NULL
;
}
static
void
test_
MFCreateMediaT
ype
(
void
)
static
void
test_
media_t
ype
(
void
)
{
IMFMediaType
*
mediatype
,
*
mediatype2
;
BOOL
compressed
;
DWORD
flags
;
HRESULT
hr
;
IMFMediaType
*
mediatype
;
GUID
guid
;
if
(
0
)
{
...
...
@@ -343,9 +346,89 @@ if(0)
hr
=
MFCreateMediaType
(
&
mediatype
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
hr
=
IMFMediaType_GetMajorType
(
mediatype
,
&
guid
);
todo_wine
ok
(
hr
==
MF_E_ATTRIBUTENOTFOUND
,
"Unexpected hr %#x.
\n
"
,
hr
);
compressed
=
FALSE
;
hr
=
IMFMediaType_IsCompressedFormat
(
mediatype
,
&
compressed
);
todo_wine
ok
(
hr
==
S_OK
,
"Failed to get media type property, hr %#x.
\n
"
,
hr
);
ok
(
compressed
,
"Unexpected value %d.
\n
"
,
compressed
);
hr
=
IMFMediaType_SetUINT32
(
mediatype
,
&
MF_MT_ALL_SAMPLES_INDEPENDENT
,
0
);
todo_wine
ok
(
hr
==
S_OK
,
"Failed to set attribute, hr %#x.
\n
"
,
hr
);
compressed
=
FALSE
;
hr
=
IMFMediaType_IsCompressedFormat
(
mediatype
,
&
compressed
);
todo_wine
ok
(
hr
==
S_OK
,
"Failed to get media type property, hr %#x.
\n
"
,
hr
);
ok
(
compressed
,
"Unexpected value %d.
\n
"
,
compressed
);
hr
=
IMFMediaType_SetUINT32
(
mediatype
,
&
MF_MT_ALL_SAMPLES_INDEPENDENT
,
1
);
todo_wine
ok
(
hr
==
S_OK
,
"Failed to set attribute, hr %#x.
\n
"
,
hr
);
compressed
=
TRUE
;
hr
=
IMFMediaType_IsCompressedFormat
(
mediatype
,
&
compressed
);
todo_wine
{
ok
(
hr
==
S_OK
,
"Failed to get media type property, hr %#x.
\n
"
,
hr
);
ok
(
!
compressed
,
"Unexpected value %d.
\n
"
,
compressed
);
}
hr
=
IMFMediaType_SetGUID
(
mediatype
,
&
MF_MT_MAJOR_TYPE
,
&
MFMediaType_Video
);
todo_wine
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
hr
=
IMFMediaType_GetMajorType
(
mediatype
,
&
guid
);
todo_wine
{
ok
(
hr
==
S_OK
,
"Failed to get major type, hr %#x.
\n
"
,
hr
);
ok
(
IsEqualGUID
(
&
guid
,
&
MFMediaType_Video
),
"Unexpected major type.
\n
"
);
}
/* IsEqual() */
hr
=
MFCreateMediaType
(
&
mediatype2
);
ok
(
hr
==
S_OK
,
"Failed to create media type, hr %#x.
\n
"
,
hr
);
flags
=
0xdeadbeef
;
hr
=
IMFMediaType_IsEqual
(
mediatype
,
mediatype2
,
&
flags
);
ok
(
hr
==
E_INVALIDARG
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
flags
==
0
,
"Unexpected flags %#x.
\n
"
,
flags
);
/* Different major types. */
hr
=
IMFMediaType_SetGUID
(
mediatype2
,
&
MF_MT_MAJOR_TYPE
,
&
MFMediaType_Audio
);
todo_wine
ok
(
hr
==
S_OK
,
"Failed to set major type, hr %#x.
\n
"
,
hr
);
flags
=
0
;
hr
=
IMFMediaType_IsEqual
(
mediatype
,
mediatype2
,
&
flags
);
todo_wine
{
ok
(
hr
==
S_FALSE
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
flags
==
(
MF_MEDIATYPE_EQUAL_FORMAT_TYPES
|
MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA
),
"Unexpected flags %#x.
\n
"
,
flags
);
}
/* Same major types, different subtypes. */
hr
=
IMFMediaType_SetGUID
(
mediatype2
,
&
MF_MT_MAJOR_TYPE
,
&
MFMediaType_Video
);
todo_wine
ok
(
hr
==
S_OK
,
"Failed to set major type, hr %#x.
\n
"
,
hr
);
flags
=
0
;
hr
=
IMFMediaType_IsEqual
(
mediatype
,
mediatype2
,
&
flags
);
todo_wine
{
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
flags
==
(
MF_MEDIATYPE_EQUAL_MAJOR_TYPES
|
MF_MEDIATYPE_EQUAL_FORMAT_TYPES
|
MF_MEDIATYPE_EQUAL_FORMAT_DATA
|
MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA
),
"Unexpected flags %#x.
\n
"
,
flags
);
}
hr
=
IMFMediaType_SetGUID
(
mediatype
,
&
MF_MT_SUBTYPE
,
&
MFVideoFormat_RGB32
);
todo_wine
ok
(
hr
==
S_OK
,
"Failed to set subtype, hr %#x.
\n
"
,
hr
);
flags
=
0
;
hr
=
IMFMediaType_IsEqual
(
mediatype
,
mediatype2
,
&
flags
);
todo_wine
{
ok
(
hr
==
S_FALSE
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
flags
==
(
MF_MEDIATYPE_EQUAL_MAJOR_TYPES
|
MF_MEDIATYPE_EQUAL_FORMAT_DATA
|
MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA
),
"Unexpected flags %#x.
\n
"
,
flags
);
}
IMFMediaType_Release
(
mediatype2
);
IMFMediaType_Release
(
mediatype
);
}
...
...
@@ -1766,7 +1849,7 @@ START_TEST(mfplat)
test_startup
();
test_register
();
test_
MFCreateMediaT
ype
();
test_
media_t
ype
();
test_MFCreateMediaEvent
();
test_MFCreateAttributes
();
test_sample
();
...
...
include/mfapi.h
View file @
61f76829
...
...
@@ -88,6 +88,9 @@ DEFINE_GUID(MF_MT_MAJOR_TYPE, 0x48eba18e, 0xf8c9, 0x4687, 0xbf, 0x1
DEFINE_GUID
(
MF_MT_PIXEL_ASPECT_RATIO
,
0xc6376a1e
,
0x8d0a
,
0x4027
,
0xbe
,
0x45
,
0x6d
,
0x9a
,
0x0a
,
0xd3
,
0x9b
,
0xb6
);
DEFINE_GUID
(
MF_MT_SUBTYPE
,
0xf7e34c9a
,
0x42e8
,
0x4714
,
0xb7
,
0x4b
,
0xcb
,
0x29
,
0xd7
,
0x2c
,
0x35
,
0xe5
);
DEFINE_GUID
(
MF_MT_ALL_SAMPLES_INDEPENDENT
,
0xc9173739
,
0x5e56
,
0x461c
,
0xb7
,
0x13
,
0x46
,
0xfb
,
0x99
,
0x5c
,
0xb9
,
0x5f
);
DEFINE_GUID
(
MF_MT_USER_DATA
,
0xb6bc765f
,
0x4c3b
,
0x40a4
,
0xbd
,
0x51
,
0x25
,
0x35
,
0xb6
,
0x6f
,
0xe0
,
0x9d
);
DEFINE_GUID
(
MF_MT_FRAME_RATE_RANGE_MIN
,
0xd2e7558c
,
0xdc1f
,
0x403f
,
0x9a
,
0x72
,
0xd2
,
0x8b
,
0xb1
,
0xeb
,
0x3b
,
0x5e
);
DEFINE_GUID
(
MF_MT_FRAME_RATE_RANGE_MAX
,
0xe3371d41
,
0xb4cf
,
0x4a05
,
0xbd
,
0x4e
,
0x20
,
0xb8
,
0x8b
,
0xb2
,
0xc4
,
0xd6
);
DEFINE_GUID
(
MFT_CATEGORY_VIDEO_DECODER
,
0xd6c02d4b
,
0x6833
,
0x45b4
,
0x97
,
0x1a
,
0x05
,
0xa4
,
0xb0
,
0x4b
,
0xab
,
0x91
);
DEFINE_GUID
(
MFT_CATEGORY_VIDEO_ENCODER
,
0xf79eac7d
,
0xe545
,
0x4387
,
0xbd
,
0xee
,
0xd6
,
0x47
,
0xd7
,
0xbd
,
0xe4
,
0x2a
);
...
...
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