tools_common.h 4.15 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
John Koleszar's avatar
John Koleszar committed
3
 *
4 5 6 7 8 9
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
John Koleszar's avatar
John Koleszar committed
10
 */
11 12 13 14 15
#ifndef TOOLS_COMMON_H_
#define TOOLS_COMMON_H_

#include <stdio.h>

Adrian Grange's avatar
Adrian Grange committed
16 17 18 19
#include "./aom_config.h"
#include "aom/aom_codec.h"
#include "aom/aom_image.h"
#include "aom/aom_integer.h"
Yaowu Xu's avatar
Yaowu Xu committed
20
#include "aom_ports/msvc.h"
21 22 23 24

#if CONFIG_ENCODERS
#include "./y4minput.h"
#endif
25 26

#if defined(_MSC_VER)
27
/* MSVS uses _f{seek,tell}i64. */
28 29 30
#define fseeko _fseeki64
#define ftello _ftelli64
#elif defined(_WIN32)
James Zern's avatar
James Zern committed
31
/* MinGW uses f{seek,tell}o64 for large files. */
32 33
#define fseeko fseeko64
#define ftello ftello64
clang-format's avatar
clang-format committed
34
#endif /* _WIN32 */
35 36 37

#if CONFIG_OS_SUPPORT
#if defined(_MSC_VER)
clang-format's avatar
clang-format committed
38 39 40
#include <io.h> /* NOLINT */
#define isatty _isatty
#define fileno _fileno
41
#else
clang-format's avatar
clang-format committed
42 43 44
#include <unistd.h> /* NOLINT */
#endif              /* _MSC_VER */
#endif              /* CONFIG_OS_SUPPORT */
45 46 47 48 49 50

/* Use 32-bit file operations in WebM file format when building ARM
 * executables (.axf) with RVCT. */
#if !CONFIG_OS_SUPPORT
#define fseeko fseek
#define ftello ftell
clang-format's avatar
clang-format committed
51
#endif /* CONFIG_OS_SUPPORT */
52 53 54 55 56 57 58

#define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo)

#ifndef PATH_MAX
#define PATH_MAX 512
#endif

clang-format's avatar
clang-format committed
59
#define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */
60 61 62 63
#define IVF_FILE_HDR_SZ 32

#define RAW_FRAME_HDR_SZ sizeof(uint32_t)

Adrian Grange's avatar
Adrian Grange committed
64
#define AV1_FOURCC 0x31305641
John Koleszar's avatar
John Koleszar committed
65

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
enum VideoFileType {
  FILE_TYPE_RAW,
  FILE_TYPE_IVF,
  FILE_TYPE_Y4M,
  FILE_TYPE_WEBM
};

struct FileTypeDetectionBuffer {
  char buf[4];
  size_t buf_read;
  size_t position;
};

struct VpxRational {
  int numerator;
  int denominator;
};

struct VpxInputContext {
  const char *filename;
  FILE *file;
James Zern's avatar
James Zern committed
87
  int64_t length;
88 89
  struct FileTypeDetectionBuffer detect;
  enum VideoFileType file_type;
90 91
  uint32_t width;
  uint32_t height;
92
  struct VpxRational pixel_aspect_ratio;
Adrian Grange's avatar
Adrian Grange committed
93 94
  aom_img_fmt_t fmt;
  aom_bit_depth_t bit_depth;
95
  int only_i420;
96
  uint32_t fourcc;
97 98 99 100 101 102 103 104 105 106
  struct VpxRational framerate;
#if CONFIG_ENCODERS
  y4m_input y4m;
#endif
};

#ifdef __cplusplus
extern "C" {
#endif

107
#if defined(__GNUC__)
Adrian Grange's avatar
Adrian Grange committed
108
#define AOM_NO_RETURN __attribute__((noreturn))
109
#else
Adrian Grange's avatar
Adrian Grange committed
110
#define AOM_NO_RETURN
111 112
#endif

John Koleszar's avatar
John Koleszar committed
113
/* Sets a stdio stream into binary mode */
John Koleszar's avatar
John Koleszar committed
114
FILE *set_binary_mode(FILE *stream);
John Koleszar's avatar
John Koleszar committed
115

Adrian Grange's avatar
Adrian Grange committed
116 117
void die(const char *fmt, ...) AOM_NO_RETURN;
void fatal(const char *fmt, ...) AOM_NO_RETURN;
118 119
void warn(const char *fmt, ...);

Adrian Grange's avatar
Adrian Grange committed
120
void die_codec(aom_codec_ctx_t *ctx, const char *s) AOM_NO_RETURN;
121

122
/* The tool including this file must define usage_exit() */
Adrian Grange's avatar
Adrian Grange committed
123
void usage_exit(void) AOM_NO_RETURN;
124

Adrian Grange's avatar
Adrian Grange committed
125
#undef AOM_NO_RETURN
126

Adrian Grange's avatar
Adrian Grange committed
127
int read_yuv_frame(struct VpxInputContext *input_ctx, aom_image_t *yuv_frame);
128

129 130 131
typedef struct VpxInterface {
  const char *const name;
  const uint32_t fourcc;
Adrian Grange's avatar
Adrian Grange committed
132
  aom_codec_iface_t *(*const codec_interface)();
133 134
} VpxInterface;

Adrian Grange's avatar
Adrian Grange committed
135 136 137
int get_aom_encoder_count(void);
const VpxInterface *get_aom_encoder_by_index(int i);
const VpxInterface *get_aom_encoder_by_name(const char *name);
138

Adrian Grange's avatar
Adrian Grange committed
139 140 141 142
int get_aom_decoder_count(void);
const VpxInterface *get_aom_decoder_by_index(int i);
const VpxInterface *get_aom_decoder_by_name(const char *name);
const VpxInterface *get_aom_decoder_by_fourcc(uint32_t fourcc);
143

Adrian Grange's avatar
Adrian Grange committed
144 145 146 147 148 149
// TODO(dkovalev): move this function to aom_image.{c, h}, so it will be part
// of aom_image_t support
int aom_img_plane_width(const aom_image_t *img, int plane);
int aom_img_plane_height(const aom_image_t *img, int plane);
void aom_img_write(const aom_image_t *img, FILE *file);
int aom_img_read(aom_image_t *img, FILE *file);
150

151 152
double sse_to_psnr(double samples, double peak, double mse);

153
#if CONFIG_AOM_HIGHBITDEPTH
Adrian Grange's avatar
Adrian Grange committed
154 155 156
void aom_img_upshift(aom_image_t *dst, aom_image_t *src, int input_shift);
void aom_img_downshift(aom_image_t *dst, aom_image_t *src, int down_shift);
void aom_img_truncate_16_to_8(aom_image_t *dst, aom_image_t *src);
157 158
#endif

159
#ifdef __cplusplus
clang-format's avatar
clang-format committed
160
} /* extern "C" */
161 162
#endif

163
#endif  // TOOLS_COMMON_H_