summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe de Dinechin <dinechin@redhat.com>2018-02-28 16:43:25 +0100
committerFrediano Ziglio <fziglio@redhat.com>2018-04-26 12:44:44 +0100
commit83c912a0ada480efc5f77b6374689344ed0a5b78 (patch)
treec6b6fde0b121421cb7aae261b678b2ac007f0657
parent9cbcd20e1b7e99a7709ac1ddd33ce4920ffd4428 (diff)
Move capture loop into concrete-agent.cppstyle3
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@redhat.com>
-rw-r--r--src/concrete-agent.cpp106
-rw-r--r--src/frame-log.hpp2
-rw-r--r--src/spice-streaming-agent.cpp102
3 files changed, 105 insertions, 105 deletions
diff --git a/src/concrete-agent.cpp b/src/concrete-agent.cpp
index 58ce9c4..35f2e07 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)
@@ -136,3 +143,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 16efc00..a8e409e 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[])