video_writer.c (2390B)
1 /* 2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 #include "common/video_writer.h" 12 13 #include <stdlib.h> 14 15 #include "aom/aom_encoder.h" 16 #include "common/ivfenc.h" 17 18 struct AvxVideoWriterStruct { 19 AvxVideoInfo info; 20 FILE *file; 21 int frame_count; 22 }; 23 24 static void write_header(FILE *file, const AvxVideoInfo *info, 25 int frame_count) { 26 struct aom_codec_enc_cfg cfg; 27 cfg.g_w = info->frame_width; 28 cfg.g_h = info->frame_height; 29 cfg.g_timebase.num = info->time_base.numerator; 30 cfg.g_timebase.den = info->time_base.denominator; 31 32 ivf_write_file_header(file, &cfg, info->codec_fourcc, frame_count); 33 } 34 35 AvxVideoWriter *aom_video_writer_open(const char *filename, 36 AvxContainer container, 37 const AvxVideoInfo *info) { 38 if (container == kContainerIVF) { 39 AvxVideoWriter *writer = NULL; 40 FILE *const file = fopen(filename, "wb"); 41 if (!file) return NULL; 42 43 writer = malloc(sizeof(*writer)); 44 if (!writer) { 45 fclose(file); 46 return NULL; 47 } 48 writer->frame_count = 0; 49 writer->info = *info; 50 writer->file = file; 51 52 write_header(writer->file, info, 0); 53 54 return writer; 55 } 56 57 return NULL; 58 } 59 60 void aom_video_writer_close(AvxVideoWriter *writer) { 61 if (writer) { 62 // Rewriting frame header with real frame count 63 rewind(writer->file); 64 write_header(writer->file, &writer->info, writer->frame_count); 65 66 fclose(writer->file); 67 free(writer); 68 } 69 } 70 71 int aom_video_writer_write_frame(AvxVideoWriter *writer, const uint8_t *buffer, 72 size_t size, int64_t pts) { 73 ivf_write_frame_header(writer->file, pts, size); 74 if (fwrite(buffer, 1, size, writer->file) != size) return 0; 75 76 ++writer->frame_count; 77 78 return 1; 79 } 80 81 void aom_video_writer_set_fourcc(AvxVideoWriter *writer, uint32_t fourcc) { 82 writer->info.codec_fourcc = fourcc; 83 }