#include "codecs.h" #include "codec.h" #ifdef LIANA_SERVER #ifdef CAMU_HAVE_FFMPEG #include "ffmpeg/demuxer.h" #endif #endif #ifdef LIANA_CLIENT #ifdef CAMU_HAVE_FFMPEG #include "ffmpeg/decoder.h" #endif #endif #include "stb_image.h" #include "wuffs.h" #include "spng.h" struct camu_codec_info codec_information[] = { #ifdef CAMU_HAVE_WUFFS { .name = al_str_c("wuffs"), .supported = (s32[]){ CAMU_CODEC_PNG, CAMU_CODEC_NONE }, #ifdef LIANA_SERVER .create_demuxer = camu_wuffs_demuxer_create, #endif #ifdef LIANA_CLIENT .create_decoder = camu_wuffs_decoder_create #endif }, #endif #ifdef CAMU_HAVE_STB_IMAGE { .name = al_str_c("stb_image"), .supported = (s32[]){ CAMU_CODEC_PNG, CAMU_CODEC_JPEG, CAMU_CODEC_NONE }, #ifdef LIANA_SERVER .create_demuxer = camu_stbi_demuxer_create, #endif #ifdef LIANA_CLIENT .create_decoder = camu_stbi_decoder_create #endif }, #endif #ifdef CAMU_HAVE_SPNG { .name = al_str_c("spng"), .supported = (s32[]){ CAMU_CODEC_PNG, CAMU_CODEC_NONE }, #ifdef LIANA_SERVER .create_demuxer = camu_spng_demuxer_create, #endif #ifdef LIANA_CLIENT .create_decoder = camu_spng_decoder_create #endif }, #endif #ifdef CAMU_HAVE_FFMPEG { .name = al_str_c("FFmpeg"), .supported = (s32[]){ CAMU_CODEC_FALLBACK }, #ifdef LIANA_SERVER .create_demuxer = camu_ff_demuxer_create, #endif #ifdef LIANA_CLIENT .create_decoder = camu_ff_decoder_create #endif }, #endif }; struct camu_codec_info *camu_codec_info_by_type(s32 type) { for (u32 i = 0; i < ARRAY_SIZE(codec_information); i++) { struct camu_codec_info *info = &codec_information[i]; s32 *supported = info->supported; while (*supported != CAMU_CODEC_NONE) { if (type == (*supported) || (*supported) == CAMU_CODEC_FALLBACK) { return info; } supported++; } } return NULL; } struct camu_codec_info *camu_codec_info_by_name(str *name) { if (al_str_eq(name, &al_str_c("pcm_s16le"))) { return (struct camu_codec_info *)0xcdda; } for (u32 i = 0; i < ARRAY_SIZE(codec_information); i++) { if (al_str_eq(&codec_information[i].name, name)) { return &codec_information[i]; } } return NULL; }