Commit 9c9fdf30 authored by Dmitry Kovalev's avatar Dmitry Kovalev Committed by Gerrit Code Review

Merge "Adding raw_read_frame() function to vpxdec."

parents ff0d073d f0fde243
...@@ -167,64 +167,68 @@ void usage_exit() { ...@@ -167,64 +167,68 @@ void usage_exit() {
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
static int read_frame(struct VpxDecInputContext *input, static int raw_read_frame(struct VpxInputContext *input_ctx, uint8_t **buffer,
uint8_t **buf, size_t *bytes_read, size_t *buffer_size) {
size_t *bytes_in_buffer,
size_t *buffer_size) {
char raw_hdr[RAW_FRAME_HDR_SZ]; char raw_hdr[RAW_FRAME_HDR_SZ];
size_t bytes_to_read = 0; size_t frame_size = 0;
FILE *infile = input->vpx_input_ctx->file; FILE *infile = 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;
}
if (kind == FILE_TYPE_RAW && bytes_to_read < kFrameTooSmallThreshold) { if (fread(raw_hdr, RAW_FRAME_HDR_SZ, 1, infile) != 1) {
warn("Warning: Read invalid frame size (%u) - not a raw file?\n", if (!feof(infile))
(unsigned int)bytes_to_read); 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) { if (frame_size > kCorruptFrameThreshold) {
uint8_t *new_buf = realloc(*buf, 2 * bytes_to_read); warn("Read invalid frame size (%u)\n", (unsigned int)frame_size);
frame_size = 0;
}
if (new_buf) { if (frame_size < kFrameTooSmallThreshold) {
*buf = new_buf; warn("Warning: Read invalid frame size (%u) - not a raw file?\n",
*buffer_size = 2 * bytes_to_read; (unsigned int)frame_size);
} else {
warn("Failed to allocate compressed data buffer\n");
bytes_to_read = 0;
}
}
} }
if (!feof(infile)) { if (frame_size > *buffer_size) {
if (fread(*buf, 1, bytes_to_read, infile) != bytes_to_read) { uint8_t *new_buf = realloc(*buffer, 2 * frame_size);
warn("Failed to read full frame\n"); if (new_buf) {
return 1; *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; if (!feof(infile)) {
} else if (kind == FILE_TYPE_IVF) { if (fread(*buffer, 1, frame_size, infile) != frame_size) {
return ivf_read_frame(input->vpx_input_ctx, warn("Failed to read full frame\n");
buf, bytes_in_buffer, buffer_size); 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) { void *out_open(const char *out_fn, int do_md5) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment