[Spice-devel] [PATCH 22/22] Move capture loop into concrete-agent.cpp
Christophe de Dinechin
christophe at dinechin.org
Wed Feb 28 15:43:25 UTC 2018
From: Christophe de Dinechin <dinechin at redhat.com>
The capture loop has been isolated, and the required dependencies
have been put in separate files, so we can now easily move the
main event loop where it belongs.
Signed-off-by: Christophe de Dinechin <dinechin at redhat.com>
---
src/concrete-agent.cpp | 106 +++++++++++++++++++++++++++++++++++++++++-
src/frame-log.hpp | 2 +-
src/spice-streaming-agent.cpp | 102 ----------------------------------------
3 files changed, 105 insertions(+), 105 deletions(-)
diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp
index 4cf70e7..93b3653 100644
--- a/src/concrete-agent.cpp
+++ b/src/concrete-agent.cpp
@@ -4,15 +4,22 @@
* Copyright 2017 Red Hat Inc. All rights reserved.
*/
+#include "concrete-agent.hpp"
+#include "message.hpp"
+#include "frame-log.hpp"
+
+#include <spice-streaming-agent/frame-capture.hpp>
+#include <spice-streaming-agent/plugin.hpp>
+#include <spice-streaming-agent/errors.hpp>
+
#include <config.h>
#include <algorithm>
#include <syslog.h>
#include <glob.h>
#include <dlfcn.h>
+#include <inttypes.h>
#include <string>
-#include "concrete-agent.hpp"
-
using namespace spice::streaming_agent;
static inline unsigned MajorVersion(unsigned version)
@@ -121,3 +128,98 @@ FrameCapture *ConcreteAgent::GetBestFrameCapture(const std::set<SpiceVideoCodecT
}
return nullptr;
}
+
+class FormatMessage : public Message<StreamMsgFormat, FormatMessage, STREAM_TYPE_FORMAT>
+{
+public:
+ FormatMessage(unsigned w, unsigned h, uint8_t c) : Message(w, h, c) {}
+ static size_t size(unsigned width, unsigned height, uint8_t codec)
+ {
+ return sizeof(payload_t);
+ }
+ void write_message_body(Stream &stream, unsigned w, unsigned h, uint8_t c)
+ {
+ StreamMsgFormat msg = { .width = w, .height = h, .codec = c, .padding1 = {} };
+ stream.write_all("format", &msg, sizeof(msg));
+ }
+};
+
+class FrameMessage : public Message<StreamMsgData, FrameMessage, STREAM_TYPE_DATA>
+{
+public:
+ FrameMessage(const void *frame, size_t length) : Message(frame, length) {}
+ static size_t size(const void *frame, size_t length)
+ {
+ return sizeof(payload_t) + length;
+ }
+ void write_message_body(Stream &stream, const void *frame, size_t length)
+ {
+ stream.write_all("frame", frame, length);
+ }
+};
+
+
+void ConcreteAgent::CaptureLoop(Stream &stream, FrameLog &frame_log)
+{
+ unsigned int frame_count = 0;
+ while (!quit_requested) {
+ while (!quit_requested && !stream.streaming_requested()) {
+ if (stream.read_command(true) < 0) {
+ syslog(LOG_ERR, "FAILED to read command\n");
+ return;
+ }
+ }
+
+ if (quit_requested) {
+ return;
+ }
+
+ syslog(LOG_INFO, "streaming starts now\n");
+ uint64_t time_last = 0;
+
+ std::unique_ptr<FrameCapture> capture(GetBestFrameCapture(stream.client_codecs()));
+ if (!capture) {
+ throw Error("cannot find a suitable capture system");
+ }
+
+ while (!quit_requested && stream.streaming_requested()) {
+ if (++frame_count % 100 == 0) {
+ syslog(LOG_DEBUG, "SENT %d frames\n", frame_count);
+ }
+ uint64_t time_before = get_time();
+
+ FrameInfo frame = capture->CaptureFrame();
+
+ uint64_t time_after = get_time();
+ syslog(LOG_DEBUG,
+ "got a frame -- size is %zu (%" PRIu64 " ms) "
+ "(%" PRIu64 " ms from last frame)(%" PRIu64 " us)\n",
+ frame.buffer_size, (time_after - time_before)/1000,
+ (time_after - time_last)/1000,
+ (time_before - time_last));
+ time_last = time_after;
+
+ if (frame.stream_start) {
+ unsigned width, height;
+ uint8_t codec;
+
+ width = frame.size.width;
+ height = frame.size.height;
+ codec = capture->VideoCodecType();
+
+ syslog(LOG_DEBUG, "wXh %uX%u codec=%u\n", width, height, codec);
+
+ stream.send<FormatMessage>(width, height, codec);
+ }
+ if (frame_log) {
+ frame_log.dump(frame.buffer, frame.buffer_size);
+ }
+ stream.send<FrameMessage>(frame.buffer, frame.buffer_size);
+ //usleep(1);
+ if (stream.read_command(false) < 0) {
+ syslog(LOG_ERR, "FAILED to read command\n");
+ return;
+ }
+ }
+ }
+}
diff --git a/src/frame-log.hpp b/src/frame-log.hpp
index 09dbd4a..059819b 100644
--- a/src/frame-log.hpp
+++ b/src/frame-log.hpp
@@ -14,7 +14,7 @@ namespace spice {
namespace streaming_agent {
/* returns current time in micro-seconds */
-static uint64_t get_time(void)
+static inline uint64_t get_time(void)
{
struct timeval now;
diff --git a/src/spice-streaming-agent.cpp b/src/spice-streaming-agent.cpp
index 424db95..4ac4e04 100644
--- a/src/spice-streaming-agent.cpp
+++ b/src/spice-streaming-agent.cpp
@@ -40,42 +40,6 @@
using namespace spice::streaming_agent;
-namespace spice
-{
-namespace streaming_agent
-{
-
-class FormatMessage : public Message<StreamMsgFormat, FormatMessage, STREAM_TYPE_FORMAT>
-{
-public:
- FormatMessage(unsigned w, unsigned h, uint8_t c) : Message(w, h, c) {}
- static size_t size(unsigned width, unsigned height, uint8_t codec)
- {
- return sizeof(payload_t);
- }
- void write_message_body(Stream &stream, unsigned w, unsigned h, uint8_t c)
- {
- StreamMsgFormat msg = { .width = w, .height = h, .codec = c, .padding1 = {} };
- stream.write_all("format", &msg, sizeof(msg));
- }
-};
-
-class FrameMessage : public Message<StreamMsgData, FrameMessage, STREAM_TYPE_DATA>
-{
-public:
- FrameMessage(const void *frame, size_t length) : Message(frame, length) {}
- static size_t size(const void *frame, size_t length)
- {
- return sizeof(payload_t) + length;
- }
- void write_message_body(Stream &stream, const void *frame, size_t length)
- {
- stream.write_all("frame", frame, length);
- }
-};
-
-}} // namespace spice::streaming_agent
-
bool quit_requested = false;
static void handle_interrupt(int intr)
@@ -111,72 +75,6 @@ static void usage(const char *progname)
exit(1);
}
-
-void ConcreteAgent::CaptureLoop(Stream &stream, FrameLog &frame_log)
-{
- unsigned int frame_count = 0;
- while (!quit_requested) {
- while (!quit_requested && !stream.streaming_requested()) {
- if (stream.read_command(true) < 0) {
- syslog(LOG_ERR, "FAILED to read command\n");
- return;
- }
- }
-
- if (quit_requested) {
- return;
- }
-
- syslog(LOG_INFO, "streaming starts now\n");
- uint64_t time_last = 0;
-
- std::unique_ptr<FrameCapture> capture(GetBestFrameCapture(stream.client_codecs()));
- if (!capture) {
- throw Error("cannot find a suitable capture system");
- }
-
- while (!quit_requested && stream.streaming_requested()) {
- if (++frame_count % 100 == 0) {
- syslog(LOG_DEBUG, "SENT %d frames\n", frame_count);
- }
- uint64_t time_before = get_time();
-
- FrameInfo frame = capture->CaptureFrame();
-
- uint64_t time_after = get_time();
- syslog(LOG_DEBUG,
- "got a frame -- size is %zu (%" PRIu64 " ms) "
- "(%" PRIu64 " ms from last frame)(%" PRIu64 " us)\n",
- frame.buffer_size, (time_after - time_before)/1000,
- (time_after - time_last)/1000,
- (time_before - time_last));
- time_last = time_after;
-
- if (frame.stream_start) {
- unsigned width, height;
- uint8_t codec;
-
- width = frame.size.width;
- height = frame.size.height;
- codec = capture->VideoCodecType();
-
- syslog(LOG_DEBUG, "wXh %uX%u codec=%u\n", width, height, codec);
-
- stream.send<FormatMessage>(width, height, codec);
- }
- if (frame_log) {
- frame_log.dump(frame.buffer, frame.buffer_size);
- }
- stream.send<FrameMessage>(frame.buffer, frame.buffer_size);
- //usleep(1);
- if (stream.read_command(false) < 0) {
- syslog(LOG_ERR, "FAILED to read command\n");
- return;
- }
- }
- }
-}
-
#define arg_error(...) syslog(LOG_ERR, ## __VA_ARGS__);
int main(int argc, char* argv[])
--
2.13.5 (Apple Git-94)
More information about the Spice-devel
mailing list