Home | History | Annotate | Download | only in libvpx
      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 #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 typedef off_t FileOffset;
     37 /* Use 32-bit file operations in WebM file format when building ARM
     38  * executables (.axf) with RVCT. */
     39 #else
     40 #define fseeko fseek
     41 #define ftello ftell
     42 typedef long FileOffset; /* NOLINT */
     43 #endif /* CONFIG_OS_SUPPORT */
     44 
     45 #if CONFIG_OS_SUPPORT
     46 #if defined(_MSC_VER)
     47 #include <io.h> /* NOLINT */
     48 #define isatty _isatty
     49 #define fileno _fileno
     50 #else
     51 #include <unistd.h> /* NOLINT */
     52 #endif              /* _MSC_VER */
     53 #endif              /* CONFIG_OS_SUPPORT */
     54 
     55 #define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo)
     56 
     57 #ifndef PATH_MAX
     58 #define PATH_MAX 512
     59 #endif
     60 
     61 #define IVF_FRAME_HDR_SZ (4 + 8) /* 4 byte size + 8 byte timestamp */
     62 #define IVF_FILE_HDR_SZ 32
     63 
     64 #define RAW_FRAME_HDR_SZ sizeof(uint32_t)
     65 
     66 #define VP8_FOURCC 0x30385056
     67 #define VP9_FOURCC 0x30395056
     68 
     69 enum VideoFileType {
     70   FILE_TYPE_RAW,
     71   FILE_TYPE_IVF,
     72   FILE_TYPE_Y4M,
     73   FILE_TYPE_WEBM
     74 };
     75 
     76 struct FileTypeDetectionBuffer {
     77   char buf[4];
     78   size_t buf_read;
     79   size_t position;
     80 };
     81 
     82 struct VpxRational {
     83   int numerator;
     84   int denominator;
     85 };
     86 
     87 struct VpxInputContext {
     88   const char *filename;
     89   FILE *file;
     90   int64_t length;
     91   struct FileTypeDetectionBuffer detect;
     92   enum VideoFileType file_type;
     93   uint32_t width;
     94   uint32_t height;
     95   struct VpxRational pixel_aspect_ratio;
     96   vpx_img_fmt_t fmt;
     97   vpx_bit_depth_t bit_depth;
     98   int only_i420;
     99   uint32_t fourcc;
    100   struct VpxRational framerate;
    101 #if CONFIG_ENCODERS
    102   y4m_input y4m;
    103 #endif
    104 };
    105 
    106 #ifdef __cplusplus
    107 extern "C" {
    108 #endif
    109 
    110 #if defined(__GNUC__)
    111 #define VPX_NO_RETURN __attribute__((noreturn))
    112 #else
    113 #define VPX_NO_RETURN
    114 #endif
    115 
    116 /* Sets a stdio stream into binary mode */
    117 FILE *set_binary_mode(FILE *stream);
    118 
    119 void die(const char *fmt, ...) VPX_NO_RETURN;
    120 void fatal(const char *fmt, ...) VPX_NO_RETURN;
    121 void warn(const char *fmt, ...);
    122 
    123 void die_codec(vpx_codec_ctx_t *ctx, const char *s) VPX_NO_RETURN;
    124 
    125 /* The tool including this file must define usage_exit() */
    126 void usage_exit(void) VPX_NO_RETURN;
    127 
    128 #undef VPX_NO_RETURN
    129 
    130 int read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame);
    131 
    132 typedef struct VpxInterface {
    133   const char *const name;
    134   const uint32_t fourcc;
    135   vpx_codec_iface_t *(*const codec_interface)();
    136 } VpxInterface;
    137 
    138 int get_vpx_encoder_count(void);
    139 const VpxInterface *get_vpx_encoder_by_index(int i);
    140 const VpxInterface *get_vpx_encoder_by_name(const char *name);
    141 
    142 int get_vpx_decoder_count(void);
    143 const VpxInterface *get_vpx_decoder_by_index(int i);
    144 const VpxInterface *get_vpx_decoder_by_name(const char *name);
    145 const VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc);
    146 
    147 // TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
    148 // of vpx_image_t support
    149 int vpx_img_plane_width(const vpx_image_t *img, int plane);
    150 int vpx_img_plane_height(const vpx_image_t *img, int plane);
    151 void vpx_img_write(const vpx_image_t *img, FILE *file);
    152 int vpx_img_read(vpx_image_t *img, FILE *file);
    153 
    154 double sse_to_psnr(double samples, double peak, double mse);
    155 
    156 #if CONFIG_VP9_HIGHBITDEPTH
    157 void vpx_img_upshift(vpx_image_t *dst, vpx_image_t *src, int input_shift);
    158 void vpx_img_downshift(vpx_image_t *dst, vpx_image_t *src, int down_shift);
    159 void vpx_img_truncate_16_to_8(vpx_image_t *dst, vpx_image_t *src);
    160 #endif
    161 
    162 #ifdef __cplusplus
    163 } /* extern "C" */
    164 #endif
    165 
    166 #endif  // TOOLS_COMMON_H_
    167