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