]> git.sesse.net Git - nageru/blobdiff - httpd.cpp
Let settings follow buses when editing the mapping.
[nageru] / httpd.cpp
index c6a233deae66f6dca2eecc5476ec275a5928ca98..3fbab5d6d6630e97e6133a2df44b890b8484cf50 100644 (file)
--- a/httpd.cpp
+++ b/httpd.cpp
@@ -1,5 +1,6 @@
 #include <arpa/inet.h>
 #include <assert.h>
+#include <endian.h>
 #include <microhttpd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -25,11 +26,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 +43,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 +180,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(); 
 }