• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
write_header(FILE * file,const AvxVideoInfo * info,int frame_count)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 
aom_video_writer_open(const char * filename,AvxContainer container,const AvxVideoInfo * info)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) return NULL;
45 
46     writer->frame_count = 0;
47     writer->info = *info;
48     writer->file = file;
49 
50     write_header(writer->file, info, 0);
51 
52     return writer;
53   }
54 
55   return NULL;
56 }
57 
aom_video_writer_close(AvxVideoWriter * writer)58 void aom_video_writer_close(AvxVideoWriter *writer) {
59   if (writer) {
60     // Rewriting frame header with real frame count
61     rewind(writer->file);
62     write_header(writer->file, &writer->info, writer->frame_count);
63 
64     fclose(writer->file);
65     free(writer);
66   }
67 }
68 
aom_video_writer_write_frame(AvxVideoWriter * writer,const uint8_t * buffer,size_t size,int64_t pts)69 int aom_video_writer_write_frame(AvxVideoWriter *writer, const uint8_t *buffer,
70                                  size_t size, int64_t pts) {
71   ivf_write_frame_header(writer->file, pts, size);
72   if (fwrite(buffer, 1, size, writer->file) != size) return 0;
73 
74   ++writer->frame_count;
75 
76   return 1;
77 }
78 
aom_video_writer_set_fourcc(AvxVideoWriter * writer,uint32_t fourcc)79 void aom_video_writer_set_fourcc(AvxVideoWriter *writer, uint32_t fourcc) {
80   writer->info.codec_fourcc = fourcc;
81 }
82