omx: add an helper to convert OMX color format to GStreamer color format

This commit is contained in:
Aurélien Zanelli 2014-04-09 18:51:12 +02:00 committed by Julien Isorce
parent 718fd1bb93
commit c115da9fd5
3 changed files with 95 additions and 66 deletions

View file

@ -31,6 +31,58 @@
GST_DEBUG_CATEGORY (gst_omx_video_debug_category); GST_DEBUG_CATEGORY (gst_omx_video_debug_category);
#define GST_CAT_DEFAULT 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 * GList *
gst_omx_video_get_supported_colorformats (GstOMXPort * port, gst_omx_video_get_supported_colorformats (GstOMXPort * port,
GstVideoCodecState * state) GstVideoCodecState * state)
@ -41,6 +93,7 @@ gst_omx_video_get_supported_colorformats (GstOMXPort * port,
GList *negotiation_map = NULL; GList *negotiation_map = NULL;
gint old_index; gint old_index;
GstOMXVideoNegotiationMap *m; GstOMXVideoNegotiationMap *m;
GstVideoFormat f;
GST_OMX_INIT_STRUCT (&param); GST_OMX_INIT_STRUCT (&param);
param.nPortIndex = port->index; param.nPortIndex = port->index;
@ -64,31 +117,21 @@ gst_omx_video_get_supported_colorformats (GstOMXPort * port,
break; break;
if (err == OMX_ErrorNone || err == OMX_ErrorNoMore) { if (err == OMX_ErrorNone || err == OMX_ErrorNoMore) {
switch (param.eColorFormat) { f = gst_omx_video_get_format_from_omx (param.eColorFormat);
case OMX_COLOR_FormatYUV420Planar:
case OMX_COLOR_FormatYUV420PackedPlanar: if (f != GST_VIDEO_FORMAT_UNKNOWN) {
m = g_slice_new (GstOMXVideoNegotiationMap); m = g_slice_new (GstOMXVideoNegotiationMap);
m->format = GST_VIDEO_FORMAT_I420; m->format = f;
m->type = param.eColorFormat; m->type = param.eColorFormat;
negotiation_map = g_list_append (negotiation_map, m); negotiation_map = g_list_append (negotiation_map, m);
GST_DEBUG_OBJECT (comp->parent, GST_DEBUG_OBJECT (comp->parent,
"Component supports I420 (%d) at index %u", "Component supports %s (%d) at index %u",
param.eColorFormat, (guint) param.nIndex); gst_video_format_to_string (f), param.eColorFormat,
break; (guint) param.nIndex);
case OMX_COLOR_FormatYUV420SemiPlanar: } else {
m = g_slice_new (GstOMXVideoNegotiationMap); GST_DEBUG_OBJECT (comp->parent,
m->format = GST_VIDEO_FORMAT_NV12; "Component supports unsupported color format %d at index %u",
m->type = param.eColorFormat; param.eColorFormat, (guint) param.nIndex);
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;
} }
} }
old_index = param.nIndex++; old_index = param.nIndex++;

View file

@ -38,6 +38,9 @@ typedef struct
OMX_COLOR_FORMATTYPE type; OMX_COLOR_FORMATTYPE type;
} GstOMXVideoNegotiationMap; } GstOMXVideoNegotiationMap;
GstVideoFormat
gst_omx_video_get_format_from_omx (OMX_COLOR_FORMATTYPE omx_colorformat);
GList * GList *
gst_omx_video_get_supported_colorformats (GstOMXPort * port, gst_omx_video_get_supported_colorformats (GstOMXPort * port,
GstVideoCodecState * state); GstVideoCodecState * state);

View file

@ -1094,30 +1094,21 @@ gst_omx_video_dec_reconfigure_output_port (GstOMXVideoDec * self)
gst_omx_port_get_port_definition (port, &port_def); gst_omx_port_get_port_definition (port, &port_def);
g_assert (port_def.format.video.eCompressionFormat == OMX_VIDEO_CodingUnused); g_assert (port_def.format.video.eCompressionFormat == OMX_VIDEO_CodingUnused);
switch (port_def.format.video.eColorFormat) { format =
case OMX_COLOR_FormatYUV420Planar: gst_omx_video_get_format_from_omx (port_def.format.video.eColorFormat);
case OMX_COLOR_FormatYUV420PackedPlanar:
GST_DEBUG_OBJECT (self, "Output is I420 (%d)", if (format == GST_VIDEO_FORMAT_UNKNOWN) {
port_def.format.video.eColorFormat); GST_ERROR_OBJECT (self, "Unsupported color format: %d",
format = GST_VIDEO_FORMAT_I420; port_def.format.video.eColorFormat);
break; GST_VIDEO_DECODER_STREAM_UNLOCK (self);
case OMX_COLOR_FormatYUV420SemiPlanar: err = OMX_ErrorUndefined;
GST_DEBUG_OBJECT (self, "Output is NV12 (%d)", goto done;
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;
} }
GST_DEBUG_OBJECT (self, 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), gst_video_format_to_string (format),
port_def.format.video.eColorFormat,
(guint) port_def.format.video.nFrameWidth, (guint) port_def.format.video.nFrameWidth,
(guint) port_def.format.video.nFrameHeight); (guint) port_def.format.video.nFrameHeight);
@ -1223,31 +1214,23 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
g_assert (port_def.format.video.eCompressionFormat == g_assert (port_def.format.video.eCompressionFormat ==
OMX_VIDEO_CodingUnused); OMX_VIDEO_CodingUnused);
switch (port_def.format.video.eColorFormat) { format =
case OMX_COLOR_FormatYUV420Planar: gst_omx_video_get_format_from_omx (port_def.format.
case OMX_COLOR_FormatYUV420PackedPlanar: video.eColorFormat);
GST_DEBUG_OBJECT (self, "Output is I420 (%d)",
port_def.format.video.eColorFormat); if (format == GST_VIDEO_FORMAT_UNKNOWN) {
format = GST_VIDEO_FORMAT_I420; GST_ERROR_OBJECT (self, "Unsupported color format: %d",
break; port_def.format.video.eColorFormat);
case OMX_COLOR_FormatYUV420SemiPlanar: if (buf)
GST_DEBUG_OBJECT (self, "Output is NV12 (%d)", gst_omx_port_release_buffer (port, buf);
port_def.format.video.eColorFormat); GST_VIDEO_DECODER_STREAM_UNLOCK (self);
format = GST_VIDEO_FORMAT_NV12; goto caps_failed;
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;
} }
GST_DEBUG_OBJECT (self, 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), gst_video_format_to_string (format),
port_def.format.video.eColorFormat,
(guint) port_def.format.video.nFrameWidth, (guint) port_def.format.video.nFrameWidth,
(guint) port_def.format.video.nFrameHeight); (guint) port_def.format.video.nFrameHeight);