stream: install converter based on format

This commit is contained in:
Wim Taymans 2018-04-12 09:49:31 +02:00
parent e33c76f728
commit bd27b32c39

View file

@ -44,12 +44,15 @@
struct type { struct type {
uint32_t client_node; uint32_t client_node;
struct spa_type_media_type media_type;
struct spa_type_media_subtype media_subtype;
}; };
static inline void init_type(struct type *type, struct spa_type_map *map) static inline void init_type(struct type *type, struct spa_type_map *map)
{ {
type->client_node = spa_type_map_get_id(map, PW_TYPE_INTERFACE__ClientNode); type->client_node = spa_type_map_get_id(map, PW_TYPE_INTERFACE__ClientNode);
spa_type_media_type_map(map, &type->media_type);
spa_type_media_subtype_map(map, &type->media_subtype);
} }
struct buffer { struct buffer {
@ -927,7 +930,9 @@ set_init_params(struct pw_stream *stream,
{ {
struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this); struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this);
struct pw_type *t = impl->t; struct pw_type *t = impl->t;
bool add_audio = false; #define CONVERT_AUDIO (1<<0)
#define CONVERT_VIDEO (1<<1)
uint32_t convert_mask = 0;
int i; int i;
if (impl->init_params) { if (impl->init_params) {
@ -941,19 +946,38 @@ set_init_params(struct pw_stream *stream,
for (i = 0; i < n_init_params; i++) { for (i = 0; i < n_init_params; i++) {
impl->init_params[i] = pw_spa_pod_copy(init_params[i]); impl->init_params[i] = pw_spa_pod_copy(init_params[i]);
if (spa_pod_is_object_type(impl->init_params[i], t->spa_format)) if (spa_pod_is_object_type(impl->init_params[i], t->spa_format)) {
add_audio = true; uint32_t media_type, media_subtype;
spa_pod_object_parse(impl->init_params[i],
"I", &media_type,
"I", &media_subtype);
if (media_type == impl->type.media_type.audio &&
media_subtype == impl->type.media_subtype.raw)
SPA_FLAG_SET(convert_mask, CONVERT_AUDIO);
else if (media_type == impl->type.media_type.video &&
media_subtype == impl->type.media_subtype.raw)
SPA_FLAG_SET(convert_mask, CONVERT_VIDEO);
}
} }
} }
impl->n_orig_params = n_init_params; impl->n_orig_params = n_init_params;
if (add_audio && !SPA_FLAG_CHECK(impl->flags, PW_STREAM_FLAG_NO_CONVERT)) { if (convert_mask && !SPA_FLAG_CHECK(impl->flags, PW_STREAM_FLAG_NO_CONVERT)) {
uint32_t state = 0; uint32_t state = 0;
int res; int res;
if ((impl->convert = pw_load_spa_interface("audioconvert/libspa-audioconvert", if (SPA_FLAG_CHECK(convert_mask, CONVERT_AUDIO)) {
"audioconvert", SPA_TYPE__Node, NULL, 0)) == NULL) if ((impl->convert = pw_load_spa_interface("audioconvert/libspa-audioconvert",
goto done; "audioconvert", SPA_TYPE__Node, NULL, 0)) == NULL)
goto done;
}
if (SPA_FLAG_CHECK(convert_mask, CONVERT_VIDEO)) {
if ((impl->convert = pw_load_spa_interface("videoconvert/libspa-videoconvert",
"videoconvert", SPA_TYPE__Node, NULL, 0)) == NULL)
goto done;
}
while (true) { while (true) {
uint8_t buffer[4096]; uint8_t buffer[4096];