tools_common.h revision 6ac915abcdb404a00d927fe6308a47fcf09d9519
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