tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

vp56.h (8146B)


      1 /*
      2 * Copyright (C) 2006  Aurelien Jacobs <aurel@gnuage.org>
      3 *
      4 * This file is part of FFmpeg.
      5 *
      6 * FFmpeg is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License as published by the Free Software Foundation; either
      9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * FFmpeg is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with FFmpeg; if not, write to the Free Software
     18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19 */
     20 
     21 /**
     22 * @file
     23 * VP5 and VP6 compatible video decoder (common features)
     24 */
     25 
     26 #ifndef AVCODEC_VP56_H
     27 #define AVCODEC_VP56_H
     28 
     29 #include "libavutil/mem_internal.h"
     30 
     31 #include "avcodec.h"
     32 #include "get_bits.h"
     33 #include "hpeldsp.h"
     34 #include "h264chroma.h"
     35 #include "videodsp.h"
     36 #include "vp3dsp.h"
     37 #include "vp56dsp.h"
     38 #include "vpx_rac.h"
     39 
     40 typedef struct vp56_context VP56Context;
     41 
     42 typedef enum {
     43    VP56_FRAME_NONE     =-1,
     44    VP56_FRAME_CURRENT  = 0,
     45    VP56_FRAME_PREVIOUS = 1,
     46    VP56_FRAME_GOLDEN   = 2,
     47 } VP56Frame;
     48 
     49 typedef enum {
     50    VP56_MB_INTER_NOVEC_PF = 0,  /**< Inter MB, no vector, from previous frame */
     51    VP56_MB_INTRA          = 1,  /**< Intra MB */
     52    VP56_MB_INTER_DELTA_PF = 2,  /**< Inter MB, above/left vector + delta, from previous frame */
     53    VP56_MB_INTER_V1_PF    = 3,  /**< Inter MB, first vector, from previous frame */
     54    VP56_MB_INTER_V2_PF    = 4,  /**< Inter MB, second vector, from previous frame */
     55    VP56_MB_INTER_NOVEC_GF = 5,  /**< Inter MB, no vector, from golden frame */
     56    VP56_MB_INTER_DELTA_GF = 6,  /**< Inter MB, above/left vector + delta, from golden frame */
     57    VP56_MB_INTER_4V       = 7,  /**< Inter MB, 4 vectors, from previous frame */
     58    VP56_MB_INTER_V1_GF    = 8,  /**< Inter MB, first vector, from golden frame */
     59    VP56_MB_INTER_V2_GF    = 9,  /**< Inter MB, second vector, from golden frame */
     60 } VP56mb;
     61 
     62 typedef struct VP56Tree {
     63  int8_t val;
     64  int8_t prob_idx;
     65 } VP56Tree;
     66 
     67 typedef struct VP56mv {
     68    DECLARE_ALIGNED(4, int16_t, x);
     69    int16_t y;
     70 } VP56mv;
     71 
     72 #define VP56_SIZE_CHANGE 1
     73 
     74 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
     75                                          VP56mv *vect);
     76 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
     77                           int offset1, int offset2, ptrdiff_t stride,
     78                           VP56mv mv, int mask, int select, int luma);
     79 typedef int  (*VP56ParseCoeff)(VP56Context *s);
     80 typedef void (*VP56DefaultModelsInit)(VP56Context *s);
     81 typedef void (*VP56ParseVectorModels)(VP56Context *s);
     82 typedef int  (*VP56ParseCoeffModels)(VP56Context *s);
     83 typedef int  (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf,
     84                                int buf_size);
     85 
     86 typedef struct VP56RefDc {
     87    uint8_t not_null_dc;
     88    VP56Frame ref_frame;
     89    int16_t dc_coeff;
     90 } VP56RefDc;
     91 
     92 typedef struct VP56Macroblock {
     93    uint8_t type;
     94    VP56mv mv;
     95 } VP56Macroblock;
     96 
     97 typedef struct VP56Model {
     98    uint8_t coeff_reorder[64];       /* used in vp6 only */
     99    uint8_t coeff_index_to_pos[64];  /* used in vp6 only */
    100    uint8_t coeff_index_to_idct_selector[64]; /* used in vp6 only */
    101    uint8_t vector_sig[2];           /* delta sign */
    102    uint8_t vector_dct[2];           /* delta coding types */
    103    uint8_t vector_pdi[2][2];        /* predefined delta init */
    104    uint8_t vector_pdv[2][7];        /* predefined delta values */
    105    uint8_t vector_fdv[2][8];        /* 8 bit delta value definition */
    106    uint8_t coeff_dccv[2][11];       /* DC coeff value */
    107    uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */
    108    uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */
    109    uint8_t coeff_dcct[2][36][5];    /* DC coeff coding type */
    110    uint8_t coeff_runv[2][14];       /* run value (vp6 only) */
    111    uint8_t mb_type[3][10][10];      /* model for decoding MB type */
    112    uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */
    113 } VP56Model;
    114 
    115 struct vp56_context {
    116    AVCodecContext *avctx;
    117    H264ChromaContext h264chroma;
    118    HpelDSPContext hdsp;
    119    VideoDSPContext vdsp;
    120    VP3DSPContext vp3dsp;
    121    VP56DSPContext vp56dsp;
    122    uint8_t idct_scantable[64];
    123    AVFrame *frames[4];
    124    uint8_t *edge_emu_buffer_alloc;
    125    uint8_t *edge_emu_buffer;
    126    VPXRangeCoder c;
    127    VPXRangeCoder cc;
    128    VPXRangeCoder *ccp;
    129    int sub_version;
    130 
    131    /* frame info */
    132    int golden_frame;
    133    int plane_width[4];
    134    int plane_height[4];
    135    int mb_width;   /* number of horizontal MB */
    136    int mb_height;  /* number of vertical MB */
    137    int block_offset[6];
    138 
    139    int quantizer;
    140    uint16_t dequant_dc;
    141    uint16_t dequant_ac;
    142 
    143    /* DC predictors management */
    144    VP56RefDc *above_blocks;
    145    VP56RefDc left_block[4];
    146    int above_block_idx[6];
    147    int16_t prev_dc[3][3];    /* [plan][ref_frame] */
    148 
    149    /* blocks / macroblock */
    150    VP56mb mb_type;
    151    VP56Macroblock *macroblocks;
    152    DECLARE_ALIGNED(16, int16_t, block_coeff)[6][64];
    153    int idct_selector[6];
    154    const uint8_t *def_coeff_reorder;/* used in vp6 only */
    155 
    156    /* motion vectors */
    157    VP56mv mv[6];  /* vectors for each block in MB */
    158    VP56mv vector_candidate[2];
    159    int vector_candidate_pos;
    160 
    161    /* filtering hints */
    162    int filter_header;               /* used in vp6 only */
    163    int deblock_filtering;
    164    int filter_selection;
    165    int filter_mode;
    166    int max_vector_length;
    167    int sample_variance_threshold;
    168    DECLARE_ALIGNED(8, int, bounding_values_array)[256];
    169 
    170    uint8_t coeff_ctx[4][64];              /* used in vp5 only */
    171    uint8_t coeff_ctx_last[4];             /* used in vp5 only */
    172 
    173    int has_alpha;
    174 
    175    /* interlacing params */
    176    int interlaced;
    177    int il_prob;
    178    int il_block;
    179 
    180    /* upside-down flipping hints */
    181    int flip;  /* are we flipping ? */
    182    int frbi;  /* first row block index in MB */
    183    int srbi;  /* second row block index in MB */
    184    ptrdiff_t stride[4];  /* stride for each plan */
    185 
    186    const uint8_t *vp56_coord_div;
    187    VP56ParseVectorAdjustment parse_vector_adjustment;
    188    VP56Filter filter;
    189    VP56ParseCoeff parse_coeff;
    190    VP56DefaultModelsInit default_models_init;
    191    VP56ParseVectorModels parse_vector_models;
    192    VP56ParseCoeffModels parse_coeff_models;
    193    VP56ParseHeader parse_header;
    194 
    195    /* for "slice" parallelism between YUV and A */
    196    VP56Context *alpha_context;
    197 
    198    VP56Model *modelp;
    199    VP56Model model;
    200 
    201    /* huffman decoding */
    202    int use_huffman;
    203    GetBitContext gb;
    204    VLC dccv_vlc[2];
    205    VLC runv_vlc[2];
    206    VLC ract_vlc[2][3][6];
    207    unsigned int nb_null[2][2];       /* number of consecutive NULL DC/AC */
    208 
    209    int have_undamaged_frame;
    210    int discard_frame;
    211 };
    212 
    213 
    214 /**
    215 * Initializes an VP56Context. Expects its caller to clean up
    216 * in case of error.
    217 */
    218 int ff_vp56_init_context(AVCodecContext *avctx, VP56Context *s,
    219                          int flip, int has_alpha);
    220 int ff_vp56_free_context(VP56Context *s);
    221 void ff_vp56_init_dequant(VP56Context *s, int quantizer);
    222 int ff_vp56_decode_frame(AVCodecContext *avctx, AVFrame *frame,
    223                         int *got_frame, AVPacket *avpkt);
    224 
    225 
    226 /**
    227 * vp56 specific range coder implementation
    228 */
    229 
    230 static int vp56_rac_gets(VPXRangeCoder *c, int bits)
    231 {
    232    int value = 0;
    233 
    234    while (bits--) {
    235        value = (value << 1) | vpx_rac_get(c);
    236    }
    237 
    238    return value;
    239 }
    240 
    241 // P(7)
    242 static av_unused int vp56_rac_gets_nn(VPXRangeCoder *c, int bits)
    243 {
    244    int v = vp56_rac_gets(c, 7) << 1;
    245    return v + !v;
    246 }
    247 
    248 static av_always_inline
    249 int vp56_rac_get_tree(VPXRangeCoder *c,
    250                      const VP56Tree *tree,
    251                      const uint8_t *probs)
    252 {
    253    while (tree->val > 0) {
    254        if (vpx_rac_get_prob_branchy(c, probs[tree->prob_idx]))
    255            tree += tree->val;
    256        else
    257            tree++;
    258    }
    259    return -tree->val;
    260 }
    261 
    262 #endif /* AVCODEC_VP56_H */