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