]> git.sesse.net Git - nageru/blobdiff - video_encoder.cpp
Fix an issue with streaming the NUT mux to HTTP.
[nageru] / video_encoder.cpp
index dfbf565437d5dcfc311f84c7245eaa06eaee68be..f7369877b7b55f67a4af3e795a5ed99bb5d88e21 100644 (file)
@@ -1,16 +1,28 @@
 #include "video_encoder.h"
 
 #include <assert.h>
-
+#include <stdio.h>
+#include <time.h>
+#include <unistd.h>
 #include <string>
+#include <thread>
+
+extern "C" {
+#include <libavutil/mem.h>
+}
 
+#include "audio_encoder.h"
 #include "defs.h"
+#include "ffmpeg_raii.h"
 #include "flags.h"
 #include "httpd.h"
-#include "timebase.h"
+#include "mux.h"
 #include "quicksync_encoder.h"
+#include "timebase.h"
 #include "x264_encoder.h"
 
+class RefCountedFrame;
+
 using namespace std;
 using namespace movit;
 
@@ -158,6 +170,14 @@ int VideoEncoder::write_packet2_thunk(void *opaque, uint8_t *buf, int buf_size,
 
 int VideoEncoder::write_packet2(uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time)
 {
+       if (type == AVIO_DATA_MARKER_SYNC_POINT || type == AVIO_DATA_MARKER_BOUNDARY_POINT) {
+               seen_sync_markers = true;
+       } else if (type == AVIO_DATA_MARKER_UNKNOWN && !seen_sync_markers) {
+               // We don't know if this is a keyframe or not (the muxer could
+               // avoid marking it), so we just have to make the best of it.
+               type = AVIO_DATA_MARKER_SYNC_POINT;
+       }
+
        if (type == AVIO_DATA_MARKER_HEADER) {
                stream_mux_header.append((char *)buf, buf_size);
                httpd->set_header(stream_mux_header);