Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Peter Hutterer
pipewire
Commits
265c852c
Commit
265c852c
authored
Dec 14, 2016
by
Wim Taymans
Browse files
Try a different way of doing buffer memory
parent
5e8a3afe
Changes
20
Hide whitespace changes
Inline
Side-by-side
pinos/client/connection.h
View file @
265c852c
...
...
@@ -278,7 +278,7 @@ typedef struct {
SpaDirection
direction
;
uint32_t
port_id
;
uint32_t
mem_id
;
Spa
Data
Type
type
;
Spa
Mem
Type
type
;
int
memfd
;
uint32_t
flags
;
off_t
offset
;
...
...
@@ -291,13 +291,31 @@ typedef struct {
size_t
size
;
}
PinosMessageMemRef
;
typedef
struct
{
SpaMetaType
type
;
PinosMessageMemRef
meta
;
}
PinosMessageBufferMeta
;
typedef
struct
{
PinosMessageMemRef
mem
;
PinosMessageMemRef
chunk
;
}
PinosMessageBufferMem
;
typedef
struct
{
uint32_t
id
;
uint32_t
n_metas
;
PinosMessageBufferMeta
*
metas
;
uint32_t
n_mems
;
PinosMessageBufferMem
*
mems
;
}
PinosMessageBuffer
;
/* PINOS_MESSAGE_USE_BUFFERS */
typedef
struct
{
uint32_t
seq
;
SpaDirection
direction
;
uint32_t
port_id
;
unsigned
int
n_buffers
;
PinosMessage
MemRef
*
buffers
;
PinosMessage
Buffer
*
buffers
;
}
PinosMessageUseBuffers
;
PinosConnection
*
pinos_connection_new
(
int
fd
);
...
...
pinos/client/serialize.c
View file @
265c852c
...
...
@@ -31,8 +31,8 @@ pinos_serialize_buffer_get_size (const SpaBuffer *buffer)
size
=
sizeof
(
SpaBuffer
);
for
(
i
=
0
;
i
<
buffer
->
n_metas
;
i
++
)
size
+=
sizeof
(
SpaMeta
)
+
buffer
->
metas
[
i
].
size
;
for
(
i
=
0
;
i
<
buffer
->
n_
data
s
;
i
++
)
size
+=
sizeof
(
Spa
Data
);
for
(
i
=
0
;
i
<
buffer
->
n_
mem
s
;
i
++
)
size
+=
sizeof
(
Spa
Mem
);
return
size
;
}
...
...
@@ -41,7 +41,7 @@ pinos_serialize_buffer_serialize (void *dest, const SpaBuffer *buffer)
{
SpaBuffer
*
tb
;
SpaMeta
*
mp
;
Spa
Data
*
dp
;
Spa
Mem
*
dp
;
void
*
p
;
unsigned
int
i
;
...
...
@@ -51,11 +51,11 @@ pinos_serialize_buffer_serialize (void *dest, const SpaBuffer *buffer)
tb
=
dest
;
memcpy
(
tb
,
buffer
,
sizeof
(
SpaBuffer
));
mp
=
SPA_MEMBER
(
tb
,
sizeof
(
SpaBuffer
),
SpaMeta
);
dp
=
SPA_MEMBER
(
mp
,
sizeof
(
SpaMeta
)
*
tb
->
n_metas
,
Spa
Data
);
p
=
SPA_MEMBER
(
dp
,
sizeof
(
Spa
Data
)
*
tb
->
n_
data
s
,
void
);
dp
=
SPA_MEMBER
(
mp
,
sizeof
(
SpaMeta
)
*
tb
->
n_metas
,
Spa
Mem
);
p
=
SPA_MEMBER
(
dp
,
sizeof
(
Spa
Mem
)
*
tb
->
n_
mem
s
,
void
);
tb
->
metas
=
SPA_INT_TO_PTR
(
SPA_PTRDIFF
(
mp
,
tb
));
tb
->
data
s
=
SPA_INT_TO_PTR
(
SPA_PTRDIFF
(
dp
,
tb
));
tb
->
mem
s
=
SPA_INT_TO_PTR
(
SPA_PTRDIFF
(
dp
,
tb
));
for
(
i
=
0
;
i
<
tb
->
n_metas
;
i
++
)
{
memcpy
(
&
mp
[
i
],
&
buffer
->
metas
[
i
],
sizeof
(
SpaMeta
));
...
...
@@ -63,8 +63,8 @@ pinos_serialize_buffer_serialize (void *dest, const SpaBuffer *buffer)
mp
[
i
].
data
=
SPA_INT_TO_PTR
(
SPA_PTRDIFF
(
p
,
tb
));
p
+=
mp
[
i
].
size
;
}
for
(
i
=
0
;
i
<
tb
->
n_
data
s
;
i
++
)
memcpy
(
&
dp
[
i
],
&
buffer
->
data
s
[
i
],
sizeof
(
Spa
Data
));
for
(
i
=
0
;
i
<
tb
->
n_
mem
s
;
i
++
)
memcpy
(
&
dp
[
i
],
&
buffer
->
mem
s
[
i
],
sizeof
(
Spa
Mem
));
return
SPA_PTRDIFF
(
p
,
tb
);
}
...
...
@@ -83,9 +83,13 @@ pinos_serialize_buffer_deserialize (void *src, off_t offset)
if
(
m
->
data
)
m
->
data
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
m
->
data
),
void
);
}
if
(
b
->
datas
)
b
->
datas
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
b
->
datas
),
SpaData
);
if
(
b
->
mems
)
b
->
mems
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
b
->
mems
),
SpaMem
);
for
(
i
=
0
;
i
<
b
->
n_mems
;
i
++
)
{
SpaMem
*
m
=
&
b
->
mems
[
i
];
if
(
m
->
chunk
)
m
->
chunk
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
m
->
chunk
),
void
);
}
return
b
;
}
...
...
pinos/client/stream.c
View file @
265c852c
...
...
@@ -52,7 +52,7 @@ typedef struct {
bool
used
;
void
*
buf_ptr
;
SpaBuffer
*
buf
;
Spa
Data
*
data
s
;
Spa
Mem
*
mem
s
;
}
BufferId
;
typedef
struct
...
...
@@ -462,8 +462,8 @@ on_rtsocket_condition (SpaSource *source,
continue
;
if
((
bid
=
find_buffer
(
stream
,
input
->
buffer_id
)))
{
for
(
i
=
0
;
i
<
bid
->
buf
->
n_
data
s
;
i
++
)
{
bid
->
buf
->
datas
[
i
].
size
=
bid
->
datas
[
i
].
size
;
for
(
i
=
0
;
i
<
bid
->
buf
->
n_
mem
s
;
i
++
)
{
SPA_BUFFER_SIZE
(
bid
->
buf
,
i
)
=
SPA_BUFFER_SIZE
(
bid
,
i
)
;
}
pinos_signal_emit
(
&
stream
->
new_buffer
,
stream
,
bid
->
id
);
}
...
...
@@ -703,17 +703,17 @@ stream_dispatch_func (void *object,
m
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
b
->
metas
),
SpaMeta
);
for
(
i
=
0
;
i
<
b
->
n_metas
;
i
++
)
size
+=
sizeof
(
SpaMeta
)
+
m
[
i
].
size
;
for
(
i
=
0
;
i
<
b
->
n_
data
s
;
i
++
)
size
+=
sizeof
(
Spa
Data
);
for
(
i
=
0
;
i
<
b
->
n_
mem
s
;
i
++
)
size
+=
sizeof
(
Spa
Mem
);
b
=
bid
->
buf
=
malloc
(
size
);
memcpy
(
b
,
bid
->
buf_ptr
,
size
);
if
(
b
->
metas
)
b
->
metas
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
b
->
metas
),
SpaMeta
);
if
(
b
->
data
s
)
{
bid
->
data
s
=
SPA_MEMBER
(
bid
->
buf_ptr
,
SPA_PTR_TO_INT
(
b
->
data
s
),
Spa
Data
);
b
->
data
s
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
b
->
data
s
),
Spa
Data
);
if
(
b
->
mem
s
)
{
bid
->
mem
s
=
SPA_MEMBER
(
bid
->
buf_ptr
,
SPA_PTR_TO_INT
(
b
->
mem
s
),
Spa
Mem
);
b
->
mem
s
=
SPA_MEMBER
(
b
,
SPA_PTR_TO_INT
(
b
->
mem
s
),
Spa
Mem
);
}
}
...
...
@@ -731,28 +731,28 @@ stream_dispatch_func (void *object,
m
->
data
=
SPA_MEMBER
(
bid
->
buf_ptr
,
SPA_PTR_TO_INT
(
m
->
data
),
void
);
}
for
(
j
=
0
;
j
<
b
->
n_
data
s
;
j
++
)
{
Spa
Data
*
d
=
&
b
->
data
s
[
j
];
for
(
j
=
0
;
j
<
b
->
n_
mem
s
;
j
++
)
{
Spa
Mem
*
m
=
&
b
->
mem
s
[
j
];
switch
(
d
->
type
)
{
case
SPA_
DATA
_TYPE_ID
:
switch
(
m
->
type
)
{
case
SPA_
MEM
_TYPE_ID
:
{
MemId
*
bmid
=
find_mem
(
stream
,
SPA_PTR_TO_UINT32
(
d
->
data
));
d
->
type
=
SPA_
DATA
_TYPE_MEMFD
;
d
->
data
=
NULL
;
d
->
fd
=
bmid
->
fd
;
MemId
*
bmid
=
find_mem
(
stream
,
SPA_PTR_TO_UINT32
(
m
->
ptr
));
m
->
type
=
SPA_
MEM
_TYPE_MEMFD
;
m
->
ptr
=
NULL
;
m
->
fd
=
bmid
->
fd
;
pinos_log_debug
(
" data %d %u -> fd %d"
,
j
,
bmid
->
id
,
bmid
->
fd
);
break
;
}
case
SPA_
DATA
_TYPE_MEMPTR
:
case
SPA_
MEM
_TYPE_MEMPTR
:
{
d
->
data
=
SPA_MEMBER
(
bid
->
buf_ptr
,
SPA_PTR_TO_INT
(
d
->
data
),
void
);
d
->
fd
=
-
1
;
pinos_log_debug
(
" data %d %u -> mem %p"
,
j
,
bid
->
id
,
d
->
data
);
m
->
ptr
=
SPA_MEMBER
(
bid
->
buf_ptr
,
SPA_PTR_TO_INT
(
m
->
ptr
),
void
);
m
->
fd
=
-
1
;
pinos_log_debug
(
" data %d %u -> mem %p"
,
j
,
bid
->
id
,
m
->
ptr
);
break
;
}
default:
pinos_log_warn
(
"unknown buffer data type %d"
,
d
->
type
);
pinos_log_warn
(
"unknown buffer data type %d"
,
m
->
type
);
break
;
}
}
...
...
@@ -1096,8 +1096,8 @@ pinos_stream_send_buffer (PinosStream *stream,
uint8_t
cmd
=
PINOS_TRANSPORT_CMD_HAVE_DATA
;
bid
->
used
=
true
;
for
(
i
=
0
;
i
<
bid
->
buf
->
n_
data
s
;
i
++
)
{
bid
->
datas
[
i
].
size
=
bid
->
buf
->
datas
[
i
].
size
;
for
(
i
=
0
;
i
<
bid
->
buf
->
n_
mem
s
;
i
++
)
{
SPA_BUFFER_SIZE
(
bid
,
i
)
=
SPA_BUFFER_SIZE
(
bid
->
buf
,
i
)
;
}
impl
->
trans
->
outputs
[
0
].
buffer_id
=
id
;
impl
->
trans
->
outputs
[
0
].
status
=
SPA_RESULT_OK
;
...
...
pinos/gst/gstpinossink.c
View file @
265c852c
...
...
@@ -394,22 +394,22 @@ on_add_buffer (PinosListener *listener,
break
;
}
}
for
(
i
=
0
;
i
<
b
->
n_
data
s
;
i
++
)
{
Spa
Data
*
d
=
&
b
->
data
s
[
i
];
for
(
i
=
0
;
i
<
b
->
n_
mem
s
;
i
++
)
{
Spa
Mem
*
m
=
&
b
->
mem
s
[
i
];
GstMemory
*
gmem
=
NULL
;
switch
(
d
->
type
)
{
case
SPA_
DATA
_TYPE_MEMFD
:
case
SPA_
DATA
_TYPE_DMABUF
:
switch
(
m
->
type
)
{
case
SPA_
MEM
_TYPE_MEMFD
:
case
SPA_
MEM
_TYPE_DMABUF
:
{
gmem
=
gst_fd_allocator_alloc
(
pinossink
->
allocator
,
dup
(
d
->
fd
),
d
->
max
size
,
GST_FD_MEMORY_FLAG_NONE
);
gst_memory_resize
(
gmem
,
d
->
offset
,
d
->
size
);
gmem
=
gst_fd_allocator_alloc
(
pinossink
->
allocator
,
dup
(
m
->
fd
),
m
->
size
,
GST_FD_MEMORY_FLAG_NONE
);
gst_memory_resize
(
gmem
,
m
->
offset
+
m
->
chunk
->
offset
,
m
->
chunk
->
size
);
break
;
}
case
SPA_
DATA
_TYPE_MEMPTR
:
gmem
=
gst_memory_new_wrapped
(
0
,
d
->
data
,
d
->
max
size
,
d
->
offset
,
d
->
size
,
NULL
,
NULL
);
case
SPA_
MEM
_TYPE_MEMPTR
:
gmem
=
gst_memory_new_wrapped
(
0
,
m
->
ptr
,
m
->
size
,
m
->
chunk
->
offset
,
m
->
chunk
->
size
,
NULL
,
NULL
);
break
;
default:
break
;
...
...
@@ -641,11 +641,11 @@ gst_pinos_sink_render (GstBaseSink * bsink, GstBuffer * buffer)
data
->
header
->
pts
=
GST_BUFFER_PTS
(
buffer
);
data
->
header
->
dts_offset
=
GST_BUFFER_DTS
(
buffer
);
}
for
(
i
=
0
;
i
<
data
->
buf
->
n_
data
s
;
i
++
)
{
Spa
Data
*
d
=
&
data
->
buf
->
data
s
[
i
];
for
(
i
=
0
;
i
<
data
->
buf
->
n_
mem
s
;
i
++
)
{
Spa
Mem
*
m
=
&
data
->
buf
->
mem
s
[
i
];
GstMemory
*
mem
=
gst_buffer_peek_memory
(
buffer
,
i
);
d
->
offset
=
mem
->
offset
;
d
->
size
=
mem
->
size
;
m
->
chunk
->
offset
=
mem
->
offset
;
m
->
chunk
->
size
=
mem
->
size
;
}
gst_buffer_ref
(
buffer
);
...
...
pinos/gst/gstpinossrc.c
View file @
265c852c
...
...
@@ -408,22 +408,22 @@ on_add_buffer (PinosListener *listener,
break
;
}
}
for
(
i
=
0
;
i
<
b
->
n_
data
s
;
i
++
)
{
Spa
Data
*
d
=
&
b
->
data
s
[
i
];
for
(
i
=
0
;
i
<
b
->
n_
mem
s
;
i
++
)
{
Spa
Mem
*
m
=
&
b
->
mem
s
[
i
];
GstMemory
*
gmem
=
NULL
;
switch
(
d
->
type
)
{
case
SPA_
DATA
_TYPE_MEMFD
:
case
SPA_
DATA
_TYPE_DMABUF
:
switch
(
m
->
type
)
{
case
SPA_
MEM
_TYPE_MEMFD
:
case
SPA_
MEM
_TYPE_DMABUF
:
{
gmem
=
gst_fd_allocator_alloc
(
pinossrc
->
fd_allocator
,
dup
(
d
->
fd
),
d
->
max
size
,
GST_FD_MEMORY_FLAG_NONE
);
gst_memory_resize
(
gmem
,
d
->
offset
,
d
->
size
);
gmem
=
gst_fd_allocator_alloc
(
pinossrc
->
fd_allocator
,
dup
(
m
->
fd
),
m
->
size
,
GST_FD_MEMORY_FLAG_NONE
);
gst_memory_resize
(
gmem
,
m
->
offset
+
m
->
chunk
->
offset
,
m
->
chunk
->
size
);
break
;
}
case
SPA_
DATA
_TYPE_MEMPTR
:
gmem
=
gst_memory_new_wrapped
(
0
,
d
->
data
,
d
->
max
size
,
d
->
offset
,
d
->
size
,
NULL
,
NULL
);
case
SPA_
MEM
_TYPE_MEMPTR
:
gmem
=
gst_memory_new_wrapped
(
0
,
m
->
ptr
,
m
->
size
,
m
->
chunk
->
offset
,
m
->
chunk
->
size
,
NULL
,
NULL
);
default:
break
;
}
...
...
@@ -485,11 +485,11 @@ on_new_buffer (PinosListener *listener,
}
GST_BUFFER_OFFSET
(
buf
)
=
h
->
seq
;
}
for
(
i
=
0
;
i
<
data
->
buf
->
n_
data
s
;
i
++
)
{
Spa
Data
*
d
=
&
data
->
buf
->
data
s
[
i
];
for
(
i
=
0
;
i
<
data
->
buf
->
n_
mem
s
;
i
++
)
{
Spa
Mem
*
m
=
&
data
->
buf
->
mem
s
[
i
];
GstMemory
*
mem
=
gst_buffer_peek_memory
(
buf
,
i
);
mem
->
offset
=
d
->
offset
;
mem
->
size
=
d
->
size
;
mem
->
offset
=
m
->
chunk
->
offset
;
mem
->
size
=
m
->
chunk
->
size
;
}
g_queue_push_tail
(
&
pinossrc
->
queue
,
buf
);
...
...
pinos/server/client-node.c
View file @
265c852c
...
...
@@ -62,7 +62,7 @@ struct _ProxyBuffer {
SpaBuffer
*
outbuf
;
SpaBuffer
buffer
;
SpaMeta
metas
[
4
];
Spa
Data
data
s
[
4
];
Spa
Mem
mem
s
[
4
];
off_t
offset
;
size_t
size
;
bool
outstanding
;
...
...
@@ -638,8 +638,8 @@ spa_proxy_node_port_use_buffers (SpaNode *node,
b
->
outbuf
=
buffers
[
i
];
memcpy
(
&
b
->
buffer
,
buffers
[
i
],
sizeof
(
SpaBuffer
));
b
->
buffer
.
datas
=
b
->
datas
;
b
->
buffer
.
metas
=
b
->
metas
;
b
->
buffer
.
mems
=
b
->
mems
;
b
->
size
=
SPA_ROUND_UP_N
(
pinos_serialize_buffer_get_size
(
buffers
[
i
]),
64
);
b
->
offset
=
size
;
...
...
@@ -648,38 +648,37 @@ spa_proxy_node_port_use_buffers (SpaNode *node,
memcpy
(
&
b
->
buffer
.
metas
[
j
],
&
buffers
[
i
]
->
metas
[
j
],
sizeof
(
SpaMeta
));
}
for
(
j
=
0
;
j
<
buffers
[
i
]
->
n_
data
s
;
j
++
)
{
Spa
Data
*
d
=
&
buffers
[
i
]
->
data
s
[
j
];
for
(
j
=
0
;
j
<
buffers
[
i
]
->
n_
mem
s
;
j
++
)
{
Spa
Mem
*
m
=
&
buffers
[
i
]
->
mem
s
[
j
];
memcpy
(
&
b
->
buffer
.
data
s
[
j
],
d
,
sizeof
(
Spa
Data
));
memcpy
(
&
b
->
buffer
.
mem
s
[
j
],
m
,
sizeof
(
Spa
Mem
));
switch
(
d
->
type
)
{
case
SPA_
DATA
_TYPE_DMABUF
:
case
SPA_
DATA
_TYPE_MEMFD
:
switch
(
m
->
type
)
{
case
SPA_
MEM
_TYPE_DMABUF
:
case
SPA_
MEM
_TYPE_MEMFD
:
am
.
direction
=
direction
;
am
.
port_id
=
port_id
;
am
.
mem_id
=
n_mem
;
am
.
type
=
d
->
type
;
am
.
memfd
=
d
->
fd
;
am
.
flags
=
d
->
flags
;
am
.
offset
=
d
->
offset
;
am
.
size
=
d
->
max
size
;
am
.
type
=
m
->
type
;
am
.
memfd
=
m
->
fd
;
am
.
flags
=
m
->
flags
;
am
.
offset
=
m
->
offset
;
am
.
size
=
m
->
size
;
pinos_resource_send_message
(
this
->
resource
,
PINOS_MESSAGE_ADD_MEM
,
&
am
,
false
);
b
->
buffer
.
data
s
[
j
].
type
=
SPA_
DATA
_TYPE_ID
;
b
->
buffer
.
data
s
[
j
].
data
=
SPA_UINT32_TO_PTR
(
n_mem
);
b
->
buffer
.
mem
s
[
j
].
type
=
SPA_
MEM
_TYPE_ID
;
b
->
buffer
.
mem
s
[
j
].
ptr
=
SPA_UINT32_TO_PTR
(
n_mem
);
n_mem
++
;
break
;
case
SPA_DATA_TYPE_MEMPTR
:
b
->
buffer
.
datas
[
j
].
data
=
SPA_INT_TO_PTR
(
b
->
size
);
b
->
size
+=
d
->
size
;
case
SPA_MEM_TYPE_MEMPTR
:
b
->
buffer
.
mems
[
j
].
ptr
=
SPA_INT_TO_PTR
(
b
->
size
);
break
;
default:
b
->
buffer
.
data
s
[
j
].
type
=
SPA_
DATA
_TYPE_INVALID
;
b
->
buffer
.
data
s
[
j
].
data
=
0
;
spa_log_error
(
this
->
log
,
"invalid memory type %d"
,
d
->
type
);
b
->
buffer
.
mem
s
[
j
].
type
=
SPA_
MEM
_TYPE_INVALID
;
b
->
buffer
.
mem
s
[
j
].
ptr
=
0
;
spa_log_error
(
this
->
log
,
"invalid memory type %d"
,
m
->
type
);
break
;
}
}
...
...
@@ -703,29 +702,32 @@ spa_proxy_node_port_use_buffers (SpaNode *node,
ProxyBuffer
*
b
=
&
port
->
buffers
[
i
];
SpaBuffer
*
sb
;
SpaMeta
*
sbm
;
Spa
Data
*
sb
d
;
Spa
Mem
*
sb
mem
;
pinos_serialize_buffer_serialize
(
p
,
&
b
->
buffer
);
sb
=
p
;
b
->
buffer
.
data
s
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sb
->
data
s
),
Spa
Data
);
b
->
buffer
.
mem
s
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sb
->
mem
s
),
Spa
Mem
);
sbm
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sb
->
metas
),
SpaMeta
);
sb
d
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sb
->
data
s
),
Spa
Data
);
sb
mem
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sb
->
mem
s
),
Spa
Mem
);
for
(
j
=
0
;
j
<
b
->
buffer
.
n_metas
;
j
++
)
b
->
metas
[
j
].
data
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sbm
[
j
].
data
),
void
);
for
(
j
=
0
;
j
<
b
->
buffer
.
n_
data
s
;
j
++
)
{
if
(
b
->
data
s
[
j
].
type
==
SPA_
DATA
_TYPE_MEMPTR
)
b
->
data
s
[
j
].
data
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sb
d
[
j
].
data
),
void
);
for
(
j
=
0
;
j
<
b
->
buffer
.
n_
mem
s
;
j
++
)
{
if
(
b
->
mem
s
[
j
].
type
==
SPA_
MEM
_TYPE_MEMPTR
)
b
->
mem
s
[
j
].
ptr
=
SPA_MEMBER
(
sb
,
SPA_PTR_TO_INT
(
sb
mem
[
j
].
ptr
),
void
);
}
p
+=
b
->
size
;
spa_debug_buffer
(
b
->
outbuf
);
spa_debug_buffer
(
&
b
->
buffer
);
}
am
.
direction
=
direction
;
am
.
port_id
=
port_id
;
am
.
mem_id
=
port
->
buffer_mem_id
;
am
.
type
=
SPA_
DATA
_TYPE_MEMFD
;
am
.
type
=
SPA_
MEM
_TYPE_MEMFD
;
am
.
memfd
=
port
->
buffer_mem
.
fd
;
am
.
flags
=
0
;
am
.
offset
=
0
;
...
...
@@ -795,13 +797,15 @@ copy_meta_in (SpaProxy *this, SpaProxyPort *port, uint32_t buffer_id)
for
(
i
=
0
;
i
<
b
->
outbuf
->
n_metas
;
i
++
)
{
SpaMeta
*
sm
=
&
b
->
buffer
.
metas
[
i
];
SpaMeta
*
dm
=
&
b
->
outbuf
->
metas
[
i
];
spa_log_info
(
this
->
log
,
"%d/%d memcpy meta %p -> %p %zd"
,
i
,
b
->
outbuf
->
n_metas
,
sm
->
data
,
dm
->
data
,
dm
->
size
);
memcpy
(
dm
->
data
,
sm
->
data
,
dm
->
size
);
}
for
(
i
=
0
;
i
<
b
->
outbuf
->
n_
data
s
;
i
++
)
{
b
->
outbuf
->
datas
[
i
].
size
=
b
->
buffer
.
datas
[
i
].
size
;
if
(
b
->
outbuf
->
datas
[
i
].
type
==
SPA_
DATA
_TYPE_MEMPTR
)
{
spa_log_info
(
this
->
log
,
"memcpy in %zd"
,
b
->
buffer
.
datas
[
i
].
size
);
memcpy
(
b
->
outbuf
->
data
s
[
i
].
data
,
b
->
data
s
[
i
].
data
,
b
->
buffer
.
datas
[
i
].
size
);
for
(
i
=
0
;
i
<
b
->
outbuf
->
n_
mem
s
;
i
++
)
{
SPA_BUFFER_SIZE
(
b
->
outbuf
,
i
)
=
SPA_BUFFER_SIZE
(
&
b
->
buffer
,
i
)
;
if
(
SPA_BUFFER_MEM_TYPE
(
b
->
outbuf
,
i
)
==
SPA_
MEM
_TYPE_MEMPTR
)
{
spa_log_info
(
this
->
log
,
"memcpy in %zd"
,
SPA_BUFFER_SIZE
(
&
b
->
buffer
,
i
)
);
memcpy
(
b
->
outbuf
->
mem
s
[
i
].
ptr
,
b
->
mem
s
[
i
].
ptr
,
SPA_BUFFER_SIZE
(
&
b
->
buffer
,
i
)
);
}
}
}
...
...
@@ -817,11 +821,11 @@ copy_meta_out (SpaProxy *this, SpaProxyPort *port, uint32_t buffer_id)
SpaMeta
*
dm
=
&
b
->
buffer
.
metas
[
i
];
memcpy
(
dm
->
data
,
sm
->
data
,
dm
->
size
);
}
for
(
i
=
0
;
i
<
b
->
outbuf
->
n_
data
s
;
i
++
)
{
b
->
buffer
.
datas
[
i
].
size
=
b
->
outbuf
->
datas
[
i
].
size
;
if
(
b
->
data
s
[
i
].
type
==
SPA_
DATA
_TYPE_MEMPTR
)
{
spa_log_info
(
this
->
log
,
"memcpy out %zd"
,
b
->
outbuf
->
datas
[
i
].
size
);
memcpy
(
b
->
data
s
[
i
].
data
,
b
->
outbuf
->
data
s
[
i
].
data
,
b
->
outbuf
->
datas
[
i
].
size
);
for
(
i
=
0
;
i
<
b
->
outbuf
->
n_
mem
s
;
i
++
)
{
SPA_BUFFER_SIZE
(
&
b
->
buffer
,
i
)
=
SPA_BUFFER_SIZE
(
b
->
outbuf
,
i
)
;
if
(
b
->
mem
s
[
i
].
type
==
SPA_
MEM
_TYPE_MEMPTR
)
{
spa_log_info
(
this
->
log
,
"memcpy out %zd"
,
SPA_BUFFER_SIZE
(
b
->
outbuf
,
i
)
);
memcpy
(
b
->
mem
s
[
i
].
ptr
,
b
->
outbuf
->
mem
s
[
i
].
ptr
,
SPA_BUFFER_SIZE
(
b
->
outbuf
,
i
)
);
}
}
}
...
...
pinos/server/link.c
View file @
265c852c
...
...
@@ -318,54 +318,69 @@ do_allocation (PinosLink *this, SpaNodeState in_state, SpaNodeState out_state)
pinos_log_debug
(
"reusing %d output buffers %p"
,
impl
->
n_buffers
,
impl
->
buffers
);
}
else
{
unsigned
int
i
,
j
;
size_t
hdr_size
,
buf_size
,
arr_size
;
void
*
p
;
unsigned
int
n_metas
,
n_
data
s
;
size_t
hdr_size
,
buf_size
,
arr_size
,
meta_size
;
void
*
meta_p
,
*
chunk_p
,
*
data_
p
;
unsigned
int
n_metas
,
n_
mem
s
;
n_metas
=
0
;
n_
data
s
=
1
;
n_
mem
s
=
1
;
hdr_size
=
sizeof
(
SpaBuffer
);
hdr_size
+=
n_datas
*
sizeof
(
SpaData
);
impl
->
n_buffers
=
max_buffers
;
/* buffer size contains, the data + metadata + chunk info. This allocated
* in shared memory. */
buf_size
=
minsize
*
blocks
;
buf_size
+=
n_mems
*
sizeof
(
SpaMemChunk
);
meta_size
=
0
;
for
(
i
=
0
;
i
<
oinfo
->
n_params
;
i
++
)
{
SpaAllocParam
*
ap
=
oinfo
->
params
[
i
];
if
(
ap
->
type
==
SPA_ALLOC_PARAM_TYPE_META_ENABLE
)
{
SpaAllocParamMetaEnable
*
pme
=
(
SpaAllocParamMetaEnable
*
)
ap
;
hdr
_size
+=
spa_meta_type_get_size
(
pme
->
type
);
meta
_size
+=
spa_meta_type_get_size
(
pme
->
type
);
n_metas
++
;
}
}
hdr_size
+=
n_metas
*
sizeof
(
SpaMeta
);
buf_size
=
SPA_ROUND_UP_N
(
hdr_size
+
(
minsize
*
blocks
),
64
);
buf_size
+=
meta_size
;
buf_size
=
SPA_ROUND_UP_N
(
buf_size
,
64
);
impl
->
n_buffers
=
max_buffers
;
pinos_memblock_alloc
(
PINOS_MEMBLOCK_FLAG_WITH_FD
|
PINOS_MEMBLOCK_FLAG_MAP_READWRITE
|
PINOS_MEMBLOCK_FLAG_SEAL
,
impl
->
n_buffers
*
(
sizeof
(
SpaBuffer
*
)
+
buf_size
)
,
buf_size
*
impl
->
n_buffers
,
&
impl
->
buffer_mem
);
meta_p
=
SPA_MEMBER
(
impl
->
buffer_mem
.
ptr
,
0
,
void
);
chunk_p
=
SPA_MEMBER
(
meta_p
,
impl
->
n_buffers
*
meta_size
,
void
);
data_p
=
SPA_MEMBER
(
chunk_p
,
impl
->
n_buffers
*
n_mems
*
sizeof
(
SpaMemChunk
),
void
);
/* header conatain the buffer, mem and metadata headers along with
* the array of buffers. This is allocated in local memory */
hdr_size
=
sizeof
(
SpaBuffer
);
hdr_size
+=
n_metas
*
sizeof
(
SpaMeta
);
hdr_size
+=
n_mems
*
sizeof
(
SpaMem
);
impl
->
buffers
=
calloc
(
impl
->
n_buffers
,
sizeof
(
SpaBuffer
*
)
+
hdr_size
);
arr_size
=
impl
->
n_buffers
*
sizeof
(
SpaBuffer
*
);
impl
->
buffers
=
p
=
impl
->
buffer_mem
.
ptr
;
p
=
SPA_MEMBER
(
p
,
arr_size
,
void
);
for
(
i
=
0
;
i
<
impl
->
n_buffers
;
i
++
)
{
SpaBuffer
*
b
;
Spa
Data
*
d
;
Spa
Mem
*
m
;
void
*
pd
;
unsigned
int
mi
;
b
=
impl
->
buffers
[
i
]
=
SPA_MEMBER
(
p
,
buf
_size
*
i
,
SpaBuffer
);
b
=
impl
->
buffers
[
i
]
=
SPA_MEMBER
(
impl
->
buffers
,
arr_size
+
(
hdr
_size
*
i
)
,
SpaBuffer
);
b
->
id
=
i
;
b
->
n_metas
=
n_metas
;
b
->
metas
=
SPA_MEMBER
(
b
,
sizeof
(
SpaBuffer
),
SpaMeta
);
b
->
n_datas
=
n_datas
;
b
->
datas
=
SPA_MEMBER
(
b
->
metas
,
sizeof
(
SpaMeta
)
*
n_metas
,
SpaData
);
pd
=
SPA_MEMBER
(
b
->
datas
,
sizeof
(
SpaData
)
*
n_datas
,
void
);
b
->
n_mems
=
n_mems
;
b
->
mems
=
SPA_MEMBER
(
b
->
metas
,
sizeof
(
SpaMeta
)
*
n_metas
,
SpaMem
);
pd
=
SPA_MEMBER
(
meta_p
,
meta_size
*
i
,
void
);
for
(
j
=
0
,
mi
=
0
;
j
<
oinfo
->
n_params
;
j
++
)
{
SpaAllocParam
*
ap
=
oinfo
->
params
[
j
];
...
...
@@ -392,20 +407,22 @@ do_allocation (PinosLink *this, SpaNodeState in_state, SpaNodeState out_state)
}
}
d
=
&
b
->
data
s
[
0
];
m
=
&
b
->
mem
s
[
0
];
if
(
minsize
>
0
)
{
d
->
type
=
SPA_DATA_TYPE_MEMFD
;
d
->
flags
=
0
;
d
->
data
=
impl
->
buffer_mem
.
ptr
;
d
->
fd
=
impl
->
buffer_mem
.
fd
;
d
->
maxsize
=
impl
->
buffer_mem
.
size
;
d
->
offset
=
arr_size
+
hdr_size
+
(
buf_size
*
i
);
d
->
size
=
minsize
;
d
->
stride
=
stride
;
m
->
type
=
SPA_MEM_TYPE_MEMFD
;
m
->
flags
=
SPA_MEM_FLAG_NONE
;
m
->
fd
=
impl
->
buffer_mem
.
fd
;
m
->
offset
=
SPA_PTRDIFF
(
data_p
,
impl
->
buffer_mem
.
ptr
)
+
(
minsize
*
blocks
)
*
i
;
m
->
size
=
impl
->
buffer_mem
.
size
;
m
->
ptr
=
SPA_MEMBER
(
impl
->
buffer_mem
.
ptr
,
m
->
offset
,
void
);
m
->
chunk
->
offset
=
0
,
m
->
chunk
->
size
=
minsize
;
m
->
chunk
->
stride
=
stride
;
}
else
{
d
->
type
=
SPA_
DATA
_TYPE_INVALID
;
d
->
data
=
NULL
;
m
->
type
=
SPA_
MEM
_TYPE_INVALID
;
m
->
ptr
=
NULL
;
}
spa_debug_buffer
(
b
);
}
pinos_log_debug
(
"allocated %d buffers %p %zd"
,
impl
->
n_buffers
,
impl
->
buffers
,
minsize
);