From f0fde24379526da487319b9bf7288757013f7a6b Mon Sep 17 00:00:00 2001 From: Dmitry Kovalev Date: Mon, 13 Jan 2014 10:54:57 -0800 Subject: Adding raw_read_frame() function to vpxdec. Change-Id: Ie2a4606daf35b327d6f2ac8d7fd8f6cacf4c5b6a --- vpxdec.c | 98 +++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/vpxdec.c b/vpxdec.c index 655b75690..6ea21798d 100644 --- a/vpxdec.c +++ b/vpxdec.c @@ -167,64 +167,68 @@ void usage_exit() { exit(EXIT_FAILURE); } -static int read_frame(struct VpxDecInputContext *input, - uint8_t **buf, - size_t *bytes_in_buffer, - size_t *buffer_size) { +static int raw_read_frame(struct VpxInputContext *input_ctx, uint8_t **buffer, + size_t *bytes_read, size_t *buffer_size) { char raw_hdr[RAW_FRAME_HDR_SZ]; - size_t bytes_to_read = 0; - FILE *infile = input->vpx_input_ctx->file; - enum VideoFileType kind = input->vpx_input_ctx->file_type; - if (kind == FILE_TYPE_WEBM) { - return webm_read_frame(input->webm_ctx, - buf, bytes_in_buffer, buffer_size); - } else if (kind == FILE_TYPE_RAW) { - if (fread(raw_hdr, RAW_FRAME_HDR_SZ, 1, infile) != 1) { - if (!feof(infile)) - warn("Failed to read RAW frame size\n"); - } else { - const int kCorruptFrameThreshold = 256 * 1024 * 1024; - const int kFrameTooSmallThreshold = 256 * 1024; - bytes_to_read = mem_get_le32(raw_hdr); - - if (bytes_to_read > kCorruptFrameThreshold) { - warn("Read invalid frame size (%u)\n", (unsigned int)bytes_to_read); - bytes_to_read = 0; - } + size_t frame_size = 0; + FILE *infile = input_ctx->file; - if (kind == FILE_TYPE_RAW && bytes_to_read < kFrameTooSmallThreshold) { - warn("Warning: Read invalid frame size (%u) - not a raw file?\n", - (unsigned int)bytes_to_read); - } + if (fread(raw_hdr, RAW_FRAME_HDR_SZ, 1, infile) != 1) { + if (!feof(infile)) + warn("Failed to read RAW frame size\n"); + } else { + const int kCorruptFrameThreshold = 256 * 1024 * 1024; + const int kFrameTooSmallThreshold = 256 * 1024; + frame_size = mem_get_le32(raw_hdr); - if (bytes_to_read > *buffer_size) { - uint8_t *new_buf = realloc(*buf, 2 * bytes_to_read); + if (frame_size > kCorruptFrameThreshold) { + warn("Read invalid frame size (%u)\n", (unsigned int)frame_size); + frame_size = 0; + } - if (new_buf) { - *buf = new_buf; - *buffer_size = 2 * bytes_to_read; - } else { - warn("Failed to allocate compressed data buffer\n"); - bytes_to_read = 0; - } - } + if (frame_size < kFrameTooSmallThreshold) { + warn("Warning: Read invalid frame size (%u) - not a raw file?\n", + (unsigned int)frame_size); } - if (!feof(infile)) { - if (fread(*buf, 1, bytes_to_read, infile) != bytes_to_read) { - warn("Failed to read full frame\n"); - return 1; + if (frame_size > *buffer_size) { + uint8_t *new_buf = realloc(*buffer, 2 * frame_size); + if (new_buf) { + *buffer = new_buf; + *buffer_size = 2 * frame_size; + } else { + warn("Failed to allocate compressed data buffer\n"); + frame_size = 0; } - *bytes_in_buffer = bytes_to_read; } + } - return 0; - } else if (kind == FILE_TYPE_IVF) { - return ivf_read_frame(input->vpx_input_ctx, - buf, bytes_in_buffer, buffer_size); + if (!feof(infile)) { + if (fread(*buffer, 1, frame_size, infile) != frame_size) { + warn("Failed to read full frame\n"); + return 1; + } + *bytes_read = frame_size; } - return 1; + return 0; +} + +static int read_frame(struct VpxDecInputContext *input, uint8_t **buf, + size_t *bytes_in_buffer, size_t *buffer_size) { + switch (input->vpx_input_ctx->file_type) { + case FILE_TYPE_WEBM: + return webm_read_frame(input->webm_ctx, + buf, bytes_in_buffer, buffer_size); + case FILE_TYPE_RAW: + return raw_read_frame(input->vpx_input_ctx, + buf, bytes_in_buffer, buffer_size); + case FILE_TYPE_IVF: + return ivf_read_frame(input->vpx_input_ctx, + buf, bytes_in_buffer, buffer_size); + default: + return 1; + } } void *out_open(const char *out_fn, int do_md5) { -- cgit v1.2.3