1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h> 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <string.h> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./ivfdec.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./video_reader.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/mem_ops.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan 19233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const char *const kIVFSignature = "DKIF"; 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct VpxVideoReaderStruct { 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan VpxVideoInfo info; 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *file; 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint8_t *buffer; 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan size_t buffer_size; 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan size_t frame_size; 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan 29233d2500723e5594f3e7c70896ffeeef32b9c950ywanVpxVideoReader *vpx_video_reader_open(const char *filename) { 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan char header[32]; 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan VpxVideoReader *reader = NULL; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *const file = fopen(filename, "rb"); 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!file) 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan return NULL; // Can't open file 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (fread(header, 1, 32, file) != 32) 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan return NULL; // Can't read file header 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (memcmp(kIVFSignature, header, 4) != 0) 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan return NULL; // Wrong IVF signature 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mem_get_le16(header + 4) != 0) 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan return NULL; // Wrong IVF version 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan reader = calloc(1, sizeof(*reader)); 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!reader) 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan return NULL; // Can't allocate VpxVideoReader 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan reader->file = file; 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan reader->info.codec_fourcc = mem_get_le32(header + 8); 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan reader->info.frame_width = mem_get_le16(header + 12); 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan reader->info.frame_height = mem_get_le16(header + 14); 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan reader->info.time_base.numerator = mem_get_le32(header + 16); 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan reader->info.time_base.denominator = mem_get_le32(header + 20); 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan return reader; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan 59233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vpx_video_reader_close(VpxVideoReader *reader) { 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (reader) { 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan fclose(reader->file); 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan free(reader->buffer); 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan free(reader); 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vpx_video_reader_read_frame(VpxVideoReader *reader) { 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan return !ivf_read_frame(reader->file, &reader->buffer, &reader->frame_size, 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan &reader->buffer_size); 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 72233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst uint8_t *vpx_video_reader_get_frame(VpxVideoReader *reader, 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan size_t *size) { 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (size) 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan *size = reader->frame_size; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan return reader->buffer; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan 80233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst VpxVideoInfo *vpx_video_reader_get_info(VpxVideoReader *reader) { 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &reader->info; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 84