Home | History | Annotate | Download | only in libvpx
      1 /*
      2  *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include <stdlib.h>
     12 
     13 #include "./ivfenc.h"
     14 #include "./video_writer.h"
     15 #include "vpx/vpx_encoder.h"
     16 
     17 struct VpxVideoWriterStruct {
     18   VpxVideoInfo info;
     19   FILE *file;
     20   int frame_count;
     21 };
     22 
     23 static void write_header(FILE *file, const VpxVideoInfo *info,
     24                          int frame_count) {
     25   struct vpx_codec_enc_cfg cfg;
     26   cfg.g_w = info->frame_width;
     27   cfg.g_h = info->frame_height;
     28   cfg.g_timebase.num = info->time_base.numerator;
     29   cfg.g_timebase.den = info->time_base.denominator;
     30 
     31   ivf_write_file_header(file, &cfg, info->codec_fourcc, frame_count);
     32 }
     33 
     34 VpxVideoWriter *vpx_video_writer_open(const char *filename,
     35                                       VpxContainer container,
     36                                       const VpxVideoInfo *info) {
     37   if (container == kContainerIVF) {
     38     VpxVideoWriter *writer = NULL;
     39     FILE *const file = fopen(filename, "wb");
     40     if (!file) return NULL;
     41 
     42     writer = malloc(sizeof(*writer));
     43     if (!writer) return NULL;
     44 
     45     writer->frame_count = 0;
     46     writer->info = *info;
     47     writer->file = file;
     48 
     49     write_header(writer->file, info, 0);
     50 
     51     return writer;
     52   }
     53 
     54   return NULL;
     55 }
     56 
     57 void vpx_video_writer_close(VpxVideoWriter *writer) {
     58   if (writer) {
     59     // Rewriting frame header with real frame count
     60     rewind(writer->file);
     61     write_header(writer->file, &writer->info, writer->frame_count);
     62 
     63     fclose(writer->file);
     64     free(writer);
     65   }
     66 }
     67 
     68 int vpx_video_writer_write_frame(VpxVideoWriter *writer, const uint8_t *buffer,
     69                                  size_t size, int64_t pts) {
     70   ivf_write_frame_header(writer->file, pts, size);
     71   if (fwrite(buffer, 1, size, writer->file) != size) return 0;
     72 
     73   ++writer->frame_count;
     74 
     75   return 1;
     76 }
     77