xref: /aosp_15_r20/external/libvpx/tools_common.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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