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
b50c7c79
Commit
b50c7c79
authored
Mar 10, 2020
by
Nikolay Sivov
Committed by
Alexandre Julliard
Mar 10, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mfplat: Implement CopyToBuffer().
Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
68da7ea9
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
160 additions
and
11 deletions
+160
-11
buffer.c
dlls/mfplat/buffer.c
+70
-11
mfplat.c
dlls/mfplat/tests/mfplat.c
+90
-0
No files found.
dlls/mfplat/buffer.c
View file @
b50c7c79
...
@@ -771,22 +771,29 @@ static HRESULT WINAPI sample_RemoveAllBuffers(IMFSample *iface)
...
@@ -771,22 +771,29 @@ static HRESULT WINAPI sample_RemoveAllBuffers(IMFSample *iface)
return
S_OK
;
return
S_OK
;
}
}
static
HRESULT
WINAPI
sample_GetTotalLength
(
IMFSample
*
iface
,
DWORD
*
total_length
)
static
DWORD
sample_get_total_length
(
struct
sample
*
sample
)
{
{
struct
sample
*
sample
=
impl_from_IMFSample
(
iface
);
DWORD
total_length
=
0
,
length
;
DWORD
length
;
size_t
i
;
size_t
i
;
TRACE
(
"%p, %p.
\n
"
,
iface
,
total_length
);
*
total_length
=
0
;
EnterCriticalSection
(
&
sample
->
attributes
.
cs
);
for
(
i
=
0
;
i
<
sample
->
buffer_count
;
++
i
)
for
(
i
=
0
;
i
<
sample
->
buffer_count
;
++
i
)
{
{
length
=
0
;
if
(
SUCCEEDED
(
IMFMediaBuffer_GetCurrentLength
(
sample
->
buffers
[
i
],
&
length
)))
if
(
SUCCEEDED
(
IMFMediaBuffer_GetCurrentLength
(
sample
->
buffers
[
i
],
&
length
)))
*
total_length
+=
length
;
total_length
+=
length
;
}
}
return
total_length
;
}
static
HRESULT
WINAPI
sample_GetTotalLength
(
IMFSample
*
iface
,
DWORD
*
total_length
)
{
struct
sample
*
sample
=
impl_from_IMFSample
(
iface
);
TRACE
(
"%p, %p.
\n
"
,
iface
,
total_length
);
EnterCriticalSection
(
&
sample
->
attributes
.
cs
);
*
total_length
=
sample_get_total_length
(
sample
);
LeaveCriticalSection
(
&
sample
->
attributes
.
cs
);
LeaveCriticalSection
(
&
sample
->
attributes
.
cs
);
return
S_OK
;
return
S_OK
;
...
@@ -794,9 +801,61 @@ static HRESULT WINAPI sample_GetTotalLength(IMFSample *iface, DWORD *total_lengt
...
@@ -794,9 +801,61 @@ static HRESULT WINAPI sample_GetTotalLength(IMFSample *iface, DWORD *total_lengt
static
HRESULT
WINAPI
sample_CopyToBuffer
(
IMFSample
*
iface
,
IMFMediaBuffer
*
buffer
)
static
HRESULT
WINAPI
sample_CopyToBuffer
(
IMFSample
*
iface
,
IMFMediaBuffer
*
buffer
)
{
{
FIXME
(
"%p, %p.
\n
"
,
iface
,
buffer
);
struct
sample
*
sample
=
impl_from_IMFSample
(
iface
);
DWORD
total_length
,
dst_length
,
dst_current_length
,
src_max_length
,
current_length
;
BYTE
*
src_ptr
,
*
dst_ptr
;
BOOL
locked
;
HRESULT
hr
;
size_t
i
;
return
E_NOTIMPL
;
TRACE
(
"%p, %p.
\n
"
,
iface
,
buffer
);
EnterCriticalSection
(
&
sample
->
attributes
.
cs
);
total_length
=
sample_get_total_length
(
sample
);
dst_current_length
=
0
;
dst_ptr
=
NULL
;
dst_length
=
current_length
=
0
;
locked
=
SUCCEEDED
(
hr
=
IMFMediaBuffer_Lock
(
buffer
,
&
dst_ptr
,
&
dst_length
,
&
current_length
));
if
(
locked
)
{
if
(
dst_length
<
total_length
)
hr
=
MF_E_BUFFERTOOSMALL
;
else
if
(
dst_ptr
)
{
for
(
i
=
0
;
i
<
sample
->
buffer_count
&&
SUCCEEDED
(
hr
);
++
i
)
{
src_ptr
=
NULL
;
src_max_length
=
current_length
=
0
;
if
(
SUCCEEDED
(
hr
=
IMFMediaBuffer_Lock
(
sample
->
buffers
[
i
],
&
src_ptr
,
&
src_max_length
,
&
current_length
)))
{
if
(
src_ptr
)
{
if
(
current_length
>
dst_length
)
hr
=
MF_E_BUFFERTOOSMALL
;
else
if
(
current_length
)
{
memcpy
(
dst_ptr
,
src_ptr
,
current_length
);
dst_length
-=
current_length
;
dst_current_length
+=
current_length
;
dst_ptr
+=
current_length
;
}
}
IMFMediaBuffer_Unlock
(
sample
->
buffers
[
i
]);
}
}
}
}
IMFMediaBuffer_SetCurrentLength
(
buffer
,
dst_current_length
);
if
(
locked
)
IMFMediaBuffer_Unlock
(
buffer
);
LeaveCriticalSection
(
&
sample
->
attributes
.
cs
);
return
hr
;
}
}
static
const
IMFSampleVtbl
samplevtbl
=
static
const
IMFSampleVtbl
samplevtbl
=
...
...
dlls/mfplat/tests/mfplat.c
View file @
b50c7c79
...
@@ -1760,12 +1760,14 @@ static void test_system_memory_buffer(void)
...
@@ -1760,12 +1760,14 @@ static void test_system_memory_buffer(void)
static
void
test_sample
(
void
)
static
void
test_sample
(
void
)
{
{
static
const
DWORD
test_pattern
=
0x22222222
;
IMFMediaBuffer
*
buffer
,
*
buffer2
;
IMFMediaBuffer
*
buffer
,
*
buffer2
;
DWORD
count
,
flags
,
length
;
DWORD
count
,
flags
,
length
;
IMFAttributes
*
attributes
;
IMFAttributes
*
attributes
;
IMFSample
*
sample
;
IMFSample
*
sample
;
LONGLONG
time
;
LONGLONG
time
;
HRESULT
hr
;
HRESULT
hr
;
BYTE
*
data
;
hr
=
MFCreateSample
(
&
sample
);
hr
=
MFCreateSample
(
&
sample
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
...
@@ -1868,6 +1870,94 @@ static void test_sample(void)
...
@@ -1868,6 +1870,94 @@ static void test_sample(void)
IMFAttributes_Release
(
attributes
);
IMFAttributes_Release
(
attributes
);
IMFSample_Release
(
sample
);
IMFSample_Release
(
sample
);
/* CopyToBuffer() */
hr
=
MFCreateSample
(
&
sample
);
ok
(
hr
==
S_OK
,
"Failed to create a sample, hr %#x.
\n
"
,
hr
);
hr
=
MFCreateMemoryBuffer
(
16
,
&
buffer2
);
ok
(
hr
==
S_OK
,
"Failed to create a buffer, hr %#x.
\n
"
,
hr
);
/* Sample with no buffers. */
hr
=
IMFMediaBuffer_SetCurrentLength
(
buffer2
,
1
);
ok
(
hr
==
S_OK
,
"Failed to set current length, hr %#x.
\n
"
,
hr
);
hr
=
IMFSample_CopyToBuffer
(
sample
,
buffer2
);
ok
(
hr
==
S_OK
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_GetCurrentLength
(
buffer2
,
&
length
);
ok
(
hr
==
S_OK
,
"Failed to get current length, hr %#x.
\n
"
,
hr
);
ok
(
!
length
,
"Unexpected length %u.
\n
"
,
length
);
/* Single buffer, larger destination. */
hr
=
MFCreateMemoryBuffer
(
8
,
&
buffer
);
ok
(
hr
==
S_OK
,
"Failed to create a buffer, hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_Lock
(
buffer
,
&
data
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"Failed to lock buffer, hr %#x.
\n
"
,
hr
);
*
(
DWORD
*
)
data
=
0x11111111
;
hr
=
IMFMediaBuffer_Unlock
(
buffer
);
ok
(
hr
==
S_OK
,
"Failed to unlock, hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_SetCurrentLength
(
buffer
,
4
);
ok
(
hr
==
S_OK
,
"Failed to set current length, hr %#x.
\n
"
,
hr
);
hr
=
IMFSample_AddBuffer
(
sample
,
buffer
);
ok
(
hr
==
S_OK
,
"Failed to add buffer, hr %#x.
\n
"
,
hr
);
/* Existing content is overwritten. */
hr
=
IMFMediaBuffer_SetCurrentLength
(
buffer2
,
8
);
ok
(
hr
==
S_OK
,
"Failed to set length, hr %#x.
\n
"
,
hr
);
hr
=
IMFSample_CopyToBuffer
(
sample
,
buffer2
);
ok
(
hr
==
S_OK
,
"Failed to copy to buffer, hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_GetCurrentLength
(
buffer2
,
&
length
);
ok
(
hr
==
S_OK
,
"Failed to get length, hr %#x.
\n
"
,
hr
);
ok
(
length
==
4
,
"Unexpected buffer length %u.
\n
"
,
length
);
/* Multiple buffers, matching total size. */
hr
=
IMFSample_AddBuffer
(
sample
,
buffer
);
ok
(
hr
==
S_OK
,
"Failed to add buffer, hr %#x.
\n
"
,
hr
);
hr
=
IMFSample_GetBufferCount
(
sample
,
&
count
);
ok
(
hr
==
S_OK
,
"Failed to get buffer count, hr %#x.
\n
"
,
hr
);
ok
(
count
==
2
,
"Unexpected buffer count %u.
\n
"
,
count
);
hr
=
IMFMediaBuffer_SetCurrentLength
(
buffer
,
8
);
ok
(
hr
==
S_OK
,
"Failed to set current length, hr %#x.
\n
"
,
hr
);
hr
=
IMFSample_CopyToBuffer
(
sample
,
buffer2
);
ok
(
hr
==
S_OK
,
"Failed to copy to buffer, hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_GetCurrentLength
(
buffer2
,
&
length
);
ok
(
hr
==
S_OK
,
"Failed to get length, hr %#x.
\n
"
,
hr
);
ok
(
length
==
16
,
"Unexpected buffer length %u.
\n
"
,
length
);
hr
=
IMFSample_AddBuffer
(
sample
,
buffer
);
ok
(
hr
==
S_OK
,
"Failed to add buffer, hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_SetCurrentLength
(
buffer2
,
1
);
ok
(
hr
==
S_OK
,
"Failed to set buffer length, hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_Lock
(
buffer2
,
&
data
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"Failed to lock buffer, hr %#x.
\n
"
,
hr
);
*
(
DWORD
*
)
data
=
test_pattern
;
hr
=
IMFMediaBuffer_Unlock
(
buffer2
);
ok
(
hr
==
S_OK
,
"Failed to unlock buffer, hr %#x.
\n
"
,
hr
);
hr
=
IMFSample_CopyToBuffer
(
sample
,
buffer2
);
ok
(
hr
==
MF_E_BUFFERTOOSMALL
,
"Unexpected hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_Lock
(
buffer2
,
&
data
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"Failed to lock buffer, hr %#x.
\n
"
,
hr
);
ok
(
!
memcmp
(
data
,
&
test_pattern
,
sizeof
(
test_pattern
)),
"Unexpected contents, %#x
\n
"
,
*
(
DWORD
*
)
data
);
hr
=
IMFMediaBuffer_Unlock
(
buffer2
);
ok
(
hr
==
S_OK
,
"Failed to unlock buffer, hr %#x.
\n
"
,
hr
);
hr
=
IMFMediaBuffer_GetCurrentLength
(
buffer2
,
&
length
);
ok
(
hr
==
S_OK
,
"Failed to get length, hr %#x.
\n
"
,
hr
);
ok
(
!
length
,
"Unexpected buffer length %u.
\n
"
,
length
);
IMFMediaBuffer_Release
(
buffer2
);
IMFSample_Release
(
sample
);
/* ConvertToContiguousBuffer() */
/* ConvertToContiguousBuffer() */
hr
=
MFCreateSample
(
&
sample
);
hr
=
MFCreateSample
(
&
sample
);
ok
(
hr
==
S_OK
,
"Failed to create a sample, hr %#x.
\n
"
,
hr
);
ok
(
hr
==
S_OK
,
"Failed to create a sample, hr %#x.
\n
"
,
hr
);
...
...
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