PipeWire  1.6.4
format-utils.h
Go to the documentation of this file.
1 /* Simple Plugin API */
2 /* SPDX-FileCopyrightText: Copyright © 2018 Wim Taymans */
3 /* SPDX-License-Identifier: MIT */
4 
5 #ifndef SPA_PARAM_AUDIO_FORMAT_UTILS_H
6 #define SPA_PARAM_AUDIO_FORMAT_UTILS_H
7 
8 #include <spa/pod/parser.h>
9 #include <spa/pod/builder.h>
10 #include <spa/param/audio/format.h>
11 #include <spa/param/format-utils.h>
12 
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
41 #ifndef SPA_API_AUDIO_FORMAT_UTILS
42  #ifdef SPA_API_IMPL
43  #define SPA_API_AUDIO_FORMAT_UTILS SPA_API_IMPL
44  #else
45  #define SPA_API_AUDIO_FORMAT_UTILS static inline
46  #endif
47 #endif
48 
50 spa_format_audio_ext_valid_size(uint32_t media_subtype, size_t size)
51 {
52  switch (media_subtype) {
54  return size >= offsetof(struct spa_audio_info, info.raw) &&
55  SPA_AUDIO_INFO_RAW_VALID_SIZE(size - offsetof(struct spa_audio_info, info.raw));
56 
57 #define _SPA_FORMAT_AUDIO_EXT_VALID_SIZE_CASE(format) \
58  case SPA_MEDIA_SUBTYPE_ ## format: \
59  return size >= offsetof(struct spa_audio_info, info.format) + sizeof(struct spa_audio_info_ ## format);
77 #undef _SPA_FORMAT_AUDIO_EXT_VALID_SIZE_CASE
78  }
79  return false;
80 }
81 
83 spa_format_audio_ext_parse(const struct spa_pod *format, struct spa_audio_info *info, size_t size)
84 {
85  int res;
86  uint32_t media_type, media_subtype;
87 
88  if ((res = spa_format_parse(format, &media_type, &media_subtype)) < 0)
89  return res;
90 
91  if (media_type != SPA_MEDIA_TYPE_audio)
92  return -EINVAL;
93 
94  if (!spa_format_audio_ext_valid_size(media_subtype, size))
95  return -EINVAL;
96 
97  info->media_type = media_type;
98  info->media_subtype = media_subtype;
99 
100  switch (media_subtype) {
102  return spa_format_audio_raw_ext_parse(format, &info->info.raw,
103  size - offsetof(struct spa_audio_info, info.raw));
105  return spa_format_audio_dsp_parse(format, &info->info.dsp);
107  return spa_format_audio_iec958_parse(format, &info->info.iec958);
109  return spa_format_audio_dsd_parse(format, &info->info.dsd);
111  return spa_format_audio_mp3_parse(format, &info->info.mp3);
113  return spa_format_audio_aac_parse(format, &info->info.aac);
115  return spa_format_audio_vorbis_parse(format, &info->info.vorbis);
117  return spa_format_audio_wma_parse(format, &info->info.wma);
119  return spa_format_audio_ra_parse(format, &info->info.ra);
121  return spa_format_audio_amr_parse(format, &info->info.amr);
123  return spa_format_audio_alac_parse(format, &info->info.alac);
125  return spa_format_audio_flac_parse(format, &info->info.flac);
127  return spa_format_audio_ape_parse(format, &info->info.ape);
129  return spa_format_audio_ac3_parse(format, &info->info.ac3);
131  return spa_format_audio_eac3_parse(format, &info->info.eac3);
133  return spa_format_audio_truehd_parse(format, &info->info.truehd);
135  return spa_format_audio_dts_parse(format, &info->info.dts);
137  return spa_format_audio_mpegh_parse(format, &info->info.mpegh);
138  }
139  return -ENOTSUP;
140 }
141 
143 spa_format_audio_parse(const struct spa_pod *format, struct spa_audio_info *info)
144 {
145  return spa_format_audio_ext_parse(format, info, sizeof(*info));
146 }
147 
149 spa_format_audio_ext_build(struct spa_pod_builder *builder, uint32_t id,
150  const struct spa_audio_info *info, size_t size)
151 {
153  errno = EINVAL;
154  return NULL;
155  }
156 
157  switch (info->media_subtype) {
159  return spa_format_audio_raw_ext_build(builder, id, &info->info.raw,
160  size - offsetof(struct spa_audio_info, info.raw));
162  return spa_format_audio_dsp_build(builder, id, &info->info.dsp);
164  return spa_format_audio_iec958_build(builder, id, &info->info.iec958);
166  return spa_format_audio_dsd_build(builder, id, &info->info.dsd);
168  return spa_format_audio_mp3_build(builder, id, &info->info.mp3);
170  return spa_format_audio_aac_build(builder, id, &info->info.aac);
172  return spa_format_audio_vorbis_build(builder, id, &info->info.vorbis);
174  return spa_format_audio_wma_build(builder, id, &info->info.wma);
176  return spa_format_audio_ra_build(builder, id, &info->info.ra);
178  return spa_format_audio_amr_build(builder, id, &info->info.amr);
180  return spa_format_audio_alac_build(builder, id, &info->info.alac);
182  return spa_format_audio_flac_build(builder, id, &info->info.flac);
184  return spa_format_audio_ape_build(builder, id, &info->info.ape);
186  return spa_format_audio_ac3_build(builder, id, &info->info.ac3);
188  return spa_format_audio_eac3_build(builder, id, &info->info.eac3);
190  return spa_format_audio_truehd_build(builder, id, &info->info.truehd);
192  return spa_format_audio_dts_build(builder, id, &info->info.dts);
194  return spa_format_audio_mpegh_build(builder, id, &info->info.mpegh);
195  }
196  errno = ENOTSUP;
197  return NULL;
198 }
199 
201 spa_format_audio_build(struct spa_pod_builder *builder, uint32_t id,
202  const struct spa_audio_info *info)
203 {
204  return spa_format_audio_ext_build(builder, id, info, sizeof(*info));
205 }
210 #ifdef __cplusplus
211 } /* extern "C" */
212 #endif
213 
214 #endif /* SPA_PARAM_AUDIO_FORMAT_UTILS_H */
#define _SPA_FORMAT_AUDIO_EXT_VALID_SIZE_CASE(format)
spa/pod/builder.h
uint32_t int int res
Definition: core.h:433
SPA_API_AUDIO_EAC3_UTILS int spa_format_audio_eac3_parse(const struct spa_pod *format, struct spa_audio_info_eac3 *info)
Definition: eac3-utils.h:38
SPA_API_AUDIO_DTS_UTILS int spa_format_audio_dts_parse(const struct spa_pod *format, struct spa_audio_info_dts *info)
Definition: dts-utils.h:38
SPA_API_AUDIO_MP3_UTILS int spa_format_audio_mp3_parse(const struct spa_pod *format, struct spa_audio_info_mp3 *info)
Definition: mp3-utils.h:38
SPA_API_AUDIO_AC3_UTILS struct spa_pod * spa_format_audio_ac3_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_ac3 *info)
Definition: ac3-utils.h:49
SPA_API_AUDIO_AC3_UTILS int spa_format_audio_ac3_parse(const struct spa_pod *format, struct spa_audio_info_ac3 *info)
Definition: ac3-utils.h:38
SPA_API_AUDIO_DSP_UTILS int spa_format_audio_dsp_parse(const struct spa_pod *format, struct spa_audio_info_dsp *info)
Definition: dsp-utils.h:38
SPA_API_AUDIO_DSP_UTILS struct spa_pod * spa_format_audio_dsp_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_dsp *info)
Definition: dsp-utils.h:48
SPA_API_AUDIO_APE_UTILS int spa_format_audio_ape_parse(const struct spa_pod *format, struct spa_audio_info_ape *info)
Definition: ape-utils.h:38
SPA_API_AUDIO_FORMAT_UTILS struct spa_pod * spa_format_audio_ext_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info *info, size_t size)
Definition: format-utils.h:156
SPA_API_AUDIO_ALAC_UTILS int spa_format_audio_alac_parse(const struct spa_pod *format, struct spa_audio_info_alac *info)
Definition: alac-utils.h:39
SPA_API_AUDIO_RA_UTILS int spa_format_audio_ra_parse(const struct spa_pod *format, struct spa_audio_info_ra *info)
Definition: ra-utils.h:38
SPA_API_AUDIO_FORMAT_UTILS int spa_format_audio_parse(const struct spa_pod *format, struct spa_audio_info *info)
Definition: format-utils.h:150
SPA_API_AUDIO_DSD_UTILS struct spa_pod * spa_format_audio_dsd_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_dsd *info)
Definition: dsd-utils.h:64
SPA_API_AUDIO_FORMAT_UTILS bool spa_format_audio_ext_valid_size(uint32_t media_subtype, size_t size)
Definition: format-utils.h:57
SPA_API_AUDIO_EAC3_UTILS struct spa_pod * spa_format_audio_eac3_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_eac3 *info)
Definition: eac3-utils.h:49
SPA_API_AUDIO_DTS_UTILS struct spa_pod * spa_format_audio_dts_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_dts *info)
Definition: dts-utils.h:50
SPA_API_AUDIO_WMA_UTILS int spa_format_audio_wma_parse(const struct spa_pod *format, struct spa_audio_info_wma *info)
Definition: wma-utils.h:38
SPA_API_AUDIO_AMR_UTILS struct spa_pod * spa_format_audio_amr_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_amr *info)
Definition: amr-utils.h:51
SPA_API_AUDIO_TRUEHD_UTILS struct spa_pod * spa_format_audio_truehd_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_truehd *info)
Definition: truehd-utils.h:49
SPA_API_AUDIO_AAC_UTILS int spa_format_audio_aac_parse(const struct spa_pod *format, struct spa_audio_info_aac *info)
Definition: aac-utils.h:38
SPA_API_AUDIO_DSD_UTILS int spa_format_audio_dsd_parse(const struct spa_pod *format, struct spa_audio_info_dsd *info)
Definition: dsd-utils.h:39
SPA_API_AUDIO_RAW_UTILS struct spa_pod * spa_format_audio_raw_ext_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_raw *info, size_t size)
Definition: raw-utils.h:73
#define SPA_API_AUDIO_FORMAT_UTILS
Definition: format-utils.h:52
SPA_API_AUDIO_MP3_UTILS struct spa_pod * spa_format_audio_mp3_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_mp3 *info)
Definition: mp3-utils.h:50
SPA_API_AUDIO_TRUEHD_UTILS int spa_format_audio_truehd_parse(const struct spa_pod *format, struct spa_audio_info_truehd *info)
Definition: truehd-utils.h:38
SPA_API_AUDIO_ALAC_UTILS struct spa_pod * spa_format_audio_alac_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_alac *info)
Definition: alac-utils.h:50
SPA_API_AUDIO_VORBIS_UTILS struct spa_pod * spa_format_audio_vorbis_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_vorbis *info)
Definition: vorbis-utils.h:49
SPA_API_AUDIO_RA_UTILS struct spa_pod * spa_format_audio_ra_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_ra *info)
Definition: ra-utils.h:49
SPA_API_AUDIO_AMR_UTILS int spa_format_audio_amr_parse(const struct spa_pod *format, struct spa_audio_info_amr *info)
Definition: amr-utils.h:39
SPA_API_AUDIO_VORBIS_UTILS int spa_format_audio_vorbis_parse(const struct spa_pod *format, struct spa_audio_info_vorbis *info)
Definition: vorbis-utils.h:38
SPA_API_AUDIO_FORMAT_UTILS int spa_format_audio_ext_parse(const struct spa_pod *format, struct spa_audio_info *info, size_t size)
Definition: format-utils.h:90
SPA_API_AUDIO_IEC958_UTILS struct spa_pod * spa_format_audio_iec958_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_iec958 *info)
Definition: iec958-utils.h:49
SPA_API_AUDIO_FLAC_UTILS struct spa_pod * spa_format_audio_flac_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_flac *info)
Definition: flac-utils.h:49
SPA_API_AUDIO_FORMAT_UTILS struct spa_pod * spa_format_audio_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info *info)
Definition: format-utils.h:208
SPA_API_FORMAT_UTILS int spa_format_parse(const struct spa_pod *format, uint32_t *media_type, uint32_t *media_subtype)
Definition: format-utils.h:37
SPA_API_AUDIO_MPEGH_UTILS int spa_format_audio_mpegh_parse(const struct spa_pod *format, struct spa_audio_info_mpegh *info)
Definition: mpegh-utils.h:38
SPA_API_AUDIO_FLAC_UTILS int spa_format_audio_flac_parse(const struct spa_pod *format, struct spa_audio_info_flac *info)
Definition: flac-utils.h:38
SPA_API_AUDIO_MPEGH_UTILS struct spa_pod * spa_format_audio_mpegh_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_mpegh *info)
Definition: mpegh-utils.h:48
#define SPA_AUDIO_INFO_RAW_VALID_SIZE(size)
Definition: raw.h:310
SPA_API_AUDIO_WMA_UTILS struct spa_pod * spa_format_audio_wma_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_wma *info)
Definition: wma-utils.h:52
SPA_API_AUDIO_AAC_UTILS struct spa_pod * spa_format_audio_aac_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_aac *info)
Definition: aac-utils.h:52
SPA_API_AUDIO_APE_UTILS struct spa_pod * spa_format_audio_ape_build(struct spa_pod_builder *builder, uint32_t id, const struct spa_audio_info_ape *info)
Definition: ape-utils.h:49
SPA_API_AUDIO_IEC958_UTILS int spa_format_audio_iec958_parse(const struct spa_pod *format, struct spa_audio_info_iec958 *info)
Definition: iec958-utils.h:38
SPA_API_AUDIO_RAW_UTILS int spa_format_audio_raw_ext_parse(const struct spa_pod *format, struct spa_audio_info_raw *info, size_t size)
Definition: raw-utils.h:39
@ SPA_MEDIA_TYPE_audio
Definition: format.h:27
@ SPA_MEDIA_SUBTYPE_alac
Definition: format.h:56
@ SPA_MEDIA_SUBTYPE_ra
Definition: format.h:48
@ SPA_MEDIA_SUBTYPE_mp3
Definition: format.h:44
@ SPA_MEDIA_SUBTYPE_ac3
since 0.3.68
Definition: format.h:60
@ SPA_MEDIA_SUBTYPE_aac
Definition: format.h:45
@ SPA_MEDIA_SUBTYPE_iec958
Definition: format.h:40
@ SPA_MEDIA_SUBTYPE_ape
since 0.3.65
Definition: format.h:58
@ SPA_MEDIA_SUBTYPE_wma
Definition: format.h:47
@ SPA_MEDIA_SUBTYPE_truehd
since 1.5.1
Definition: format.h:62
@ SPA_MEDIA_SUBTYPE_amr
Definition: format.h:54
@ SPA_MEDIA_SUBTYPE_dsp
Definition: format.h:39
@ SPA_MEDIA_SUBTYPE_vorbis
Definition: format.h:46
@ SPA_MEDIA_SUBTYPE_raw
Definition: format.h:38
@ SPA_MEDIA_SUBTYPE_dts
since 1.5.1
Definition: format.h:63
@ SPA_MEDIA_SUBTYPE_eac3
since 1.5.1
Definition: format.h:61
@ SPA_MEDIA_SUBTYPE_mpegh
since 1.5.1
Definition: format.h:64
@ SPA_MEDIA_SUBTYPE_dsd
S/PDIF.
Definition: format.h:41
@ SPA_MEDIA_SUBTYPE_flac
since 0.3.65
Definition: format.h:57
spa/param/audio/format.h
spa/pod/parser.h
Definition: format.h:43
struct spa_audio_info_dsd dsd
Definition: format.h:50
union spa_audio_info::@4 info
struct spa_audio_info_vorbis vorbis
Definition: format.h:53
struct spa_audio_info_dsp dsp
Definition: format.h:48
struct spa_audio_info_amr amr
Definition: format.h:56
struct spa_audio_info_dts dts
Definition: format.h:64
uint32_t media_subtype
Definition: format.h:45
struct spa_audio_info_mp3 mp3
Definition: format.h:51
struct spa_audio_info_ra ra
Definition: format.h:55
struct spa_audio_info_eac3 eac3
Definition: format.h:62
struct spa_audio_info_raw raw
Definition: format.h:47
struct spa_audio_info_truehd truehd
Definition: format.h:63
struct spa_audio_info_ape ape
Definition: format.h:59
struct spa_audio_info_aac aac
Definition: format.h:52
uint32_t media_type
Definition: format.h:44
struct spa_audio_info_iec958 iec958
Definition: format.h:49
struct spa_audio_info_mpegh mpegh
Definition: format.h:65
struct spa_audio_info_ac3 ac3
Definition: format.h:61
struct spa_audio_info_wma wma
Definition: format.h:54
struct spa_audio_info_alac alac
Definition: format.h:57
struct spa_audio_info_flac flac
Definition: format.h:58
Definition: builder.h:63
Definition: pod.h:57
uint32_t size
Definition: pod.h:58