aom.h 5.3 KB
Newer Older
Adrian Grange's avatar
Adrian Grange committed
1 2 3 4 5 6 7 8 9 10 11
/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

Adrian Grange's avatar
Adrian Grange committed
12
/*!\defgroup aom AOM
Adrian Grange's avatar
Adrian Grange committed
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
 * \ingroup codecs
 * AOM is aom's newest video compression algorithm that uses motion
 * compensated prediction, Discrete Cosine Transform (DCT) coding of the
 * prediction error signal and context dependent entropy coding techniques
 * based on arithmetic principles. It features:
 *  - YUV 4:2:0 image format
 *  - Macro-block based coding (16x16 luma plus two 8x8 chroma)
 *  - 1/4 (1/8) pixel accuracy motion compensated prediction
 *  - 4x4 DCT transform
 *  - 128 level linear quantizer
 *  - In loop deblocking filter
 *  - Context-based entropy coding
 *
 * @{
 */
/*!\file
 * \brief Provides controls common to both the AOM encoder and decoder.
 */
#ifndef AOM_AOM_H_
#define AOM_AOM_H_

#include "./aom_codec.h"
#include "./aom_image.h"

#ifdef __cplusplus
extern "C" {
#endif

/*!\brief Control functions
 *
 * The set of macros define the control functions of AOM interface
 */
Adrian Grange's avatar
Adrian Grange committed
45
enum aom_com_control_id {
Adrian Grange's avatar
Adrian Grange committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
  AOM_SET_REFERENCE =
      1, /**< pass in an external frame into decoder to be used as reference
            frame */
  AOM_COPY_REFERENCE = 2, /**< get a copy of reference frame from the decoder */
  AOM_SET_POSTPROC = 3,   /**< set the decoder's post processing settings  */
  AOM_SET_DBG_COLOR_REF_FRAME =
      4, /**< set the reference frames to color for each macroblock */
  AOM_SET_DBG_COLOR_MB_MODES = 5, /**< set which macro block modes to color */
  AOM_SET_DBG_COLOR_B_MODES = 6,  /**< set which blocks modes to color */
  AOM_SET_DBG_DISPLAY_MV = 7,     /**< set which motion vector modes to draw */

  /* TODO(jkoleszar): The encoder incorrectly reuses some of these values (5+)
   * for its control ids. These should be migrated to something like the
   * AOM_DECODER_CTRL_ID_START range next time we're ready to break the ABI.
   */
  AV1_GET_REFERENCE = 128, /**< get a pointer to a reference frame */
  AOM_COMMON_CTRL_ID_MAX,
  AOM_DECODER_CTRL_ID_START = 256
};

/*!\brief post process flags
 *
 * The set of macros define AOM decoder post processing flags
 */
Adrian Grange's avatar
Adrian Grange committed
70
enum aom_postproc_level {
Adrian Grange's avatar
Adrian Grange committed
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
  AOM_NOFILTERING = 0,
  AOM_DEBLOCK = 1 << 0,
  AOM_DEMACROBLOCK = 1 << 1,
  AOM_ADDNOISE = 1 << 2,
  AOM_DEBUG_TXT_FRAME_INFO = 1 << 3, /**< print frame information */
  AOM_DEBUG_TXT_MBLK_MODES =
      1 << 4, /**< print macro block modes over each macro block */
  AOM_DEBUG_TXT_DC_DIFF = 1 << 5,   /**< print dc diff for each macro block */
  AOM_DEBUG_TXT_RATE_INFO = 1 << 6, /**< print video rate info (encoder only) */
  AOM_MFQE = 1 << 10
};

/*!\brief post process flags
 *
 * This define a structure that describe the post processing settings. For
 * the best objective measure (using the PSNR metric) set post_proc_flag
 * to AOM_DEBLOCK and deblocking_level to 1.
 */

Adrian Grange's avatar
Adrian Grange committed
90
typedef struct aom_postproc_cfg {
Adrian Grange's avatar
Adrian Grange committed
91
  int post_proc_flag;   /**< the types of post processing to be done, should be
Adrian Grange's avatar
Adrian Grange committed
92
                           combination of "aom_postproc_level" */
Adrian Grange's avatar
Adrian Grange committed
93 94
  int deblocking_level; /**< the strength of deblocking, valid range [0, 16] */
  int noise_level; /**< the strength of additive noise, valid range [0, 16] */
Adrian Grange's avatar
Adrian Grange committed
95
} aom_postproc_cfg_t;
Adrian Grange's avatar
Adrian Grange committed
96 97 98 99 100 101 102 103 104 105 106 107 108

/*!\brief reference frame type
 *
 * The set of macros define the type of AOM reference frames
 */
typedef enum aom_ref_frame_type {
  AOM_LAST_FRAME = 1,
  AOM_GOLD_FRAME = 2,
  AOM_ALTR_FRAME = 4
} aom_ref_frame_type_t;

/*!\brief reference frame data struct
 *
Adrian Grange's avatar
Adrian Grange committed
109
 * Define the data struct to access aom reference frames.
Adrian Grange's avatar
Adrian Grange committed
110 111 112 113 114 115 116 117
 */
typedef struct aom_ref_frame {
  aom_ref_frame_type_t frame_type; /**< which reference frame */
  aom_image_t img;                 /**< reference frame data in image format */
} aom_ref_frame_t;

/*!\brief AV1 specific reference frame data struct
 *
Adrian Grange's avatar
Adrian Grange committed
118
 * Define the data struct to access av1 reference frames.
Adrian Grange's avatar
Adrian Grange committed
119
 */
Adrian Grange's avatar
Adrian Grange committed
120
typedef struct av1_ref_frame {
Adrian Grange's avatar
Adrian Grange committed
121 122
  int idx;         /**< frame index to get (input) */
  aom_image_t img; /**< img structure to populate (output) */
Adrian Grange's avatar
Adrian Grange committed
123
} av1_ref_frame_t;
Adrian Grange's avatar
Adrian Grange committed
124 125

/*!\cond */
Adrian Grange's avatar
Adrian Grange committed
126
/*!\brief aom decoder control function parameter type
Adrian Grange's avatar
Adrian Grange committed
127 128 129 130 131 132 133
 *
 * defines the data type for each of AOM decoder control function requires
 */
AOM_CTRL_USE_TYPE(AOM_SET_REFERENCE, aom_ref_frame_t *)
#define AOM_CTRL_AOM_SET_REFERENCE
AOM_CTRL_USE_TYPE(AOM_COPY_REFERENCE, aom_ref_frame_t *)
#define AOM_CTRL_AOM_COPY_REFERENCE
Adrian Grange's avatar
Adrian Grange committed
134
AOM_CTRL_USE_TYPE(AOM_SET_POSTPROC, aom_postproc_cfg_t *)
Adrian Grange's avatar
Adrian Grange committed
135 136 137 138 139 140 141 142 143
#define AOM_CTRL_AOM_SET_POSTPROC
AOM_CTRL_USE_TYPE(AOM_SET_DBG_COLOR_REF_FRAME, int)
#define AOM_CTRL_AOM_SET_DBG_COLOR_REF_FRAME
AOM_CTRL_USE_TYPE(AOM_SET_DBG_COLOR_MB_MODES, int)
#define AOM_CTRL_AOM_SET_DBG_COLOR_MB_MODES
AOM_CTRL_USE_TYPE(AOM_SET_DBG_COLOR_B_MODES, int)
#define AOM_CTRL_AOM_SET_DBG_COLOR_B_MODES
AOM_CTRL_USE_TYPE(AOM_SET_DBG_DISPLAY_MV, int)
#define AOM_CTRL_AOM_SET_DBG_DISPLAY_MV
Adrian Grange's avatar
Adrian Grange committed
144
AOM_CTRL_USE_TYPE(AV1_GET_REFERENCE, av1_ref_frame_t *)
Adrian Grange's avatar
Adrian Grange committed
145 146 147
#define AOM_CTRL_AV1_GET_REFERENCE

/*!\endcond */
Adrian Grange's avatar
Adrian Grange committed
148
/*! @} - end defgroup aom */
Adrian Grange's avatar
Adrian Grange committed
149 150 151 152 153 154

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // AOM_AOM_H_
Adrian Grange's avatar
Adrian Grange committed
155