ref: 77a31eb3c51582cae8597d8b3e1f76ed1dfa405b
dir: /video_reader.c/
/* * 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 <string.h> #include "./ivfdec.h" #include "./video_reader.h" #include "vpx_ports/mem_ops.h" static const char *const kIVFSignature = "DKIF"; struct VpxVideoReaderStruct { VpxVideoInfo info; FILE *file; uint8_t *buffer; size_t buffer_size; size_t frame_size; }; VpxVideoReader *vpx_video_reader_open(const char *filename) { char header[32]; VpxVideoReader *reader = NULL; FILE *const file = fopen(filename, "rb"); if (!file) return NULL; // Can't open file if (fread(header, 1, 32, file) != 32) return NULL; // Can't read file header if (memcmp(kIVFSignature, header, 4) != 0) return NULL; // Wrong IVF signature if (mem_get_le16(header + 4) != 0) return NULL; // Wrong IVF version reader = calloc(1, sizeof(*reader)); if (!reader) return NULL; // Can't allocate VpxVideoReader 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; } void vpx_video_reader_close(VpxVideoReader *reader) { if (reader) { fclose(reader->file); free(reader->buffer); free(reader); } } int vpx_video_reader_read_frame(VpxVideoReader *reader) { return !ivf_read_frame(reader->file, &reader->buffer, &reader->frame_size, &reader->buffer_size); } const uint8_t *vpx_video_reader_get_frame(VpxVideoReader *reader, size_t *size) { if (size) *size = reader->frame_size; return reader->buffer; } const VpxVideoInfo *vpx_video_reader_get_info(VpxVideoReader *reader) { return &reader->info; }