mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-05 13:30:02 -05:00
buffer: make data and meta types dynamic
Use dynamic types for the data and meta types. Move the meta into a separate header. Remove port state, we can keep track of that ourselves. Add size to MetaDataEnable params
This commit is contained in:
parent
ed273ec465
commit
b51d3e4862
36 changed files with 543 additions and 553 deletions
|
|
@ -87,6 +87,7 @@ spa_type_alloc_param_buffers_map (SpaTypeMap *map, SpaTypeAllocParamBuffers *typ
|
|||
#define SPA_TYPE_ALLOC_PARAM__MetaEnable SPA_TYPE_ALLOC_PARAM_BASE "MetaEnable"
|
||||
#define SPA_TYPE_ALLOC_PARAM_META_ENABLE_BASE SPA_TYPE_ALLOC_PARAM__MetaEnable ":"
|
||||
#define SPA_TYPE_ALLOC_PARAM_META_ENABLE__type SPA_TYPE_ALLOC_PARAM_META_ENABLE_BASE "type"
|
||||
#define SPA_TYPE_ALLOC_PARAM_META_ENABLE__size SPA_TYPE_ALLOC_PARAM_META_ENABLE_BASE "size"
|
||||
|
||||
#define SPA_TYPE_ALLOC_PARAM_META_ENABLE__ringbufferSize SPA_TYPE_ALLOC_PARAM_META_ENABLE_BASE "ringbufferSize"
|
||||
#define SPA_TYPE_ALLOC_PARAM_META_ENABLE__ringbufferStride SPA_TYPE_ALLOC_PARAM_META_ENABLE_BASE "ringbufferStride"
|
||||
|
|
@ -96,6 +97,7 @@ spa_type_alloc_param_buffers_map (SpaTypeMap *map, SpaTypeAllocParamBuffers *typ
|
|||
typedef struct {
|
||||
uint32_t MetaEnable;
|
||||
uint32_t type;
|
||||
uint32_t size;
|
||||
uint32_t ringbufferSize;
|
||||
uint32_t ringbufferStride;
|
||||
uint32_t ringbufferBlocks;
|
||||
|
|
@ -108,6 +110,7 @@ spa_type_alloc_param_meta_enable_map (SpaTypeMap *map, SpaTypeAllocParamMetaEnab
|
|||
if (type->MetaEnable == 0) {
|
||||
type->MetaEnable = spa_type_map_get_id (map, SPA_TYPE_ALLOC_PARAM__MetaEnable);
|
||||
type->type = spa_type_map_get_id (map, SPA_TYPE_ALLOC_PARAM_META_ENABLE__type);
|
||||
type->size = spa_type_map_get_id (map, SPA_TYPE_ALLOC_PARAM_META_ENABLE__size);
|
||||
type->ringbufferSize = spa_type_map_get_id (map, SPA_TYPE_ALLOC_PARAM_META_ENABLE__ringbufferSize);
|
||||
type->ringbufferStride = spa_type_map_get_id (map, SPA_TYPE_ALLOC_PARAM_META_ENABLE__ringbufferStride);
|
||||
type->ringbufferBlocks = spa_type_map_get_id (map, SPA_TYPE_ALLOC_PARAM_META_ENABLE__ringbufferBlocks);
|
||||
|
|
|
|||
|
|
@ -26,126 +26,37 @@ extern "C" {
|
|||
|
||||
typedef struct _SpaBuffer SpaBuffer;
|
||||
|
||||
#include <spa/defs.h>
|
||||
#include <spa/meta.h>
|
||||
|
||||
#define SPA_TYPE__Buffer SPA_TYPE_POINTER_BASE "Buffer"
|
||||
#define SPA_TYPE_BUFFER_BASE SPA_TYPE__Buffer ":"
|
||||
|
||||
/**
|
||||
* SpaMetaType:
|
||||
* @SPA_META_TYPE_INVALID: invalid metadata, should be ignored
|
||||
* @SPA_META_TYPE_HEADER: header metadata
|
||||
* @SPA_META_TYPE_POINTER: a generic pointer
|
||||
* @SPA_META_TYPE_VIDEO_CROP: video cropping region
|
||||
* @SPA_META_TYPE_RINGBUFFER: a ringbuffer
|
||||
* @SPA_META_TYPE_SHARED: buffer data and metadata memory can be shared
|
||||
*/
|
||||
typedef enum {
|
||||
SPA_META_TYPE_INVALID = 0,
|
||||
SPA_META_TYPE_HEADER,
|
||||
SPA_META_TYPE_POINTER,
|
||||
SPA_META_TYPE_VIDEO_CROP,
|
||||
SPA_META_TYPE_RINGBUFFER,
|
||||
SPA_META_TYPE_SHARED,
|
||||
} SpaMetaType;
|
||||
#define SPA_TYPE__Data SPA_TYPE_ENUM_BASE "DataType"
|
||||
#define SPA_TYPE_DATA_BASE SPA_TYPE__Data ":"
|
||||
|
||||
/**
|
||||
* SpaDataType:
|
||||
* @SPA_DATA_TYPE_INVALID: invalid data, should be ignored
|
||||
* @SPA_DATA_TYPE_MEMPTR: data points to CPU accessible memory
|
||||
* @SPA_DATA_TYPE_MEMFD: fd is memfd, data can be mmapped
|
||||
* @SPA_DATA_TYPE_DMABUF: fd is dmabuf, data can be mmapped
|
||||
* @SPA_DATA_TYPE_ID: data is an id use SPA_PTR_TO_INT32. The definition of
|
||||
* the ID is conveyed in some other way
|
||||
*/
|
||||
typedef enum {
|
||||
SPA_DATA_TYPE_INVALID = 0,
|
||||
SPA_DATA_TYPE_MEMPTR,
|
||||
SPA_DATA_TYPE_MEMFD,
|
||||
SPA_DATA_TYPE_DMABUF,
|
||||
SPA_DATA_TYPE_ID,
|
||||
} SpaDataType;
|
||||
|
||||
#include <spa/defs.h>
|
||||
#include <spa/ringbuffer.h>
|
||||
|
||||
/**
|
||||
* SpaBufferFlags:
|
||||
* @SPA_BUFFER_FLAG_NONE: no flag
|
||||
* @SPA_BUFFER_FLAG_DISCONT: the buffer marks a data discontinuity
|
||||
* @SPA_BUFFER_FLAG_CORRUPTED: the buffer data might be corrupted
|
||||
* @SPA_BUFFER_FLAG_MARKER: the buffer contains a media specific marker
|
||||
* @SPA_BUFFER_FLAG_HEADER: the buffer contains a header
|
||||
* @SPA_BUFFER_FLAG_GAP: the buffer has been constructed to fill a gap
|
||||
* and contains media neutral data
|
||||
* @SPA_BUFFER_FLAG_DELTA_UNIT: the media cannot be decoded independently
|
||||
*/
|
||||
typedef enum {
|
||||
SPA_BUFFER_FLAG_NONE = 0,
|
||||
SPA_BUFFER_FLAG_DISCONT = (1 << 0),
|
||||
SPA_BUFFER_FLAG_CORRUPTED = (1 << 1),
|
||||
SPA_BUFFER_FLAG_MARKER = (1 << 2),
|
||||
SPA_BUFFER_FLAG_HEADER = (1 << 3),
|
||||
SPA_BUFFER_FLAG_GAP = (1 << 4),
|
||||
SPA_BUFFER_FLAG_DELTA_UNIT = (1 << 5),
|
||||
} SpaBufferFlags;
|
||||
#define SPA_TYPE_DATA__MemPtr SPA_TYPE_DATA_BASE "MemPtr"
|
||||
#define SPA_TYPE_DATA__MemFd SPA_TYPE_DATA_BASE "MemFd"
|
||||
#define SPA_TYPE_DATA__DmaBuf SPA_TYPE_DATA_BASE "DmaBuf"
|
||||
#define SPA_TYPE_DATA__Id SPA_TYPE_DATA_BASE "Id"
|
||||
|
||||
typedef struct {
|
||||
SpaBufferFlags flags;
|
||||
uint32_t seq;
|
||||
int64_t pts;
|
||||
int64_t dts_offset;
|
||||
} SpaMetaHeader;
|
||||
uint32_t MemPtr;
|
||||
uint32_t MemFd;
|
||||
uint32_t DmaBuf;
|
||||
uint32_t Id;
|
||||
} SpaTypeData;
|
||||
|
||||
typedef struct {
|
||||
const char *ptr_type;
|
||||
void *ptr;
|
||||
} SpaMetaPointer;
|
||||
|
||||
/**
|
||||
* SpaMetaVideoCrop:
|
||||
* @x:
|
||||
* @y:
|
||||
* @width:
|
||||
* @height
|
||||
*/
|
||||
typedef struct {
|
||||
int32_t x, y;
|
||||
int32_t width, height;
|
||||
} SpaMetaVideoCrop;
|
||||
|
||||
/**
|
||||
* SpaMetaRingbuffer:
|
||||
* @ringbuffer:
|
||||
*/
|
||||
typedef struct {
|
||||
SpaRingbuffer ringbuffer;
|
||||
} SpaMetaRingbuffer;
|
||||
|
||||
/**
|
||||
* SpaMetaShared:
|
||||
* @type:
|
||||
* @flags:
|
||||
* @fd:
|
||||
* @size:
|
||||
*/
|
||||
typedef struct {
|
||||
SpaDataType type;
|
||||
int32_t flags;
|
||||
int fd;
|
||||
int32_t offset;
|
||||
uint32_t size;
|
||||
} SpaMetaShared;
|
||||
|
||||
/**
|
||||
* SpaMeta:
|
||||
* @type: metadata type
|
||||
* @data: pointer to metadata
|
||||
* @size: size of metadata
|
||||
*/
|
||||
typedef struct {
|
||||
SpaMetaType type;
|
||||
void *data;
|
||||
uint32_t size;
|
||||
} SpaMeta;
|
||||
static inline void
|
||||
spa_type_data_map (SpaTypeMap *map, SpaTypeData *type)
|
||||
{
|
||||
if (type->MemPtr == 0) {
|
||||
type->MemPtr = spa_type_map_get_id (map, SPA_TYPE_DATA__MemPtr);
|
||||
type->MemFd = spa_type_map_get_id (map, SPA_TYPE_DATA__MemFd);
|
||||
type->DmaBuf = spa_type_map_get_id (map, SPA_TYPE_DATA__DmaBuf);
|
||||
type->Id = spa_type_map_get_id (map, SPA_TYPE_DATA__Id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SpaChunk:
|
||||
|
|
@ -164,13 +75,13 @@ typedef struct {
|
|||
* @type: memory type
|
||||
* @flags: memory flags
|
||||
* @fd: file descriptor
|
||||
* @offset: start offset when mapping @fd
|
||||
* @mapoffset: start offset when mapping @fd
|
||||
* @maxsize: maximum size of the memory
|
||||
* @data: pointer to memory
|
||||
* @chunk: pointer to chunk with valid offset
|
||||
*/
|
||||
typedef struct {
|
||||
SpaDataType type;
|
||||
uint32_t type;
|
||||
uint32_t flags;
|
||||
int fd;
|
||||
uint32_t mapoffset;
|
||||
|
|
@ -195,32 +106,16 @@ struct _SpaBuffer {
|
|||
SpaData *datas;
|
||||
};
|
||||
|
||||
|
||||
static inline void *
|
||||
spa_buffer_find_meta (SpaBuffer *b, SpaMetaType type)
|
||||
spa_buffer_find_meta (SpaBuffer *b, uint32_t type)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < b->n_metas; i++)
|
||||
if (b->metas[i].type == type)
|
||||
return b->metas[i].data;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
spa_meta_type_get_size (SpaMetaType type)
|
||||
{
|
||||
static const uint32_t header_sizes[] = {
|
||||
0,
|
||||
sizeof (SpaMetaHeader),
|
||||
sizeof (SpaMetaPointer),
|
||||
sizeof (SpaMetaVideoCrop),
|
||||
sizeof (SpaMetaRingbuffer),
|
||||
sizeof (SpaMetaShared),
|
||||
};
|
||||
if (type <= 0 || type >= SPA_N_ELEMENTS (header_sizes))
|
||||
return 0;
|
||||
return header_sizes[type];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
135
spa/include/spa/meta.h
Normal file
135
spa/include/spa/meta.h
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/* Simple Plugin API
|
||||
* Copyright (C) 2017 Wim Taymans <wim.taymans@gmail.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __SPA_META_H__
|
||||
#define __SPA_META_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <spa/defs.h>
|
||||
#include <spa/ringbuffer.h>
|
||||
|
||||
#define SPA_TYPE__Meta SPA_TYPE_POINTER_BASE "Meta"
|
||||
#define SPA_TYPE_META_BASE SPA_TYPE__Meta ":"
|
||||
|
||||
#define SPA_TYPE_META__Header SPA_TYPE_META_BASE "Header"
|
||||
#define SPA_TYPE_META__Pointer SPA_TYPE_META_BASE "Pointer"
|
||||
#define SPA_TYPE_META__VideoCrop SPA_TYPE_META_BASE "VideoCrop"
|
||||
#define SPA_TYPE_META__Ringbuffer SPA_TYPE_META_BASE "Ringbuffer"
|
||||
#define SPA_TYPE_META__Shared SPA_TYPE_META_BASE "Shared"
|
||||
|
||||
typedef struct {
|
||||
uint32_t Header;
|
||||
uint32_t Pointer;
|
||||
uint32_t VideoCrop;
|
||||
uint32_t Ringbuffer;
|
||||
uint32_t Shared;
|
||||
} SpaTypeMeta;
|
||||
|
||||
static inline void
|
||||
spa_type_meta_map (SpaTypeMap *map, SpaTypeMeta *type)
|
||||
{
|
||||
if (type->Header == 0) {
|
||||
type->Header = spa_type_map_get_id (map, SPA_TYPE_META__Header);
|
||||
type->Pointer = spa_type_map_get_id (map, SPA_TYPE_META__Pointer);
|
||||
type->VideoCrop = spa_type_map_get_id (map, SPA_TYPE_META__VideoCrop);
|
||||
type->Ringbuffer = spa_type_map_get_id (map, SPA_TYPE_META__Ringbuffer);
|
||||
type->Shared = spa_type_map_get_id (map, SPA_TYPE_META__Shared);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SpaMetaHeader:
|
||||
* @flags: extra flags
|
||||
* @seq: sequence number. This monotonically increments and with the rate,
|
||||
* it can be used to derive a media time.
|
||||
* @pts: The MONOTONIC time for @seq.
|
||||
* @dts_offset: offset relative to @pts to start decoding this buffer.
|
||||
*/
|
||||
typedef struct {
|
||||
#define SPA_META_HEADER_FLAG_DISCONT (1 << 0) /* data is not continous with previous buffer */
|
||||
#define SPA_META_HEADER_FLAG_CORRUPTED (1 << 1) /* data might be corrupted */
|
||||
#define SPA_META_HEADER_FLAG_MARKER (1 << 2) /* media specific marker */
|
||||
#define SPA_META_HEADER_FLAG_HEADER (1 << 3) /* data contains a codec specific header */
|
||||
#define SPA_META_HEADER_FLAG_GAP (1 << 4) /* data contains media neutral data */
|
||||
#define SPA_META_HEADER_FLAG_DELTA_UNIT (1 << 5) /* cannot be decoded independently */
|
||||
uint32_t flags;
|
||||
uint32_t seq;
|
||||
int64_t pts;
|
||||
int64_t dts_offset;
|
||||
} SpaMetaHeader;
|
||||
|
||||
typedef struct {
|
||||
uint32_t type;
|
||||
void *ptr;
|
||||
} SpaMetaPointer;
|
||||
|
||||
/**
|
||||
* SpaMetaVideoCrop:
|
||||
* @x:
|
||||
* @y:
|
||||
* @width:
|
||||
* @height
|
||||
*/
|
||||
typedef struct {
|
||||
int32_t x, y;
|
||||
int32_t width, height;
|
||||
} SpaMetaVideoCrop;
|
||||
|
||||
/**
|
||||
* SpaMetaRingbuffer:
|
||||
* @ringbuffer:
|
||||
*/
|
||||
typedef struct {
|
||||
SpaRingbuffer ringbuffer;
|
||||
} SpaMetaRingbuffer;
|
||||
|
||||
/**
|
||||
* SpaMetaShared:
|
||||
* @flags: flags
|
||||
* @fd: the fd of the memory
|
||||
* @offset: start offset of memory
|
||||
* @size: size of the memory
|
||||
*/
|
||||
typedef struct {
|
||||
int32_t flags;
|
||||
int fd;
|
||||
int32_t offset;
|
||||
uint32_t size;
|
||||
} SpaMetaShared;
|
||||
|
||||
/**
|
||||
* SpaMeta:
|
||||
* @type: metadata type
|
||||
* @data: pointer to metadata
|
||||
* @size: size of metadata
|
||||
*/
|
||||
typedef struct {
|
||||
uint32_t type;
|
||||
void *data;
|
||||
uint32_t size;
|
||||
} SpaMeta;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* __SPA_META_H__ */
|
||||
|
|
@ -102,23 +102,17 @@ typedef enum {
|
|||
/**
|
||||
* SpaPortInfo
|
||||
* @flags: extra port flags
|
||||
* @rate: rate of sequence number increment per second of media data
|
||||
* @n_params: number of elements in @params;
|
||||
* @params: extra allocation parameters
|
||||
* @maxbuffering: the maximum amount of bytes that the element will keep
|
||||
* around internally
|
||||
* @latency: latency on this port in nanoseconds
|
||||
* @extra: a dictionary of extra port info
|
||||
*
|
||||
*/
|
||||
typedef struct {
|
||||
#define SPA_PORT_STATE_ERROR -1
|
||||
#define SPA_PORT_STATE_INIT 0
|
||||
#define SPA_PORT_STATE_CONFIGURE 1
|
||||
#define SPA_PORT_STATE_READY 2
|
||||
#define SPA_PORT_STATE_PAUSED 3
|
||||
#define SPA_PORT_STATE_STREAMING 4
|
||||
uint32_t state;
|
||||
SpaPortInfoFlags flags;
|
||||
uint32_t rate;
|
||||
uint32_t n_params;
|
||||
SpaAllocParam **params;
|
||||
uint64_t maxbuffering;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,9 @@ typedef uint32_t SpaType;
|
|||
#define SPA_TYPE__Enum SPA_TYPE_BASE "Enum"
|
||||
#define SPA_TYPE_ENUM_BASE SPA_TYPE__Enum ":"
|
||||
|
||||
#define SPA_TYPE__Pointer SPA_TYPE_BASE "Pointer"
|
||||
#define SPA_TYPE_POINTER_BASE SPA_TYPE__Pointer ":"
|
||||
|
||||
#define SPA_TYPE__Interface SPA_TYPE_BASE "Interface"
|
||||
#define SPA_TYPE_INTERFACE_BASE SPA_TYPE__Interface ":"
|
||||
|
||||
|
|
|
|||
131
spa/lib/debug.c
131
spa/lib/debug.c
|
|
@ -23,31 +23,6 @@
|
|||
#include <spa/format-utils.h>
|
||||
#include "debug.h"
|
||||
|
||||
static const struct meta_type_name {
|
||||
const char *name;
|
||||
} meta_type_names[] = {
|
||||
{ "invalid" },
|
||||
{ "SpaMetaHeader" },
|
||||
{ "SpaMetaPointer" },
|
||||
{ "SpaMetaVideoCrop" },
|
||||
{ "SpaMetaRingbuffer" },
|
||||
{ "SpaMetaShared" },
|
||||
{ "invalid" },
|
||||
};
|
||||
#define META_TYPE_NAME(t) meta_type_names[SPA_CLAMP(t,0,SPA_N_ELEMENTS(meta_type_names)-1)].name
|
||||
|
||||
static const struct data_type_name {
|
||||
const char *name;
|
||||
} data_type_names[] = {
|
||||
{ "invalid" },
|
||||
{ "memptr" },
|
||||
{ "memfd" },
|
||||
{ "dmabuf" },
|
||||
{ "ID" },
|
||||
{ "invalid" },
|
||||
};
|
||||
#define DATA_TYPE_NAME(t) data_type_names[SPA_CLAMP(t,0,SPA_N_ELEMENTS(data_type_names)-1)].name
|
||||
|
||||
SpaResult
|
||||
spa_debug_port_info (const SpaPortInfo *info, const SpaTypeMap *map)
|
||||
{
|
||||
|
|
@ -69,7 +44,7 @@ spa_debug_port_info (const SpaPortInfo *info, const SpaTypeMap *map)
|
|||
}
|
||||
|
||||
SpaResult
|
||||
spa_debug_buffer (const SpaBuffer *buffer)
|
||||
spa_debug_buffer (const SpaBuffer *buffer, const SpaTypeMap *map)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -81,67 +56,59 @@ spa_debug_buffer (const SpaBuffer *buffer)
|
|||
fprintf (stderr, " n_metas: %u (at %p)\n", buffer->n_metas, buffer->metas);
|
||||
for (i = 0; i < buffer->n_metas; i++) {
|
||||
SpaMeta *m = &buffer->metas[i];
|
||||
fprintf (stderr, " meta %d: type %d (%s), data %p, size %d:\n", i, m->type, META_TYPE_NAME (m->type), m->data, m->size);
|
||||
switch (m->type) {
|
||||
case SPA_META_TYPE_HEADER:
|
||||
{
|
||||
SpaMetaHeader *h = m->data;
|
||||
fprintf (stderr, " SpaMetaHeader:\n");
|
||||
fprintf (stderr, " flags: %08x\n", h->flags);
|
||||
fprintf (stderr, " seq: %u\n", h->seq);
|
||||
fprintf (stderr, " pts: %"PRIi64"\n", h->pts);
|
||||
fprintf (stderr, " dts_offset: %"PRIi64"\n", h->dts_offset);
|
||||
break;
|
||||
}
|
||||
case SPA_META_TYPE_POINTER:
|
||||
{
|
||||
SpaMetaPointer *h = m->data;
|
||||
fprintf (stderr, " SpaMetaPointer:\n");
|
||||
fprintf (stderr, " ptr_type: %s\n", h->ptr_type);
|
||||
fprintf (stderr, " ptr: %p\n", h->ptr);
|
||||
spa_debug_dump_mem (m->data, m->size);
|
||||
break;
|
||||
}
|
||||
case SPA_META_TYPE_VIDEO_CROP:
|
||||
{
|
||||
SpaMetaVideoCrop *h = m->data;
|
||||
fprintf (stderr, " SpaMetaVideoCrop:\n");
|
||||
fprintf (stderr, " x: %d\n", h->x);
|
||||
fprintf (stderr, " y: %d\n", h->y);
|
||||
fprintf (stderr, " width: %d\n", h->width);
|
||||
fprintf (stderr, " height: %d\n", h->height);
|
||||
break;
|
||||
}
|
||||
case SPA_META_TYPE_RINGBUFFER:
|
||||
{
|
||||
SpaMetaRingbuffer *h = m->data;
|
||||
fprintf (stderr, " SpaMetaRingbuffer:\n");
|
||||
fprintf (stderr, " readindex: %d\n", h->ringbuffer.readindex);
|
||||
fprintf (stderr, " writeindex: %d\n", h->ringbuffer.writeindex);
|
||||
fprintf (stderr, " size: %d\n", h->ringbuffer.size);
|
||||
fprintf (stderr, " mask: %d\n", h->ringbuffer.mask);
|
||||
break;
|
||||
}
|
||||
case SPA_META_TYPE_SHARED:
|
||||
{
|
||||
SpaMetaShared *h = m->data;
|
||||
fprintf (stderr, " SpaMetaShared:\n");
|
||||
fprintf (stderr, " type: %d\n", h->type);
|
||||
fprintf (stderr, " flags: %d\n", h->flags);
|
||||
fprintf (stderr, " fd: %d\n", h->fd);
|
||||
fprintf (stderr, " offset: %d\n", h->offset);
|
||||
fprintf (stderr, " size: %d\n", h->size);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
spa_debug_dump_mem (m->data, m->size);
|
||||
break;
|
||||
const char *type_name;
|
||||
|
||||
type_name = spa_type_map_get_type (map, m->type);
|
||||
fprintf (stderr, " meta %d: type %d (%s), data %p, size %d:\n", i, m->type,
|
||||
type_name, m->data, m->size);
|
||||
|
||||
if (!strcmp (type_name, SPA_TYPE_META__Header)) {
|
||||
SpaMetaHeader *h = m->data;
|
||||
fprintf (stderr, " SpaMetaHeader:\n");
|
||||
fprintf (stderr, " flags: %08x\n", h->flags);
|
||||
fprintf (stderr, " seq: %u\n", h->seq);
|
||||
fprintf (stderr, " pts: %"PRIi64"\n", h->pts);
|
||||
fprintf (stderr, " dts_offset: %"PRIi64"\n", h->dts_offset);
|
||||
}
|
||||
else if (!strcmp (type_name, SPA_TYPE_META__Pointer)) {
|
||||
SpaMetaPointer *h = m->data;
|
||||
fprintf (stderr, " SpaMetaPointer:\n");
|
||||
fprintf (stderr, " type: %s\n", spa_type_map_get_type (map, h->type));
|
||||
fprintf (stderr, " ptr: %p\n", h->ptr);
|
||||
}
|
||||
else if (!strcmp (type_name, SPA_TYPE_META__VideoCrop)) {
|
||||
SpaMetaVideoCrop *h = m->data;
|
||||
fprintf (stderr, " SpaMetaVideoCrop:\n");
|
||||
fprintf (stderr, " x: %d\n", h->x);
|
||||
fprintf (stderr, " y: %d\n", h->y);
|
||||
fprintf (stderr, " width: %d\n", h->width);
|
||||
fprintf (stderr, " height: %d\n", h->height);
|
||||
}
|
||||
else if (!strcmp (type_name, SPA_TYPE_META__Ringbuffer)) {
|
||||
SpaMetaRingbuffer *h = m->data;
|
||||
fprintf (stderr, " SpaMetaRingbuffer:\n");
|
||||
fprintf (stderr, " readindex: %d\n", h->ringbuffer.readindex);
|
||||
fprintf (stderr, " writeindex: %d\n", h->ringbuffer.writeindex);
|
||||
fprintf (stderr, " size: %d\n", h->ringbuffer.size);
|
||||
fprintf (stderr, " mask: %d\n", h->ringbuffer.mask);
|
||||
}
|
||||
else if (!strcmp (type_name, SPA_TYPE_META__Shared)) {
|
||||
SpaMetaShared *h = m->data;
|
||||
fprintf (stderr, " SpaMetaShared:\n");
|
||||
fprintf (stderr, " flags: %d\n", h->flags);
|
||||
fprintf (stderr, " fd: %d\n", h->fd);
|
||||
fprintf (stderr, " offset: %d\n", h->offset);
|
||||
fprintf (stderr, " size: %d\n", h->size);
|
||||
}
|
||||
else {
|
||||
fprintf (stderr, " Unknown:\n");
|
||||
spa_debug_dump_mem (m->data, m->size);
|
||||
}
|
||||
}
|
||||
fprintf (stderr, " n_datas: \t%u (at %p)\n", buffer->n_datas, buffer->datas);
|
||||
for (i = 0; i < buffer->n_datas; i++) {
|
||||
SpaData *d = &buffer->datas[i];
|
||||
fprintf (stderr, " type: %d (%s)\n", d->type, DATA_TYPE_NAME (d->type));
|
||||
fprintf (stderr, " type: %d (%s)\n", d->type, spa_type_map_get_type (map, d->type));
|
||||
fprintf (stderr, " flags: %d\n", d->flags);
|
||||
fprintf (stderr, " data: %p\n", d->data);
|
||||
fprintf (stderr, " fd: %d\n", d->fd);
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ extern "C" {
|
|||
#include <spa/log.h>
|
||||
|
||||
SpaResult spa_debug_port_info (const SpaPortInfo *info, const SpaTypeMap *map);
|
||||
SpaResult spa_debug_buffer (const SpaBuffer *buffer);
|
||||
SpaResult spa_debug_buffer (const SpaBuffer *buffer, const SpaTypeMap *map);
|
||||
SpaResult spa_debug_props (const SpaProps *props, const SpaTypeMap *map);
|
||||
SpaResult spa_debug_pod (const SpaPOD *pod, const SpaTypeMap *map);
|
||||
SpaResult spa_debug_format (const SpaFormat *format, const SpaTypeMap *map);
|
||||
|
|
|
|||
|
|
@ -329,11 +329,13 @@ spa_alsa_sink_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_RINGBUFFER),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Ringbuffer),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaRingbuffer)),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.ringbufferSize, SPA_POD_TYPE_INT, this->period_frames * this->frame_size * 32),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.ringbufferStride, SPA_POD_TYPE_INT, 0),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.ringbufferBlocks, SPA_POD_TYPE_INT, 1),
|
||||
|
|
@ -444,23 +446,20 @@ spa_alsa_sink_node_port_use_buffers (SpaNode *node,
|
|||
|
||||
for (i = 0; i < n_buffers; i++) {
|
||||
SpaALSABuffer *b = &this->buffers[i];
|
||||
uint32_t type = buffers[i]->datas[0].type;
|
||||
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->rb = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_RINGBUFFER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
b->rb = spa_buffer_find_meta (b->outbuf, this->type.meta.Ringbuffer);
|
||||
|
||||
switch (buffers[i]->datas[0].type) {
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
if (buffers[i]->datas[0].data == NULL) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((type == this->type.data.MemFd ||
|
||||
type == this->type.data.DmaBuf ||
|
||||
type == this->type.data.MemPtr) &&
|
||||
buffers[i]->datas[0].data == NULL) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
}
|
||||
this->n_buffers = n_buffers;
|
||||
|
|
|
|||
|
|
@ -376,7 +376,8 @@ spa_alsa_source_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
this->info.extra = NULL;
|
||||
|
|
@ -482,22 +483,19 @@ spa_alsa_source_node_port_use_buffers (SpaNode *node,
|
|||
}
|
||||
for (i = 0; i < n_buffers; i++) {
|
||||
SpaALSABuffer *b = &this->buffers[i];
|
||||
SpaData *d = buffers[i]->datas;
|
||||
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = false;
|
||||
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
|
||||
switch (buffers[i]->datas[0].type) {
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
if (buffers[i]->datas[0].data == NULL) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (!((d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf ||
|
||||
d[0].type == this->type.data.MemPtr) &&
|
||||
d[0].data != NULL)) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
spa_list_insert (this->free.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ typedef struct {
|
|||
uint32_t prop_device_name;
|
||||
uint32_t prop_card_name;
|
||||
uint32_t prop_min_latency;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeMediaSubtypeAudio media_subtype_audio;
|
||||
|
|
@ -90,6 +92,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->prop_card_name = spa_type_map_get_id (map, SPA_TYPE_PROPS__cardName);
|
||||
type->prop_min_latency = spa_type_map_get_id (map, SPA_TYPE_PROPS__minLatency);
|
||||
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_media_subtype_audio_map (map, &type->media_subtype_audio);
|
||||
|
|
|
|||
|
|
@ -62,6 +62,8 @@ typedef struct {
|
|||
SpaTypeFormatAudio format_audio;
|
||||
SpaTypeAudioFormat audio_format;
|
||||
SpaTypeCommandNode command_node;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
} Type;
|
||||
|
||||
static inline void
|
||||
|
|
@ -74,6 +76,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
spa_type_audio_format_map (map, &type->audio_format);
|
||||
spa_type_command_node_map (map, &type->command_node);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
}
|
||||
|
||||
struct _SpaAudioMixer {
|
||||
|
|
@ -477,19 +481,14 @@ spa_audiomixer_node_port_use_buffers (SpaNode *node,
|
|||
b = &port->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = direction == SPA_DIRECTION_INPUT ? true : false;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (!((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data != NULL)) {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
if (!b->outstanding)
|
||||
spa_list_insert (port->queue.prev, &b->link);
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@ typedef struct {
|
|||
uint32_t prop_volume;
|
||||
uint32_t wave_sine;
|
||||
uint32_t wave_square;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatAudio format_audio;
|
||||
|
|
@ -71,6 +73,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->prop_volume = spa_type_map_get_id (map, SPA_TYPE_PROPS__volume);
|
||||
type->wave_sine = spa_type_map_get_id (map, SPA_TYPE_PROPS__waveType ":sine");
|
||||
type->wave_square = spa_type_map_get_id (map, SPA_TYPE_PROPS__waveType ":square");
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
|
|
@ -618,7 +622,8 @@ spa_audiotestsrc_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
this->info.extra = NULL;
|
||||
|
|
@ -725,20 +730,14 @@ spa_audiotestsrc_node_port_use_buffers (SpaNode *node,
|
|||
b = &this->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = false;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->rb = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_RINGBUFFER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
b->rb = spa_buffer_find_meta (buffers[i], this->type.meta.Ringbuffer);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "audiotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data == NULL) {
|
||||
spa_log_error (this->log, "audiotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
}
|
||||
spa_list_insert (this->empty.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,6 +80,8 @@ typedef struct {
|
|||
SpaTypeCommandNode command_node;
|
||||
SpaTypeAllocParamBuffers alloc_param_buffers;
|
||||
SpaTypeAllocParamMetaEnable alloc_param_meta_enable;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
} Type;
|
||||
|
||||
static inline void
|
||||
|
|
@ -101,6 +103,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
spa_type_command_node_map (map, &type->command_node);
|
||||
spa_type_alloc_param_buffers_map (map, &type->alloc_param_buffers);
|
||||
spa_type_alloc_param_meta_enable_map (map, &type->alloc_param_meta_enable);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ spa_v4l2_clear_buffers (SpaV4l2Source *this)
|
|||
munmap (b->outbuf->datas[0].data, b->outbuf->datas[0].maxsize);
|
||||
if (b->outbuf->datas[0].fd != -1)
|
||||
close (b->outbuf->datas[0].fd);
|
||||
b->outbuf->datas[0].type = SPA_DATA_TYPE_INVALID;
|
||||
b->outbuf->datas[0].type = SPA_ID_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -916,7 +916,8 @@ spa_v4l2_set_format (SpaV4l2Source *this, SpaVideoInfo *format, bool try_only)
|
|||
state->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
state->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
state->info.extra = NULL;
|
||||
|
|
@ -959,9 +960,9 @@ mmap_read (SpaV4l2Source *this)
|
|||
|
||||
b = &state->buffers[buf.index];
|
||||
if (b->h) {
|
||||
b->h->flags = SPA_BUFFER_FLAG_NONE;
|
||||
b->h->flags = 0;
|
||||
if (buf.flags & V4L2_BUF_FLAG_ERROR)
|
||||
b->h->flags |= SPA_BUFFER_FLAG_CORRUPTED;
|
||||
b->h->flags |= SPA_META_HEADER_FLAG_CORRUPTED;
|
||||
b->h->seq = buf.sequence;
|
||||
b->h->pts = pts;
|
||||
}
|
||||
|
|
@ -1007,17 +1008,19 @@ spa_v4l2_use_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_buffe
|
|||
SpaData *d;
|
||||
|
||||
if (n_buffers > 0) {
|
||||
switch (buffers[0]->datas[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
state->memtype = V4L2_MEMORY_USERPTR;
|
||||
break;
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
state->memtype = V4L2_MEMORY_DMABUF;
|
||||
break;
|
||||
default:
|
||||
spa_log_error (state->log, "v4l2: can't use buffers");
|
||||
return SPA_RESULT_ERROR;
|
||||
SpaData *d = buffers[0]->datas;
|
||||
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd) &&
|
||||
d[0].data != NULL) {
|
||||
state->memtype = V4L2_MEMORY_USERPTR;
|
||||
}
|
||||
else if (d[0].type == this->type.data.DmaBuf) {
|
||||
state->memtype = V4L2_MEMORY_DMABUF;
|
||||
}
|
||||
else {
|
||||
spa_log_error (state->log, "v4l2: can't use buffers of type %d", d[0].type);
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1043,7 +1046,7 @@ spa_v4l2_use_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_buffe
|
|||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
b->allocated = false;
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
|
||||
spa_log_info (state->log, "v4l2: import buffer %p", buffers[i]);
|
||||
|
||||
|
|
@ -1057,21 +1060,14 @@ spa_v4l2_use_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_buffe
|
|||
b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
b->v4l2_buffer.memory = state->memtype;
|
||||
b->v4l2_buffer.index = i;
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (state->log, "v4l2: need mmaped memory");
|
||||
continue;
|
||||
}
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) d[0].data;
|
||||
b->v4l2_buffer.length = d[0].maxsize;
|
||||
break;
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
b->v4l2_buffer.m.fd = d[0].fd;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
if (d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd) {
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) d[0].data;
|
||||
b->v4l2_buffer.length = d[0].maxsize;
|
||||
}
|
||||
else if (d[0].type == this->type.data.DmaBuf) {
|
||||
b->v4l2_buffer.m.fd = d[0].fd;
|
||||
}
|
||||
spa_v4l2_buffer_recycle (this, buffers[i]->id);
|
||||
}
|
||||
|
|
@ -1126,7 +1122,7 @@ mmap_init (SpaV4l2Source *this,
|
|||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
b->allocated = true;
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
|
||||
CLEAR (b->v4l2_buffer);
|
||||
b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
|
|
@ -1156,11 +1152,11 @@ mmap_init (SpaV4l2Source *this,
|
|||
perror("VIDIOC_EXPBUF");
|
||||
continue;
|
||||
}
|
||||
d[0].type = SPA_DATA_TYPE_DMABUF;
|
||||
d[0].type = this->type.data.DmaBuf;
|
||||
d[0].fd = expbuf.fd;
|
||||
d[0].data = NULL;
|
||||
} else {
|
||||
d[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
d[0].type = this->type.data.MemPtr;
|
||||
d[0].fd = -1;
|
||||
d[0].data = mmap (NULL,
|
||||
b->v4l2_buffer.length,
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@ typedef struct {
|
|||
uint32_t prop_pattern;
|
||||
uint32_t pattern_smpte_snow;
|
||||
uint32_t pattern_snow;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatVideo format_video;
|
||||
|
|
@ -67,6 +69,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->prop_pattern = spa_type_map_get_id (map, SPA_TYPE_PROPS__patternType);
|
||||
type->pattern_smpte_snow = spa_type_map_get_id (map, SPA_TYPE_PROPS__patternType ":smpte-snow");
|
||||
type->pattern_snow = spa_type_map_get_id (map, SPA_TYPE_PROPS__patternType ":snow");
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_video_map (map, &type->format_video);
|
||||
|
|
@ -581,7 +585,8 @@ spa_videotestsrc_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
this->info.extra = NULL;
|
||||
|
|
@ -687,19 +692,13 @@ spa_videotestsrc_node_port_use_buffers (SpaNode *node,
|
|||
b = &this->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = false;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "videotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data == NULL) {
|
||||
spa_log_error (this->log, "videotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
}
|
||||
spa_list_insert (this->empty.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ typedef struct {
|
|||
uint32_t props;
|
||||
uint32_t prop_volume;
|
||||
uint32_t prop_mute;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatAudio format_audio;
|
||||
|
|
@ -84,6 +86,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->props = spa_type_map_get_id (map, SPA_TYPE__Props);
|
||||
type->prop_volume = spa_type_map_get_id (map, SPA_TYPE_PROPS__volume);
|
||||
type->prop_mute = spa_type_map_get_id (map, SPA_TYPE_PROPS__mute);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
|
|
@ -402,7 +406,8 @@ spa_volume_node_port_set_format (SpaNode *node,
|
|||
port->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
port->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
port->info.extra = NULL;
|
||||
|
|
@ -508,21 +513,18 @@ spa_volume_node_port_use_buffers (SpaNode *node,
|
|||
b = &port->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
b->ptr = d[0].data;
|
||||
b->size = d[0].maxsize;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data != NULL) {
|
||||
b->ptr = d[0].data;
|
||||
b->size = d[0].maxsize;
|
||||
}
|
||||
else {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
spa_list_insert (port->empty.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@ typedef struct {
|
|||
uint32_t props_volume;
|
||||
uint32_t props_min_latency;
|
||||
uint32_t props_live;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatAudio format_audio;
|
||||
|
|
@ -65,6 +67,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->props_volume = spa_type_map_get_id (map, SPA_TYPE_PROPS__volume);
|
||||
type->props_min_latency = spa_type_map_get_id (map, SPA_TYPE_PROPS__minLatency);
|
||||
type->props_live = spa_type_map_get_id (map, SPA_TYPE_PROPS__live);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
|
|
@ -141,11 +145,11 @@ init_buffer (AppData *data, SpaBuffer **bufs, Buffer *ba, int n_buffers, size_t
|
|||
b->header.seq = 0;
|
||||
b->header.pts = 0;
|
||||
b->header.dts_offset = 0;
|
||||
b->metas[0].type = SPA_META_TYPE_HEADER;
|
||||
b->metas[0].type = data->type.meta.Header;
|
||||
b->metas[0].data = &b->header;
|
||||
b->metas[0].size = sizeof (b->header);
|
||||
|
||||
b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
b->datas[0].type = data->type.data.MemPtr;
|
||||
b->datas[0].flags = 0;
|
||||
b->datas[0].fd = -1;
|
||||
b->datas[0].mapoffset = 0;
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@ typedef struct {
|
|||
uint32_t props_volume;
|
||||
uint32_t props_min_latency;
|
||||
uint32_t props_live;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatAudio format_audio;
|
||||
|
|
@ -65,6 +67,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->props_volume = spa_type_map_get_id (map, SPA_TYPE_PROPS__volume);
|
||||
type->props_min_latency = spa_type_map_get_id (map, SPA_TYPE_PROPS__minLatency);
|
||||
type->props_live = spa_type_map_get_id (map, SPA_TYPE_PROPS__live);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
|
|
@ -130,16 +134,16 @@ init_buffer (AppData *data, SpaBuffer **bufs, Buffer *ba, int n_buffers, size_t
|
|||
b->header.seq = 0;
|
||||
b->header.pts = 0;
|
||||
b->header.dts_offset = 0;
|
||||
b->metas[0].type = SPA_META_TYPE_HEADER;
|
||||
b->metas[0].type = data->type.meta.Header;
|
||||
b->metas[0].data = &b->header;
|
||||
b->metas[0].size = sizeof (b->header);
|
||||
|
||||
spa_ringbuffer_init (&b->rb.ringbuffer, size);
|
||||
b->metas[1].type = SPA_META_TYPE_RINGBUFFER;
|
||||
b->metas[1].type = data->type.meta.Ringbuffer;
|
||||
b->metas[1].data = &b->rb;
|
||||
b->metas[1].size = sizeof (b->rb);
|
||||
|
||||
b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
b->datas[0].type = data->type.data.MemPtr;
|
||||
b->datas[0].flags = 0;
|
||||
b->datas[0].fd = -1;
|
||||
b->datas[0].mapoffset = 0;
|
||||
|
|
|
|||
|
|
@ -43,6 +43,9 @@ typedef struct {
|
|||
uint32_t props;
|
||||
uint32_t format;
|
||||
uint32_t props_device;
|
||||
uint32_t SDL_Texture;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatVideo format_video;
|
||||
|
|
@ -58,6 +61,9 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->props = spa_type_map_get_id (map, SPA_TYPE__Props);
|
||||
type->format = spa_type_map_get_id (map, SPA_TYPE__Format);
|
||||
type->props_device = spa_type_map_get_id (map, SPA_TYPE_PROPS__device);
|
||||
type->SDL_Texture = spa_type_map_get_id (map, SPA_TYPE_POINTER_BASE "SDL_Texture");
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_video_map (map, &type->format_video);
|
||||
|
|
@ -177,8 +183,8 @@ on_source_event (SpaNode *node, SpaEvent *event, void *user_data)
|
|||
metas = b->metas;
|
||||
datas = b->datas;
|
||||
|
||||
if (metas[1].type == SPA_META_TYPE_POINTER &&
|
||||
strcmp (((SpaMetaPointer *)metas[1].data)->ptr_type, "SDL_Texture") == 0) {
|
||||
if (metas[1].type == data->type.meta.Pointer &&
|
||||
((SpaMetaPointer *)metas[1].data)->type == data->type.SDL_Texture) {
|
||||
SDL_Texture *texture;
|
||||
texture = ((SpaMetaPointer *)metas[1].data)->ptr;
|
||||
|
||||
|
|
@ -192,7 +198,7 @@ on_source_event (SpaNode *node, SpaEvent *event, void *user_data)
|
|||
fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
|
||||
return;
|
||||
}
|
||||
datas[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
datas[0].type = data->type.data.MemPtr;
|
||||
datas[0].flags = 0;
|
||||
datas[0].fd = -1;
|
||||
datas[0].mapoffset = 0;
|
||||
|
|
@ -328,17 +334,17 @@ alloc_buffers (AppData *data)
|
|||
b->header.seq = 0;
|
||||
b->header.pts = 0;
|
||||
b->header.dts_offset = 0;
|
||||
b->metas[0].type = SPA_META_TYPE_HEADER;
|
||||
b->metas[0].type = data->type.meta.Header;
|
||||
b->metas[0].data = &b->header;
|
||||
b->metas[0].size = sizeof (b->header);
|
||||
|
||||
b->ptr.ptr_type = "SDL_Texture";
|
||||
b->ptr.type = data->type.SDL_Texture;
|
||||
b->ptr.ptr = texture;
|
||||
b->metas[1].type = SPA_META_TYPE_POINTER;
|
||||
b->metas[1].type = data->type.meta.Pointer;
|
||||
b->metas[1].data = &b->ptr;
|
||||
b->metas[1].size = sizeof (b->ptr);
|
||||
|
||||
b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
b->datas[0].type = data->type.data.MemPtr;
|
||||
b->datas[0].flags = 0;
|
||||
b->datas[0].fd = -1;
|
||||
b->datas[0].mapoffset = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue