| /* |
| * Copyright (c) 2016, Alliance for Open Media. All rights reserved |
| * |
| * This source code is subject to the terms of the BSD 2 Clause License and |
| * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| * was not distributed with this source code in the LICENSE file, you can |
| * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| * Media Patent License 1.0 was not distributed with this source code in the |
| * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
| */ |
| |
| #include <stdlib.h> |
| |
| #include "./ivfenc.h" |
| #include "./video_writer.h" |
| #include "aom/aom_encoder.h" |
| |
| struct AvxVideoWriterStruct { |
| AvxVideoInfo info; |
| FILE *file; |
| int frame_count; |
| }; |
| |
| static void write_header(FILE *file, const AvxVideoInfo *info, |
| int frame_count) { |
| struct aom_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); |
| } |
| |
| AvxVideoWriter *aom_video_writer_open(const char *filename, |
| AvxContainer container, |
| const AvxVideoInfo *info) { |
| if (container == kContainerIVF) { |
| AvxVideoWriter *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 aom_video_writer_close(AvxVideoWriter *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 aom_video_writer_write_frame(AvxVideoWriter *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; |
| } |