mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
improve format support
This commit is contained in:
parent
a973007a49
commit
ee17176faf
8 changed files with 222 additions and 91 deletions
|
|
@ -36,7 +36,7 @@ typedef enum {
|
||||||
SPA_PROP_ID_AUDIO_RATE,
|
SPA_PROP_ID_AUDIO_RATE,
|
||||||
SPA_PROP_ID_AUDIO_CHANNELS,
|
SPA_PROP_ID_AUDIO_CHANNELS,
|
||||||
SPA_PROP_ID_AUDIO_CHANNEL_MASK,
|
SPA_PROP_ID_AUDIO_CHANNEL_MASK,
|
||||||
SPA_PROP_ID_AUDIO_RAW_INFO,
|
SPA_PROP_ID_AUDIO_INFO_RAW,
|
||||||
} SpaPropIdAudio;
|
} SpaPropIdAudio;
|
||||||
|
|
||||||
SpaResult spa_prop_info_fill_audio (SpaPropInfo *info,
|
SpaResult spa_prop_info_fill_audio (SpaPropInfo *info,
|
||||||
|
|
|
||||||
|
|
@ -37,25 +37,48 @@ typedef enum {
|
||||||
SPA_MEDIA_TYPE_IMAGE = 3,
|
SPA_MEDIA_TYPE_IMAGE = 3,
|
||||||
} SpaMediaType;
|
} SpaMediaType;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SPA_MEDIA_SUBTYPE_INVALID = 0,
|
SPA_MEDIA_SUBTYPE_INVALID = 0,
|
||||||
SPA_MEDIA_SUBTYPE_RAW = 1,
|
|
||||||
SPA_MEDIA_SUBTYPE_H264 = 2,
|
#define SPA_MEDIA_SUBTYPE_ANY_FIRST 1
|
||||||
SPA_MEDIA_SUBTYPE_MJPG = 3,
|
SPA_MEDIA_SUBTYPE_RAW = SPA_MEDIA_SUBTYPE_ANY_FIRST,
|
||||||
SPA_MEDIA_SUBTYPE_DV = 4,
|
#define SPA_MEDIA_SUBTYPE_ANY_LAST SPA_MEDIA_SUBTYPE_RAW
|
||||||
SPA_MEDIA_SUBTYPE_MPEGTS = 5,
|
|
||||||
SPA_MEDIA_SUBTYPE_H263 = 6,
|
/* VIDEO */
|
||||||
SPA_MEDIA_SUBTYPE_MPEG1 = 7,
|
#define SPA_MEDIA_SUBTYPE_VIDEO_FIRST 20
|
||||||
SPA_MEDIA_SUBTYPE_MPEG2 = 8,
|
SPA_MEDIA_SUBTYPE_H264 = SPA_MEDIA_SUBTYPE_VIDEO_FIRST,
|
||||||
SPA_MEDIA_SUBTYPE_MPEG4 = 9,
|
SPA_MEDIA_SUBTYPE_MJPG,
|
||||||
SPA_MEDIA_SUBTYPE_XVID = 10,
|
SPA_MEDIA_SUBTYPE_DV,
|
||||||
SPA_MEDIA_SUBTYPE_VC1 = 11,
|
SPA_MEDIA_SUBTYPE_MPEGTS,
|
||||||
SPA_MEDIA_SUBTYPE_VP8 = 12,
|
SPA_MEDIA_SUBTYPE_H263,
|
||||||
SPA_MEDIA_SUBTYPE_VP9 = 13,
|
SPA_MEDIA_SUBTYPE_MPEG1,
|
||||||
SPA_MEDIA_SUBTYPE_JPEG = 14,
|
SPA_MEDIA_SUBTYPE_MPEG2,
|
||||||
SPA_MEDIA_SUBTYPE_BAYER = 15,
|
SPA_MEDIA_SUBTYPE_MPEG4,
|
||||||
SPA_MEDIA_SUBTYPE_MP3 = 16,
|
SPA_MEDIA_SUBTYPE_XVID,
|
||||||
SPA_MEDIA_SUBTYPE_AAC = 17,
|
SPA_MEDIA_SUBTYPE_VC1,
|
||||||
|
SPA_MEDIA_SUBTYPE_VP8,
|
||||||
|
SPA_MEDIA_SUBTYPE_VP9,
|
||||||
|
SPA_MEDIA_SUBTYPE_JPEG,
|
||||||
|
SPA_MEDIA_SUBTYPE_BAYER,
|
||||||
|
#define SPA_MEDIA_SUBTYPE_VIDEO_LAST SPA_MEDIA_SUBTYPE_BAYER
|
||||||
|
|
||||||
|
/* AUDIO */
|
||||||
|
#define SPA_MEDIA_SUBTYPE_AUDIO_FIRST 200
|
||||||
|
SPA_MEDIA_SUBTYPE_MP3 = SPA_MEDIA_SUBTYPE_AUDIO_FIRST,
|
||||||
|
SPA_MEDIA_SUBTYPE_AAC,
|
||||||
|
SPA_MEDIA_SUBTYPE_VORBIS,
|
||||||
|
SPA_MEDIA_SUBTYPE_WMA,
|
||||||
|
SPA_MEDIA_SUBTYPE_RA,
|
||||||
|
SPA_MEDIA_SUBTYPE_SBC,
|
||||||
|
SPA_MEDIA_SUBTYPE_ADPCM,
|
||||||
|
SPA_MEDIA_SUBTYPE_G723,
|
||||||
|
SPA_MEDIA_SUBTYPE_G726,
|
||||||
|
SPA_MEDIA_SUBTYPE_G729,
|
||||||
|
SPA_MEDIA_SUBTYPE_AMR,
|
||||||
|
SPA_MEDIA_SUBTYPE_GSM,
|
||||||
|
#define SPA_MEDIA_SUBTYPE_AUDIO_LAST SPA_MEDIA_SUBTYPE_GSM
|
||||||
|
|
||||||
} SpaMediaSubType;
|
} SpaMediaSubType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -24,12 +24,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct _SpaVideoInfoJPEG SpaVideoInfoJPEG;
|
typedef struct _SpaVideoInfoMJPG SpaVideoInfoMJPG;
|
||||||
|
|
||||||
#include <spa/format.h>
|
#include <spa/format.h>
|
||||||
#include <spa/video/format.h>
|
#include <spa/video/format.h>
|
||||||
|
|
||||||
struct _SpaVideoInfoJPEG {
|
struct _SpaVideoInfoMJPG {
|
||||||
SpaRectangle size;
|
SpaRectangle size;
|
||||||
SpaFraction framerate;
|
SpaFraction framerate;
|
||||||
SpaFraction max_framerate;
|
SpaFraction max_framerate;
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,8 @@ typedef enum {
|
||||||
SPA_PROP_ID_VIDEO_COLOR_MATRIX,
|
SPA_PROP_ID_VIDEO_COLOR_MATRIX,
|
||||||
SPA_PROP_ID_VIDEO_TRANSFER_FUNCTION,
|
SPA_PROP_ID_VIDEO_TRANSFER_FUNCTION,
|
||||||
SPA_PROP_ID_VIDEO_COLOR_PRIMARIES,
|
SPA_PROP_ID_VIDEO_COLOR_PRIMARIES,
|
||||||
SPA_PROP_ID_VIDEO_RAW_INFO,
|
SPA_PROP_ID_VIDEO_INFO_RAW,
|
||||||
|
SPA_PROP_ID_VIDEO_INFO_MJPG,
|
||||||
} SpaPropIdVideo;
|
} SpaPropIdVideo;
|
||||||
|
|
||||||
SpaResult spa_prop_info_fill_video (SpaPropInfo *info,
|
SpaResult spa_prop_info_fill_video (SpaPropInfo *info,
|
||||||
|
|
@ -62,7 +63,7 @@ struct _SpaFormatVideo {
|
||||||
SpaFormat format;
|
SpaFormat format;
|
||||||
union {
|
union {
|
||||||
SpaVideoInfoRaw raw;
|
SpaVideoInfoRaw raw;
|
||||||
SpaVideoInfoJPEG jpeg;
|
SpaVideoInfoMJPG mjpg;
|
||||||
} info;
|
} info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -173,7 +173,7 @@ static const SpaPropInfo format_prop_info[] =
|
||||||
SPA_PROP_TYPE_BITMASK, sizeof (uint32_t),
|
SPA_PROP_TYPE_BITMASK, sizeof (uint32_t),
|
||||||
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
SPA_PROP_RANGE_TYPE_NONE, 0, NULL,
|
||||||
NULL },
|
NULL },
|
||||||
{ SPA_PROP_ID_AUDIO_RAW_INFO, 0,
|
{ SPA_PROP_ID_AUDIO_INFO_RAW, 0,
|
||||||
"info", "the SpaAudioInfoRaw structure",
|
"info", "the SpaAudioInfoRaw structure",
|
||||||
SPA_PROP_FLAG_READWRITE,
|
SPA_PROP_FLAG_READWRITE,
|
||||||
SPA_PROP_TYPE_POINTER, sizeof (SpaAudioInfoRaw),
|
SPA_PROP_TYPE_POINTER, sizeof (SpaAudioInfoRaw),
|
||||||
|
|
@ -186,52 +186,84 @@ spa_prop_info_fill_audio (SpaPropInfo *info,
|
||||||
SpaPropIdAudio id,
|
SpaPropIdAudio id,
|
||||||
size_t offset)
|
size_t offset)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
int i;
|
||||||
|
|
||||||
if (info == NULL)
|
if (info == NULL)
|
||||||
return SPA_RESULT_INVALID_ARGUMENTS;
|
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||||
|
|
||||||
for (i = 0; i < SPA_N_ELEMENTS (format_prop_info); i++) {
|
i = id - SPA_PROP_ID_MEDIA_CUSTOM_START;
|
||||||
if (format_prop_info[i].id == id) {
|
|
||||||
memcpy (info, &format_prop_info[i], sizeof (SpaPropInfo));
|
if (i < 0 || i >= SPA_N_ELEMENTS (format_prop_info))
|
||||||
info->offset = offset;
|
return SPA_RESULT_INVALID_PROPERTY_INDEX;
|
||||||
return SPA_RESULT_OK;
|
|
||||||
}
|
memcpy (info, &format_prop_info[i], sizeof (SpaPropInfo));
|
||||||
}
|
info->offset = offset;
|
||||||
return SPA_RESULT_INVALID_PROPERTY_INDEX;
|
|
||||||
|
return SPA_RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SpaResult
|
SpaResult
|
||||||
spa_format_audio_init (SpaMediaType type,
|
spa_format_audio_init (SpaMediaType type,
|
||||||
SpaMediaSubType subtype,
|
SpaMediaSubType subtype,
|
||||||
SpaFormatAudio *format)
|
SpaFormatAudio *format)
|
||||||
{
|
{
|
||||||
static SpaPropInfo raw_format_prop_info[] =
|
SpaPropInfo *prop_info = NULL;
|
||||||
{
|
unsigned int n_prop_info = 0;
|
||||||
{ SPA_PROP_ID_AUDIO_FORMAT, offsetof (SpaFormatAudio, info.raw.format), },
|
int i;
|
||||||
{ SPA_PROP_ID_AUDIO_FLAGS, offsetof (SpaFormatAudio, info.raw.flags), },
|
|
||||||
{ SPA_PROP_ID_AUDIO_LAYOUT, offsetof (SpaFormatAudio, info.raw.layout), },
|
|
||||||
{ SPA_PROP_ID_AUDIO_RATE, offsetof (SpaFormatAudio, info.raw.rate), },
|
|
||||||
{ SPA_PROP_ID_AUDIO_CHANNELS, offsetof (SpaFormatAudio, info.raw.channels), },
|
|
||||||
{ SPA_PROP_ID_AUDIO_CHANNEL_MASK, offsetof (SpaFormatAudio, info.raw.channel_mask), },
|
|
||||||
{ SPA_PROP_ID_AUDIO_RAW_INFO, offsetof (SpaFormatAudio, info), },
|
|
||||||
};
|
|
||||||
|
|
||||||
if (raw_format_prop_info[0].name == NULL) {
|
if (type != SPA_MEDIA_TYPE_AUDIO)
|
||||||
int i;
|
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||||
|
|
||||||
for (i = 0; i < SPA_N_ELEMENTS (raw_format_prop_info); i++)
|
switch (subtype) {
|
||||||
spa_prop_info_fill_audio (&raw_format_prop_info[i],
|
case SPA_MEDIA_SUBTYPE_RAW:
|
||||||
raw_format_prop_info[i].id,
|
{
|
||||||
raw_format_prop_info[i].offset);
|
static SpaPropInfo raw_format_prop_info[] =
|
||||||
|
{
|
||||||
|
{ SPA_PROP_ID_AUDIO_FORMAT, offsetof (SpaFormatAudio, info.raw.format), },
|
||||||
|
{ SPA_PROP_ID_AUDIO_FLAGS, offsetof (SpaFormatAudio, info.raw.flags), },
|
||||||
|
{ SPA_PROP_ID_AUDIO_LAYOUT, offsetof (SpaFormatAudio, info.raw.layout), },
|
||||||
|
{ SPA_PROP_ID_AUDIO_RATE, offsetof (SpaFormatAudio, info.raw.rate), },
|
||||||
|
{ SPA_PROP_ID_AUDIO_CHANNELS, offsetof (SpaFormatAudio, info.raw.channels), },
|
||||||
|
{ SPA_PROP_ID_AUDIO_CHANNEL_MASK, offsetof (SpaFormatAudio, info.raw.channel_mask), },
|
||||||
|
{ SPA_PROP_ID_AUDIO_INFO_RAW, offsetof (SpaFormatAudio, info), },
|
||||||
|
};
|
||||||
|
prop_info = raw_format_prop_info;
|
||||||
|
n_prop_info = SPA_N_ELEMENTS (raw_format_prop_info);
|
||||||
|
format->format.props.unset_mask = (1 << 0) | (1 << 2) | (1 << 3) | (1 << 4);
|
||||||
|
format->info.raw = default_raw_info;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SPA_MEDIA_SUBTYPE_MP3:
|
||||||
|
case SPA_MEDIA_SUBTYPE_AAC:
|
||||||
|
case SPA_MEDIA_SUBTYPE_VORBIS:
|
||||||
|
case SPA_MEDIA_SUBTYPE_WMA:
|
||||||
|
case SPA_MEDIA_SUBTYPE_RA:
|
||||||
|
case SPA_MEDIA_SUBTYPE_SBC:
|
||||||
|
case SPA_MEDIA_SUBTYPE_ADPCM:
|
||||||
|
case SPA_MEDIA_SUBTYPE_G723:
|
||||||
|
case SPA_MEDIA_SUBTYPE_G726:
|
||||||
|
case SPA_MEDIA_SUBTYPE_G729:
|
||||||
|
case SPA_MEDIA_SUBTYPE_AMR:
|
||||||
|
case SPA_MEDIA_SUBTYPE_GSM:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prop_info && prop_info[0].name == NULL) {
|
||||||
|
for (i = 0; i < n_prop_info; i++)
|
||||||
|
spa_prop_info_fill_audio (&prop_info[i],
|
||||||
|
prop_info[i].id,
|
||||||
|
prop_info[i].offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
format->format.media_type = type;
|
format->format.media_type = type;
|
||||||
format->format.media_subtype = subtype;
|
format->format.media_subtype = subtype;
|
||||||
format->format.props.n_prop_info = SPA_N_ELEMENTS (raw_format_prop_info);
|
format->format.props.n_prop_info = n_prop_info;
|
||||||
format->format.props.prop_info = raw_format_prop_info;
|
format->format.props.prop_info = prop_info;
|
||||||
format->format.props.unset_mask = (1 << 0) | (1 << 2) | (1 << 3) | (1 << 4);
|
|
||||||
format->info.raw = default_raw_info;
|
|
||||||
|
|
||||||
return SPA_RESULT_OK;
|
return SPA_RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
@ -255,7 +287,7 @@ spa_format_audio_parse (const SpaFormat *format,
|
||||||
aformat);
|
aformat);
|
||||||
|
|
||||||
props = &format->props;
|
props = &format->props;
|
||||||
if ((res = spa_props_get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_AUDIO_RAW_INFO), &value)) < 0)
|
if ((res = spa_props_get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_AUDIO_INFO_RAW), &value)) < 0)
|
||||||
goto fallback;
|
goto fallback;
|
||||||
|
|
||||||
if (value.type != SPA_PROP_TYPE_POINTER || value.size != sizeof (SpaAudioInfoRaw))
|
if (value.type != SPA_PROP_TYPE_POINTER || value.size != sizeof (SpaAudioInfoRaw))
|
||||||
|
|
|
||||||
|
|
@ -168,18 +168,23 @@ spa_debug_dump_mem (const void *mem, size_t size)
|
||||||
|
|
||||||
struct media_type_name {
|
struct media_type_name {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
unsigned int first;
|
||||||
|
unsigned int last;
|
||||||
|
unsigned int idx;
|
||||||
} media_type_names[] = {
|
} media_type_names[] = {
|
||||||
{ "invalid" },
|
{ "invalid", 0, 0, 0 },
|
||||||
{ "audio" },
|
{ "audio", SPA_MEDIA_SUBTYPE_AUDIO_FIRST, SPA_MEDIA_SUBTYPE_AUDIO_LAST, 16 },
|
||||||
{ "video" },
|
{ "video", SPA_MEDIA_SUBTYPE_VIDEO_FIRST, SPA_MEDIA_SUBTYPE_VIDEO_LAST, 2 },
|
||||||
{ "image" },
|
{ "image", 0, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct media_subtype_name {
|
struct media_subtype_name {
|
||||||
const char *name;
|
const char *name;
|
||||||
} media_subtype_names[] = {
|
} media_subtype_names[] = {
|
||||||
{ "invalid" },
|
{ "invalid" },
|
||||||
|
|
||||||
{ "raw" },
|
{ "raw" },
|
||||||
|
|
||||||
{ "h264" },
|
{ "h264" },
|
||||||
{ "mjpg" },
|
{ "mjpg" },
|
||||||
{ "dv" },
|
{ "dv" },
|
||||||
|
|
@ -194,8 +199,19 @@ struct media_subtype_name {
|
||||||
{ "vp9" },
|
{ "vp9" },
|
||||||
{ "jpeg" },
|
{ "jpeg" },
|
||||||
{ "bayer" },
|
{ "bayer" },
|
||||||
|
|
||||||
{ "mp3" },
|
{ "mp3" },
|
||||||
{ "aac" },
|
{ "aac" },
|
||||||
|
{ "vorbis" },
|
||||||
|
{ "wma" },
|
||||||
|
{ "ra" },
|
||||||
|
{ "sbc" },
|
||||||
|
{ "adpcm" },
|
||||||
|
{ "g723" },
|
||||||
|
{ "g726" },
|
||||||
|
{ "g729" },
|
||||||
|
{ "amr" },
|
||||||
|
{ "gsm" },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct prop_type_name {
|
struct prop_type_name {
|
||||||
|
|
@ -400,7 +416,7 @@ SpaResult
|
||||||
spa_debug_format (const SpaFormat *format)
|
spa_debug_format (const SpaFormat *format)
|
||||||
{
|
{
|
||||||
const SpaProps *props;
|
const SpaProps *props;
|
||||||
int i;
|
int i, first, last, idx;
|
||||||
const char *media_type;
|
const char *media_type;
|
||||||
const char *media_subtype;
|
const char *media_subtype;
|
||||||
|
|
||||||
|
|
@ -409,13 +425,22 @@ spa_debug_format (const SpaFormat *format)
|
||||||
|
|
||||||
props = &format->props;
|
props = &format->props;
|
||||||
|
|
||||||
if (format->media_type > 0 && format->media_type < SPA_N_ELEMENTS (media_type_names))
|
if (format->media_type > 0 && format->media_type < SPA_N_ELEMENTS (media_type_names)) {
|
||||||
media_type = media_type_names[format->media_type].name;
|
media_type = media_type_names[format->media_type].name;
|
||||||
else
|
first = media_type_names[format->media_type].first;
|
||||||
|
last = media_type_names[format->media_type].last;
|
||||||
|
idx = media_type_names[format->media_type].idx;
|
||||||
|
}
|
||||||
|
else {
|
||||||
media_type = "unknown";
|
media_type = "unknown";
|
||||||
|
idx = first = last = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (format->media_subtype > 0 && format->media_subtype < SPA_N_ELEMENTS (media_subtype_names))
|
if (format->media_subtype >= SPA_MEDIA_SUBTYPE_ANY_FIRST &&
|
||||||
|
format->media_subtype <= SPA_MEDIA_SUBTYPE_ANY_LAST) {
|
||||||
media_subtype = media_subtype_names[format->media_subtype].name;
|
media_subtype = media_subtype_names[format->media_subtype].name;
|
||||||
|
} else if (format->media_subtype >= first && format->media_subtype <= last)
|
||||||
|
media_subtype = media_subtype_names[format->media_subtype - first + idx].name;
|
||||||
else
|
else
|
||||||
media_subtype = "unknown";
|
media_subtype = "unknown";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -457,7 +457,7 @@ static const SpaPropInfo format_prop_info[] =
|
||||||
SPA_PROP_TYPE_UINT32, sizeof (uint32_t),
|
SPA_PROP_TYPE_UINT32, sizeof (uint32_t),
|
||||||
SPA_PROP_RANGE_TYPE_ENUM, SPA_N_ELEMENTS (color_primaries_range), color_primaries_range,
|
SPA_PROP_RANGE_TYPE_ENUM, SPA_N_ELEMENTS (color_primaries_range), color_primaries_range,
|
||||||
NULL },
|
NULL },
|
||||||
{ SPA_PROP_ID_VIDEO_RAW_INFO, 0,
|
{ SPA_PROP_ID_VIDEO_INFO_RAW, 0,
|
||||||
"info", "the SpaVideoRawInfo structure",
|
"info", "the SpaVideoRawInfo structure",
|
||||||
SPA_PROP_FLAG_READWRITE | SPA_PROP_FLAG_OPTIONAL,
|
SPA_PROP_FLAG_READWRITE | SPA_PROP_FLAG_OPTIONAL,
|
||||||
SPA_PROP_TYPE_POINTER, sizeof (SpaVideoInfoRaw),
|
SPA_PROP_TYPE_POINTER, sizeof (SpaVideoInfoRaw),
|
||||||
|
|
@ -491,38 +491,87 @@ spa_format_video_init (SpaMediaType type,
|
||||||
SpaMediaSubType subtype,
|
SpaMediaSubType subtype,
|
||||||
SpaFormatVideo *format)
|
SpaFormatVideo *format)
|
||||||
{
|
{
|
||||||
static SpaPropInfo raw_format_prop_info[] = {
|
SpaPropInfo *prop_info = NULL;
|
||||||
{ SPA_PROP_ID_VIDEO_FORMAT, offsetof (SpaFormatVideo, info.raw.format) },
|
unsigned int n_prop_info = 0;
|
||||||
{ SPA_PROP_ID_VIDEO_SIZE, offsetof (SpaFormatVideo, info.raw.size) },
|
int i;
|
||||||
{ SPA_PROP_ID_VIDEO_FRAMERATE, offsetof (SpaFormatVideo, info.raw.framerate) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_MAX_FRAMERATE, offsetof (SpaFormatVideo, info.raw.max_framerate) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_VIEWS, offsetof (SpaFormatVideo, info.raw.views) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_INTERLACE_MODE, offsetof (SpaFormatVideo, info.raw.interlace_mode) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_PIXEL_ASPECT_RATIO, offsetof (SpaFormatVideo, info.raw.pixel_aspect_ratio) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_MULTIVIEW_MODE, offsetof (SpaFormatVideo, info.raw.multiview_mode) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_MULTIVIEW_FLAGS, offsetof (SpaFormatVideo, info.raw.multiview_flags) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_CHROMA_SITE, offsetof (SpaFormatVideo, info.raw.chroma_site) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_COLOR_RANGE, offsetof (SpaFormatVideo, info.raw.color_range) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_COLOR_MATRIX, offsetof (SpaFormatVideo, info.raw.color_matrix) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_TRANSFER_FUNCTION, offsetof (SpaFormatVideo, info.raw.transfer_function) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_COLOR_PRIMARIES, offsetof (SpaFormatVideo, info.raw.color_primaries) },
|
|
||||||
{ SPA_PROP_ID_VIDEO_RAW_INFO, offsetof (SpaFormatVideo, info.raw ) },
|
|
||||||
};
|
|
||||||
|
|
||||||
if (raw_format_prop_info[0].name == NULL) {
|
if (type != SPA_MEDIA_TYPE_VIDEO)
|
||||||
int i;
|
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||||
for (i = 0; i < SPA_N_ELEMENTS (raw_format_prop_info); i++)
|
|
||||||
spa_prop_info_fill_video (&raw_format_prop_info[i],
|
switch (subtype) {
|
||||||
raw_format_prop_info[i].id,
|
case SPA_MEDIA_SUBTYPE_RAW:
|
||||||
raw_format_prop_info[i].offset);
|
{
|
||||||
|
static SpaPropInfo raw_prop_info[] = {
|
||||||
|
{ SPA_PROP_ID_VIDEO_FORMAT, offsetof (SpaFormatVideo, info.raw.format) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_SIZE, offsetof (SpaFormatVideo, info.raw.size) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_FRAMERATE, offsetof (SpaFormatVideo, info.raw.framerate) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_MAX_FRAMERATE, offsetof (SpaFormatVideo, info.raw.max_framerate) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_VIEWS, offsetof (SpaFormatVideo, info.raw.views) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_INTERLACE_MODE, offsetof (SpaFormatVideo, info.raw.interlace_mode) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_PIXEL_ASPECT_RATIO, offsetof (SpaFormatVideo, info.raw.pixel_aspect_ratio) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_MULTIVIEW_MODE, offsetof (SpaFormatVideo, info.raw.multiview_mode) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_MULTIVIEW_FLAGS, offsetof (SpaFormatVideo, info.raw.multiview_flags) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_CHROMA_SITE, offsetof (SpaFormatVideo, info.raw.chroma_site) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_COLOR_RANGE, offsetof (SpaFormatVideo, info.raw.color_range) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_COLOR_MATRIX, offsetof (SpaFormatVideo, info.raw.color_matrix) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_TRANSFER_FUNCTION, offsetof (SpaFormatVideo, info.raw.transfer_function) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_COLOR_PRIMARIES, offsetof (SpaFormatVideo, info.raw.color_primaries) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_INFO_RAW, offsetof (SpaFormatVideo, info.raw) },
|
||||||
|
};
|
||||||
|
prop_info = raw_prop_info;
|
||||||
|
n_prop_info = SPA_N_ELEMENTS (raw_prop_info);
|
||||||
|
format->format.props.unset_mask = (1 << 14)-1;
|
||||||
|
format->info.raw = default_raw_info;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SPA_MEDIA_SUBTYPE_H264:
|
||||||
|
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
case SPA_MEDIA_SUBTYPE_MJPG:
|
||||||
|
{
|
||||||
|
static SpaPropInfo mjpg_prop_info[] = {
|
||||||
|
{ SPA_PROP_ID_VIDEO_SIZE, offsetof (SpaFormatVideo, info.mjpg.size) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_FRAMERATE, offsetof (SpaFormatVideo, info.mjpg.framerate) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_MAX_FRAMERATE, offsetof (SpaFormatVideo, info.mjpg.max_framerate) },
|
||||||
|
{ SPA_PROP_ID_VIDEO_INFO_MJPG, offsetof (SpaFormatVideo, info.mjpg) },
|
||||||
|
};
|
||||||
|
prop_info = mjpg_prop_info;
|
||||||
|
n_prop_info = SPA_N_ELEMENTS (mjpg_prop_info);
|
||||||
|
format->format.props.unset_mask = (1 << 3)-1;
|
||||||
|
format->info.raw = default_raw_info;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SPA_MEDIA_SUBTYPE_DV:
|
||||||
|
case SPA_MEDIA_SUBTYPE_MPEGTS:
|
||||||
|
case SPA_MEDIA_SUBTYPE_H263:
|
||||||
|
case SPA_MEDIA_SUBTYPE_MPEG1:
|
||||||
|
case SPA_MEDIA_SUBTYPE_MPEG2:
|
||||||
|
case SPA_MEDIA_SUBTYPE_MPEG4:
|
||||||
|
case SPA_MEDIA_SUBTYPE_XVID:
|
||||||
|
case SPA_MEDIA_SUBTYPE_VC1:
|
||||||
|
case SPA_MEDIA_SUBTYPE_VP8:
|
||||||
|
case SPA_MEDIA_SUBTYPE_VP9:
|
||||||
|
case SPA_MEDIA_SUBTYPE_JPEG:
|
||||||
|
case SPA_MEDIA_SUBTYPE_BAYER:
|
||||||
|
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prop_info && prop_info[0].name == NULL) {
|
||||||
|
for (i = 0; i < n_prop_info; i++)
|
||||||
|
spa_prop_info_fill_video (&prop_info[i],
|
||||||
|
prop_info[i].id,
|
||||||
|
prop_info[i].offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
format->format.media_type = type;
|
format->format.media_type = type;
|
||||||
format->format.media_subtype = subtype;
|
format->format.media_subtype = subtype;
|
||||||
format->format.props.n_prop_info = SPA_N_ELEMENTS (raw_format_prop_info);
|
format->format.props.n_prop_info = n_prop_info;
|
||||||
format->format.props.prop_info = raw_format_prop_info;
|
format->format.props.prop_info = prop_info;
|
||||||
format->format.props.unset_mask = (1 << 14)-1;
|
|
||||||
format->info.raw = default_raw_info;
|
|
||||||
|
|
||||||
return SPA_RESULT_OK;
|
return SPA_RESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
@ -546,7 +595,7 @@ spa_format_video_parse (const SpaFormat *format,
|
||||||
vformat);
|
vformat);
|
||||||
|
|
||||||
props = &format->props;
|
props = &format->props;
|
||||||
if ((res = spa_props_get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_VIDEO_RAW_INFO), &value)) < 0)
|
if ((res = spa_props_get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_VIDEO_INFO_RAW), &value)) < 0)
|
||||||
goto fallback;
|
goto fallback;
|
||||||
|
|
||||||
if (value.type != SPA_PROP_TYPE_POINTER)
|
if (value.type != SPA_PROP_TYPE_POINTER)
|
||||||
|
|
|
||||||
|
|
@ -463,7 +463,7 @@ static int
|
||||||
spa_v4l2_set_format (SpaV4l2Source *this, V4l2Format *f, bool try_only)
|
spa_v4l2_set_format (SpaV4l2Source *this, V4l2Format *f, bool try_only)
|
||||||
{
|
{
|
||||||
SpaV4l2State *state = &this->state[0];
|
SpaV4l2State *state = &this->state[0];
|
||||||
int cmd = try_only ? VIDIOC_TRY_FMT : VIDIOC_S_FMT;
|
int cmd;
|
||||||
struct v4l2_format reqfmt, fmt;
|
struct v4l2_format reqfmt, fmt;
|
||||||
struct v4l2_streamparm streamparm;
|
struct v4l2_streamparm streamparm;
|
||||||
const FormatInfo *info = NULL;
|
const FormatInfo *info = NULL;
|
||||||
|
|
@ -500,6 +500,7 @@ spa_v4l2_set_format (SpaV4l2Source *this, V4l2Format *f, bool try_only)
|
||||||
if (spa_v4l2_open (this) < 0)
|
if (spa_v4l2_open (this) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
cmd = try_only ? VIDIOC_TRY_FMT : VIDIOC_S_FMT;
|
||||||
if (xioctl (state->fd, cmd, &fmt) < 0) {
|
if (xioctl (state->fd, cmd, &fmt) < 0) {
|
||||||
perror ("VIDIOC_S_FMT");
|
perror ("VIDIOC_S_FMT");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue