tools_common.h revision b08e2e23eec181e9951df33cd704ac294c5407b6
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) 259b35249446b07f40ac5fcc3205f2c048616efacchkuang/* MSVS doesn't define off_t, and uses _f{seek,tell}i64. */ 269b35249446b07f40ac5fcc3205f2c048616efacchkuangtypedef __int64 off_t; 279b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko _fseeki64 289b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello _ftelli64 299b35249446b07f40ac5fcc3205f2c048616efacchkuang#elif defined(_WIN32) 309b35249446b07f40ac5fcc3205f2c048616efacchkuang/* MinGW defines off_t as long and uses f{seek,tell}o64/off64_t for large 319b35249446b07f40ac5fcc3205f2c048616efacchkuang * files. */ 329b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko fseeko64 339b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello ftello64 349b35249446b07f40ac5fcc3205f2c048616efacchkuang#define off_t off64_t 359b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* _WIN32 */ 369b35249446b07f40ac5fcc3205f2c048616efacchkuang 379b35249446b07f40ac5fcc3205f2c048616efacchkuang#if CONFIG_OS_SUPPORT 389b35249446b07f40ac5fcc3205f2c048616efacchkuang#if defined(_MSC_VER) 399b35249446b07f40ac5fcc3205f2c048616efacchkuang#include <io.h> /* NOLINT */ 409b35249446b07f40ac5fcc3205f2c048616efacchkuang#define snprintf _snprintf 419b35249446b07f40ac5fcc3205f2c048616efacchkuang#define isatty _isatty 429b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fileno _fileno 439b35249446b07f40ac5fcc3205f2c048616efacchkuang#else 449b35249446b07f40ac5fcc3205f2c048616efacchkuang#include <unistd.h> /* NOLINT */ 459b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* _MSC_VER */ 469b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* CONFIG_OS_SUPPORT */ 479b35249446b07f40ac5fcc3205f2c048616efacchkuang 489b35249446b07f40ac5fcc3205f2c048616efacchkuang/* Use 32-bit file operations in WebM file format when building ARM 499b35249446b07f40ac5fcc3205f2c048616efacchkuang * executables (.axf) with RVCT. */ 509b35249446b07f40ac5fcc3205f2c048616efacchkuang#if !CONFIG_OS_SUPPORT 519b35249446b07f40ac5fcc3205f2c048616efacchkuangtypedef long off_t; /* NOLINT */ 529b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko fseek 539b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello ftell 549b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* CONFIG_OS_SUPPORT */ 559b35249446b07f40ac5fcc3205f2c048616efacchkuang 569b35249446b07f40ac5fcc3205f2c048616efacchkuang#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo) 579b35249446b07f40ac5fcc3205f2c048616efacchkuang 589b35249446b07f40ac5fcc3205f2c048616efacchkuang#ifndef PATH_MAX 599b35249446b07f40ac5fcc3205f2c048616efacchkuang#define PATH_MAX 512 609b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif 619b35249446b07f40ac5fcc3205f2c048616efacchkuang 62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */ 63b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define IVF_FILE_HDR_SZ 32 64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define RAW_FRAME_HDR_SZ sizeof(uint32_t) 66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP8_FOURCC 0x30385056 68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP9_FOURCC 0x30395056 69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianenum VideoFileType { 71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_RAW, 72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_IVF, 73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_Y4M, 74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE_TYPE_WEBM 75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct FileTypeDetectionBuffer { 78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian char buf[4]; 79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t buf_read; 80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian size_t position; 81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct VpxRational { 84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int numerator; 85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int denominator; 86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct VpxInputContext { 89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const char *filename; 90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian FILE *file; 91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian off_t length; 92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct FileTypeDetectionBuffer detect; 93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian enum VideoFileType file_type; 94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t width; 95b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t height; 96b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int use_i420; 97b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int only_i420; 98b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian uint32_t fourcc; 99b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct VpxRational framerate; 100b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_ENCODERS 101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian y4m_input y4m; 102b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" { 107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Sets a stdio stream into binary mode */ 110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *set_binary_mode(FILE *stream); 111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 1125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid die(const char *fmt, ...); 1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid fatal(const char *fmt, ...); 1145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid warn(const char *fmt, ...); 1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 116b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid die_codec(vpx_codec_ctx_t *ctx, const char *s); 117b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/* The tool including this file must define usage_exit() */ 1195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid usage_exit(); 1205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 121b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame); 122b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 123b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct VpxInterface { 124b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const char *const name; 125b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const uint32_t fourcc; 126b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vpx_codec_iface_t *(*const interface)(); 127b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} VpxInterface; 128b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 129b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint get_vpx_encoder_count(); 130b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_encoder_by_index(int i); 131b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_encoder_by_name(const char *name); 132b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 133b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint get_vpx_decoder_count(); 134b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_index(int i); 135b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_name(const char *name); 136b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc); 137b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 138b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part 139b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// of vpx_image_t support 140b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vpx_img_plane_width(const vpx_image_t *img, int plane); 141b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vpx_img_plane_height(const vpx_image_t *img, int plane); 142b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vpx_img_write(const vpx_image_t *img, FILE *file); 143b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianint vpx_img_read(vpx_image_t *img, FILE *file); 144b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 145b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniandouble sse_to_psnr(double samples, double peak, double mse); 146b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 147b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus 148b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} /* extern "C" */ 149b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 150b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 1515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif // TOOLS_COMMON_H_ 152