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