video_reader.c 2.31 KB
Newer Older
1
/*
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3
 *
4 5 6 7 8 9
 * 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.
10 11 12 13 14 15 16 17
 */

#include <stdlib.h>
#include <string.h>

#include "./ivfdec.h"
#include "./video_reader.h"

18
#include "aom_ports/mem_ops.h"
19

20 21
static const char *const kIVFSignature = "DKIF";

22 23
struct AvxVideoReaderStruct {
  AvxVideoInfo info;
24 25 26 27 28 29
  FILE *file;
  uint8_t *buffer;
  size_t buffer_size;
  size_t frame_size;
};

30
AvxVideoReader *aom_video_reader_open(const char *filename) {
31
  char header[32];
32
  AvxVideoReader *reader = NULL;
33
  FILE *const file = fopen(filename, "rb");
34
  if (!file) return NULL;  // Can't open file
35

36
  if (fread(header, 1, 32, file) != 32) return NULL;  // Can't read file header
37 38 39 40

  if (memcmp(kIVFSignature, header, 4) != 0)
    return NULL;  // Wrong IVF signature

41
  if (mem_get_le16(header + 4) != 0) return NULL;  // Wrong IVF version
42

43
  reader = (AvxVideoReader *)calloc(1, sizeof(*reader));
44
  if (!reader) return NULL;  // Can't allocate AvxVideoReader
45 46 47 48 49 50 51 52 53 54 55

  reader->file = file;
  reader->info.codec_fourcc = mem_get_le32(header + 8);
  reader->info.frame_width = mem_get_le16(header + 12);
  reader->info.frame_height = mem_get_le16(header + 14);
  reader->info.time_base.numerator = mem_get_le32(header + 16);
  reader->info.time_base.denominator = mem_get_le32(header + 20);

  return reader;
}

56
void aom_video_reader_close(AvxVideoReader *reader) {
57 58 59 60 61 62 63
  if (reader) {
    fclose(reader->file);
    free(reader->buffer);
    free(reader);
  }
}

64
int aom_video_reader_read_frame(AvxVideoReader *reader) {
65 66 67 68
  return !ivf_read_frame(reader->file, &reader->buffer, &reader->frame_size,
                         &reader->buffer_size);
}

69
const uint8_t *aom_video_reader_get_frame(AvxVideoReader *reader,
70
                                          size_t *size) {
71
  if (size) *size = reader->frame_size;
72 73 74 75

  return reader->buffer;
}

76
const AvxVideoInfo *aom_video_reader_get_info(AvxVideoReader *reader) {
77 78
  return &reader->info;
}