From d261527c84f0e43022c31a65a0179d464dd694f7 Mon Sep 17 00:00:00 2001
From: Mikhail Burakov <mburakov@mailbox.org>
Date: Thu, 16 Mar 2023 06:26:03 +0100
Subject: Write encoded frames to provided fd

---
 encode.c | 12 +++++++-----
 encode.h |  2 +-
 main.c   |  4 ++--
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/encode.c b/encode.c
index 5b81e9a..ed91e73 100644
--- a/encode.c
+++ b/encode.c
@@ -121,8 +121,7 @@ struct EncodeContext* EncodeContextCreate(struct GpuContext* gpu_context,
   encode_context->codec_context->colorspace = AVCOL_SPC_BT709;
   encode_context->codec_context->color_range = AVCOL_RANGE_JPEG;
 
-  if (!encode_context->codec_context->hw_frames_ctx &&
-      !SetHwFramesContext(encode_context, (int)width, (int)height)) {
+  if (!SetHwFramesContext(encode_context, (int)width, (int)height)) {
     LOG("Failed to set hwframes context");
     return NULL;
   }
@@ -195,7 +194,7 @@ release_planes:
   return encode_context->gpu_frame;
 }
 
-bool EncodeContextEncodeFrame(struct EncodeContext* encode_context) {
+bool EncodeContextEncodeFrame(struct EncodeContext* encode_context, int fd) {
   GpuFrameDestroy(&encode_context->gpu_frame);
   AUTO(AVFrame)* hw_frame = RELEASE(encode_context->hw_frame);
   AUTO(AVPacket)* packet = av_packet_alloc();
@@ -223,10 +222,13 @@ bool EncodeContextEncodeFrame(struct EncodeContext* encode_context) {
         return false;
     }
 
-    // TODO(mburakov): Why???
     packet->stream_index = 0;
-    write(STDOUT_FILENO, packet->data, (size_t)packet->size);
+    bool result = write(fd, packet->data, (size_t)packet->size) != packet->size;
     av_packet_unref(packet);
+    if (!result) {
+      LOG("Failed to write full packet (%s)", strerror(errno));
+      return false;
+    }
   }
 }
 
diff --git a/encode.h b/encode.h
index 1d44024..f68b2e2 100644
--- a/encode.h
+++ b/encode.h
@@ -29,7 +29,7 @@ struct EncodeContext* EncodeContextCreate(struct GpuContext* gpu_context,
                                           uint32_t width, uint32_t height);
 const struct GpuFrame* EncodeContextGetFrame(
     struct EncodeContext* encode_context);
-bool EncodeContextEncodeFrame(struct EncodeContext* encode_context);
+bool EncodeContextEncodeFrame(struct EncodeContext* encode_context, int fd);
 void EncodeContextDestroy(struct EncodeContext** encode_context);
 
 #endif  // STREAMER_ENCODE_H_
diff --git a/main.c b/main.c
index 0c3138a..50d9df4 100644
--- a/main.c
+++ b/main.c
@@ -125,7 +125,7 @@ int main(int argc, char* argv[]) {
 
     GpuContextSync(gpu_context);
     unsigned long long before_encode = MicrosNow();
-    if (!EncodeContextEncodeFrame(encode_context)) {
+    if (!EncodeContextEncodeFrame(encode_context, STDOUT_FILENO)) {
       LOG("Failed to encode frame");
       return EXIT_FAILURE;
     }
@@ -142,7 +142,7 @@ int main(int argc, char* argv[]) {
     if (micros) usleep((unsigned)micros);
   }
 
-  if (!EncodeContextEncodeFrame(encode_context)) {
+  if (!EncodeContextEncodeFrame(encode_context, STDOUT_FILENO)) {
     LOG("Failed to drain encoder");
     return EXIT_FAILURE;
   }
-- 
cgit v1.2.3