1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifndef TOOLS_COMMON_H_
11d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define TOOLS_COMMON_H_
12d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
13d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include <stdio.h>
14d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
15d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "./vpx_config.h"
16dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#include "vpx/vpx_codec.h"
17d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "vpx/vpx_image.h"
18d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "vpx/vpx_integer.h"
19d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
20d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if CONFIG_ENCODERS
21d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include "./y4minput.h"
22d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif
23d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
24d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if defined(_MSC_VER)
2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/* MSVS uses _f{seek,tell}i64. */
26d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fseeko _fseeki64
27d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ftello _ftelli64
28d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#elif defined(_WIN32)
29693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com/* MinGW uses f{seek,tell}o64 for large files. */
30d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fseeko fseeko64
31d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ftello ftello64
32d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif  /* _WIN32 */
33d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
34d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if CONFIG_OS_SUPPORT
35d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if defined(_MSC_VER)
36d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include <io.h>  /* NOLINT */
37d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define snprintf _snprintf
38d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define isatty   _isatty
39d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fileno   _fileno
40d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#else
41d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#include <unistd.h>  /* NOLINT */
42d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif  /* _MSC_VER */
43d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif  /* CONFIG_OS_SUPPORT */
44d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
45d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org/* Use 32-bit file operations in WebM file format when building ARM
46d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org * executables (.axf) with RVCT. */
47d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if !CONFIG_OS_SUPPORT
48d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define fseeko fseek
49d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define ftello ftell
50d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif  /* CONFIG_OS_SUPPORT */
51d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
52d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo)
53d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
54d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifndef PATH_MAX
55d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define PATH_MAX 512
56d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif
57d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
58d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define IVF_FRAME_HDR_SZ (4 + 8)  /* 4 byte size + 8 byte timestamp */
59d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define IVF_FILE_HDR_SZ 32
60d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
61d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define RAW_FRAME_HDR_SZ sizeof(uint32_t)
62d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
63dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#define VP8_FOURCC 0x30385056
64dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#define VP9_FOURCC 0x30395056
65d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
66d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgenum VideoFileType {
67d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  FILE_TYPE_RAW,
68d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  FILE_TYPE_IVF,
69d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  FILE_TYPE_Y4M,
70d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  FILE_TYPE_WEBM
71d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org};
72d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
73d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstruct FileTypeDetectionBuffer {
74d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  char buf[4];
75d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  size_t buf_read;
76d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  size_t position;
77d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org};
78d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
79d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstruct VpxRational {
80d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  int numerator;
81d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  int denominator;
82d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org};
83d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
84d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstruct VpxInputContext {
85d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  const char *filename;
86d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  FILE *file;
87693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  int64_t length;
88d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  struct FileTypeDetectionBuffer detect;
89d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  enum VideoFileType file_type;
90d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  uint32_t width;
91d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  uint32_t height;
9288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  vpx_img_fmt_t fmt;
93e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org  vpx_bit_depth_t bit_depth;
94d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  int only_i420;
95d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  uint32_t fourcc;
96d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  struct VpxRational framerate;
97d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#if CONFIG_ENCODERS
98d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  y4m_input y4m;
99d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif
100d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org};
101d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
102d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifdef __cplusplus
103d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgextern "C" {
104d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
106d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#if defined(__GNUC__)
107d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#define VPX_NO_RETURN __attribute__((noreturn))
108d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#else
109d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#define VPX_NO_RETURN
110d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#endif
111d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* Sets a stdio stream into binary mode */
1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgFILE *set_binary_mode(FILE *stream);
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
115d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid die(const char *fmt, ...) VPX_NO_RETURN;
116d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid fatal(const char *fmt, ...) VPX_NO_RETURN;
117d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgvoid warn(const char *fmt, ...);
118d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
119d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid die_codec(vpx_codec_ctx_t *ctx, const char *s) VPX_NO_RETURN;
120dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
121d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org/* The tool including this file must define usage_exit() */
122d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid usage_exit() VPX_NO_RETURN;
123d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org
124d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org#undef VPX_NO_RETURN
125d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
126d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgint read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame);
127d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
12876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgtypedef struct VpxInterface {
12976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  const char *const name;
13076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  const uint32_t fourcc;
131ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  vpx_codec_iface_t *(*const codec_interface)();
13276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org} VpxInterface;
13376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
13476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint get_vpx_encoder_count();
13576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_encoder_by_index(int i);
13676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_encoder_by_name(const char *name);
13776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
13876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint get_vpx_decoder_count();
13976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_decoder_by_index(int i);
14076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_decoder_by_name(const char *name);
14176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgconst VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc);
142dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
143dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
144dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org// of vpx_image_t support
14576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint vpx_img_plane_width(const vpx_image_t *img, int plane);
14676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint vpx_img_plane_height(const vpx_image_t *img, int plane);
147dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgvoid vpx_img_write(const vpx_image_t *img, FILE *file);
14876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgint vpx_img_read(vpx_image_t *img, FILE *file);
149dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
150411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgdouble sse_to_psnr(double samples, double peak, double mse);
151411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org
152d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifdef __cplusplus
153d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org}  /* extern "C" */
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
155d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
156d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif  // TOOLS_COMMON_H_
157