diff --git a/pinos/gst/gstpinosformat.c b/pinos/gst/gstpinosformat.c index aa15b7dd1..541a5d31e 100644 --- a/pinos/gst/gstpinosformat.c +++ b/pinos/gst/gstpinosformat.c @@ -17,6 +17,7 @@ * Boston, MA 02110-1301, USA. */ +#define _GNU_SOURCE #include #include @@ -43,6 +44,7 @@ static SpaMediaSubtypesVideo media_subtypes_video = { 0, }; static SpaMediaSubtypesAudio media_subtypes_audio = { 0, }; static SpaPropVideo prop_video = { 0, }; static SpaPropAudio prop_audio = { 0, }; +static SpaVideoFormats video_formats = { 0, }; static void ensure_types (void) @@ -53,6 +55,7 @@ ensure_types (void) spa_media_subtypes_audio_map (spa_id_map_get_default (), &media_subtypes_audio); spa_prop_video_map (spa_id_map_get_default (), &prop_video); spa_prop_audio_map (spa_id_map_get_default (), &prop_audio); + spa_video_formats_map (spa_id_map_get_default (), &video_formats); } static const MediaType media_type_map[] = { @@ -63,6 +66,74 @@ static const MediaType media_type_map[] = { { NULL, } }; +static const uint32_t *video_format_map[] = { + &video_formats.UNKNOWN, + &video_formats.ENCODED, + &video_formats.I420, + &video_formats.YV12, + &video_formats.YUY2, + &video_formats.UYVY, + &video_formats.AYUV, + &video_formats.RGBx, + &video_formats.BGRx, + &video_formats.xRGB, + &video_formats.xBGR, + &video_formats.RGBA, + &video_formats.BGRA, + &video_formats.ARGB, + &video_formats.ABGR, + &video_formats.RGB, + &video_formats.BGR, + &video_formats.Y41B, + &video_formats.Y42B, + &video_formats.YVYU, + &video_formats.Y444, + &video_formats.v210, + &video_formats.v216, + &video_formats.NV12, + &video_formats.NV21, + &video_formats.GRAY8, + &video_formats.GRAY16_BE, + &video_formats.GRAY16_LE, + &video_formats.v308, + &video_formats.RGB16, + &video_formats.BGR16, + &video_formats.RGB15, + &video_formats.BGR15, + &video_formats.UYVP, + &video_formats.A420, + &video_formats.RGB8P, + &video_formats.YUV9, + &video_formats.YVU9, + &video_formats.IYU1, + &video_formats.ARGB64, + &video_formats.AYUV64, + &video_formats.r210, + &video_formats.I420_10BE, + &video_formats.I420_10LE, + &video_formats.I422_10BE, + &video_formats.I422_10LE, + &video_formats.Y444_10BE, + &video_formats.Y444_10LE, + &video_formats.GBR, + &video_formats.GBR_10BE, + &video_formats.GBR_10LE, + &video_formats.NV16, + &video_formats.NV24, + &video_formats.NV12_64Z32, + &video_formats.A420_10BE, + &video_formats.A420_10LE, + &video_formats.A422_10BE, + &video_formats.A422_10LE, + &video_formats.A444_10BE, + &video_formats.A444_10LE, + &video_formats.NV61, + &video_formats.P010_10BE, + &video_formats.P010_10LE, + &video_formats.IYU2, + &video_formats.VYUY, +}; + typedef struct { SpaPODBuilder b; const MediaType *type; @@ -251,7 +322,7 @@ handle_video_fields (ConvertData *d) prop_video.format, get_range_type (value) | SPA_POD_PROP_FLAG_READWRITE); - spa_pod_builder_int (&d->b, gst_video_format_from_string (v)); + spa_pod_builder_uri (&d->b, *video_format_map[gst_video_format_from_string (v)]); } if (i > 1) SPA_POD_BUILDER_DEREF (&d->b, f.ref, SpaPODProp)->body.flags |= SPA_POD_PROP_FLAG_UNSET; @@ -480,8 +551,10 @@ gst_caps_from_format (const SpaFormat *format) return NULL; if (media_subtype == media_subtypes.raw) { + const char * str = spa_id_map_get_uri (spa_id_map_get_default (), f.info.raw.format); + res = gst_caps_new_simple ("video/x-raw", - "format", G_TYPE_STRING, gst_video_format_to_string (f.info.raw.format), + "format", G_TYPE_STRING, strstr (str, "#") + 1, "width", G_TYPE_INT, f.info.raw.size.width, "height", G_TYPE_INT, f.info.raw.size.height, "framerate", GST_TYPE_FRACTION, f.info.raw.framerate.num, f.info.raw.framerate.denom, diff --git a/spa/include/spa/video/raw.h b/spa/include/spa/video/raw.h index e7b56e66e..36b6b49cb 100644 --- a/spa/include/spa/video/raw.h +++ b/spa/include/spa/video/raw.h @@ -27,83 +27,222 @@ extern "C" { typedef struct _SpaVideoInfoRaw SpaVideoInfoRaw; #include +#include #include #include #include -#include - #define SPA_VIDEO_MAX_PLANES 4 #define SPA_VIDEO_MAX_COMPONENTS 4 -typedef enum { - SPA_VIDEO_FORMAT_UNKNOWN, - SPA_VIDEO_FORMAT_ENCODED, - SPA_VIDEO_FORMAT_I420, - SPA_VIDEO_FORMAT_YV12, - SPA_VIDEO_FORMAT_YUY2, - SPA_VIDEO_FORMAT_UYVY, - SPA_VIDEO_FORMAT_AYUV, - SPA_VIDEO_FORMAT_RGBx, - SPA_VIDEO_FORMAT_BGRx, - SPA_VIDEO_FORMAT_xRGB, - SPA_VIDEO_FORMAT_xBGR, - SPA_VIDEO_FORMAT_RGBA, - SPA_VIDEO_FORMAT_BGRA, - SPA_VIDEO_FORMAT_ARGB, - SPA_VIDEO_FORMAT_ABGR, - SPA_VIDEO_FORMAT_RGB, - SPA_VIDEO_FORMAT_BGR, - SPA_VIDEO_FORMAT_Y41B, - SPA_VIDEO_FORMAT_Y42B, - SPA_VIDEO_FORMAT_YVYU, - SPA_VIDEO_FORMAT_Y444, - SPA_VIDEO_FORMAT_v210, - SPA_VIDEO_FORMAT_v216, - SPA_VIDEO_FORMAT_NV12, - SPA_VIDEO_FORMAT_NV21, - SPA_VIDEO_FORMAT_GRAY8, - SPA_VIDEO_FORMAT_GRAY16_BE, - SPA_VIDEO_FORMAT_GRAY16_LE, - SPA_VIDEO_FORMAT_v308, - SPA_VIDEO_FORMAT_RGB16, - SPA_VIDEO_FORMAT_BGR16, - SPA_VIDEO_FORMAT_RGB15, - SPA_VIDEO_FORMAT_BGR15, - SPA_VIDEO_FORMAT_UYVP, - SPA_VIDEO_FORMAT_A420, - SPA_VIDEO_FORMAT_RGB8P, - SPA_VIDEO_FORMAT_YUV9, - SPA_VIDEO_FORMAT_YVU9, - SPA_VIDEO_FORMAT_IYU1, - SPA_VIDEO_FORMAT_ARGB64, - SPA_VIDEO_FORMAT_AYUV64, - SPA_VIDEO_FORMAT_r210, - SPA_VIDEO_FORMAT_I420_10BE, - SPA_VIDEO_FORMAT_I420_10LE, - SPA_VIDEO_FORMAT_I422_10BE, - SPA_VIDEO_FORMAT_I422_10LE, - SPA_VIDEO_FORMAT_Y444_10BE, - SPA_VIDEO_FORMAT_Y444_10LE, - SPA_VIDEO_FORMAT_GBR, - SPA_VIDEO_FORMAT_GBR_10BE, - SPA_VIDEO_FORMAT_GBR_10LE, - SPA_VIDEO_FORMAT_NV16, - SPA_VIDEO_FORMAT_NV24, - SPA_VIDEO_FORMAT_NV12_64Z32, - SPA_VIDEO_FORMAT_A420_10BE, - SPA_VIDEO_FORMAT_A420_10LE, - SPA_VIDEO_FORMAT_A422_10BE, - SPA_VIDEO_FORMAT_A422_10LE, - SPA_VIDEO_FORMAT_A444_10BE, - SPA_VIDEO_FORMAT_A444_10LE, - SPA_VIDEO_FORMAT_NV61, - SPA_VIDEO_FORMAT_P010_10BE, - SPA_VIDEO_FORMAT_P010_10LE, - SPA_VIDEO_FORMAT_IYU2, - SPA_VIDEO_FORMAT_VYUY, -} SpaVideoFormat; +#define SPA_VIDEO_FORMAT_URI "http://spaplug.in/ns/video-format" +#define SPA_VIDEO_FORMAT_PREFIX SPA_VIDEO_FORMAT_URI "#" +#define SPA_VIDEO_FORMAT__ENCODED SPA_VIDEO_FORMAT_PREFIX "encoded" +#define SPA_VIDEO_FORMAT__I420 SPA_VIDEO_FORMAT_PREFIX "I420" +#define SPA_VIDEO_FORMAT__YV12 SPA_VIDEO_FORMAT_PREFIX "YV12" +#define SPA_VIDEO_FORMAT__YUY2 SPA_VIDEO_FORMAT_PREFIX "YUY2" +#define SPA_VIDEO_FORMAT__UYVY SPA_VIDEO_FORMAT_PREFIX "UYVY" +#define SPA_VIDEO_FORMAT__AYUV SPA_VIDEO_FORMAT_PREFIX "AYUV" +#define SPA_VIDEO_FORMAT__RGBx SPA_VIDEO_FORMAT_PREFIX "RGBx" +#define SPA_VIDEO_FORMAT__BGRx SPA_VIDEO_FORMAT_PREFIX "BGRx" +#define SPA_VIDEO_FORMAT__xRGB SPA_VIDEO_FORMAT_PREFIX "xRGB" +#define SPA_VIDEO_FORMAT__xBGR SPA_VIDEO_FORMAT_PREFIX "xBGR" +#define SPA_VIDEO_FORMAT__RGBA SPA_VIDEO_FORMAT_PREFIX "RGBA" +#define SPA_VIDEO_FORMAT__BGRA SPA_VIDEO_FORMAT_PREFIX "BGRA" +#define SPA_VIDEO_FORMAT__ARGB SPA_VIDEO_FORMAT_PREFIX "ARGB" +#define SPA_VIDEO_FORMAT__ABGR SPA_VIDEO_FORMAT_PREFIX "ABGR" +#define SPA_VIDEO_FORMAT__RGB SPA_VIDEO_FORMAT_PREFIX "RGB" +#define SPA_VIDEO_FORMAT__BGR SPA_VIDEO_FORMAT_PREFIX "BGR" +#define SPA_VIDEO_FORMAT__Y41B SPA_VIDEO_FORMAT_PREFIX "Y41B" +#define SPA_VIDEO_FORMAT__Y42B SPA_VIDEO_FORMAT_PREFIX "Y42B" +#define SPA_VIDEO_FORMAT__YVYU SPA_VIDEO_FORMAT_PREFIX "YVYU" +#define SPA_VIDEO_FORMAT__Y444 SPA_VIDEO_FORMAT_PREFIX "Y444" +#define SPA_VIDEO_FORMAT__v210 SPA_VIDEO_FORMAT_PREFIX "v210" +#define SPA_VIDEO_FORMAT__v216 SPA_VIDEO_FORMAT_PREFIX "v216" +#define SPA_VIDEO_FORMAT__NV12 SPA_VIDEO_FORMAT_PREFIX "NV12" +#define SPA_VIDEO_FORMAT__NV21 SPA_VIDEO_FORMAT_PREFIX "NV21" +#define SPA_VIDEO_FORMAT__GRAY8 SPA_VIDEO_FORMAT_PREFIX "GRAY8" +#define SPA_VIDEO_FORMAT__GRAY16_BE SPA_VIDEO_FORMAT_PREFIX "GRAY16_BE" +#define SPA_VIDEO_FORMAT__GRAY16_LE SPA_VIDEO_FORMAT_PREFIX "GRAY16_LE" +#define SPA_VIDEO_FORMAT__v308 SPA_VIDEO_FORMAT_PREFIX "v308" +#define SPA_VIDEO_FORMAT__RGB16 SPA_VIDEO_FORMAT_PREFIX "RGB16" +#define SPA_VIDEO_FORMAT__BGR16 SPA_VIDEO_FORMAT_PREFIX "BGR16" +#define SPA_VIDEO_FORMAT__RGB15 SPA_VIDEO_FORMAT_PREFIX "RGB15" +#define SPA_VIDEO_FORMAT__BGR15 SPA_VIDEO_FORMAT_PREFIX "BGR15" +#define SPA_VIDEO_FORMAT__UYVP SPA_VIDEO_FORMAT_PREFIX "UYVP" +#define SPA_VIDEO_FORMAT__A420 SPA_VIDEO_FORMAT_PREFIX "A420" +#define SPA_VIDEO_FORMAT__RGB8P SPA_VIDEO_FORMAT_PREFIX "RGB8P" +#define SPA_VIDEO_FORMAT__YUV9 SPA_VIDEO_FORMAT_PREFIX "YUV9" +#define SPA_VIDEO_FORMAT__YVU9 SPA_VIDEO_FORMAT_PREFIX "YVU9" +#define SPA_VIDEO_FORMAT__IYU1 SPA_VIDEO_FORMAT_PREFIX "IYU1" +#define SPA_VIDEO_FORMAT__ARGB64 SPA_VIDEO_FORMAT_PREFIX "ARGB64" +#define SPA_VIDEO_FORMAT__AYUV64 SPA_VIDEO_FORMAT_PREFIX "AYUV64" +#define SPA_VIDEO_FORMAT__r210 SPA_VIDEO_FORMAT_PREFIX "r210" +#define SPA_VIDEO_FORMAT__I420_10BE SPA_VIDEO_FORMAT_PREFIX "I420_10BE" +#define SPA_VIDEO_FORMAT__I420_10LE SPA_VIDEO_FORMAT_PREFIX "I420_10LE" +#define SPA_VIDEO_FORMAT__I422_10BE SPA_VIDEO_FORMAT_PREFIX "I422_10BE" +#define SPA_VIDEO_FORMAT__I422_10LE SPA_VIDEO_FORMAT_PREFIX "I422_10LE" +#define SPA_VIDEO_FORMAT__Y444_10BE SPA_VIDEO_FORMAT_PREFIX "Y444_10BE" +#define SPA_VIDEO_FORMAT__Y444_10LE SPA_VIDEO_FORMAT_PREFIX "Y444_10LE" +#define SPA_VIDEO_FORMAT__GBR SPA_VIDEO_FORMAT_PREFIX "GBR" +#define SPA_VIDEO_FORMAT__GBR_10BE SPA_VIDEO_FORMAT_PREFIX "GBR_10BE" +#define SPA_VIDEO_FORMAT__GBR_10LE SPA_VIDEO_FORMAT_PREFIX "GBR_10LE" +#define SPA_VIDEO_FORMAT__NV16 SPA_VIDEO_FORMAT_PREFIX "NV16" +#define SPA_VIDEO_FORMAT__NV24 SPA_VIDEO_FORMAT_PREFIX "NV24" +#define SPA_VIDEO_FORMAT__NV12_64Z32 SPA_VIDEO_FORMAT_PREFIX "NV12_64Z32" +#define SPA_VIDEO_FORMAT__A420_10BE SPA_VIDEO_FORMAT_PREFIX "A420_10BE" +#define SPA_VIDEO_FORMAT__A420_10LE SPA_VIDEO_FORMAT_PREFIX "A420_10LE" +#define SPA_VIDEO_FORMAT__A422_10BE SPA_VIDEO_FORMAT_PREFIX "A422_10BE" +#define SPA_VIDEO_FORMAT__A422_10LE SPA_VIDEO_FORMAT_PREFIX "A422_10LE" +#define SPA_VIDEO_FORMAT__A444_10BE SPA_VIDEO_FORMAT_PREFIX "A444_10BE" +#define SPA_VIDEO_FORMAT__A444_10LE SPA_VIDEO_FORMAT_PREFIX "A444_10LE" +#define SPA_VIDEO_FORMAT__NV61 SPA_VIDEO_FORMAT_PREFIX "NV61" +#define SPA_VIDEO_FORMAT__P010_10BE SPA_VIDEO_FORMAT_PREFIX "P010_10BE" +#define SPA_VIDEO_FORMAT__P010_10LE SPA_VIDEO_FORMAT_PREFIX "P010_10LE" +#define SPA_VIDEO_FORMAT__IYU2 SPA_VIDEO_FORMAT_PREFIX "IYU2" +#define SPA_VIDEO_FORMAT__VYUY SPA_VIDEO_FORMAT_PREFIX "VYUY" + +typedef struct +{ + uint32_t UNKNOWN; + uint32_t ENCODED; + uint32_t I420; + uint32_t YV12; + uint32_t YUY2; + uint32_t UYVY; + uint32_t AYUV; + uint32_t RGBx; + uint32_t BGRx; + uint32_t xRGB; + uint32_t xBGR; + uint32_t RGBA; + uint32_t BGRA; + uint32_t ARGB; + uint32_t ABGR; + uint32_t RGB; + uint32_t BGR; + uint32_t Y41B; + uint32_t Y42B; + uint32_t YVYU; + uint32_t Y444; + uint32_t v210; + uint32_t v216; + uint32_t NV12; + uint32_t NV21; + uint32_t GRAY8; + uint32_t GRAY16_BE; + uint32_t GRAY16_LE; + uint32_t v308; + uint32_t RGB16; + uint32_t BGR16; + uint32_t RGB15; + uint32_t BGR15; + uint32_t UYVP; + uint32_t A420; + uint32_t RGB8P; + uint32_t YUV9; + uint32_t YVU9; + uint32_t IYU1; + uint32_t ARGB64; + uint32_t AYUV64; + uint32_t r210; + uint32_t I420_10BE; + uint32_t I420_10LE; + uint32_t I422_10BE; + uint32_t I422_10LE; + uint32_t Y444_10BE; + uint32_t Y444_10LE; + uint32_t GBR; + uint32_t GBR_10BE; + uint32_t GBR_10LE; + uint32_t NV16; + uint32_t NV24; + uint32_t NV12_64Z32; + uint32_t A420_10BE; + uint32_t A420_10LE; + uint32_t A422_10BE; + uint32_t A422_10LE; + uint32_t A444_10BE; + uint32_t A444_10LE; + uint32_t NV61; + uint32_t P010_10BE; + uint32_t P010_10LE; + uint32_t IYU2; + uint32_t VYUY; +} SpaVideoFormats; + +static inline void +spa_video_formats_map (SpaIDMap *map, SpaVideoFormats *types) +{ + if (types->ENCODED == 0) { + types->UNKNOWN = 0; + types->ENCODED = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__ENCODED); + types->I420 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__I420); + types->YV12 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__YV12); + types->YUY2 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__YUY2); + types->UYVY = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__UYVY); + types->AYUV = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__AYUV); + types->RGBx = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__RGBx); + types->BGRx = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__BGRx); + types->xRGB = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__xRGB); + types->xBGR = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__xBGR); + types->RGBA = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__RGBA); + types->BGRA = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__BGRA); + types->ARGB = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__ARGB); + types->ABGR = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__ABGR); + types->RGB = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__RGB); + types->BGR = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__BGR); + types->Y41B = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__Y41B); + types->Y42B = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__Y42B); + types->YVYU = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__YVYU); + types->Y444 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__Y444); + types->v210 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__v210); + types->v216 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__v216); + types->NV12 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__NV12); + types->NV21 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__NV21); + types->GRAY8 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__GRAY8); + types->GRAY16_BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__GRAY16_BE); + types->GRAY16_LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__GRAY16_LE); + types->v308 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__v308); + types->RGB16 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__RGB16); + types->BGR16 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__BGR16); + types->RGB15 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__RGB15); + types->BGR15 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__BGR15); + types->UYVP = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__UYVP); + types->A420 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__A420); + types->RGB8P = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__RGB8P); + types->YUV9 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__YUV9); + types->YVU9 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__YVU9); + types->IYU1 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__IYU1); + types->ARGB64 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__ARGB64); + types->AYUV64 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__AYUV64); + types->r210 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__r210); + types->I420_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__I420_10BE); + types->I420_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__I420_10LE); + types->I422_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__I422_10BE); + types->I422_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__I422_10LE); + types->Y444_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__Y444_10BE); + types->Y444_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__Y444_10LE); + types->GBR = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__GBR); + types->GBR_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__GBR_10BE); + types->GBR_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__GBR_10LE); + types->NV16 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__NV16); + types->NV24 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__NV24); + types->NV12_64Z32 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__NV12_64Z32); + types->A420_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__A420_10BE); + types->A420_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__A420_10LE); + types->A422_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__A422_10BE); + types->A422_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__A422_10LE); + types->A444_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__A444_10BE); + types->A444_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__A444_10LE); + types->NV61 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__NV61); + types->P010_10BE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__P010_10BE); + types->P010_10LE = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__P010_10LE); + types->IYU2 = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__IYU2); + types->VYUY = spa_id_map_get_id (map, SPA_VIDEO_FORMAT__VYUY); + } +} /** * SpaVideoFlags: @@ -167,7 +306,7 @@ typedef enum { * @color_primaries: color primaries. used to convert between R'G'B' and CIE XYZ */ struct _SpaVideoInfoRaw { - SpaVideoFormat format; + uint32_t format; SpaRectangle size; SpaFraction framerate; SpaFraction max_framerate; diff --git a/spa/lib/debug.c b/spa/lib/debug.c index 934ded76c..93cbbff8a 100644 --- a/spa/lib/debug.c +++ b/spa/lib/debug.c @@ -322,8 +322,18 @@ print_format_value (uint32_t size, uint32_t type, void *body) fprintf (stderr, "%s", *(int32_t *) body ? "true" : "false"); break; case SPA_POD_TYPE_URI: - fprintf (stderr, "%"PRIi32, *(int32_t *) body); + { + const char *str = spa_id_map_get_uri (spa_id_map_get_default(), *(int32_t*)body); + if (str) { + const char *h = strstr (str, "#"); + if (h) + str = h + 1; + } else { + str = "unknown"; + } + fprintf (stderr, "%s", str); break; + } case SPA_POD_TYPE_INT: fprintf (stderr, "%"PRIi32, *(int32_t *) body); break; diff --git a/spa/lib/mapper.c b/spa/lib/mapper.c index 71c5ff1f5..6e3580147 100644 --- a/spa/lib/mapper.c +++ b/spa/lib/mapper.c @@ -61,7 +61,8 @@ id_map_get_uri (SpaIDMap *map, uint32_t id) if (id < this->n_uris) return this->uris[id]; - return 0; + + return NULL; } static IDMap default_id_map = { diff --git a/spa/lib/props.c b/spa/lib/props.c index 6ee9e299e..f6ffc676b 100644 --- a/spa/lib/props.c +++ b/spa/lib/props.c @@ -31,6 +31,7 @@ compare_value (SpaPODType type, const void *r1, const void *r2) case SPA_POD_TYPE_INVALID: return 0; case SPA_POD_TYPE_BOOL: + case SPA_POD_TYPE_URI: return *(int32_t*)r1 == *(uint32_t*)r2; case SPA_POD_TYPE_INT: return *(int32_t*)r1 - *(int32_t*)r2; diff --git a/spa/lib/video-raw.c b/spa/lib/video-raw.c index 5eff754ed..401daa847 100644 --- a/spa/lib/video-raw.c +++ b/spa/lib/video-raw.c @@ -50,7 +50,7 @@ spa_format_video_parse (const SpaFormat *format, if (info->media_subtype == media_subtypes.raw) spa_format_query (format, - prop_video.format, SPA_POD_TYPE_INT, &info->info.raw.format, + prop_video.format, SPA_POD_TYPE_URI, &info->info.raw.format, prop_video.size, SPA_POD_TYPE_RECTANGLE, &info->info.raw.size, prop_video.framerate, SPA_POD_TYPE_FRACTION, &info->info.raw.framerate, prop_video.max_framerate, SPA_POD_TYPE_FRACTION, &info->info.raw.max_framerate, diff --git a/spa/plugins/v4l2/v4l2-source.c b/spa/plugins/v4l2/v4l2-source.c index e1b746530..6a955b8d1 100644 --- a/spa/plugins/v4l2/v4l2-source.c +++ b/spa/plugins/v4l2/v4l2-source.c @@ -69,6 +69,7 @@ typedef struct { SpaMediaSubtypes media_subtypes; SpaMediaSubtypesVideo media_subtypes_video; SpaPropVideo prop_video; + SpaVideoFormats video_formats; } URI; typedef struct { @@ -579,7 +580,7 @@ spa_v4l2_source_node_port_get_format (SpaNode *node, if (state->current_format.media_subtype == this->uri.media_subtypes.raw) { spa_pod_builder_add (&b, - PROP (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_INT, state->current_format.info.raw.format), + PROP (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_URI, state->current_format.info.raw.format), PROP (&f[1], this->uri.prop_video.size, -SPA_POD_TYPE_RECTANGLE, &state->current_format.info.raw.size), PROP (&f[1], this->uri.prop_video.framerate, -SPA_POD_TYPE_FRACTION, &state->current_format.info.raw.framerate), 0); @@ -972,6 +973,7 @@ v4l2_source_init (const SpaHandleFactory *factory, spa_media_subtypes_map (this->map, &this->uri.media_subtypes); spa_media_subtypes_video_map (this->map, &this->uri.media_subtypes_video); spa_prop_video_map (this->map, &this->uri.prop_video); + spa_video_formats_map (this->map, &this->uri.video_formats); this->node = v4l2source_node; this->clock = v4l2source_clock; diff --git a/spa/plugins/v4l2/v4l2-utils.c b/spa/plugins/v4l2/v4l2-utils.c index 892b20126..d8b1fc7c3 100644 --- a/spa/plugins/v4l2/v4l2-utils.c +++ b/spa/plugins/v4l2/v4l2-utils.c @@ -164,7 +164,7 @@ spa_v4l2_close (SpaV4l2Source *this) typedef struct { uint32_t fourcc; - SpaVideoFormat format; + off_t format_offset; off_t media_type_offset; off_t media_subtype_offset; } FormatInfo; @@ -188,114 +188,143 @@ typedef struct { #define VC1 offsetof(URI, media_subtypes_video.vc1) #define VP8 offsetof(URI, media_subtypes_video.vp8) +#define FORMAT_UNKNOWN offsetof(URI, video_formats.UNKNOWN) +#define FORMAT_ENCODED offsetof(URI, video_formats.ENCODED) +#define FORMAT_RGB15 offsetof(URI, video_formats.RGB15) +#define FORMAT_BGR15 offsetof(URI, video_formats.BGR15) +#define FORMAT_RGB16 offsetof(URI, video_formats.RGB16) +#define FORMAT_BGR offsetof(URI, video_formats.BGR) +#define FORMAT_RGB offsetof(URI, video_formats.RGB) +#define FORMAT_BGRA offsetof(URI, video_formats.BGRA) +#define FORMAT_BGRx offsetof(URI, video_formats.BGRx) +#define FORMAT_ARGB offsetof(URI, video_formats.ARGB) +#define FORMAT_xRGB offsetof(URI, video_formats.xRGB) +#define FORMAT_GRAY8 offsetof(URI, video_formats.GRAY8) +#define FORMAT_GRAY16_LE offsetof(URI, video_formats.GRAY16_LE) +#define FORMAT_GRAY16_BE offsetof(URI, video_formats.GRAY16_BE) +#define FORMAT_YVU9 offsetof(URI, video_formats.YVU9) +#define FORMAT_YV12 offsetof(URI, video_formats.YV12) +#define FORMAT_YUY2 offsetof(URI, video_formats.YUY2) +#define FORMAT_YVYU offsetof(URI, video_formats.YVYU) +#define FORMAT_UYVY offsetof(URI, video_formats.UYVY) +#define FORMAT_Y42B offsetof(URI, video_formats.Y42B) +#define FORMAT_Y41B offsetof(URI, video_formats.Y41B) +#define FORMAT_YUV9 offsetof(URI, video_formats.YUV9) +#define FORMAT_I420 offsetof(URI, video_formats.I420) +#define FORMAT_NV12 offsetof(URI, video_formats.NV12) +#define FORMAT_NV12_64Z32 offsetof(URI, video_formats.NV12_64Z32) +#define FORMAT_NV21 offsetof(URI, video_formats.NV21) +#define FORMAT_NV16 offsetof(URI, video_formats.NV16) +#define FORMAT_NV61 offsetof(URI, video_formats.NV61) +#define FORMAT_NV24 offsetof(URI, video_formats.NV24) static const FormatInfo format_info[] = { /* RGB formats */ - { V4L2_PIX_FMT_RGB332, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_ARGB555, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_XRGB555, SPA_VIDEO_FORMAT_RGB15, VIDEO, RAW }, - { V4L2_PIX_FMT_ARGB555X, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_XRGB555X, SPA_VIDEO_FORMAT_BGR15, VIDEO, RAW }, - { V4L2_PIX_FMT_RGB565, SPA_VIDEO_FORMAT_RGB16, VIDEO, RAW }, - { V4L2_PIX_FMT_RGB565X, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_BGR666, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_BGR24, SPA_VIDEO_FORMAT_BGR, VIDEO, RAW }, - { V4L2_PIX_FMT_RGB24, SPA_VIDEO_FORMAT_RGB, VIDEO, RAW }, - { V4L2_PIX_FMT_ABGR32, SPA_VIDEO_FORMAT_BGRA, VIDEO, RAW }, - { V4L2_PIX_FMT_XBGR32, SPA_VIDEO_FORMAT_BGRx, VIDEO, RAW }, - { V4L2_PIX_FMT_ARGB32, SPA_VIDEO_FORMAT_ARGB, VIDEO, RAW }, - { V4L2_PIX_FMT_XRGB32, SPA_VIDEO_FORMAT_xRGB, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB332, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_ARGB555, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_XRGB555, FORMAT_RGB15, VIDEO, RAW }, + { V4L2_PIX_FMT_ARGB555X, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_XRGB555X, FORMAT_BGR15, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB565, FORMAT_RGB16, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB565X, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_BGR666, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_BGR24, FORMAT_BGR, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB24, FORMAT_RGB, VIDEO, RAW }, + { V4L2_PIX_FMT_ABGR32, FORMAT_BGRA, VIDEO, RAW }, + { V4L2_PIX_FMT_XBGR32, FORMAT_BGRx, VIDEO, RAW }, + { V4L2_PIX_FMT_ARGB32, FORMAT_ARGB, VIDEO, RAW }, + { V4L2_PIX_FMT_XRGB32, FORMAT_xRGB, VIDEO, RAW }, /* Deprecated Packed RGB Image Formats (alpha ambiguity) */ - { V4L2_PIX_FMT_RGB444, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_RGB555, SPA_VIDEO_FORMAT_RGB15, VIDEO, RAW }, - { V4L2_PIX_FMT_RGB555X, SPA_VIDEO_FORMAT_BGR15, VIDEO, RAW }, - { V4L2_PIX_FMT_BGR32, SPA_VIDEO_FORMAT_BGRx, VIDEO, RAW }, - { V4L2_PIX_FMT_RGB32, SPA_VIDEO_FORMAT_xRGB, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB444, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB555, FORMAT_RGB15, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB555X, FORMAT_BGR15, VIDEO, RAW }, + { V4L2_PIX_FMT_BGR32, FORMAT_BGRx, VIDEO, RAW }, + { V4L2_PIX_FMT_RGB32, FORMAT_xRGB, VIDEO, RAW }, /* Grey formats */ - { V4L2_PIX_FMT_GREY, SPA_VIDEO_FORMAT_GRAY8, VIDEO, RAW }, - { V4L2_PIX_FMT_Y4, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_Y6, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_Y10, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_Y12, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_Y16, SPA_VIDEO_FORMAT_GRAY16_LE, VIDEO, RAW }, - { V4L2_PIX_FMT_Y16_BE, SPA_VIDEO_FORMAT_GRAY16_BE, VIDEO, RAW }, - { V4L2_PIX_FMT_Y10BPACK, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_GREY, FORMAT_GRAY8, VIDEO, RAW }, + { V4L2_PIX_FMT_Y4, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_Y6, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_Y10, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_Y12, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_Y16, FORMAT_GRAY16_LE, VIDEO, RAW }, + { V4L2_PIX_FMT_Y16_BE, FORMAT_GRAY16_BE, VIDEO, RAW }, + { V4L2_PIX_FMT_Y10BPACK, FORMAT_UNKNOWN, VIDEO, RAW }, /* Palette formats */ - { V4L2_PIX_FMT_PAL8, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_PAL8, FORMAT_UNKNOWN, VIDEO, RAW }, /* Chrominance formats */ - { V4L2_PIX_FMT_UV8, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_UV8, FORMAT_UNKNOWN, VIDEO, RAW }, /* Luminance+Chrominance formats */ - { V4L2_PIX_FMT_YVU410, SPA_VIDEO_FORMAT_YVU9, VIDEO, RAW }, - { V4L2_PIX_FMT_YVU420, SPA_VIDEO_FORMAT_YV12, VIDEO, RAW }, - { V4L2_PIX_FMT_YVU420M, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YUYV, SPA_VIDEO_FORMAT_YUY2, VIDEO, RAW }, - { V4L2_PIX_FMT_YYUV, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YVYU, SPA_VIDEO_FORMAT_YVYU, VIDEO, RAW }, - { V4L2_PIX_FMT_UYVY, SPA_VIDEO_FORMAT_UYVY, VIDEO, RAW }, - { V4L2_PIX_FMT_VYUY, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV422P, SPA_VIDEO_FORMAT_Y42B, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV411P, SPA_VIDEO_FORMAT_Y41B, VIDEO, RAW }, - { V4L2_PIX_FMT_Y41P, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV444, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV555, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV565, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV32, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV410, SPA_VIDEO_FORMAT_YUV9, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV420, SPA_VIDEO_FORMAT_I420, VIDEO, RAW }, - { V4L2_PIX_FMT_YUV420M, SPA_VIDEO_FORMAT_I420, VIDEO, RAW }, - { V4L2_PIX_FMT_HI240, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_HM12, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_M420, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YVU410, FORMAT_YVU9, VIDEO, RAW }, + { V4L2_PIX_FMT_YVU420, FORMAT_YV12, VIDEO, RAW }, + { V4L2_PIX_FMT_YVU420M, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YUYV, FORMAT_YUY2, VIDEO, RAW }, + { V4L2_PIX_FMT_YYUV, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YVYU, FORMAT_YVYU, VIDEO, RAW }, + { V4L2_PIX_FMT_UYVY, FORMAT_UYVY, VIDEO, RAW }, + { V4L2_PIX_FMT_VYUY, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV422P, FORMAT_Y42B, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV411P, FORMAT_Y41B, VIDEO, RAW }, + { V4L2_PIX_FMT_Y41P, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV444, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV555, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV565, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV32, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV410, FORMAT_YUV9, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV420, FORMAT_I420, VIDEO, RAW }, + { V4L2_PIX_FMT_YUV420M, FORMAT_I420, VIDEO, RAW }, + { V4L2_PIX_FMT_HI240, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_HM12, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_M420, FORMAT_UNKNOWN, VIDEO, RAW }, /* two planes -- one Y, one Cr + Cb interleaved */ - { V4L2_PIX_FMT_NV12, SPA_VIDEO_FORMAT_NV12, VIDEO, RAW }, - { V4L2_PIX_FMT_NV12M, SPA_VIDEO_FORMAT_NV12, VIDEO, RAW }, - { V4L2_PIX_FMT_NV12MT, SPA_VIDEO_FORMAT_NV12_64Z32, VIDEO, RAW }, - { V4L2_PIX_FMT_NV12MT_16X16, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_NV21, SPA_VIDEO_FORMAT_NV21, VIDEO, RAW }, - { V4L2_PIX_FMT_NV21M, SPA_VIDEO_FORMAT_NV21, VIDEO, RAW }, - { V4L2_PIX_FMT_NV16, SPA_VIDEO_FORMAT_NV16, VIDEO, RAW }, - { V4L2_PIX_FMT_NV16M, SPA_VIDEO_FORMAT_NV16, VIDEO, RAW }, - { V4L2_PIX_FMT_NV61, SPA_VIDEO_FORMAT_NV61, VIDEO, RAW }, - { V4L2_PIX_FMT_NV61M, SPA_VIDEO_FORMAT_NV61, VIDEO, RAW }, - { V4L2_PIX_FMT_NV24, SPA_VIDEO_FORMAT_NV24, VIDEO, RAW }, - { V4L2_PIX_FMT_NV42, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_NV12, FORMAT_NV12, VIDEO, RAW }, + { V4L2_PIX_FMT_NV12M, FORMAT_NV12, VIDEO, RAW }, + { V4L2_PIX_FMT_NV12MT, FORMAT_NV12_64Z32, VIDEO, RAW }, + { V4L2_PIX_FMT_NV12MT_16X16, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_NV21, FORMAT_NV21, VIDEO, RAW }, + { V4L2_PIX_FMT_NV21M, FORMAT_NV21, VIDEO, RAW }, + { V4L2_PIX_FMT_NV16, FORMAT_NV16, VIDEO, RAW }, + { V4L2_PIX_FMT_NV16M, FORMAT_NV16, VIDEO, RAW }, + { V4L2_PIX_FMT_NV61, FORMAT_NV61, VIDEO, RAW }, + { V4L2_PIX_FMT_NV61M, FORMAT_NV61, VIDEO, RAW }, + { V4L2_PIX_FMT_NV24, FORMAT_NV24, VIDEO, RAW }, + { V4L2_PIX_FMT_NV42, FORMAT_UNKNOWN, VIDEO, RAW }, /* Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm */ - { V4L2_PIX_FMT_SBGGR8, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, BAYER }, - { V4L2_PIX_FMT_SGBRG8, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, BAYER }, - { V4L2_PIX_FMT_SGRBG8, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, BAYER }, - { V4L2_PIX_FMT_SRGGB8, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, BAYER }, + { V4L2_PIX_FMT_SBGGR8, FORMAT_UNKNOWN, VIDEO, BAYER }, + { V4L2_PIX_FMT_SGBRG8, FORMAT_UNKNOWN, VIDEO, BAYER }, + { V4L2_PIX_FMT_SGRBG8, FORMAT_UNKNOWN, VIDEO, BAYER }, + { V4L2_PIX_FMT_SRGGB8, FORMAT_UNKNOWN, VIDEO, BAYER }, /* compressed formats */ - { V4L2_PIX_FMT_MJPEG, SPA_VIDEO_FORMAT_ENCODED, VIDEO, MJPG }, - { V4L2_PIX_FMT_JPEG, SPA_VIDEO_FORMAT_ENCODED, IMAGE, JPEG }, - { V4L2_PIX_FMT_PJPG, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_DV, SPA_VIDEO_FORMAT_ENCODED, VIDEO, DV }, - { V4L2_PIX_FMT_MPEG, SPA_VIDEO_FORMAT_ENCODED, VIDEO, MPEGTS }, - { V4L2_PIX_FMT_H264, SPA_VIDEO_FORMAT_ENCODED, VIDEO, H264 }, - { V4L2_PIX_FMT_H264_NO_SC, SPA_VIDEO_FORMAT_ENCODED, VIDEO, H264 }, - { V4L2_PIX_FMT_H264_MVC, SPA_VIDEO_FORMAT_ENCODED, VIDEO, H264 }, - { V4L2_PIX_FMT_H263, SPA_VIDEO_FORMAT_ENCODED, VIDEO, H263 }, - { V4L2_PIX_FMT_MPEG1, SPA_VIDEO_FORMAT_ENCODED, VIDEO, MPEG1 }, - { V4L2_PIX_FMT_MPEG2, SPA_VIDEO_FORMAT_ENCODED, VIDEO, MPEG2 }, - { V4L2_PIX_FMT_MPEG4, SPA_VIDEO_FORMAT_ENCODED, VIDEO, MPEG4 }, - { V4L2_PIX_FMT_XVID, SPA_VIDEO_FORMAT_ENCODED, VIDEO, XVID }, - { V4L2_PIX_FMT_VC1_ANNEX_G, SPA_VIDEO_FORMAT_ENCODED, VIDEO, VC1 }, - { V4L2_PIX_FMT_VC1_ANNEX_L, SPA_VIDEO_FORMAT_ENCODED, VIDEO, VC1 }, - { V4L2_PIX_FMT_VP8, SPA_VIDEO_FORMAT_ENCODED, VIDEO, VP8 }, + { V4L2_PIX_FMT_MJPEG, FORMAT_ENCODED, VIDEO, MJPG }, + { V4L2_PIX_FMT_JPEG, FORMAT_ENCODED, IMAGE, JPEG }, + { V4L2_PIX_FMT_PJPG, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_DV, FORMAT_ENCODED, VIDEO, DV }, + { V4L2_PIX_FMT_MPEG, FORMAT_ENCODED, VIDEO, MPEGTS }, + { V4L2_PIX_FMT_H264, FORMAT_ENCODED, VIDEO, H264 }, + { V4L2_PIX_FMT_H264_NO_SC, FORMAT_ENCODED, VIDEO, H264 }, + { V4L2_PIX_FMT_H264_MVC, FORMAT_ENCODED, VIDEO, H264 }, + { V4L2_PIX_FMT_H263, FORMAT_ENCODED, VIDEO, H263 }, + { V4L2_PIX_FMT_MPEG1, FORMAT_ENCODED, VIDEO, MPEG1 }, + { V4L2_PIX_FMT_MPEG2, FORMAT_ENCODED, VIDEO, MPEG2 }, + { V4L2_PIX_FMT_MPEG4, FORMAT_ENCODED, VIDEO, MPEG4 }, + { V4L2_PIX_FMT_XVID, FORMAT_ENCODED, VIDEO, XVID }, + { V4L2_PIX_FMT_VC1_ANNEX_G, FORMAT_ENCODED, VIDEO, VC1 }, + { V4L2_PIX_FMT_VC1_ANNEX_L, FORMAT_ENCODED, VIDEO, VC1 }, + { V4L2_PIX_FMT_VP8, FORMAT_ENCODED, VIDEO, VP8 }, /* Vendor-specific formats */ - { V4L2_PIX_FMT_WNVA, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_SN9C10X, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_PWC1, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, - { V4L2_PIX_FMT_PWC2, SPA_VIDEO_FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_WNVA, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_SN9C10X, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_PWC1, FORMAT_UNKNOWN, VIDEO, RAW }, + { V4L2_PIX_FMT_PWC2, FORMAT_UNKNOWN, VIDEO, RAW }, }; static const FormatInfo * @@ -328,7 +357,7 @@ static const FormatInfo * find_format_info_by_media_type (URI *uri, uint32_t type, uint32_t subtype, - SpaVideoFormat format, + uint32_t format, int startidx) { int i; @@ -338,20 +367,20 @@ find_format_info_by_media_type (URI *uri, media_type = *SPA_MEMBER (uri, format_info[i].media_type_offset, uint32_t); media_subtype = *SPA_MEMBER (uri, format_info[i].media_subtype_offset, uint32_t); - media_format = format_info[i].format; + media_format = *SPA_MEMBER (uri, format_info[i].format_offset, uint32_t); if ((media_type == type) && (media_subtype == subtype) && - (format == SPA_VIDEO_FORMAT_UNKNOWN || media_format == format)) + (format == 0 || media_format == format)) return &format_info[i]; } return NULL; } -static SpaVideoFormat +static uint32_t enum_filter_format (URI *uri, const SpaFormat *filter, uint32_t index) { - SpaVideoFormat video_format = SPA_VIDEO_FORMAT_UNKNOWN; + uint32_t video_format = 0; if ((filter->body.media_type.value == uri->media_types.video || filter->body.media_type.value == uri->media_types.image)) { @@ -361,10 +390,10 @@ enum_filter_format (URI *uri, const SpaFormat *filter, uint32_t index) const uint32_t *values; if (!(p = spa_format_find_prop (filter, uri->prop_video.format))) - return SPA_VIDEO_FORMAT_UNKNOWN; + return uri->video_formats.UNKNOWN; - if (p->body.value.type != SPA_POD_TYPE_INT) - return SPA_VIDEO_FORMAT_UNKNOWN; + if (p->body.value.type != SPA_POD_TYPE_URI) + return uri->video_formats.UNKNOWN; values = SPA_POD_BODY_CONST (&p->body.value); n_values = SPA_POD_PROP_N_VALUES (p); @@ -378,7 +407,7 @@ enum_filter_format (URI *uri, const SpaFormat *filter, uint32_t index) } } else { if (index == 0) - video_format = SPA_VIDEO_FORMAT_ENCODED; + video_format = uri->video_formats.ENCODED; } } return video_format; @@ -484,7 +513,7 @@ spa_v4l2_enum_format (SpaV4l2Source *this, SpaPODFrame f[2]; SpaPODProp *prop; SpaPODBuilder b = { state->format_buffer, sizeof (state->format_buffer), }; - uint32_t media_type, media_subtype; + uint32_t media_type, media_subtype, video_format; if (spa_v4l2_open (this) < 0) return SPA_RESULT_ERROR; @@ -509,10 +538,8 @@ next_fmtdesc: while (state->next_fmtdesc) { if (filter) { - SpaVideoFormat video_format; - video_format = enum_filter_format (&this->uri, filter, state->fmtdesc.index); - if (video_format == SPA_VIDEO_FORMAT_UNKNOWN) + if (video_format == this->uri.video_formats.UNKNOWN) return SPA_RESULT_ENUM_END; info = find_format_info_by_media_type (&this->uri, @@ -633,6 +660,7 @@ have_size: media_type = *SPA_MEMBER (&this->uri, info->media_type_offset, uint32_t); media_subtype = *SPA_MEMBER (&this->uri, info->media_subtype_offset, uint32_t); + video_format = *SPA_MEMBER (&this->uri, info->format_offset, uint32_t); spa_pod_builder_push_format (&b, &f[0], media_type, @@ -640,7 +668,7 @@ have_size: if (media_subtype == this->uri.media_subtypes.raw) { spa_pod_builder_add (&b, - PROP (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_INT, info->format), + PROP (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_URI, video_format), 0); } spa_pod_builder_add (&b, @@ -765,7 +793,7 @@ spa_v4l2_set_format (SpaV4l2Source *this, SpaVideoInfo *format, bool try_only) struct v4l2_format reqfmt, fmt; struct v4l2_streamparm streamparm; const FormatInfo *info = NULL; - SpaVideoFormat video_format; + uint32_t video_format; SpaRectangle *size = NULL; SpaFraction *framerate = NULL; SpaPODBuilder b = { NULL }; @@ -783,17 +811,17 @@ spa_v4l2_set_format (SpaV4l2Source *this, SpaVideoInfo *format, bool try_only) } else if (format->media_subtype == this->uri.media_subtypes_video.mjpg || format->media_subtype == this->uri.media_subtypes_video.jpeg) { - video_format = SPA_VIDEO_FORMAT_ENCODED; + video_format = this->uri.video_formats.ENCODED; size = &format->info.mjpg.size; framerate = &format->info.mjpg.framerate; } else if (format->media_subtype == this->uri.media_subtypes_video.h264) { - video_format = SPA_VIDEO_FORMAT_ENCODED; + video_format = this->uri.video_formats.ENCODED; size = &format->info.h264.size; framerate = &format->info.h264.framerate; } else { - video_format = SPA_VIDEO_FORMAT_ENCODED; + video_format = this->uri.video_formats.ENCODED; } info = find_format_info_by_media_type (&this->uri, diff --git a/spa/plugins/videotestsrc/draw.c b/spa/plugins/videotestsrc/draw.c index b4df2407c..d87fee050 100644 --- a/spa/plugins/videotestsrc/draw.c +++ b/spa/plugins/videotestsrc/draw.c @@ -148,16 +148,14 @@ drawing_data_init (DrawingData *dd, (format->media_subtype != this->uri.media_subtypes.raw)) return SPA_RESULT_NOT_IMPLEMENTED; - switch (format->info.raw.format) { - case SPA_VIDEO_FORMAT_RGB: - dd->draw_pixel = draw_pixel_rgb; - break; - case SPA_VIDEO_FORMAT_UYVY: - dd->draw_pixel = draw_pixel_uyvy; - break; - default: - return SPA_RESULT_NOT_IMPLEMENTED; + if (format->info.raw.format == this->uri.video_formats.RGB) { + dd->draw_pixel = draw_pixel_rgb; } + else if (format->info.raw.format == this->uri.video_formats.UYVY) { + dd->draw_pixel = draw_pixel_uyvy; + } + else + return SPA_RESULT_NOT_IMPLEMENTED; dd->line = data; dd->width = size->width; diff --git a/spa/plugins/videotestsrc/videotestsrc.c b/spa/plugins/videotestsrc/videotestsrc.c index 01a74dde3..f6cd7eaec 100644 --- a/spa/plugins/videotestsrc/videotestsrc.c +++ b/spa/plugins/videotestsrc/videotestsrc.c @@ -42,6 +42,7 @@ typedef struct { SpaMediaTypes media_types; SpaMediaSubtypes media_subtypes; SpaPropVideo prop_video; + SpaVideoFormats video_formats; } URI; typedef struct _SpaVideoTestSrc SpaVideoTestSrc; @@ -454,10 +455,10 @@ next: case 0: spa_pod_builder_format (&b, &f[0], this->uri.media_types.video, this->uri.media_subtypes.raw, - PROP_U_EN (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_INT, 3, - SPA_VIDEO_FORMAT_RGB, - SPA_VIDEO_FORMAT_RGB, - SPA_VIDEO_FORMAT_UYVY), + PROP_U_EN (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_URI, 3, + this->uri.video_formats.RGB, + this->uri.video_formats.RGB, + this->uri.video_formats.UYVY), PROP_U_MM (&f[1], this->uri.prop_video.size, SPA_POD_TYPE_RECTANGLE, 320, 240, 1, 1, @@ -529,16 +530,14 @@ spa_videotestsrc_node_port_set_format (SpaNode *node, SpaPODBuilder b = { NULL }; SpaPODFrame f[2]; - switch (raw_info->format) { - case SPA_VIDEO_FORMAT_RGB: - this->bpp = 3; - break; - case SPA_VIDEO_FORMAT_UYVY: - this->bpp = 2; - break; - default: - return SPA_RESULT_NOT_IMPLEMENTED; + if (raw_info->format == this->uri.video_formats.RGB) { + this->bpp = 3; } + else if (raw_info->format == this->uri.video_formats.UYVY) { + this->bpp = 2; + } + else + return SPA_RESULT_NOT_IMPLEMENTED; this->info.maxbuffering = -1; this->info.latency = 0; @@ -594,7 +593,7 @@ spa_videotestsrc_node_port_get_format (SpaNode *node, spa_pod_builder_format (&b, &f[0], this->uri.media_types.video, this->uri.media_subtypes.raw, - PROP (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_INT, this->current_format.info.raw.format), + PROP (&f[1], this->uri.prop_video.format, SPA_POD_TYPE_URI, this->current_format.info.raw.format), PROP (&f[1], this->uri.prop_video.size, -SPA_POD_TYPE_RECTANGLE, &this->current_format.info.raw.size), PROP (&f[1], this->uri.prop_video.framerate, -SPA_POD_TYPE_FRACTION, &this->current_format.info.raw.framerate)); *format = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaFormat); @@ -962,6 +961,7 @@ videotestsrc_init (const SpaHandleFactory *factory, spa_media_types_fill (&this->uri.media_types, this->map); spa_media_subtypes_map (this->map, &this->uri.media_subtypes); spa_prop_video_map (this->map, &this->uri.prop_video); + spa_video_formats_map (this->map, &this->uri.video_formats); this->node = videotestsrc_node; this->clock = videotestsrc_clock; diff --git a/spa/tests/test-props.c b/spa/tests/test-props.c index 407c65b3c..fe656cef8 100644 --- a/spa/tests/test-props.c +++ b/spa/tests/test-props.c @@ -40,12 +40,12 @@ */ spa_build (SPA_MEDIA_TYPE_VIDEO, SPA_MEDIA_SUBTYPE_RAW, - prop_video.format, SPA_PROP_TYPE_INT, - SPA_VIDEO_FORMAT_I420 + prop_video.format, SPA_PROP_TYPE_URI, + video_formats.I420 SPA_POD_PROP_FLAG_UNSET | SPA_PROP_RANGE_ENUM, 2, - SPA_VIDEO_FORMAT_I420, - SPA_VIDEO_FORMAT_YUY2, + video_formats.I420, + video_formats.YUY2, prop_video.size , SPA_PROP_TYPE_RECTANGLE, 320, 240, SPA_POD_PROP_FLAG_UNSET | @@ -63,6 +63,7 @@ spa_build (SPA_MEDIA_TYPE_VIDEO, SPA_MEDIA_SUBTYPE_RAW, static SpaMediaTypes media_types; static SpaMediaSubtypes media_subtypes; static SpaPropVideo prop_video; +static SpaVideoFormats video_formats; static void do_static_struct (void) @@ -101,9 +102,9 @@ do_static_struct (void) { { sizeof (test_format.props.format_vals) + sizeof (SpaPODPropBody), SPA_POD_TYPE_PROP } , { prop_video.format, SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET, - { sizeof (uint32_t), SPA_POD_TYPE_INT } }, }, - { SPA_VIDEO_FORMAT_I420, - { SPA_VIDEO_FORMAT_I420, SPA_VIDEO_FORMAT_YUY2 } }, 0, + { sizeof (uint32_t), SPA_POD_TYPE_URI } }, }, + { video_formats.I420, + { video_formats.I420, video_formats.YUY2 } }, 0, { { sizeof (test_format.props.size_vals) + sizeof (SpaPODPropBody), SPA_POD_TYPE_PROP } , @@ -151,6 +152,7 @@ main (int argc, char *argv[]) spa_media_types_fill (&media_types, spa_id_map_get_default()); spa_media_subtypes_map (spa_id_map_get_default(), &media_subtypes); spa_prop_video_map (spa_id_map_get_default(), &prop_video); + spa_video_formats_map (spa_id_map_get_default(), &video_formats); spa_pod_builder_init (&b, buffer, sizeof (buffer)); @@ -160,9 +162,9 @@ main (int argc, char *argv[]) spa_pod_builder_push_prop (&b, &frame[1], prop_video.format, SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET | SPA_POD_PROP_FLAG_READWRITE); - spa_pod_builder_int (&b, SPA_VIDEO_FORMAT_I420); - spa_pod_builder_int (&b, SPA_VIDEO_FORMAT_I420); - spa_pod_builder_int (&b, SPA_VIDEO_FORMAT_YUY2); + spa_pod_builder_uri (&b, video_formats.I420); + spa_pod_builder_uri (&b, video_formats.I420); + spa_pod_builder_uri (&b, video_formats.YUY2); spa_pod_builder_pop (&b, &frame[1]); SpaRectangle size_min_max[] = { { 1, 1 }, { INT32_MAX, INT32_MAX } }; @@ -192,10 +194,10 @@ main (int argc, char *argv[]) SPA_POD_TYPE_PROP, &frame[1], prop_video.format, SPA_POD_PROP_FLAG_UNSET | SPA_POD_PROP_RANGE_ENUM, - SPA_POD_TYPE_INT, 3, - SPA_VIDEO_FORMAT_I420, - SPA_VIDEO_FORMAT_I420, - SPA_VIDEO_FORMAT_YUY2, + SPA_POD_TYPE_URI, 3, + video_formats.I420, + video_formats.I420, + video_formats.YUY2, -SPA_POD_TYPE_PROP, &frame[1], SPA_POD_TYPE_PROP, &frame[1], prop_video.size, SPA_POD_PROP_FLAG_UNSET | @@ -227,10 +229,10 @@ main (int argc, char *argv[]) SPA_POD_TYPE_PROP, &frame[1], prop_video.format, SPA_POD_PROP_FLAG_UNSET | SPA_POD_PROP_RANGE_ENUM, - SPA_POD_TYPE_INT, 3, - SPA_VIDEO_FORMAT_I420, - SPA_VIDEO_FORMAT_I420, - SPA_VIDEO_FORMAT_YUY2, + SPA_POD_TYPE_URI, 3, + video_formats.I420, + video_formats.I420, + video_formats.YUY2, -SPA_POD_TYPE_PROP, &frame[1], SPA_POD_TYPE_PROP, &frame[1], prop_video.size, SPA_POD_PROP_FLAG_UNSET |