1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10#ifndef TOOLS_COMMON_H_
11#define TOOLS_COMMON_H_
12
13#include <stdio.h>
14
15#include "./vpx_config.h"
16#include "vpx/vpx_codec.h"
17#include "vpx/vpx_image.h"
18#include "vpx/vpx_integer.h"
19
20#if CONFIG_ENCODERS
21#include "./y4minput.h"
22#endif
23
24#if defined(_MSC_VER)
25/* MSVS uses _f{seek,tell}i64. */
26#define fseeko _fseeki64
27#define ftello _ftelli64
28typedef long _off_t;  // NOLINT - MSVS compatible type
29typedef __int64 off_t;  // fseeki64 compatible type
30#define _OFF_T_DEFINED
31#elif defined(_WIN32)
32/* MinGW defines off_t as long and uses f{seek,tell}o64/off64_t for large
33 * files. */
34#define fseeko fseeko64
35#define ftello ftello64
36#define off_t off64_t
37#endif  /* _WIN32 */
38
39#if CONFIG_OS_SUPPORT
40#if defined(_MSC_VER)
41#include <io.h>  /* NOLINT */
42#define snprintf _snprintf
43#define isatty   _isatty
44#define fileno   _fileno
45#else
46#include <unistd.h>  /* NOLINT */
47#endif  /* _MSC_VER */
48#endif  /* CONFIG_OS_SUPPORT */
49
50/* Use 32-bit file operations in WebM file format when building ARM
51 * executables (.axf) with RVCT. */
52#if !CONFIG_OS_SUPPORT
53typedef long off_t;  /* NOLINT */
54#define fseeko fseek
55#define ftello ftell
56#endif  /* CONFIG_OS_SUPPORT */
57
58#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo)
59
60#ifndef PATH_MAX
61#define PATH_MAX 512
62#endif
63
64#define IVF_FRAME_HDR_SZ (4 + 8)  /* 4 byte size + 8 byte timestamp */
65#define IVF_FILE_HDR_SZ 32
66
67#define RAW_FRAME_HDR_SZ sizeof(uint32_t)
68
69#define VP8_FOURCC 0x30385056
70#define VP9_FOURCC 0x30395056
71
72enum VideoFileType {
73  FILE_TYPE_RAW,
74  FILE_TYPE_IVF,
75  FILE_TYPE_Y4M,
76  FILE_TYPE_WEBM
77};
78
79struct FileTypeDetectionBuffer {
80  char buf[4];
81  size_t buf_read;
82  size_t position;
83};
84
85struct VpxRational {
86  int numerator;
87  int denominator;
88};
89
90struct VpxInputContext {
91  const char *filename;
92  FILE *file;
93  off_t length;
94  struct FileTypeDetectionBuffer detect;
95  enum VideoFileType file_type;
96  uint32_t width;
97  uint32_t height;
98  int use_i420;
99  int only_i420;
100  uint32_t fourcc;
101  struct VpxRational framerate;
102#if CONFIG_ENCODERS
103  y4m_input y4m;
104#endif
105};
106
107#ifdef __cplusplus
108extern "C" {
109#endif
110
111/* Sets a stdio stream into binary mode */
112FILE *set_binary_mode(FILE *stream);
113
114void die(const char *fmt, ...);
115void fatal(const char *fmt, ...);
116void warn(const char *fmt, ...);
117
118void die_codec(vpx_codec_ctx_t *ctx, const char *s);
119
120/* The tool including this file must define usage_exit() */
121void usage_exit();
122
123int read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame);
124
125typedef struct VpxInterface {
126  const char *const name;
127  const uint32_t fourcc;
128  vpx_codec_iface_t *(*const interface)();
129} VpxInterface;
130
131int get_vpx_encoder_count();
132const VpxInterface *get_vpx_encoder_by_index(int i);
133const VpxInterface *get_vpx_encoder_by_name(const char *name);
134
135int get_vpx_decoder_count();
136const VpxInterface *get_vpx_decoder_by_index(int i);
137const VpxInterface *get_vpx_decoder_by_name(const char *name);
138const VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc);
139
140// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
141// of vpx_image_t support
142int vpx_img_plane_width(const vpx_image_t *img, int plane);
143int vpx_img_plane_height(const vpx_image_t *img, int plane);
144void vpx_img_write(const vpx_image_t *img, FILE *file);
145int vpx_img_read(vpx_image_t *img, FILE *file);
146
147double sse_to_psnr(double samples, double peak, double mse);
148
149#ifdef __cplusplus
150}  /* extern "C" */
151#endif
152
153#endif  // TOOLS_COMMON_H_
154