]> git.sesse.net Git - nageru/blobdiff - httpd.cpp
Allow using control 0.
[nageru] / httpd.cpp
index c6a233deae66f6dca2eecc5476ec275a5928ca98..858d9522c9354f1ea275cd0e859e5fef60d30636 100644 (file)
--- a/httpd.cpp
+++ b/httpd.cpp
@@ -1,18 +1,18 @@
-#include <arpa/inet.h>
+#include "httpd.h"
+
 #include <assert.h>
+#include <byteswap.h>
+#include <endian.h>
 #include <microhttpd.h>
+#include <netinet/in.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
-
-#include <vector>
-
-#include "httpd.h"
+#include <sys/time.h>
+#include <time.h>
+#include <memory>
 
 #include "defs.h"
-#include "flags.h"
 #include "metacube2.h"
-#include "timebase.h"
 
 struct MHD_Connection;
 struct MHD_Response;
@@ -25,11 +25,13 @@ HTTPD::HTTPD()
 
 HTTPD::~HTTPD()
 {
-       MHD_quiesce_daemon(mhd);
-       for (Stream *stream : streams) {
-               stream->stop();
+       if (mhd) {
+               MHD_quiesce_daemon(mhd);
+               for (Stream *stream : streams) {
+                       stream->stop();
+               }
+               MHD_stop_daemon(mhd);
        }
-       MHD_stop_daemon(mhd);
 }
 
 void HTTPD::start(int port)
@@ -40,6 +42,9 @@ void HTTPD::start(int port)
                               &answer_to_connection_thunk, this,
                               MHD_OPTION_NOTIFY_COMPLETED, nullptr, this,
                               MHD_OPTION_END);
+       if (mhd == nullptr) {
+               fprintf(stderr, "Warning: Could not open HTTP server. (Port already in use?)\n");
+       }
 }
 
 void HTTPD::add_data(const char *buf, size_t size, bool keyframe)
@@ -174,6 +179,26 @@ void HTTPD::Stream::add_data(const char *buf, size_t buf_size, HTTPD::Stream::Da
                buffered_data.emplace_back((char *)&hdr, sizeof(hdr));
        }
        buffered_data.emplace_back(buf, buf_size);
+
+       // Send a Metacube2 timestamp every keyframe.
+       if (framing == FRAMING_METACUBE && data_type == DATA_TYPE_KEYFRAME) {
+               timespec now;
+               clock_gettime(CLOCK_REALTIME, &now);
+
+               metacube2_timestamp_packet packet;
+               packet.type = htobe64(METACUBE_METADATA_TYPE_ENCODER_TIMESTAMP);
+               packet.tv_sec = htobe64(now.tv_sec);
+               packet.tv_nsec = htobe64(now.tv_nsec);
+
+               metacube2_block_header hdr;
+               memcpy(hdr.sync, METACUBE2_SYNC, sizeof(hdr.sync));
+               hdr.size = htonl(sizeof(packet));
+               hdr.flags = htons(METACUBE_FLAGS_METADATA);
+               hdr.csum = htons(metacube2_compute_crc(&hdr));
+               buffered_data.emplace_back((char *)&hdr, sizeof(hdr));
+               buffered_data.emplace_back((char *)&packet, sizeof(packet));
+       }
+
        has_buffered_data.notify_all(); 
 }