| /* | 
 |  *  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; | 
 | } |