Argus Camera Sample Argus Camera Sample

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
EventThread.cpp
Go to the documentation of this file.
1 /*
2 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of NVIDIA CORPORATION nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "EventThread.h"
30 #include "Dispatcher.h"
31 #include "Util.h"
32 #include "PerfTracker.h"
33
34 #include <Argus/Ext/InternalFrameCount.h>
35
36 namespace ArgusSamples {
37
38 EventThread::EventThread(Argus::CaptureSession *session,
39 SessionPerfTracker *sessionPerfTracker)
40 : m_session(session)
41 , m_sessionPerfTracker(sessionPerfTracker)
42 {
43 }
44
45 EventThread::~EventThread()
46 {
47 }
48
49 bool EventThread::threadInitialize()
50 {
51 std::vector<Argus::EventType> eventTypes;
52 eventTypes.push_back(Argus::EVENT_TYPE_CAPTURE_COMPLETE);
53
54 PROPAGATE_ERROR(Dispatcher::getInstance().createEventQueue(eventTypes, m_eventQueue,
55 m_session));
56
57 return true;
58 }
59
60 bool EventThread::threadExecute()
61 {
62 Dispatcher &dispatcher = Dispatcher::getInstance();
63
64 // wait for events (use a time out to allow the thread to be shutdown even if there are no
65 // new events)
66 PROPAGATE_ERROR(dispatcher.waitForEvents(m_eventQueue.get(), TimeValue::fromMSec(100),
67 m_session));
68
69 Argus::IEventQueue *iEventQueue =
70 Argus::interface_cast<Argus::IEventQueue>(m_eventQueue.get());
71 if (!iEventQueue)
72 ORIGINATE_ERROR("Failed to get iEventQueue");
73
74 for (uint32_t i = 0; i < iEventQueue->getSize(); i++)
75 {
76 const Argus::Event *event = iEventQueue->getEvent(i);
77 const Argus::IEvent *iEvent = Argus::interface_cast<const Argus::IEvent>(event);
78 if (!iEvent)
79 ORIGINATE_ERROR("Failed to get IEvent interface");
80
81 if (iEvent->getEventType() == Argus::EVENT_TYPE_CAPTURE_COMPLETE)
82 {
83 PROPAGATE_ERROR(m_sessionPerfTracker->onEvent(SESSION_EVENT_REQUEST_RECEIVED));
84
85 const Argus::IEventCaptureComplete *iEventCaptureComplete
86 = Argus::interface_cast<const Argus::IEventCaptureComplete>(event);
87 const Argus::CaptureMetadata *metaData = iEventCaptureComplete->getMetadata();
88 if (metaData)
89 {
90 const Argus::ICaptureMetadata *iCaptureMeta =
91 Argus::interface_cast<const Argus::ICaptureMetadata>(metaData);
92 if (iCaptureMeta)
93 {
94 /// @todo IEvent documentation says the time value is in nano seconds, but
95 /// actually it's in micro seconds.
96 const TimeValue latency =
97 TimeValue::fromUSec(iEvent->getTime()) -
98 TimeValue::fromNSec(iCaptureMeta->getSensorTimestamp());
99 PROPAGATE_ERROR(m_sessionPerfTracker->onEvent(
100 SESSION_EVENT_REQUEST_LATENCY, latency.toMSec()));
101 }
102
103 const Argus::Ext::IInternalFrameCount *iInternalFrameCount =
104 Argus::interface_cast<const Argus::Ext::IInternalFrameCount>(metaData);
105 if (iInternalFrameCount)
106 {
107 const uint64_t currentFrameCount = iInternalFrameCount->getInternalFrameCount();
108 PROPAGATE_ERROR(m_sessionPerfTracker->onEvent(SESSION_EVENT_FRAME_COUNT,
109 currentFrameCount));
110 }
111
112 }
113 }
114 }
115
116 return true;
117 }
118
119 bool EventThread::threadShutdown()
120 {
121 return true;
122 }
123
124 }; // namespace ArgusSamples