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" 162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "vpx/vpx_codec.h" 172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "vpx/vpx_image.h" 182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "vpx/vpx_integer.h" 197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_ports/msvc.h" 202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#if CONFIG_ENCODERS 222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./y4minput.h" 232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 249b35249446b07f40ac5fcc3205f2c048616efacchkuang 259b35249446b07f40ac5fcc3205f2c048616efacchkuang#if defined(_MSC_VER) 264fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang/* MSVS uses _f{seek,tell}i64. */ 279b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko _fseeki64 289b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello _ftelli64 299b35249446b07f40ac5fcc3205f2c048616efacchkuang#elif defined(_WIN32) 30ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian/* MinGW uses f{seek,tell}o64 for large files. */ 319b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko fseeko64 329b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello ftello64 339b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* _WIN32 */ 349b35249446b07f40ac5fcc3205f2c048616efacchkuang 359b35249446b07f40ac5fcc3205f2c048616efacchkuang#if CONFIG_OS_SUPPORT 369b35249446b07f40ac5fcc3205f2c048616efacchkuang#if defined(_MSC_VER) 379b35249446b07f40ac5fcc3205f2c048616efacchkuang#include <io.h> /* NOLINT */ 389b35249446b07f40ac5fcc3205f2c048616efacchkuang#define isatty _isatty 399b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fileno _fileno 409b35249446b07f40ac5fcc3205f2c048616efacchkuang#else 419b35249446b07f40ac5fcc3205f2c048616efacchkuang#include <unistd.h> /* NOLINT */ 429b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* _MSC_VER */ 439b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* CONFIG_OS_SUPPORT */ 449b35249446b07f40ac5fcc3205f2c048616efacchkuang 459b35249446b07f40ac5fcc3205f2c048616efacchkuang/* Use 32-bit file operations in WebM file format when building ARM 469b35249446b07f40ac5fcc3205f2c048616efacchkuang * executables (.axf) with RVCT. */ 479b35249446b07f40ac5fcc3205f2c048616efacchkuang#if !CONFIG_OS_SUPPORT 489b35249446b07f40ac5fcc3205f2c048616efacchkuang#define fseeko fseek 499b35249446b07f40ac5fcc3205f2c048616efacchkuang#define ftello ftell 509b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif /* CONFIG_OS_SUPPORT */ 519b35249446b07f40ac5fcc3205f2c048616efacchkuang 529b35249446b07f40ac5fcc3205f2c048616efacchkuang#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo) 539b35249446b07f40ac5fcc3205f2c048616efacchkuang 549b35249446b07f40ac5fcc3205f2c048616efacchkuang#ifndef PATH_MAX 559b35249446b07f40ac5fcc3205f2c048616efacchkuang#define PATH_MAX 512 569b35249446b07f40ac5fcc3205f2c048616efacchkuang#endif 579b35249446b07f40ac5fcc3205f2c048616efacchkuang 582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */ 592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define IVF_FILE_HDR_SZ 32 602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define RAW_FRAME_HDR_SZ sizeof(uint32_t) 622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define VP8_FOURCC 0x30385056 642ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define VP9_FOURCC 0x30395056 657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define VP10_FOURCC 0x303a5056 662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianenum VideoFileType { 682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FILE_TYPE_RAW, 692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FILE_TYPE_IVF, 702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FILE_TYPE_Y4M, 712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FILE_TYPE_WEBM 722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct FileTypeDetectionBuffer { 752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian char buf[4]; 762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian size_t buf_read; 772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian size_t position; 782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct VpxRational { 812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int numerator; 822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int denominator; 832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianstruct VpxInputContext { 862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const char *filename; 872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FILE *file; 88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian int64_t length; 892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct FileTypeDetectionBuffer detect; 902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian enum VideoFileType file_type; 912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32_t width; 922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32_t height; 937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian struct VpxRational pixel_aspect_ratio; 94ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vpx_img_fmt_t fmt; 95ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vpx_bit_depth_t bit_depth; 962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int only_i420; 972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian uint32_t fourcc; 982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian struct VpxRational framerate; 992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#if CONFIG_ENCODERS 1002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian y4m_input y4m; 1012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 1022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 1032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus 1052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianextern "C" { 1062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 1087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if defined(__GNUC__) 1097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define VPX_NO_RETURN __attribute__((noreturn)) 1107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else 1117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define VPX_NO_RETURN 1127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* Sets a stdio stream into binary mode */ 115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangFILE *set_binary_mode(FILE *stream); 116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 1177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid die(const char *fmt, ...) VPX_NO_RETURN; 1187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid fatal(const char *fmt, ...) VPX_NO_RETURN; 1195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid warn(const char *fmt, ...); 1205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid die_codec(vpx_codec_ctx_t *ctx, const char *s) VPX_NO_RETURN; 1222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/* The tool including this file must define usage_exit() */ 1247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid usage_exit(void) VPX_NO_RETURN; 1257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#undef VPX_NO_RETURN 1275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianint read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame); 1292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramaniantypedef struct VpxInterface { 1312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const char *const name; 1322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const uint32_t fourcc; 133ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian vpx_codec_iface_t *(*const codec_interface)(); 1342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian} VpxInterface; 1352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianint get_vpx_encoder_count(void); 1372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianconst VpxInterface *get_vpx_encoder_by_index(int i); 1382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianconst VpxInterface *get_vpx_encoder_by_name(const char *name); 1392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianint get_vpx_decoder_count(void); 1412ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_index(int i); 1422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_name(const char *name); 1432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianconst VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc); 1442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1452ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part 1462ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// of vpx_image_t support 1472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianint vpx_img_plane_width(const vpx_image_t *img, int plane); 1482ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianint vpx_img_plane_height(const vpx_image_t *img, int plane); 1492ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianvoid vpx_img_write(const vpx_image_t *img, FILE *file); 1502ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianint vpx_img_read(vpx_image_t *img, FILE *file); 1512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramaniandouble sse_to_psnr(double samples, double peak, double mse); 1532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 1557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_img_upshift(vpx_image_t *dst, vpx_image_t *src, int input_shift); 1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_img_downshift(vpx_image_t *dst, vpx_image_t *src, int down_shift); 1577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianvoid vpx_img_truncate_16_to_8(vpx_image_t *dst, vpx_image_t *src); 1587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif 1597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1602ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifdef __cplusplus 1612ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian} /* extern "C" */ 1622ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif 1632ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif // TOOLS_COMMON_H_ 165