summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2018-08-21 15:14:09 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2018-09-19 10:52:25 +0200
commit9b1598e5ec27e916abee930bf31a23772c946008 (patch)
treea09db48dc17f2b749d8abb6621a586d98c99cfc9
parent313deb4ecf5dcfbe078bdb0d8f997ce684bd69e4 (diff)
downloadgst-omx-9b1598e5ec27e916abee930bf31a23772c946008.tar.gz
omx: log OMX events with OMX_PERFORMANCE debug category
It has been useful to have a clear raw and structured view of the gst <-> OMX exchanges when debugging. https://bugzilla.gnome.org/show_bug.cgi?id=797171
-rw-r--r--omx/gstomx.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/omx/gstomx.c b/omx/gstomx.c
index c57eb1d..7abbd05 100644
--- a/omx/gstomx.c
+++ b/omx/gstomx.c
@@ -491,12 +491,153 @@ gst_omx_component_wait_message (GstOMXComponent * comp, GstClockTime timeout)
return signalled;
}
+static const gchar *
+omx_event_type_to_str (OMX_EVENTTYPE event)
+{
+ switch (event) {
+ case OMX_EventCmdComplete:
+ return "EventCmdComplete";
+ case OMX_EventError:
+ return "EventError";
+ case OMX_EventMark:
+ return "EventMark";
+ case OMX_EventPortSettingsChanged:
+ return "EventPortSettingsChanged";
+ case OMX_EventBufferFlag:
+ return "EventBufferFlag";
+ case OMX_EventResourcesAcquired:
+ return "EventResourcesAcquired";
+ case OMX_EventComponentResumed:
+ return "EventComponentResumed";
+ case OMX_EventDynamicResourcesAvailable:
+ return "EventDynamicResourcesAvailable";
+ case OMX_EventPortFormatDetected:
+ return "EventPortFormatDetected";
+#ifdef OMX_EventIndexSettingChanged
+ case OMX_EventIndexSettingChanged:
+ return "EventIndexSettingChanged";
+#endif
+#ifdef OMX_EventPortNeedsDisable
+ case OMX_EventPortNeedsDisable:
+ return "EventPortNeedsDisable";
+#endif
+#ifdef OMX_EventPortNeedsFlush
+ case OMX_EventPortNeedsFlush:
+ return "EventPortNeedsFlush";
+#endif
+ case OMX_EventKhronosExtensions:
+ case OMX_EventVendorStartUnused:
+ case OMX_EventMax:
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+/* See "Table 3-11: Event Parameter Usage" */
+static GstStructure *
+omx_event_to_debug_struct (OMX_EVENTTYPE event,
+ guint32 data1, guint32 data2, gpointer event_data)
+{
+ const gchar *name;
+
+ name = omx_event_type_to_str (event);
+ switch (event) {
+ case OMX_EventCmdComplete:
+ {
+ const gchar *cmd = gst_omx_command_to_string (data1);
+
+ if (!cmd)
+ break;
+
+ switch (data1) {
+ case OMX_CommandStateSet:
+ return gst_structure_new (name,
+ "command", G_TYPE_STRING, cmd,
+ "state-reached", G_TYPE_STRING, gst_omx_state_to_string (data2),
+ NULL);
+ case OMX_CommandFlush:
+ case OMX_CommandPortDisable:
+ case OMX_CommandPortEnable:
+ case OMX_CommandMarkBuffer:
+ return gst_structure_new (name,
+ "command", G_TYPE_STRING, cmd, "port", G_TYPE_UINT, data2,
+ "error", G_TYPE_STRING,
+ gst_omx_error_to_string (GPOINTER_TO_UINT (event_data)), NULL);
+ case OMX_CommandKhronosExtensions:
+ case OMX_CommandVendorStartUnused:
+ case OMX_CommandMax:
+ break;
+ }
+ }
+ break;
+ case OMX_EventError:
+ return gst_structure_new (name, "error", G_TYPE_STRING,
+ gst_omx_error_to_string (data1), "extra-info", G_TYPE_STRING,
+ gst_omx_error_to_string (data2), NULL);
+ case OMX_EventMark:
+ case OMX_EventComponentResumed:
+ case OMX_EventResourcesAcquired:
+ case OMX_EventDynamicResourcesAvailable:
+ case OMX_EventPortFormatDetected:
+ return gst_structure_new_empty (name);
+ case OMX_EventPortSettingsChanged:
+#ifdef OMX_EventIndexSettingChanged
+ case OMX_EventIndexSettingChanged:
+#endif
+#ifdef OMX_EventPortNeedsDisable
+ case OMX_EventPortNeedsDisable:
+#endif
+#ifdef OMX_EventPortNeedsFlush
+ case OMX_EventPortNeedsFlush:
+#endif
+ return gst_structure_new (name, "port", G_TYPE_UINT,
+ data1, "param-config", G_TYPE_UINT, data2, NULL);
+ case OMX_EventBufferFlag:
+ return gst_structure_new (name, "port", G_TYPE_UINT,
+ data1, "flags", gst_omx_buffer_flags_to_string (data2), NULL);
+ case OMX_EventKhronosExtensions:
+ case OMX_EventVendorStartUnused:
+ case OMX_EventMax:
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+static void
+log_omx_performance_event (GstOMXComponent * comp, OMX_EVENTTYPE event,
+ guint32 data1, guint32 data2, gpointer event_data)
+{
+ GstStructure *s;
+
+ /* Don't bother creating useless structs if not needed */
+ if (gst_debug_category_get_threshold (OMX_PERFORMANCE) < GST_LEVEL_DEBUG)
+ return;
+
+ s = omx_event_to_debug_struct (event, data1, data2, event_data);
+ if (!s) {
+ GST_CAT_WARNING_OBJECT (OMX_PERFORMANCE, comp->parent,
+ "invalid event 0x%08x Data1 %u Data2 %u EventData %p", event, data1,
+ data2, event_data);
+ return;
+ }
+
+ GST_CAT_DEBUG_OBJECT (OMX_PERFORMANCE, comp->parent, "%" GST_PTR_FORMAT, s);
+
+ gst_structure_free (s);
+}
+
static OMX_ERRORTYPE
EventHandler (OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_EVENTTYPE eEvent,
OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData)
{
GstOMXComponent *comp = (GstOMXComponent *) pAppData;
+ log_omx_performance_event (comp, eEvent, nData1, nData2, pEventData);
+
switch (eEvent) {
case OMX_EventCmdComplete:
{