summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Burakov <mburakov@mailbox.org>2023-03-16 06:26:03 +0100
committerMikhail Burakov <mburakov@mailbox.org>2023-03-16 06:26:03 +0100
commitd261527c84f0e43022c31a65a0179d464dd694f7 (patch)
tree2cd0ce4dc3cd6944a9a7bee6a01f24e011b5bc89
parent192e8d3a83eb7c4db4a089a2f63e9818a12e2c10 (diff)
Write encoded frames to provided fd
-rw-r--r--encode.c12
-rw-r--r--encode.h2
-rw-r--r--main.c4
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;
}