mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
omx: add an helper to convert OMX color format to GStreamer color format
This commit is contained in:
parent
718fd1bb93
commit
c115da9fd5
3 changed files with 95 additions and 66 deletions
|
@ -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 (¶m);
|
GST_OMX_INIT_STRUCT (¶m);
|
||||||
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);
|
|
||||||
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,
|
GST_DEBUG_OBJECT (comp->parent,
|
||||||
"Component supports unsupported color format %d at index %u",
|
"Component supports unsupported color format %d at index %u",
|
||||||
param.eColorFormat, (guint) param.nIndex);
|
param.eColorFormat, (guint) param.nIndex);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
old_index = param.nIndex++;
|
old_index = param.nIndex++;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
|
||||||
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",
|
GST_ERROR_OBJECT (self, "Unsupported color format: %d",
|
||||||
port_def.format.video.eColorFormat);
|
port_def.format.video.eColorFormat);
|
||||||
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
||||||
err = OMX_ErrorUndefined;
|
err = OMX_ErrorUndefined;
|
||||||
goto done;
|
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;
|
|
||||||
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",
|
GST_ERROR_OBJECT (self, "Unsupported color format: %d",
|
||||||
port_def.format.video.eColorFormat);
|
port_def.format.video.eColorFormat);
|
||||||
if (buf)
|
if (buf)
|
||||||
gst_omx_port_release_buffer (port, buf);
|
gst_omx_port_release_buffer (port, buf);
|
||||||
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|
||||||
goto caps_failed;
|
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue