1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef TOOLS_COMMON_H_ 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define TOOLS_COMMON_H_ 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h> 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./vpx_config.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_codec.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_image.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/vpx_integer.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_ENCODERS 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "./y4minput.h" 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_MSC_VER) 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* MSVS uses _f{seek,tell}i64. */ 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define fseeko _fseeki64 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ftello _ftelli64 28233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef long _off_t; // NOLINT - MSVS compatible type 29233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef __int64 off_t; // fseeki64 compatible type 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define _OFF_T_DEFINED 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan#elif defined(_WIN32) 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* MinGW defines off_t as long and uses f{seek,tell}o64/off64_t for large 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan * files. */ 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define fseeko fseeko64 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ftello ftello64 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define off_t off64_t 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif /* _WIN32 */ 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_OS_SUPPORT 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if defined(_MSC_VER) 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <io.h> /* NOLINT */ 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define snprintf _snprintf 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define isatty _isatty 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define fileno _fileno 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan#else 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <unistd.h> /* NOLINT */ 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif /* _MSC_VER */ 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif /* CONFIG_OS_SUPPORT */ 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Use 32-bit file operations in WebM file format when building ARM 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan * executables (.axf) with RVCT. */ 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !CONFIG_OS_SUPPORT 53233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef long off_t; /* NOLINT */ 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define fseeko fseek 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define ftello ftell 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif /* CONFIG_OS_SUPPORT */ 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo) 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef PATH_MAX 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define PATH_MAX 512 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */ 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define IVF_FILE_HDR_SZ 32 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RAW_FRAME_HDR_SZ sizeof(uint32_t) 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP8_FOURCC 0x30385056 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP9_FOURCC 0x30395056 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 72233d2500723e5594f3e7c70896ffeeef32b9c950ywanenum VideoFileType { 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE_TYPE_RAW, 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE_TYPE_IVF, 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE_TYPE_Y4M, 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE_TYPE_WEBM 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan 79233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct FileTypeDetectionBuffer { 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan char buf[4]; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan size_t buf_read; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan size_t position; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan 85233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct VpxRational { 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan int numerator; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan int denominator; 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan 90233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct VpxInputContext { 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan const char *filename; 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan FILE *file; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan off_t length; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct FileTypeDetectionBuffer detect; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan enum VideoFileType file_type; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint32_t width; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint32_t height; 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan int use_i420; 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan int only_i420; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint32_t fourcc; 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct VpxRational framerate; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_ENCODERS 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan y4m_input y4m; 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 108233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Sets a stdio stream into binary mode */ 112233d2500723e5594f3e7c70896ffeeef32b9c950ywanFILE *set_binary_mode(FILE *stream); 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan 114233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid die(const char *fmt, ...); 115233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid fatal(const char *fmt, ...); 116233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid warn(const char *fmt, ...); 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan 118233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid die_codec(vpx_codec_ctx_t *ctx, const char *s); 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* The tool including this file must define usage_exit() */ 121233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid usage_exit(); 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan 123233d2500723e5594f3e7c70896ffeeef32b9c950ywanint read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame); 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan 125233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct VpxInterface { 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan const char *const name; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan const uint32_t fourcc; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_codec_iface_t *(*const interface)(); 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan} VpxInterface; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan 131233d2500723e5594f3e7c70896ffeeef32b9c950ywanint get_vpx_encoder_count(); 132233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst VpxInterface *get_vpx_encoder_by_index(int i); 133233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst VpxInterface *get_vpx_encoder_by_name(const char *name); 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan 135233d2500723e5594f3e7c70896ffeeef32b9c950ywanint get_vpx_decoder_count(); 136233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst VpxInterface *get_vpx_decoder_by_index(int i); 137233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst VpxInterface *get_vpx_decoder_by_name(const char *name); 138233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc); 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan// of vpx_image_t support 142233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vpx_img_plane_width(const vpx_image_t *img, int plane); 143233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vpx_img_plane_height(const vpx_image_t *img, int plane); 144233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vpx_img_write(const vpx_image_t *img, FILE *file); 145233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vpx_img_read(vpx_image_t *img, FILE *file); 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan 147233d2500723e5594f3e7c70896ffeeef32b9c950ywandouble sse_to_psnr(double samples, double peak, double mse); 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan} /* extern "C" */ 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // TOOLS_COMMON_H_ 154