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 
     20 #if CONFIG_ENCODERS
     21 #include "./y4minput.h"
     22 #endif
     23 
     24 #if defined(_MSC_VER)
     25 /* MSVS uses _f{seek,tell}i64. */
     26 #define fseeko _fseeki64
     27 #define ftello _ftelli64
     28 typedef long _off_t;  // NOLINT - MSVS compatible type
     29 typedef __int64 off_t;  // fseeki64 compatible type
     30 #define _OFF_T_DEFINED
     31 #elif defined(_WIN32)
     32 /* MinGW defines off_t as long and uses f{seek,tell}o64/off64_t for large
     33  * files. */
     34 #define fseeko fseeko64
     35 #define ftello ftello64
     36 #define off_t off64_t
     37 #endif  /* _WIN32 */
     38 
     39 #if CONFIG_OS_SUPPORT
     40 #if defined(_MSC_VER)
     41 #include <io.h>  /* NOLINT */
     42 #define snprintf _snprintf
     43 #define isatty   _isatty
     44 #define fileno   _fileno
     45 #else
     46 #include <unistd.h>  /* NOLINT */
     47 #endif  /* _MSC_VER */
     48 #endif  /* CONFIG_OS_SUPPORT */
     49 
     50 /* Use 32-bit file operations in WebM file format when building ARM
     51  * executables (.axf) with RVCT. */
     52 #if !CONFIG_OS_SUPPORT
     53 typedef long off_t;  /* NOLINT */
     54 #define fseeko fseek
     55 #define ftello ftell
     56 #endif  /* CONFIG_OS_SUPPORT */
     57 
     58 #define LITERALU64(hi, lo) ((((uint64_t)hi) << 32) | lo)
     59 
     60 #ifndef PATH_MAX
     61 #define PATH_MAX 512
     62 #endif
     63 
     64 #define IVF_FRAME_HDR_SZ (4 + 8)  /* 4 byte size + 8 byte timestamp */
     65 #define IVF_FILE_HDR_SZ 32
     66 
     67 #define RAW_FRAME_HDR_SZ sizeof(uint32_t)
     68 
     69 #define VP8_FOURCC 0x30385056
     70 #define VP9_FOURCC 0x30395056
     71 
     72 enum VideoFileType {
     73   FILE_TYPE_RAW,
     74   FILE_TYPE_IVF,
     75   FILE_TYPE_Y4M,
     76   FILE_TYPE_WEBM
     77 };
     78 
     79 struct FileTypeDetectionBuffer {
     80   char buf[4];
     81   size_t buf_read;
     82   size_t position;
     83 };
     84 
     85 struct VpxRational {
     86   int numerator;
     87   int denominator;
     88 };
     89 
     90 struct VpxInputContext {
     91   const char *filename;
     92   FILE *file;
     93   off_t length;
     94   struct FileTypeDetectionBuffer detect;
     95   enum VideoFileType file_type;
     96   uint32_t width;
     97   uint32_t height;
     98   int use_i420;
     99   int only_i420;
    100   uint32_t fourcc;
    101   struct VpxRational framerate;
    102 #if CONFIG_ENCODERS
    103   y4m_input y4m;
    104 #endif
    105 };
    106 
    107 #ifdef __cplusplus
    108 extern "C" {
    109 #endif
    110 
    111 /* Sets a stdio stream into binary mode */
    112 FILE *set_binary_mode(FILE *stream);
    113 
    114 void die(const char *fmt, ...);
    115 void fatal(const char *fmt, ...);
    116 void warn(const char *fmt, ...);
    117 
    118 void die_codec(vpx_codec_ctx_t *ctx, const char *s);
    119 
    120 /* The tool including this file must define usage_exit() */
    121 void usage_exit();
    122 
    123 int read_yuv_frame(struct VpxInputContext *input_ctx, vpx_image_t *yuv_frame);
    124 
    125 typedef struct VpxInterface {
    126   const char *const name;
    127   const uint32_t fourcc;
    128   vpx_codec_iface_t *(*const interface)();
    129 } VpxInterface;
    130 
    131 int get_vpx_encoder_count();
    132 const VpxInterface *get_vpx_encoder_by_index(int i);
    133 const VpxInterface *get_vpx_encoder_by_name(const char *name);
    134 
    135 int get_vpx_decoder_count();
    136 const VpxInterface *get_vpx_decoder_by_index(int i);
    137 const VpxInterface *get_vpx_decoder_by_name(const char *name);
    138 const VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc);
    139 
    140 // TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
    141 // of vpx_image_t support
    142 int vpx_img_plane_width(const vpx_image_t *img, int plane);
    143 int vpx_img_plane_height(const vpx_image_t *img, int plane);
    144 void vpx_img_write(const vpx_image_t *img, FILE *file);
    145 int vpx_img_read(vpx_image_t *img, FILE *file);
    146 
    147 double sse_to_psnr(double samples, double peak, double mse);
    148 
    149 #ifdef __cplusplus
    150 }  /* extern "C" */
    151 #endif
    152 
    153 #endif  // TOOLS_COMMON_H_
    154