1538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * 4538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Use of this source code is governed by a BSD-style license 5538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * that can be found in the LICENSE file in the root of the source 6538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * tree. An additional intellectual property rights grant can be found 7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * in the file PATENTS. All contributing project authors may 8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * be found in the AUTHORS file in the root of the source tree. 9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef TOOLS_COMMON_H_ 115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define TOOLS_COMMON_H_ 125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <stdio.h> 145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 159b35249446b07f40ac5fcc3205f2c048616efacchkuang#include "./vpx_config.h" 16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/vpx_codec.h" 17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/vpx_image.h" 18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/vpx_integer.h" 19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_ENCODERS 21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "./y4minput.h" 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 239b35249446b07f40ac5fcc3205f2c048616efacchkuang 249b35249446b07f40ac5fcc3205f2c048616efacchkuang#if defined(_MSC_VER) 256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang/* MSVS uses _f{seek,tell}i64. */ 269b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko _fseeki64 279b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello _ftelli64 286ac915abcdb404a00d927fe6308a47fcf09d9519hkuangtypedef long _off_t; // NOLINT - MSVS compatible type 296ac915abcdb404a00d927fe6308a47fcf09d9519hkuangtypedef __int64 off_t; // fseeki64 compatible type 306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define _OFF_T_DEFINED 319b35249446b07f40ac5fcc3205f2c048616efacchkuang#elif defined(_WIN32) 329b35249446b07f40ac5fcc3205f2c048616efacchkuang/* MinGW defines off_t as long and uses f{seek,tell}o64/off64_t for large 339b35249446b07f40ac5fcc3205f2c048616efacchkuang * files. */ 349b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko fseeko64 359b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello ftello64 369b35249446b07f40ac5fcc3205f2c048616efacchkuang#define off_t off64_t 379b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* _WIN32 */ 389b35249446b07f40ac5fcc3205f2c048616efacchkuang 399b35249446b07f40ac5fcc3205f2c048616efacchkuang#if CONFIG_OS_SUPPORT 409b35249446b07f40ac5fcc3205f2c048616efacchkuang#if defined(_MSC_VER) 419b35249446b07f40ac5fcc3205f2c048616efacchkuang#include <io.h> /* NOLINT */ 429b35249446b07f40ac5fcc3205f2c048616efacchkuang#define snprintf _snprintf 439b35249446b07f40ac5fcc3205f2c048616efacchkuang#define isatty _isatty 449b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fileno _fileno 459b35249446b07f40ac5fcc3205f2c048616efacchkuang#else 469b35249446b07f40ac5fcc3205f2c048616efacchkuang#include <unistd.h> /* NOLINT */ 479b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* _MSC_VER */ 489b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* CONFIG_OS_SUPPORT */ 499b35249446b07f40ac5fcc3205f2c048616efacchkuang 509b35249446b07f40ac5fcc3205f2c048616efacchkuang/* Use 32-bit file operations in WebM file format when building ARM 519b35249446b07f40ac5fcc3205f2c048616efacchkuang * executables (.axf) with RVCT. */ 529b35249446b07f40ac5fcc3205f2c048616efacchkuang#if !CONFIG_OS_SUPPORT 539b35249446b07f40ac5fcc3205f2c048616efacchkuangtypedef long off_t; /* NOLINT */ 549b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko fseek 559b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello ftell 569b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* CONFIG_OS_SUPPORT */ 579b35249446b07f40ac5fcc3205f2c048616efacchkuang 589b35249446b07f40ac5fcc3205f2c048616efacchkuang#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo) 599b35249446b07f40ac5fcc3205f2c048616efacchkuang 609b35249446b07f40ac5fcc3205f2c048616efacchkuang#ifndef PATH_MAX 619b35249446b07f40ac5fcc3205f2c048616efacchkuang#define PATH_MAX 512 629b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif 639b35249446b07f40ac5fcc3205f2c048616efacchkuang 64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */ 65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define IVF_FILE_HDR_SZ 32 66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define RAW_FRAME_HDR_SZ sizeof(uint32_t) 68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP8_FOURCC 0x30385056 70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP9_FOURCC 0x30395056 71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianenum VideoFileType { 73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_RAW, 74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_IVF, 75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_Y4M, 76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_WEBM 77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct FileTypeDetectionBuffer { 80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian char buf[4]; 81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t buf_read; 82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t position; 83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct VpxRational { 86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int numerator; 87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int denominator; 88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct VpxInputContext { 91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const char *filename; 92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE *file; 93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian off_t length; 94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct FileTypeDetectionBuffer detect; 95b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian enum VideoFileType file_type; 96b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t width; 97b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t height; 98b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int use_i420; 99b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int only_i420; 100b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t fourcc; 101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct VpxRational framerate; 102b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_ENCODERS 103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian y4m_input y4m; 104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 108b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Sets a stdio stream into binary mode */ 112ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *set_binary_mode(FILE *stream); 113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 1145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid die(const char *fmt, ...); 1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid fatal(const char *fmt, ...); 1165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid warn(const char *fmt, ...); 1175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 118b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid die_codec(vpx_codec_ctx_t *ctx, const char *s); 119b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/* The tool including this file must define usage_exit() */ 1215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid usage_exit(); 1225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame); 124b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct VpxInterface { 126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const char *const name; 127b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const uint32_t fourcc; 128b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_codec_iface_t *(*const interface)(); 129b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} VpxInterface; 130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 131b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint get_vpx_encoder_count(); 132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_encoder_by_index(int i); 133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_encoder_by_name(const char *name); 134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 135b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint get_vpx_decoder_count(); 136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_index(int i); 137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_name(const char *name); 138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc); 139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part 141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// of vpx_image_t support 142b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vpx_img_plane_width(const vpx_image_t *img, int plane); 143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vpx_img_plane_height(const vpx_image_t *img, int plane); 144b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vpx_img_write(const vpx_image_t *img, FILE *file); 145b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vpx_img_read(vpx_image_t *img, FILE *file); 146b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniandouble sse_to_psnr(double samples, double peak, double mse); 148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} /* extern "C" */ 151b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 152b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif // TOOLS_COMMON_H_ 154