libavcodec/vp9shared.h
0c466417
 /*
  * VP9 compatible video decoder
  *
  * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
  * Copyright (C) 2013 Clément Bœsch <u pkh me>
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef AVCODEC_VP9SHARED_H
 #define AVCODEC_VP9SHARED_H
 
 #include <stddef.h>
 #include <stdint.h>
 
 #include "vp9.h"
 #include "thread.h"
 #include "vp56.h"
 
 enum BlockPartition {
     PARTITION_NONE,    // [ ] <-.
     PARTITION_H,       // [-]   |
     PARTITION_V,       // [|]   |
     PARTITION_SPLIT,   // [+] --'
 };
 
 enum InterPredMode {
     NEARESTMV = 10,
     NEARMV    = 11,
     ZEROMV    = 12,
     NEWMV     = 13,
 };
 
 enum CompPredMode {
     PRED_SINGLEREF,
     PRED_COMPREF,
     PRED_SWITCHABLE,
 };
 
 typedef struct VP9mvrefPair {
     VP56mv mv[2];
     int8_t ref[2];
 } VP9mvrefPair;
 
 typedef struct VP9Frame {
     ThreadFrame tf;
     AVBufferRef *extradata;
     uint8_t *segmentation_map;
     VP9mvrefPair *mv;
     int uses_2pass;
 
     AVBufferRef *hwaccel_priv_buf;
     void *hwaccel_picture_private;
 } VP9Frame;
 
 enum BlockLevel {
     BL_64X64,
     BL_32X32,
     BL_16X16,
     BL_8X8,
 };
 
 enum BlockSize {
     BS_64x64,
     BS_64x32,
     BS_32x64,
     BS_32x32,
     BS_32x16,
     BS_16x32,
     BS_16x16,
     BS_16x8,
     BS_8x16,
     BS_8x8,
     BS_8x4,
     BS_4x8,
     BS_4x4,
     N_BS_SIZES,
 };
 
 typedef struct VP9BitstreamHeader {
     // bitstream header
     uint8_t profile;
     uint8_t bpp;
     uint8_t keyframe;
     uint8_t invisible;
     uint8_t errorres;
     uint8_t intraonly;
     uint8_t resetctx;
     uint8_t refreshrefmask;
     uint8_t highprecisionmvs;
     enum FilterMode filtermode;
     uint8_t allowcompinter;
     uint8_t refreshctx;
     uint8_t parallelmode;
     uint8_t framectxid;
     uint8_t use_last_frame_mvs;
     uint8_t refidx[3];
     uint8_t signbias[3];
     uint8_t fixcompref;
     uint8_t varcompref[2];
     struct {
         uint8_t level;
         int8_t sharpness;
     } filter;
     struct {
         uint8_t enabled;
         uint8_t updated;
         int8_t mode[2];
         int8_t ref[4];
     } lf_delta;
     uint8_t yac_qi;
     int8_t ydc_qdelta, uvdc_qdelta, uvac_qdelta;
     uint8_t lossless;
 #define MAX_SEGMENT 8
     struct {
         uint8_t enabled;
         uint8_t temporal;
         uint8_t absolute_vals;
         uint8_t update_map;
         uint8_t prob[7];
         uint8_t pred_prob[3];
         struct {
             uint8_t q_enabled;
             uint8_t lf_enabled;
             uint8_t ref_enabled;
             uint8_t skip_enabled;
             uint8_t ref_val;
             int16_t q_val;
             int8_t lf_val;
             int16_t qmul[2][2];
             uint8_t lflvl[4][2];
         } feat[MAX_SEGMENT];
     } segmentation;
     enum TxfmMode txfmmode;
     enum CompPredMode comppredmode;
     struct {
         unsigned log2_tile_cols, log2_tile_rows;
         unsigned tile_cols, tile_rows;
     } tiling;
 
     int uncompressed_header_size;
     int compressed_header_size;
 } VP9BitstreamHeader;
 
 typedef struct VP9SharedContext {
     VP9BitstreamHeader h;
 
     ThreadFrame refs[8];
 #define CUR_FRAME 0
 #define REF_FRAME_MVPAIR 1
 #define REF_FRAME_SEGMAP 2
     VP9Frame frames[3];
 } VP9SharedContext;
 
 #endif /* AVCODEC_VP9SHARED_H */