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
059a0c0b
Commit
059a0c0b
authored
Oct 27, 2021
by
Nikolay Sivov
Committed by
Alexandre Julliard
Oct 27, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
evr/mixer: Improve output type candidates attributes configuration.
Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
379333e3
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
86 additions
and
5 deletions
+86
-5
mixer.c
dlls/evr/mixer.c
+31
-4
evr.c
dlls/evr/tests/evr.c
+55
-1
No files found.
dlls/evr/mixer.c
View file @
059a0c0b
...
...
@@ -675,14 +675,27 @@ static unsigned int video_mixer_get_interlace_mode_from_video_desc(const DXVA2_V
}
}
static
void
mf_get_attribute_uint32
(
IMFMediaType
*
media_type
,
const
GUID
*
key
,
UINT32
*
value
,
UINT32
default_value
)
{
if
(
FAILED
(
IMFMediaType_GetUINT32
(
media_type
,
key
,
value
)))
*
value
=
default_value
;
}
static
void
mf_get_attribute_uint64
(
IMFMediaType
*
media_type
,
const
GUID
*
key
,
UINT64
*
value
,
UINT64
default_value
)
{
if
(
FAILED
(
IMFMediaType_GetUINT64
(
media_type
,
key
,
value
)))
*
value
=
default_value
;
}
static
HRESULT
video_mixer_collect_output_types
(
struct
video_mixer
*
mixer
,
const
DXVA2_VideoDesc
*
video_desc
,
IMFMediaType
*
media_type
,
IDirectXVideoProcessorService
*
service
,
unsigned
int
device_count
,
const
GUID
*
devices
,
unsigned
int
flags
)
{
unsigned
int
i
,
j
,
format_count
,
count
,
interlace_mode
;
struct
rt_format
*
rt_formats
=
NULL
,
*
ptr
;
unsigned
int
i
,
j
,
format_count
,
count
;
HRESULT
hr
=
MF_E_INVALIDMEDIATYPE
;
MFVideoArea
aperture
;
D3DFORMAT
*
formats
;
GUID
subtype
;
...
...
@@ -710,6 +723,10 @@ static HRESULT video_mixer_collect_output_types(struct video_mixer *mixer, const
if
(
count
&&
!
(
flags
&
MFT_SET_TYPE_TEST_ONLY
))
{
UINT32
fixed_samples
,
interlace_mode
;
MFVideoArea
aperture
;
UINT64
par
;
if
(
!
(
mixer
->
output
.
rt_formats
=
calloc
(
count
,
sizeof
(
*
mixer
->
output
.
rt_formats
))))
{
free
(
rt_formats
);
...
...
@@ -718,9 +735,16 @@ static HRESULT video_mixer_collect_output_types(struct video_mixer *mixer, const
memcpy
(
&
subtype
,
&
MFVideoFormat_Base
,
sizeof
(
subtype
));
memset
(
&
aperture
,
0
,
sizeof
(
aperture
));
aperture
.
Area
.
cx
=
video_desc
->
SampleWidth
;
aperture
.
Area
.
cy
=
video_desc
->
SampleHeight
;
if
(
FAILED
(
IMFMediaType_GetBlob
(
media_type
,
&
MF_MT_GEOMETRIC_APERTURE
,
(
UINT8
*
)
&
aperture
,
sizeof
(
aperture
),
NULL
)))
{
aperture
.
Area
.
cx
=
video_desc
->
SampleWidth
;
aperture
.
Area
.
cy
=
video_desc
->
SampleHeight
;
}
interlace_mode
=
video_mixer_get_interlace_mode_from_video_desc
(
video_desc
);
mf_get_attribute_uint64
(
media_type
,
&
MF_MT_PIXEL_ASPECT_RATIO
,
&
par
,
(
UINT64
)
1
<<
32
|
1
);
mf_get_attribute_uint32
(
media_type
,
&
MF_MT_FIXED_SIZE_SAMPLES
,
&
fixed_samples
,
1
);
for
(
i
=
0
;
i
<
count
;
++
i
)
{
IMFMediaType
*
rt_media_type
;
...
...
@@ -731,9 +755,12 @@ static HRESULT video_mixer_collect_output_types(struct video_mixer *mixer, const
MFCreateMediaType
(
&
rt_media_type
);
IMFMediaType_CopyAllItems
(
media_type
,
(
IMFAttributes
*
)
rt_media_type
);
IMFMediaType_SetGUID
(
rt_media_type
,
&
MF_MT_SUBTYPE
,
&
subtype
);
IMFMediaType_SetUINT64
(
rt_media_type
,
&
MF_MT_FRAME_SIZE
,
(
UINT64
)
aperture
.
Area
.
cx
<<
32
|
aperture
.
Area
.
cy
);
IMFMediaType_SetBlob
(
rt_media_type
,
&
MF_MT_GEOMETRIC_APERTURE
,
(
const
UINT8
*
)
&
aperture
,
sizeof
(
aperture
));
IMFMediaType_SetBlob
(
rt_media_type
,
&
MF_MT_MINIMUM_DISPLAY_APERTURE
,
(
const
UINT8
*
)
&
aperture
,
sizeof
(
aperture
));
IMFMediaType_SetUINT32
(
rt_media_type
,
&
MF_MT_INTERLACE_MODE
,
interlace_mode
);
IMFMediaType_SetUINT64
(
rt_media_type
,
&
MF_MT_PIXEL_ASPECT_RATIO
,
par
);
IMFMediaType_SetUINT32
(
rt_media_type
,
&
MF_MT_FIXED_SIZE_SAMPLES
,
fixed_samples
);
mixer
->
output
.
rt_formats
[
i
].
media_type
=
rt_media_type
;
}
...
...
dlls/evr/tests/evr.c
View file @
059a0c0b
...
...
@@ -946,6 +946,7 @@ static void test_default_mixer_type_negotiation(void)
IDirect3DDevice9
*
device
;
IMFMediaType
*
video_type
;
IMFTransform
*
transform
;
MFVideoArea
aperture
;
DWORD
index
,
count
;
IUnknown
*
unk
;
HWND
window
;
...
...
@@ -1020,10 +1021,19 @@ static void test_default_mixer_type_negotiation(void)
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaType_SetUINT32
(
video_type
,
&
MF_MT_ALL_SAMPLES_INDEPENDENT
,
TRUE
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
memset
(
&
aperture
,
0
,
sizeof
(
aperture
));
aperture
.
Area
.
cx
=
100
;
aperture
.
Area
.
cy
=
200
;
hr
=
IMFMediaType_SetBlob
(
video_type
,
&
MF_MT_GEOMETRIC_APERTURE
,
(
UINT8
*
)
&
aperture
,
sizeof
(
aperture
));
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaType_SetUINT32
(
video_type
,
&
MF_MT_FIXED_SIZE_SAMPLES
,
2
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFTransform_SetInputType
(
transform
,
0
,
video_type
,
MFT_SET_TYPE_TEST_ONLY
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFTransform_GetOutputAvailableType
(
transform
,
0
,
0
,
&
media_type
);
ok
(
hr
==
MF_E_TRANSFORM_TYPE_NOT_SET
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFTransform_GetInputCurrentType
(
transform
,
0
,
&
media_type
);
ok
(
hr
==
MF_E_TRANSFORM_TYPE_NOT_SET
,
"Unexpected hr %#x.
\n
"
,
hr
);
...
...
@@ -1040,25 +1050,69 @@ static void test_default_mixer_type_negotiation(void)
IMFMediaType_Release
(
media_type
);
IMFMediaType_Release
(
media_type2
);
/* Modified after type was set. */
hr
=
IMFMediaType_SetUINT64
(
video_type
,
&
MF_MT_PIXEL_ASPECT_RATIO
,
(
UINT64
)
56
<<
32
|
55
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
/* Check attributes on available output types. */
index
=
0
;
while
(
SUCCEEDED
(
IMFTransform_GetOutputAvailableType
(
transform
,
0
,
index
++
,
&
media_type
)))
{
UINT64
frame_size
;
UINT64
frame_size
,
ratio
;
MFVideoArea
aperture
;
GUID
subtype
,
major
;
UINT32
value
;
hr
=
IMFMediaType_GetGUID
(
media_type
,
&
MF_MT_MAJOR_TYPE
,
&
major
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
IsEqualGUID
(
&
major
,
&
MFMediaType_Video
),
"Unexpected major type.
\n
"
);
hr
=
IMFMediaType_GetGUID
(
media_type
,
&
MF_MT_SUBTYPE
,
&
subtype
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaType_GetUINT64
(
media_type
,
&
MF_MT_FRAME_SIZE
,
&
frame_size
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
frame_size
==
((
UINT64
)
100
<<
32
|
200
),
"Unexpected frame size %s.
\n
"
,
wine_dbgstr_longlong
(
frame_size
));
hr
=
IMFMediaType_GetUINT32
(
media_type
,
&
MF_MT_ALL_SAMPLES_INDEPENDENT
,
&
value
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaType_GetUINT32
(
media_type
,
&
MF_MT_INTERLACE_MODE
,
&
value
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
value
==
MFVideoInterlace_Progressive
,
"Unexpected interlace mode.
\n
"
);
/* Ratio from input type */
hr
=
IMFMediaType_GetUINT64
(
media_type
,
&
MF_MT_PIXEL_ASPECT_RATIO
,
&
ratio
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
ratio
==
((
UINT64
)
1
<<
32
|
1
),
"Unexpected PAR %s.
\n
"
,
wine_dbgstr_longlong
(
ratio
));
hr
=
IMFMediaType_GetBlob
(
media_type
,
&
MF_MT_GEOMETRIC_APERTURE
,
(
UINT8
*
)
&
aperture
,
sizeof
(
aperture
),
NULL
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
aperture
.
Area
.
cx
==
100
&&
aperture
.
Area
.
cy
==
200
,
"Unexpected aperture area.
\n
"
);
hr
=
IMFMediaType_GetBlob
(
media_type
,
&
MF_MT_MINIMUM_DISPLAY_APERTURE
,
(
UINT8
*
)
&
aperture
,
sizeof
(
aperture
),
NULL
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
aperture
.
Area
.
cx
==
100
&&
aperture
.
Area
.
cy
==
200
,
"Unexpected aperture area.
\n
"
);
hr
=
IMFMediaType_GetUINT32
(
video_type
,
&
MF_MT_FIXED_SIZE_SAMPLES
,
&
value
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
value
==
2
,
"Unexpected value %u.
\n
"
,
value
);
IMFMediaType_Release
(
media_type
);
}
ok
(
index
>
1
,
"Unexpected number of available types.
\n
"
);
hr
=
IMFMediaType_DeleteItem
(
video_type
,
&
MF_MT_FIXED_SIZE_SAMPLES
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFTransform_SetInputType
(
transform
,
0
,
video_type
,
0
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
index
=
0
;
while
(
SUCCEEDED
(
IMFTransform_GetOutputAvailableType
(
transform
,
0
,
index
++
,
&
media_type
)))
{
UINT32
value
;
UINT64
ratio
;
hr
=
IMFMediaType_GetUINT64
(
media_type
,
&
MF_MT_PIXEL_ASPECT_RATIO
,
&
ratio
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
ratio
==
((
UINT64
)
56
<<
32
|
55
),
"Unexpected PAR %s.
\n
"
,
wine_dbgstr_longlong
(
ratio
));
hr
=
IMFMediaType_GetUINT32
(
media_type
,
&
MF_MT_FIXED_SIZE_SAMPLES
,
&
value
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
ok
(
value
==
1
,
"Unexpected value %u.
\n
"
,
value
);
IMFMediaType_Release
(
media_type
);
}
...
...
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