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 VPX_TOOLS_COMMON_H_ 11 #define VPX_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 #include "vpx_ports/msvc.h" 20 21 #if CONFIG_ENCODERS 22 #include "./y4minput.h" 23 #endif 24 25 #if defined(_MSC_VER) 26 /* MSVS uses _f{seek,tell}i64. */ 27 #define fseeko _fseeki64 28 #define ftello _ftelli64 29 typedef int64_t FileOffset; 30 #elif defined(_WIN32) 31 /* MinGW uses f{seek,tell}o64 for large files. */ 32 #define fseeko fseeko64 33 #define ftello ftello64 34 typedef off64_t FileOffset; 35 #elif CONFIG_OS_SUPPORT && \ 36 !(defined(__ANDROID__) && __ANDROID_API__ < 24 && !defined(__LP64__) && \ 37 defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) 38 /* POSIX.1 has fseeko and ftello. fseeko and ftello are not available before 39 * Android API level 24. See 40 * https://android.googlesource.com/platform/bionic/+/main/docs/32-bit-abi.md */ 41 #include <sys/types.h> /* NOLINT */ 42 typedef off_t FileOffset; 43 /* Use 32-bit file operations in WebM file format when building ARM 44 * executables (.axf) with RVCT. */ 45 #else 46 #define fseeko fseek 47 #define ftello ftell 48 typedef long FileOffset; /* NOLINT */ 49 #endif /* CONFIG_OS_SUPPORT */ 50 51 #if CONFIG_OS_SUPPORT 52 #if defined(_MSC_VER) 53 #include <io.h> /* NOLINT */ 54 #define isatty _isatty 55 #define fileno _fileno 56 #else 57 #include <unistd.h> /* NOLINT */ 58 #endif /* _MSC_VER */ 59 #endif /* CONFIG_OS_SUPPORT */ 60 61 #define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo) 62 63 #ifndef PATH_MAX 64 #define PATH_MAX 512 65 #endif 66 67 #define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */ 68 #define IVF_FILE_HDR_SZ 32 69 70 #define RAW_FRAME_HDR_SZ sizeof(uint32_t) 71 72 #define VP8_FOURCC 0x30385056 73 #define VP9_FOURCC 0x30395056 74 75 enum VideoFileType { 76 FILE_TYPE_RAW, 77 FILE_TYPE_IVF, 78 FILE_TYPE_Y4M, 79 FILE_TYPE_WEBM 80 }; 81 82 struct FileTypeDetectionBuffer { 83 char buf[4]; 84 size_t buf_read; 85 size_t position; 86 }; 87 88 struct VpxRational { 89 int numerator; 90 int denominator; 91 }; 92 93 struct VpxInputContext { 94 const char *filename; 95 FILE *file; 96 int64_t length; 97 struct FileTypeDetectionBuffer detect; 98 enum VideoFileType file_type; 99 uint32_t width; 100 uint32_t height; 101 struct VpxRational pixel_aspect_ratio; 102 vpx_img_fmt_t fmt; 103 vpx_bit_depth_t bit_depth; 104 int only_i420; 105 uint32_t fourcc; 106 struct VpxRational framerate; 107 #if CONFIG_ENCODERS 108 y4m_input y4m; 109 #endif 110 }; 111 112 #ifdef __cplusplus 113 extern "C" { 114 #endif 115 116 #if defined(__GNUC__) 117 #define VPX_NO_RETURN __attribute__((noreturn)) 118 #elif defined(_MSC_VER) 119 #define VPX_NO_RETURN __declspec(noreturn) 120 #else 121 #define VPX_NO_RETURN 122 #endif 123 124 // Tells the compiler to perform `printf` format string checking if the 125 // compiler supports it; see the 'format' attribute in 126 // <https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html>. 127 #define VPX_TOOLS_FORMAT_PRINTF(string_index, first_to_check) 128 #if defined(__has_attribute) 129 #if __has_attribute(format) 130 #undef VPX_TOOLS_FORMAT_PRINTF 131 #define VPX_TOOLS_FORMAT_PRINTF(string_index, first_to_check) \ 132 __attribute__((__format__(__printf__, string_index, first_to_check))) 133 #endif 134 #endif 135 136 /* Sets a stdio stream into binary mode */ 137 FILE *set_binary_mode(FILE *stream); 138 139 VPX_NO_RETURN void die(const char *fmt, ...) VPX_TOOLS_FORMAT_PRINTF(1, 2); 140 VPX_NO_RETURN void fatal(const char *fmt, ...) VPX_TOOLS_FORMAT_PRINTF(1, 2); 141 void warn(const char *fmt, ...) VPX_TOOLS_FORMAT_PRINTF(1, 2); 142 143 VPX_NO_RETURN void die_codec(vpx_codec_ctx_t *ctx, const char *s); 144 145 /* The tool including this file must define usage_exit() */ 146 VPX_NO_RETURN void usage_exit(void); 147 148 #undef VPX_NO_RETURN 149 150 int read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame); 151 152 typedef struct VpxInterface { 153 const char *name; 154 uint32_t fourcc; 155 vpx_codec_iface_t *(*codec_interface)(void); 156 } VpxInterface; 157 158 int get_vpx_encoder_count(void); 159 const VpxInterface *get_vpx_encoder_by_index(int i); 160 const VpxInterface *get_vpx_encoder_by_name(const char *name); 161 162 int get_vpx_decoder_count(void); 163 const VpxInterface *get_vpx_decoder_by_index(int i); 164 const VpxInterface *get_vpx_decoder_by_name(const char *name); 165 const VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc); 166 167 int vpx_img_plane_width(const vpx_image_t *img, int plane); 168 int vpx_img_plane_height(const vpx_image_t *img, int plane); 169 void vpx_img_write(const vpx_image_t *img, FILE *file); 170 int vpx_img_read(vpx_image_t *img, FILE *file); 171 172 double sse_to_psnr(double samples, double peak, double mse); 173 174 #if CONFIG_ENCODERS 175 int read_frame(struct VpxInputContext *input_ctx, vpx_image_t *img); 176 int file_is_y4m(const char detect[4]); 177 int fourcc_is_ivf(const char detect[4]); 178 void open_input_file(struct VpxInputContext *input); 179 void close_input_file(struct VpxInputContext *input); 180 #endif 181 182 #if CONFIG_VP9_HIGHBITDEPTH 183 void vpx_img_upshift(vpx_image_t *dst, vpx_image_t *src, int input_shift); 184 void vpx_img_downshift(vpx_image_t *dst, vpx_image_t *src, int down_shift); 185 void vpx_img_truncate_16_to_8(vpx_image_t *dst, vpx_image_t *src); 186 #endif 187 188 int compare_img(const vpx_image_t *const img1, const vpx_image_t *const img2); 189 #if CONFIG_VP9_HIGHBITDEPTH 190 void find_mismatch_high(const vpx_image_t *const img1, 191 const vpx_image_t *const img2, int yloc[4], int uloc[4], 192 int vloc[4]); 193 #endif 194 void find_mismatch(const vpx_image_t *const img1, const vpx_image_t *const img2, 195 int yloc[4], int uloc[4], int vloc[4]); 196 197 #ifdef __cplusplus 198 } /* extern "C" */ 199 #endif 200 201 #endif // VPX_TOOLS_COMMON_H_ 202