summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Zanelli <aurelien.zanelli@parrot.com>2014-04-09 18:51:12 +0200
committerJulien Isorce <julien.isorce@collabora.co.uk>2014-04-15 15:09:23 +0100
commitc115da9fd508272cf3ffec5ae66892c52e7682f1 (patch)
tree01108c47d18dbb00eb561222ffdc066dcc233a0e
parent718fd1bb93a09137a139d050e537f07daaf654b3 (diff)
omx: add an helper to convert OMX color format to GStreamer color format
-rw-r--r--omx/gstomxvideo.c93
-rw-r--r--omx/gstomxvideo.h3
-rw-r--r--omx/gstomxvideodec.c65
3 files changed, 95 insertions, 66 deletions
diff --git a/omx/gstomxvideo.c b/omx/gstomxvideo.c
index b8d8fd2..f052788 100644
--- a/omx/gstomxvideo.c
+++ b/omx/gstomxvideo.c
@@ -31,6 +31,58 @@
GST_DEBUG_CATEGORY (gst_omx_video_debug_category);
#define GST_CAT_DEFAULT gst_omx_video_debug_category
+GstVideoFormat
+gst_omx_video_get_format_from_omx (OMX_COLOR_FORMATTYPE omx_colorformat)
+{
+ GstVideoFormat format;
+
+ switch (omx_colorformat) {
+ case OMX_COLOR_FormatL8:
+ format = GST_VIDEO_FORMAT_GRAY8;
+ break;
+ case OMX_COLOR_FormatYUV420Planar:
+ case OMX_COLOR_FormatYUV420PackedPlanar:
+ format = GST_VIDEO_FORMAT_I420;
+ break;
+ case OMX_COLOR_FormatYUV420SemiPlanar:
+ format = GST_VIDEO_FORMAT_NV12;
+ break;
+ case OMX_COLOR_FormatYUV422SemiPlanar:
+ format = GST_VIDEO_FORMAT_NV16;
+ break;
+ case OMX_COLOR_FormatYCbYCr:
+ format = GST_VIDEO_FORMAT_YUY2;
+ break;
+ case OMX_COLOR_FormatYCrYCb:
+ format = GST_VIDEO_FORMAT_YVYU;
+ break;
+ case OMX_COLOR_FormatCbYCrY:
+ format = GST_VIDEO_FORMAT_UYVY;
+ break;
+ case OMX_COLOR_Format32bitARGB8888:
+ /* There is a mismatch in omxil specification 4.2.1 between
+ * OMX_COLOR_Format32bitARGB8888 and its description
+ * Follow the description */
+ format = GST_VIDEO_FORMAT_ABGR;
+ break;
+ case OMX_COLOR_Format32bitBGRA8888:
+ /* Same issue as OMX_COLOR_Format32bitARGB8888 */
+ format = GST_VIDEO_FORMAT_ARGB;
+ break;
+ case OMX_COLOR_Format16bitRGB565:
+ format = GST_VIDEO_FORMAT_RGB16;
+ break;
+ case OMX_COLOR_Format16bitBGR565:
+ format = GST_VIDEO_FORMAT_BGR16;
+ break;
+ default:
+ format = GST_VIDEO_FORMAT_UNKNOWN;
+ break;
+ }
+
+ return format;
+}
+
GList *
gst_omx_video_get_supported_colorformats (GstOMXPort * port,
GstVideoCodecState * state)
@@ -41,6 +93,7 @@ gst_omx_video_get_supported_colorformats (GstOMXPort * port,
GList *negotiation_map = NULL;
gint old_index;
GstOMXVideoNegotiationMap *m;
+ GstVideoFormat f;
GST_OMX_INIT_STRUCT (&param);
param.nPortIndex = port->index;
@@ -64,31 +117,21 @@ gst_omx_video_get_supported_colorformats (GstOMXPort * port,
break;
if (err == OMX_ErrorNone || err == OMX_ErrorNoMore) {
- switch (param.eColorFormat) {
- case OMX_COLOR_FormatYUV420Planar:
- case OMX_COLOR_FormatYUV420PackedPlanar:
- m = g_slice_new (GstOMXVideoNegotiationMap);
- m->format = GST_VIDEO_FORMAT_I420;
- m->type = param.eColorFormat;
- negotiation_map = g_list_append (negotiation_map, m);
- GST_DEBUG_OBJECT (comp->parent,
- "Component supports I420 (%d) at index %u",
- param.eColorFormat, (guint) param.nIndex);
- break;
- case OMX_COLOR_FormatYUV420SemiPlanar:
- m = g_slice_new (GstOMXVideoNegotiationMap);
- m->format = GST_VIDEO_FORMAT_NV12;
- m->type = param.eColorFormat;
- negotiation_map = g_list_append (negotiation_map, m);
- GST_DEBUG_OBJECT (comp->parent,
- "Component supports NV12 (%d) at index %u",
- param.eColorFormat, (guint) param.nIndex);
- break;
- default:
- GST_DEBUG_OBJECT (comp->parent,
- "Component supports unsupported color format %d at index %u",
- param.eColorFormat, (guint) param.nIndex);
- break;
+ f = gst_omx_video_get_format_from_omx (param.eColorFormat);
+
+ if (f != GST_VIDEO_FORMAT_UNKNOWN) {
+ m = g_slice_new (GstOMXVideoNegotiationMap);
+ m->format = f;
+ m->type = param.eColorFormat;
+ negotiation_map = g_list_append (negotiation_map, m);
+ GST_DEBUG_OBJECT (comp->parent,
+ "Component supports %s (%d) at index %u",
+ gst_video_format_to_string (f), param.eColorFormat,
+ (guint) param.nIndex);
+ } else {
+ GST_DEBUG_OBJECT (comp->parent,
+ "Component supports unsupported color format %d at index %u",
+ param.eColorFormat, (guint) param.nIndex);
}
}
old_index = param.nIndex++;
diff --git a/omx/gstomxvideo.h b/omx/gstomxvideo.h
index 6ab1b49..5006d88 100644
--- a/omx/gstomxvideo.h
+++ b/omx/gstomxvideo.h
@@ -38,6 +38,9 @@ typedef struct
OMX_COLOR_FORMATTYPE type;
} GstOMXVideoNegotiationMap;
+GstVideoFormat
+gst_omx_video_get_format_from_omx (OMX_COLOR_FORMATTYPE omx_colorformat);
+
GList *
gst_omx_video_get_supported_colorformats (GstOMXPort * port,
GstVideoCodecState * state);
diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
index 357e236..10d87dc 100644
--- a/omx/gstomxvideodec.c
+++ b/omx/gstomxvideodec.c
@@ -1094,30 +1094,21 @@ gst_omx_video_dec_reconfigure_output_port (GstOMXVideoDec * self)
gst_omx_port_get_port_definition (port, &port_def);
g_assert (port_def.format.video.eCompressionFormat == OMX_VIDEO_CodingUnused);
- switch (port_def.format.video.eColorFormat) {
- case OMX_COLOR_FormatYUV420Planar:
- case OMX_COLOR_FormatYUV420PackedPlanar:
- GST_DEBUG_OBJECT (self, "Output is I420 (%d)",
- port_def.format.video.eColorFormat);
- format = GST_VIDEO_FORMAT_I420;
- break;
- case OMX_COLOR_FormatYUV420SemiPlanar:
- GST_DEBUG_OBJECT (self, "Output is NV12 (%d)",
- port_def.format.video.eColorFormat);
- format = GST_VIDEO_FORMAT_NV12;
- break;
- default:
- GST_ERROR_OBJECT (self, "Unsupported color format: %d",
- port_def.format.video.eColorFormat);
- GST_VIDEO_DECODER_STREAM_UNLOCK (self);
- err = OMX_ErrorUndefined;
- goto done;
- break;
+ format =
+ gst_omx_video_get_format_from_omx (port_def.format.video.eColorFormat);
+
+ if (format == GST_VIDEO_FORMAT_UNKNOWN) {
+ GST_ERROR_OBJECT (self, "Unsupported color format: %d",
+ port_def.format.video.eColorFormat);
+ GST_VIDEO_DECODER_STREAM_UNLOCK (self);
+ err = OMX_ErrorUndefined;
+ goto done;
}
GST_DEBUG_OBJECT (self,
- "Setting output state: format %s, width %u, height %u",
+ "Setting output state: format %s (%d), width %u, height %u",
gst_video_format_to_string (format),
+ port_def.format.video.eColorFormat,
(guint) port_def.format.video.nFrameWidth,
(guint) port_def.format.video.nFrameHeight);
@@ -1223,31 +1214,23 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
g_assert (port_def.format.video.eCompressionFormat ==
OMX_VIDEO_CodingUnused);
- switch (port_def.format.video.eColorFormat) {
- case OMX_COLOR_FormatYUV420Planar:
- case OMX_COLOR_FormatYUV420PackedPlanar:
- GST_DEBUG_OBJECT (self, "Output is I420 (%d)",
- port_def.format.video.eColorFormat);
- format = GST_VIDEO_FORMAT_I420;
- break;
- case OMX_COLOR_FormatYUV420SemiPlanar:
- GST_DEBUG_OBJECT (self, "Output is NV12 (%d)",
- port_def.format.video.eColorFormat);
- format = GST_VIDEO_FORMAT_NV12;
- break;
- default:
- GST_ERROR_OBJECT (self, "Unsupported color format: %d",
- port_def.format.video.eColorFormat);
- if (buf)
- gst_omx_port_release_buffer (port, buf);
- GST_VIDEO_DECODER_STREAM_UNLOCK (self);
- goto caps_failed;
- break;
+ format =
+ gst_omx_video_get_format_from_omx (port_def.format.
+ video.eColorFormat);
+
+ if (format == GST_VIDEO_FORMAT_UNKNOWN) {
+ GST_ERROR_OBJECT (self, "Unsupported color format: %d",
+ port_def.format.video.eColorFormat);
+ if (buf)
+ gst_omx_port_release_buffer (port, buf);
+ GST_VIDEO_DECODER_STREAM_UNLOCK (self);
+ goto caps_failed;
}
GST_DEBUG_OBJECT (self,
- "Setting output state: format %s, width %u, height %u",
+ "Setting output state: format %s (%d), width %u, height %u",
gst_video_format_to_string (format),
+ port_def.format.video.eColorFormat,
(guint) port_def.format.video.nFrameWidth,
(guint) port_def.format.video.nFrameHeight);