From 9635df628785c03cd3441798a640c22349645535 Mon Sep 17 00:00:00 2001
From: dec05eba <dec05eba@protonmail.com>
Date: Tue, 31 Mar 2020 19:02:52 +0200
Subject: Fix timestamp and video duration: Add header and trailer to output
 file

---
 src/main.cpp | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/main.cpp b/src/main.cpp
index c228a06..ff88a8e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -224,7 +224,8 @@ static void receive_frames(AVCodecContext *av_codec_context, AVStream *stream,
             av_packet.stream_index = stream->index;
             // Write the encoded video frame to disk
             // av_write_frame(av_format_context, &av_packet)
-            if (write(STDOUT_FILENO, av_packet.data, av_packet.size) < 0) {
+            // write(STDOUT_FILENO, av_packet.data, av_packet.size)
+            if (av_write_frame(av_format_context, &av_packet) < 0) {
                 fprintf(stderr, "Error: Failed to write frame to muxer\n");
             }
             // av_packet_unref(&av_packet);
@@ -417,6 +418,8 @@ int main(int argc, char **argv) {
         return 1;
     }
 
+    const char *filename = "/dev/stdout";
+
     const float target_fps = 1.0f / (float)fps;
 
     Display *dpy = XOpenDisplay(nullptr);
@@ -513,7 +516,23 @@ int main(int argc, char **argv) {
     open_video(video_codec, video_stream, window_pixmap, &device_ctx,
                &cuda_graphics_resource);
 
-    output_format->flags = AVFMT_NOFILE;
+    av_dump_format(av_format_context, 0, filename, 1);
+
+    if (!(output_format->flags & AVFMT_NOFILE)) {
+        int ret = avio_open(&av_format_context->pb, filename, AVIO_FLAG_WRITE);
+        if (ret < 0) {
+            fprintf(stderr, "Error: Could not open '%s': %s\n", filename,
+                    "blabla"); // av_err2str(ret));
+            return 1;
+        }
+    }
+
+    int ret = avformat_write_header(av_format_context, nullptr);
+    if (ret < 0) {
+        fprintf(stderr, "Error occurred when opening output file: %s\n",
+                "blabla"); // av_err2str(ret));
+        return 1;
+    }
 
     AVHWDeviceContext *hw_device_context =
         (AVHWDeviceContext *)device_ctx->data;
@@ -666,15 +685,21 @@ int main(int argc, char **argv) {
         usleep(5000);
     }
 
+    if (av_write_trailer(av_format_context) != 0) {
+        fprintf(stderr, "Failed to write trailer\n");
+    }
+
     /* add sequence end code to have a real MPEG file */
+    /*
     const uint8_t endcode[] = { 0, 0, 1, 0xb7 };
     if (video_codec->id == AV_CODEC_ID_MPEG1VIDEO || video_codec->id == AV_CODEC_ID_MPEG2VIDEO)
         write(STDOUT_FILENO, endcode, sizeof(endcode));
+    */
 
     // close_video(video_stream, NULL);
 
-    // if(!(output_format->flags & AVFMT_NOFILE))
-    //    avio_close(av_format_context->pb);
+     if(!(output_format->flags & AVFMT_NOFILE))
+        avio_close(av_format_context->pb);
     // avformat_free_context(av_format_context);
     // XDamageDestroy(dpy, xdamage);
 
-- 
cgit v1.2.3-70-g09d2