IVGCVSW-4161 Provide for per model call back registration

!armnn:2810

Signed-off-by: Finn Williams <Finn.Williams@arm.com>
Change-Id: Idf56d42bd767baa5df0059a2f489f75281f8ac71
diff --git a/src/timelineDecoder/TimelineCaptureCommandHandler.cpp b/src/timelineDecoder/TimelineCaptureCommandHandler.cpp
index fb6935e..58edd9f 100644
--- a/src/timelineDecoder/TimelineCaptureCommandHandler.cpp
+++ b/src/timelineDecoder/TimelineCaptureCommandHandler.cpp
@@ -6,7 +6,7 @@
 #include "TimelineCaptureCommandHandler.hpp"
 
 #include <string>
-
+#include <armnn/Logging.hpp>
 namespace armnn
 {
 
@@ -28,7 +28,15 @@
     uint32_t offset = 0;
     m_PacketLength = packet.GetLength();
 
-    if ( m_PacketLength < 8 )
+    // We are expecting TimelineDirectoryCaptureCommandHandler to set the thread id size
+    // if it not set in the constructor
+    if (m_ThreadIdSize == 0)
+    {
+        ARMNN_LOG(error) << "TimelineCaptureCommandHandler: m_ThreadIdSize has not been set";
+        return;
+    }
+
+    if (packet.GetLength() < 8)
     {
         return;
     }
@@ -125,6 +133,11 @@
     m_TimelineDecoder.CreateEvent(event);
 }
 
+void TimelineCaptureCommandHandler::SetThreadIdSize(uint32_t size)
+{
+    m_ThreadIdSize = size;
+}
+
 void TimelineCaptureCommandHandler::operator()(const profiling::Packet& packet)
 {
     ParseData(packet);
diff --git a/src/timelineDecoder/TimelineCaptureCommandHandler.hpp b/src/timelineDecoder/TimelineCaptureCommandHandler.hpp
index b69e615..e143b5f 100644
--- a/src/timelineDecoder/TimelineCaptureCommandHandler.hpp
+++ b/src/timelineDecoder/TimelineCaptureCommandHandler.hpp
@@ -5,9 +5,9 @@
 
 #pragma once
 
-#include <CommandHandlerFunctor.hpp>
 #include "armnn/profiling/ITimelineDecoder.hpp"
 
+#include <CommandHandlerFunctor.hpp>
 #include <Packet.hpp>
 #include <ProfilingUtils.hpp>
 
@@ -31,11 +31,11 @@
                                   uint32_t packetId,
                                   uint32_t version,
                                   ITimelineDecoder& timelineDecoder,
-                                  uint32_t threadId_size)
-        : CommandHandlerFunctor(familyId, packetId, version),
-          m_TimelineDecoder(timelineDecoder),
-          m_ThreadIdSize(threadId_size),
-          m_PacketLength(0)
+                                  uint32_t threadIdSize = 0)
+        : CommandHandlerFunctor(familyId, packetId, version)
+        , m_TimelineDecoder(timelineDecoder)
+        , m_ThreadIdSize(threadIdSize)
+        , m_PacketLength(0)
     {}
 
     void operator()(const armnn::profiling::Packet& packet) override;
@@ -46,12 +46,13 @@
     void ReadRelationship(const unsigned char* data, uint32_t& offset);
     void ReadEvent(const unsigned char* data, uint32_t& offset);
 
+    void SetThreadIdSize(uint32_t size);
+
 private:
     void ParseData(const armnn::profiling::Packet& packet);
 
     ITimelineDecoder& m_TimelineDecoder;
-
-    const uint32_t            m_ThreadIdSize;
+    uint32_t m_ThreadIdSize;
     unsigned int              m_PacketLength;
     static const ReadFunction m_ReadFunctions[];
 
diff --git a/src/timelineDecoder/TimelineDecoder.cpp b/src/timelineDecoder/TimelineDecoder.cpp
index 2f9ac13..f7f4663 100644
--- a/src/timelineDecoder/TimelineDecoder.cpp
+++ b/src/timelineDecoder/TimelineDecoder.cpp
@@ -4,13 +4,14 @@
 //
 
 #include "TimelineDecoder.hpp"
-#include "../profiling/ProfilingUtils.hpp"
-
+#include <ProfilingUtils.hpp>
 #include <iostream>
