2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved.
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.
17 static const char *IVF_SIGNATURE
= "DKIF";
19 static void fix_framerate(int *num
, int *den
) {
20 // Some versions of vpxenc used 1/(2*fps) for the timebase, so
21 // we can guess the framerate using only the timebase in this
22 // case. Other files would require reading ahead to guess the
23 // timebase, like we do for webm.
25 // Correct for the factor of 2 applied to the timebase in the encoder.
31 // Don't know FPS for sure, and don't have readahead code
32 // (yet?), so just default to 30fps.
38 int file_is_ivf(struct VpxInputContext
*input_ctx
) {
42 if (fread(raw_hdr
, 1, 32, input_ctx
->file
) == 32) {
43 if (memcmp(IVF_SIGNATURE
, raw_hdr
, 4) == 0) {
46 if (mem_get_le16(raw_hdr
+ 4) != 0) {
47 fprintf(stderr
, "Error: Unrecognized IVF version! This file may not"
51 input_ctx
->fourcc
= mem_get_le32(raw_hdr
+ 8);
52 input_ctx
->width
= mem_get_le16(raw_hdr
+ 12);
53 input_ctx
->height
= mem_get_le16(raw_hdr
+ 14);
54 input_ctx
->framerate
.numerator
= mem_get_le32(raw_hdr
+ 16);
55 input_ctx
->framerate
.denominator
= mem_get_le32(raw_hdr
+ 20);
56 fix_framerate(&input_ctx
->framerate
.numerator
,
57 &input_ctx
->framerate
.denominator
);
62 rewind(input_ctx
->file
);
63 input_ctx
->detect
.buf_read
= 0;
65 input_ctx
->detect
.position
= 4;
70 int ivf_read_frame(FILE *infile
, uint8_t **buffer
,
71 size_t *bytes_read
, size_t *buffer_size
) {
72 char raw_header
[IVF_FRAME_HDR_SZ
] = {0};
73 size_t frame_size
= 0;
75 if (fread(raw_header
, IVF_FRAME_HDR_SZ
, 1, infile
) != 1) {
77 warn("Failed to read frame size\n");
79 frame_size
= mem_get_le32(raw_header
);
81 if (frame_size
> 256 * 1024 * 1024) {
82 warn("Read invalid frame size (%u)\n", (unsigned int)frame_size
);
86 if (frame_size
> *buffer_size
) {
87 uint8_t *new_buffer
= realloc(*buffer
, 2 * frame_size
);
91 *buffer_size
= 2 * frame_size
;
93 warn("Failed to allocate compressed data buffer\n");
100 if (fread(*buffer
, 1, frame_size
, infile
) != frame_size
) {
101 warn("Failed to read full frame\n");
105 *bytes_read
= frame_size
;