Index: source/libvpx/tools_common.c |
=================================================================== |
--- source/libvpx/tools_common.c (revision 240950) |
+++ source/libvpx/tools_common.c (working copy) |
@@ -7,8 +7,14 @@ |
* in the file PATENTS. All contributing project authors may |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
+ |
+#include "tools_common.h" |
+ |
+#include <stdarg.h> |
#include <stdio.h> |
-#include "tools_common.h" |
+#include <stdlib.h> |
+#include <string.h> |
+ |
#if defined(_WIN32) || defined(__OS2__) |
#include <io.h> |
#include <fcntl.h> |
@@ -20,6 +26,18 @@ |
#endif |
#endif |
+#define LOG_ERROR(label) do {\ |
+ const char *l = label;\ |
+ va_list ap;\ |
+ va_start(ap, fmt);\ |
+ if (l)\ |
+ fprintf(stderr, "%s: ", l);\ |
+ vfprintf(stderr, fmt, ap);\ |
+ fprintf(stderr, "\n");\ |
+ va_end(ap);\ |
+} while (0) |
+ |
+ |
FILE *set_binary_mode(FILE *stream) { |
(void)stream; |
#if defined(_WIN32) || defined(__OS2__) |
@@ -27,3 +45,88 @@ |
#endif |
return stream; |
} |
+ |
+void die(const char *fmt, ...) { |
+ LOG_ERROR(NULL); |
+ usage_exit(); |
+} |
+ |
+void fatal(const char *fmt, ...) { |
+ LOG_ERROR("Fatal"); |
+ exit(EXIT_FAILURE); |
+} |
+ |
+void warn(const char *fmt, ...) { |
+ LOG_ERROR("Warning"); |
+} |
+ |
+uint16_t mem_get_le16(const void *data) { |
+ uint16_t val; |
+ const uint8_t *mem = (const uint8_t*)data; |
+ |
+ val = mem[1] << 8; |
+ val |= mem[0]; |
+ return val; |
+} |
+ |
+uint32_t mem_get_le32(const void *data) { |
+ uint32_t val; |
+ const uint8_t *mem = (const uint8_t*)data; |
+ |
+ val = mem[3] << 24; |
+ val |= mem[2] << 16; |
+ val |= mem[1] << 8; |
+ val |= mem[0]; |
+ return val; |
+} |
+ |
+int read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame) { |
+ FILE *f = input_ctx->file; |
+ struct FileTypeDetectionBuffer *detect = &input_ctx->detect; |
+ int plane = 0; |
+ int shortread = 0; |
+ |
+ for (plane = 0; plane < 3; ++plane) { |
+ uint8_t *ptr; |
+ const int w = (plane ? (1 + yuv_frame->d_w) / 2 : yuv_frame->d_w); |
+ const int h = (plane ? (1 + yuv_frame->d_h) / 2 : yuv_frame->d_h); |
+ int r; |
+ |
+ /* Determine the correct plane based on the image format. The for-loop |
+ * always counts in Y,U,V order, but this may not match the order of |
+ * the data on disk. |
+ */ |
+ switch (plane) { |
+ case 1: |
+ ptr = yuv_frame->planes[ |
+ yuv_frame->fmt == VPX_IMG_FMT_YV12 ? VPX_PLANE_V : VPX_PLANE_U]; |
+ break; |
+ case 2: |
+ ptr = yuv_frame->planes[ |
+ yuv_frame->fmt == VPX_IMG_FMT_YV12 ? VPX_PLANE_U : VPX_PLANE_V]; |
+ break; |
+ default: |
+ ptr = yuv_frame->planes[plane]; |
+ } |
+ |
+ for (r = 0; r < h; ++r) { |
+ size_t needed = w; |
+ size_t buf_position = 0; |
+ const size_t left = detect->buf_read - detect->position; |
+ if (left > 0) { |
+ const size_t more = (left < needed) ? left : needed; |
+ memcpy(ptr, detect->buf + detect->position, more); |
+ buf_position = more; |
+ needed -= more; |
+ detect->position += more; |
+ } |
+ if (needed > 0) { |
+ shortread |= (fread(ptr + buf_position, 1, needed, f) < needed); |
+ } |
+ |
+ ptr += yuv_frame->stride[plane]; |
+ } |
+ } |
+ |
+ return shortread; |
+} |