+
 namespace armnn
 {
 namespace timelinedecoder
 {
+
 TimelineDecoder::TimelineStatus TimelineDecoder::CreateEntity(const Entity &entity)
 {
     if (m_OnNewEntityCallback == nullptr)
@@ -120,6 +121,34 @@
     return TimelineStatus::TimelineStatus_Success;
 }
 
+void TimelineDecoder::SetDefaultCallbacks()
+{
+    SetEntityCallback([](Model& model, const ITimelineDecoder::Entity entity)
+    {
+        model.m_Entities.emplace_back(entity);
+    });
+
+    SetEventClassCallback([](Model& model, const ITimelineDecoder::EventClass eventClass)
+    {
+        model.m_EventClasses.emplace_back(eventClass);
+    });
+
+    SetEventCallback([](Model& model, const ITimelineDecoder::Event event)
+    {
+        model.m_Events.emplace_back(event);
+    });
+
+    SetLabelCallback([](Model& model, const ITimelineDecoder::Label label)
+    {
+        model.m_Labels.emplace_back(label);
+    });
+
+    SetRelationshipCallback([](Model& model, const ITimelineDecoder::Relationship relationship)
+    {
+        model.m_Relationships.emplace_back(relationship);
+    });
+}
+
 void TimelineDecoder::print()
 {
     printLabels();
diff --git a/src/timelineDecoder/TimelineDecoder.hpp b/src/timelineDecoder/TimelineDecoder.hpp
index 4056731..c6d1e4e 100644
--- a/src/timelineDecoder/TimelineDecoder.hpp
+++ b/src/timelineDecoder/TimelineDecoder.hpp
@@ -39,13 +39,14 @@
 
     const Model& GetModel();
 
-
     TimelineStatus SetEntityCallback(const OnNewEntityCallback);
     TimelineStatus SetEventClassCallback(const OnNewEventClassCallback);
     TimelineStatus SetEventCallback(const OnNewEventCallback);
     TimelineStatus SetLabelCallback(const OnNewLabelCallback);
     TimelineStatus SetRelationshipCallback(const OnNewRelationshipCallback);
 
+    void SetDefaultCallbacks();
+
     void print();
 
 private:
diff --git a/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.cpp b/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.cpp
index 655e461..74aefea 100644
--- a/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.cpp
+++ b/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.cpp
@@ -4,6 +4,7 @@
 //
 
 #include "TimelineDirectoryCaptureCommandHandler.hpp"
+#include "TimelineCaptureCommandHandler.hpp"
 
 #include <iostream>
 #include <string>
@@ -41,6 +42,8 @@
     {
         m_SwTraceMessages.push_back(profiling::ReadSwTraceMessage(data, offset));
     }
+
+    m_TimelineCaptureCommandHandler.SetThreadIdSize(m_SwTraceHeader.m_ThreadIdBytes);
 }
 
 void TimelineDirectoryCaptureCommandHandler::Print()
diff --git a/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.hpp b/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.hpp
index b4e0fd2..a22a5d9 100644
--- a/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.hpp
+++ b/src/timelineDecoder/TimelineDirectoryCaptureCommandHandler.hpp
@@ -5,7 +5,8 @@
 
 #pragma once
 
-#include <CommandHandlerFunctor.hpp>
+
+#include <TimelineCaptureCommandHandler.hpp>
 #include <Packet.hpp>
 #include <PacketBuffer.hpp>
 #include <ProfilingUtils.hpp>
@@ -26,8 +27,10 @@
     TimelineDirectoryCaptureCommandHandler(uint32_t familyId,
                                            uint32_t packetId,
                                            uint32_t version,
+                                           TimelineCaptureCommandHandler& timelineCaptureCommandHandler,
                                            bool quietOperation = false)
         : CommandHandlerFunctor(familyId, packetId, version)
+        , m_TimelineCaptureCommandHandler(timelineCaptureCommandHandler)
         , m_QuietOperation(quietOperation)
     {}
 
@@ -40,6 +43,7 @@
     void ParseData(const armnn::profiling::Packet& packet);
     void Print();
 
+    TimelineCaptureCommandHandler& m_TimelineCaptureCommandHandler;
     bool m_QuietOperation;
 };
 
diff --git a/src/timelineDecoder/tests/TimelineTests.cpp b/src/timelineDecoder/tests/TimelineTests.cpp
index 62b4330..1f55515 100644
--- a/src/timelineDecoder/tests/TimelineTests.cpp
+++ b/src/timelineDecoder/tests/TimelineTests.cpp
@@ -83,8 +83,13 @@
 
     profiling::PacketVersionResolver packetVersionResolver;
 
+    TimelineDecoder timelineDecoder;
+    TimelineCaptureCommandHandler timelineCaptureCommandHandler(
+            1, 1, packetVersionResolver.ResolvePacketVersion(1, 1).GetEncodedValue(), timelineDecoder);
+
     TimelineDirectoryCaptureCommandHandler timelineDirectoryCaptureCommandHandler(
-            1, 0, packetVersionResolver.ResolvePacketVersion(1, 0).GetEncodedValue(), true);
+            1, 0, packetVersionResolver.ResolvePacketVersion(1, 0).GetEncodedValue(),
+            timelineCaptureCommandHandler, true);
 
     sendTimelinePacket->SendTimelineMessageDirectoryPackage();
     sendTimelinePacket->Commit();
@@ -151,6 +156,7 @@
     TimelineDecoder timelineDecoder;
     const TimelineDecoder::Model& model = timelineDecoder.GetModel();
 
+
     TimelineCaptureCommandHandler timelineCaptureCommandHandler(
         1, 1, packetVersionResolver.ResolvePacketVersion(1, 1).GetEncodedValue(), timelineDecoder, threadIdSize);