1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifndef TOOLS_COMMON_H_ 11d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define TOOLS_COMMON_H_ 12d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 13d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include <stdio.h> 14d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 15d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "./vpx_config.h" 16dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#include "vpx/vpx_codec.h" 17d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "vpx/vpx_image.h" 18d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "vpx/vpx_integer.h" 19d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 20d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if CONFIG_ENCODERS 21d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "./y4minput.h" 22d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif 23d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 24d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if defined(_MSC_VER) 2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/* MSVS uses _f{seek,tell}i64. */ 26d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fseeko _fseeki64 27d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ftello _ftelli64 28d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#elif defined(_WIN32) 29693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com/* MinGW uses f{seek,tell}o64 for large files. */ 30d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fseeko fseeko64 31d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ftello ftello64 32d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif /* _WIN32 */ 33d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 34d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if CONFIG_OS_SUPPORT 35d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if defined(_MSC_VER) 36d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include <io.h> /* NOLINT */ 37d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define snprintf _snprintf 38d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define isatty _isatty 39d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fileno _fileno 40d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#else 41d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include <unistd.h> /* NOLINT */ 42d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif /* _MSC_VER */ 43d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif /* CONFIG_OS_SUPPORT */ 44d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 45d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org/* Use 32-bit file operations in WebM file format when building ARM 46d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * executables (.axf) with RVCT. */ 47d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if !CONFIG_OS_SUPPORT 48d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fseeko fseek 49d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ftello ftell 50d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif /* CONFIG_OS_SUPPORT */ 51d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 52d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo) 53d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 54d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifndef PATH_MAX 55d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define PATH_MAX 512 56d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif 57d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 58d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */ 59d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define IVF_FILE_HDR_SZ 32 60d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 61d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define RAW_FRAME_HDR_SZ sizeof(uint32_t) 62d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 63dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#define VP8_FOURCC 0x30385056 64dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#define VP9_FOURCC 0x30395056 65d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 66d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgenum VideoFileType { 67d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org FILE_TYPE_RAW, 68d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org FILE_TYPE_IVF, 69d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org FILE_TYPE_Y4M, 70d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org FILE_TYPE_WEBM 71d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org}; 72d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 73d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstruct FileTypeDetectionBuffer { 74d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org char buf[4]; 75d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org size_t buf_read; 76d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org size_t position; 77d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org}; 78d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 79d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstruct VpxRational { 80d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org int numerator; 81d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org int denominator; 82d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org}; 83d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 84d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstruct VpxInputContext { 85d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org const char *filename; 86d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org FILE *file; 87693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com int64_t length; 88d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org struct FileTypeDetectionBuffer detect; 89d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org enum VideoFileType file_type; 90d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org uint32_t width; 91d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org uint32_t height; 9288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org vpx_img_fmt_t fmt; 93e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org vpx_bit_depth_t bit_depth; 94d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org int only_i420; 95d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org uint32_t fourcc; 96d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org struct VpxRational framerate; 97d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if CONFIG_ENCODERS 98d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org y4m_input y4m; 99d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif 100d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org}; 101d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 102d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifdef __cplusplus 103d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgextern "C" { 104d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 106d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if defined(__GNUC__) 107d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#define VPX_NO_RETURN __attribute__((noreturn)) 108d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#else 109d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#define VPX_NO_RETURN 110d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif 111d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Sets a stdio stream into binary mode */ 1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgFILE *set_binary_mode(FILE *stream); 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 115d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid die(const char *fmt, ...) VPX_NO_RETURN; 116d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid fatal(const char *fmt, ...) VPX_NO_RETURN; 117d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgvoid warn(const char *fmt, ...); 118d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 119d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid die_codec(vpx_codec_ctx_t *ctx, const char *s) VPX_NO_RETURN; 120dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 121d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org/* The tool including this file must define usage_exit() */ 122d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid usage_exit() VPX_NO_RETURN; 123d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 124d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#undef VPX_NO_RETURN 125d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 126d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgint read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame); 127d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 12876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgtypedef struct VpxInterface { 12976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org const char *const name; 13076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org const uint32_t fourcc; 131ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org vpx_codec_iface_t *(*const codec_interface)(); 13276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org} VpxInterface; 13376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 13476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint get_vpx_encoder_count(); 13576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_encoder_by_index(int i); 13676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_encoder_by_name(const char *name); 13776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 13876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint get_vpx_decoder_count(); 13976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_decoder_by_index(int i); 14076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_decoder_by_name(const char *name); 14176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc); 142dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 143dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part 144dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org// of vpx_image_t support 14576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint vpx_img_plane_width(const vpx_image_t *img, int plane); 14676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint vpx_img_plane_height(const vpx_image_t *img, int plane); 147dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgvoid vpx_img_write(const vpx_image_t *img, FILE *file); 14876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint vpx_img_read(vpx_image_t *img, FILE *file); 149dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 150411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgdouble sse_to_psnr(double samples, double peak, double mse); 151411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 152d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifdef __cplusplus 153d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org} /* extern "C" */ 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 155d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org 156d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif // TOOLS_COMMON_H_ 157