Index: source/libvpx/video_writer.c |
=================================================================== |
--- source/libvpx/video_writer.c (revision 0) |
+++ source/libvpx/video_writer.c (revision 0) |
@@ -0,0 +1,80 @@ |
+/* |
+ * Copyright (c) 2014 The WebM project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#include <stdlib.h> |
+ |
+#include "./ivfenc.h" |
+#include "./video_writer.h" |
+#include "vpx/vpx_encoder.h" |
+ |
+struct VpxVideoWriterStruct { |
+ VpxVideoInfo info; |
+ FILE *file; |
+ int frame_count; |
+}; |
+ |
+static void write_header(FILE *file, const VpxVideoInfo *info, |
+ int frame_count) { |
+ struct vpx_codec_enc_cfg cfg; |
+ cfg.g_w = info->frame_width; |
+ cfg.g_h = info->frame_height; |
+ cfg.g_timebase.num = info->time_base.numerator; |
+ cfg.g_timebase.den = info->time_base.denominator; |
+ |
+ ivf_write_file_header(file, &cfg, info->codec_fourcc, frame_count); |
+} |
+ |
+VpxVideoWriter *vpx_video_writer_open(const char *filename, |
+ VpxContainer container, |
+ const VpxVideoInfo *info) { |
+ if (container == kContainerIVF) { |
+ VpxVideoWriter *writer = NULL; |
+ FILE *const file = fopen(filename, "wb"); |
+ if (!file) |
+ return NULL; |
+ |
+ writer = malloc(sizeof(*writer)); |
+ if (!writer) |
+ return NULL; |
+ |
+ writer->frame_count = 0; |
+ writer->info = *info; |
+ writer->file = file; |
+ |
+ write_header(writer->file, info, 0); |
+ |
+ return writer; |
+ } |
+ |
+ return NULL; |
+} |
+ |
+void vpx_video_writer_close(VpxVideoWriter *writer) { |
+ if (writer) { |
+ // Rewriting frame header with real frame count |
+ rewind(writer->file); |
+ write_header(writer->file, &writer->info, writer->frame_count); |
+ |
+ fclose(writer->file); |
+ free(writer); |
+ } |
+} |
+ |
+int vpx_video_writer_write_frame(VpxVideoWriter *writer, |
+ const uint8_t *buffer, size_t size, |
+ int64_t pts) { |
+ ivf_write_frame_header(writer->file, pts, size); |
+ if (fwrite(buffer, 1, size, writer->file) != size) |
+ return 0; |
+ |
+ ++writer->frame_count; |
+ |
+ return 1; |
+} |