diff --git a/spa/include/spa/audio/format.h b/spa/include/spa/audio/format.h index a2964d715..3a153b15e 100644 --- a/spa/include/spa/audio/format.h +++ b/spa/include/spa/audio/format.h @@ -30,13 +30,13 @@ extern "C" { typedef struct _SpaFormatAudio SpaFormatAudio; typedef enum { - SPA_PROP_ID_AUDIO_FORMAT = SPA_PROP_ID_MEDIA_CUSTOM_START, + SPA_PROP_ID_AUDIO_INFO = SPA_PROP_ID_MEDIA_CUSTOM_START, + SPA_PROP_ID_AUDIO_FORMAT, SPA_PROP_ID_AUDIO_FLAGS, SPA_PROP_ID_AUDIO_LAYOUT, SPA_PROP_ID_AUDIO_RATE, SPA_PROP_ID_AUDIO_CHANNELS, SPA_PROP_ID_AUDIO_CHANNEL_MASK, - SPA_PROP_ID_AUDIO_INFO_RAW, } SpaPropIdAudio; SpaResult spa_prop_info_fill_audio (SpaPropInfo *info, diff --git a/spa/include/spa/props.h b/spa/include/spa/props.h index 2e01596e7..539aa7370 100644 --- a/spa/include/spa/props.h +++ b/spa/include/spa/props.h @@ -72,6 +72,7 @@ typedef struct { * @SPA_PROP_FLAG_WRITABLE: property is writable * @SPA_PROP_FLAG_READWRITE: property is readable and writable * @SPA_PROP_FLAG_DEPRECATED: property is deprecated and should not be used + * @SPA_PROP_FLAG_INFO: property is to get/set the complete structure */ typedef enum { SPA_PROP_FLAG_NONE = 0, @@ -80,6 +81,7 @@ typedef enum { SPA_PROP_FLAG_WRITABLE = (1 << 2), SPA_PROP_FLAG_READWRITE = SPA_PROP_FLAG_READABLE | SPA_PROP_FLAG_WRITABLE, SPA_PROP_FLAG_DEPRECATED = (1 << 3), + SPA_PROP_FLAG_INFO = (1 << 4), } SpaPropFlags; /* SpaPropRangeType: diff --git a/spa/lib/audio-raw.c b/spa/lib/audio-raw.c index b3f3867e8..3d1ae6504 100644 --- a/spa/lib/audio-raw.c +++ b/spa/lib/audio-raw.c @@ -137,6 +137,12 @@ static const SpaPropRangeInfo uint32_range[] = { static const SpaPropInfo format_prop_info[] = { + { SPA_PROP_ID_AUDIO_INFO, 0, + "info", "the SpaAudioInfo structure", + SPA_PROP_FLAG_READWRITE | SPA_PROP_FLAG_OPTIONAL | SPA_PROP_FLAG_INFO, + SPA_PROP_TYPE_POINTER, sizeof (SpaAudioInfoRaw), + SPA_PROP_RANGE_TYPE_NONE, 0, NULL, + NULL }, { SPA_PROP_ID_AUDIO_FORMAT, 0, "format", "The media format", SPA_PROP_FLAG_READWRITE, @@ -173,12 +179,6 @@ static const SpaPropInfo format_prop_info[] = SPA_PROP_TYPE_BITMASK, sizeof (uint32_t), SPA_PROP_RANGE_TYPE_NONE, 0, NULL, NULL }, - { SPA_PROP_ID_AUDIO_INFO_RAW, 0, - "info", "the SpaAudioInfoRaw structure", - SPA_PROP_FLAG_READWRITE, - SPA_PROP_TYPE_POINTER, sizeof (SpaAudioInfoRaw), - SPA_PROP_RANGE_TYPE_NONE, 0, NULL, - NULL }, }; SpaResult @@ -220,17 +220,17 @@ spa_format_audio_init (SpaMediaType type, { static SpaPropInfo raw_format_prop_info[] = { + { SPA_PROP_ID_AUDIO_INFO, offsetof (SpaFormatAudio, 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->format.props.unset_mask = (1 << 1) | (1 << 3) | (1 << 4) | (1 << 5); format->info.raw = default_raw_info; break; } @@ -288,7 +288,7 @@ spa_format_audio_parse (const SpaFormat *format, return res; props = &format->props; - idx = spa_props_index_for_id (props, SPA_PROP_ID_AUDIO_INFO_RAW); + idx = spa_props_index_for_id (props, SPA_PROP_ID_AUDIO_INFO); if ((res = spa_props_get_prop (props, idx, &value)) < 0) goto fallback; diff --git a/spa/lib/debug.c b/spa/lib/debug.c index 0022cd2bf..795d8c76d 100644 --- a/spa/lib/debug.c +++ b/spa/lib/debug.c @@ -455,6 +455,8 @@ spa_debug_format (const SpaFormat *format) res = spa_props_get_prop (props, i, &value); + if (info->flags & SPA_PROP_FLAG_INFO) + continue; if (res == SPA_RESULT_PROPERTY_UNSET && info->flags & SPA_PROP_FLAG_OPTIONAL) continue; diff --git a/spa/lib/video-raw.c b/spa/lib/video-raw.c index 74dfd88e3..fa44fbfb1 100644 --- a/spa/lib/video-raw.c +++ b/spa/lib/video-raw.c @@ -358,7 +358,7 @@ static const SpaPropInfo format_prop_info[] = { { SPA_PROP_ID_VIDEO_INFO, 0, "info", "the SpaVideoInfo structure", - SPA_PROP_FLAG_READWRITE | SPA_PROP_FLAG_OPTIONAL, + SPA_PROP_FLAG_READWRITE | SPA_PROP_FLAG_OPTIONAL | SPA_PROP_FLAG_INFO, SPA_PROP_TYPE_POINTER, sizeof (SpaVideoInfoRaw), SPA_PROP_RANGE_TYPE_NONE, 0, NULL, NULL }, @@ -519,7 +519,7 @@ spa_format_video_init (SpaMediaType type, }; prop_info = raw_prop_info; n_prop_info = SPA_N_ELEMENTS (raw_prop_info); - format->format.props.unset_mask = (1 << 14)-1; + format->format.props.unset_mask = (1 << 15)-2; format->info.raw = default_raw_info; break; } @@ -539,7 +539,7 @@ spa_format_video_init (SpaMediaType type, }; prop_info = h264_prop_info; n_prop_info = SPA_N_ELEMENTS (h264_prop_info); - format->format.props.unset_mask = (1 << 3)-1; + format->format.props.unset_mask = (1 << 4)-2; format->info.h264 = default_h264_info; break; } @@ -559,7 +559,7 @@ spa_format_video_init (SpaMediaType type, }; prop_info = mjpg_prop_info; n_prop_info = SPA_N_ELEMENTS (mjpg_prop_info); - format->format.props.unset_mask = (1 << 3)-1; + format->format.props.unset_mask = (1 << 4)-2; format->info.mjpg = default_mjpg_info; break; } diff --git a/spa/plugins/v4l2/v4l2-utils.c b/spa/plugins/v4l2/v4l2-utils.c index b367f35fb..a59ab3d12 100644 --- a/spa/plugins/v4l2/v4l2-utils.c +++ b/spa/plugins/v4l2/v4l2-utils.c @@ -682,6 +682,8 @@ have_framerate: fmt->ranges[i].val.value = &fmt->framerates[i]; i++; state->frmival.index++; + if (i == 16) + break; } else if (state->frmival.type == V4L2_FRMIVAL_TYPE_CONTINUOUS || state->frmival.type == V4L2_FRMIVAL_TYPE_STEPWISE) { fmt->framerates[0].num = state->frmival.stepwise.min.denominator;