mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
mxfdemux: Simplify caps selection by using a lookup table
This commit is contained in:
parent
9aa16c2ea5
commit
b6bac882f9
1 changed files with 44 additions and 103 deletions
147
gst/mxf/mxfup.c
147
gst/mxf/mxfup.c
|
@ -45,6 +45,39 @@
|
|||
GST_DEBUG_CATEGORY_EXTERN (mxf_debug);
|
||||
#define GST_CAT_DEFAULT mxf_debug
|
||||
|
||||
static const struct
|
||||
{
|
||||
const gchar *caps;
|
||||
guint32 n_pixel_layout;
|
||||
guint8 pixel_layout[10];
|
||||
} _rgba_mapping_table[] = {
|
||||
{
|
||||
GST_VIDEO_CAPS_RGB, 3, {
|
||||
'R', 8, 'G', 8, 'B', 8}}, {
|
||||
GST_VIDEO_CAPS_BGR, 3, {
|
||||
'B', 8, 'G', 8, 'R', 8}}, {
|
||||
GST_VIDEO_CAPS_YUV ("v308"), 3, {
|
||||
'Y', 8, 'U', 8, 'V', 8}}, {
|
||||
GST_VIDEO_CAPS_xRGB, 4, {
|
||||
'F', 8, 'R', 8, 'G', 8, 'B', 8}}, {
|
||||
GST_VIDEO_CAPS_RGBx, 4, {
|
||||
'R', 8, 'G', 8, 'B', 8, 'F', 8}}, {
|
||||
GST_VIDEO_CAPS_xBGR, 4, {
|
||||
'F', 8, 'B', 8, 'G', 8, 'R', 8}}, {
|
||||
GST_VIDEO_CAPS_BGRx, 4, {
|
||||
'B', 8, 'G', 8, 'R', 8, 'F', 8}}, {
|
||||
GST_VIDEO_CAPS_RGBA, 4, {
|
||||
'R', 8, 'G', 8, 'B', 8, 'A', 8}}, {
|
||||
GST_VIDEO_CAPS_ARGB, 4, {
|
||||
'A', 8, 'R', 8, 'G', 8, 'B', 8}}, {
|
||||
GST_VIDEO_CAPS_BGRA, 4, {
|
||||
'B', 8, 'G', 8, 'R', 8, 'A', 8}}, {
|
||||
GST_VIDEO_CAPS_ABGR, 4, {
|
||||
'A', 8, 'B', 8, 'G', 8, 'R', 8}}, {
|
||||
GST_VIDEO_CAPS_YUV ("AYUV"), 4, {
|
||||
'A', 8, 'Y', 8, 'U', 8, 'V', 8}}
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
guint32 image_start_offset;
|
||||
|
@ -118,83 +151,22 @@ mxf_up_rgba_create_caps (MXFMetadataTimelineTrack * track,
|
|||
MXFEssenceElementHandleFunc * handler, gpointer * mapping_data)
|
||||
{
|
||||
GstCaps *caps = NULL;
|
||||
guint i;
|
||||
|
||||
if (!d->pixel_layout) {
|
||||
GST_ERROR ("No pixel layout");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (d->n_pixel_layout == 3) {
|
||||
if (d->pixel_layout[0] == 'R' && d->pixel_layout[2] == 'G'
|
||||
&& d->pixel_layout[4] == 'B' && d->pixel_layout[1] == 8
|
||||
&& d->pixel_layout[3] == 8 && d->pixel_layout[5] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_RGB);
|
||||
} else if (d->pixel_layout[0] == 'B' && d->pixel_layout[2] == 'G'
|
||||
&& d->pixel_layout[4] == 'R' && d->pixel_layout[1] == 8
|
||||
&& d->pixel_layout[3] == 8 && d->pixel_layout[5] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_BGR);
|
||||
} else if (d->pixel_layout[0] == 'Y' && d->pixel_layout[2] == 'U'
|
||||
&& d->pixel_layout[4] == 'V' && d->pixel_layout[1] == 8
|
||||
&& d->pixel_layout[3] == 8 && d->pixel_layout[5] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_YUV ("v308"));
|
||||
} else {
|
||||
GST_ERROR ("Unsupport 3 component pixel layout");
|
||||
return NULL;
|
||||
for (i = 0; i < G_N_ELEMENTS (_rgba_mapping_table); i++) {
|
||||
if (d->n_pixel_layout != _rgba_mapping_table[i].n_pixel_layout)
|
||||
continue;
|
||||
|
||||
if (memcmp (d->pixel_layout, &_rgba_mapping_table[i].pixel_layout,
|
||||
_rgba_mapping_table[i].n_pixel_layout * 2) == 0) {
|
||||
caps = gst_caps_from_string (_rgba_mapping_table[i].caps);
|
||||
break;
|
||||
}
|
||||
} else if (d->n_pixel_layout == 4) {
|
||||
if (d->pixel_layout[0] == 'R' && d->pixel_layout[2] == 'G'
|
||||
&& d->pixel_layout[4] == 'B' && d->pixel_layout[6] == 'F'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_RGBx);
|
||||
} else if (d->pixel_layout[0] == 'B' && d->pixel_layout[2] == 'G'
|
||||
&& d->pixel_layout[4] == 'R' && d->pixel_layout[6] == 'F'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_BGRx);
|
||||
} else if (d->pixel_layout[0] == 'F' && d->pixel_layout[2] == 'R'
|
||||
&& d->pixel_layout[4] == 'G' && d->pixel_layout[6] == 'B'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_xRGB);
|
||||
} else if (d->pixel_layout[0] == 'F' && d->pixel_layout[2] == 'B'
|
||||
&& d->pixel_layout[4] == 'G' && d->pixel_layout[6] == 'R'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_xBGR);
|
||||
} else if (d->pixel_layout[0] == 'A' && d->pixel_layout[2] == 'R'
|
||||
&& d->pixel_layout[4] == 'G' && d->pixel_layout[6] == 'B'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_ARGB);
|
||||
} else if (d->pixel_layout[0] == 'A' && d->pixel_layout[2] == 'B'
|
||||
&& d->pixel_layout[4] == 'G' && d->pixel_layout[6] == 'R'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_ABGR);
|
||||
} else if (d->pixel_layout[0] == 'R' && d->pixel_layout[2] == 'G'
|
||||
&& d->pixel_layout[4] == 'B' && d->pixel_layout[6] == 'A'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_RGBA);
|
||||
} else if (d->pixel_layout[0] == 'B' && d->pixel_layout[2] == 'G'
|
||||
&& d->pixel_layout[4] == 'R' && d->pixel_layout[6] == 'A'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_BGRA);
|
||||
} else if (d->pixel_layout[0] == 'A' && d->pixel_layout[2] == 'Y'
|
||||
&& d->pixel_layout[4] == 'U' && d->pixel_layout[6] == 'V'
|
||||
&& d->pixel_layout[1] == 8 && d->pixel_layout[3] == 8
|
||||
&& d->pixel_layout[5] == 8 && d->pixel_layout[7] == 8) {
|
||||
caps = gst_caps_from_string (GST_VIDEO_CAPS_YUV ("AYUV"));
|
||||
} else {
|
||||
GST_ERROR ("Unsupport 4 component pixel layout");
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
GST_ERROR ("Pixel layouts with %u components not supported yet",
|
||||
d->n_pixel_layout);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (caps) {
|
||||
|
@ -206,6 +178,8 @@ mxf_up_rgba_create_caps (MXFMetadataTimelineTrack * track,
|
|||
((MXFMetadataGenericPictureEssenceDescriptor *) d)->image_end_offset;
|
||||
|
||||
*mapping_data = data;
|
||||
} else {
|
||||
GST_WARNING ("Unsupported pixel layout");
|
||||
}
|
||||
|
||||
return caps;
|
||||
|
@ -287,39 +261,6 @@ static const guint8 up_essence_container_ul[] = {
|
|||
0x0D, 0x01, 0x03, 0x01, 0x02, 0x05, 0x7F, 0x01
|
||||
};
|
||||
|
||||
static const struct
|
||||
{
|
||||
const gchar *caps;
|
||||
guint32 n_pixel_layout;
|
||||
guint8 pixel_layout[10];
|
||||
} _rgba_mapping_table[] = {
|
||||
{
|
||||
GST_VIDEO_CAPS_RGB, 3, {
|
||||
'R', 8, 'G', 8, 'B', 8}}, {
|
||||
GST_VIDEO_CAPS_BGR, 3, {
|
||||
'B', 8, 'G', 8, 'R', 8}}, {
|
||||
GST_VIDEO_CAPS_YUV ("v308"), 3, {
|
||||
'Y', 8, 'U', 8, 'V', 8}}, {
|
||||
GST_VIDEO_CAPS_xRGB, 4, {
|
||||
'F', 8, 'R', 8, 'G', 8, 'B', 8}}, {
|
||||
GST_VIDEO_CAPS_RGBx, 4, {
|
||||
'R', 8, 'G', 8, 'B', 8, 'F', 8}}, {
|
||||
GST_VIDEO_CAPS_xBGR, 4, {
|
||||
'F', 8, 'B', 8, 'G', 8, 'R', 8}}, {
|
||||
GST_VIDEO_CAPS_BGRx, 4, {
|
||||
'B', 8, 'G', 8, 'R', 8, 'F', 8}}, {
|
||||
GST_VIDEO_CAPS_RGBA, 4, {
|
||||
'R', 8, 'G', 8, 'B', 8, 'A', 8}}, {
|
||||
GST_VIDEO_CAPS_ARGB, 4, {
|
||||
'A', 8, 'R', 8, 'G', 8, 'B', 8}}, {
|
||||
GST_VIDEO_CAPS_BGRA, 4, {
|
||||
'B', 8, 'G', 8, 'R', 8, 'A', 8}}, {
|
||||
GST_VIDEO_CAPS_ABGR, 4, {
|
||||
'A', 8, 'B', 8, 'G', 8, 'R', 8}}, {
|
||||
GST_VIDEO_CAPS_YUV ("AYUV"), 4, {
|
||||
'A', 8, 'Y', 8, 'U', 8, 'V', 8}}
|
||||
};
|
||||
|
||||
static MXFMetadataFileDescriptor *
|
||||
mxf_up_get_rgba_descriptor (GstPadTemplate * tmpl, GstCaps * caps,
|
||||
MXFEssenceElementWriteFunc * handler, gpointer * mapping_data)
|
||||
|
|
Loading…
Reference in a new issue