Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * VP9 compatible video decoder
  3.  *
  4.  * Copyright (C) 2013 Ronald S. Bultje <rsbultje gmail com>
  5.  * Copyright (C) 2013 Clément Bœsch <u pkh me>
  6.  *
  7.  * This file is part of FFmpeg.
  8.  *
  9.  * FFmpeg is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU Lesser General Public
  11.  * License as published by the Free Software Foundation; either
  12.  * version 2.1 of the License, or (at your option) any later version.
  13.  *
  14.  * FFmpeg is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17.  * Lesser General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU Lesser General Public
  20.  * License along with FFmpeg; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22.  */
  23.  
  24. #ifndef AVCODEC_VP9DSP_H
  25. #define AVCODEC_VP9DSP_H
  26.  
  27. #include <stddef.h>
  28. #include <stdint.h>
  29.  
  30. #include "vp9.h"
  31.  
  32. typedef void (*vp9_mc_func)(uint8_t *dst, ptrdiff_t dst_stride,
  33.                             const uint8_t *ref, ptrdiff_t ref_stride,
  34.                             int h, int mx, int my);
  35.  
  36. typedef struct VP9DSPContext {
  37.     /*
  38.      * dimension 1: 0=4x4, 1=8x8, 2=16x16, 3=32x32
  39.      * dimension 2: intra prediction modes
  40.      *
  41.      * dst/left/top is aligned by transform-size (i.e. 4, 8, 16 or 32 pixels)
  42.      * stride is aligned by 16 pixels
  43.      * top[-1] is top/left; top[4,7] is top-right for 4x4
  44.      */
  45.     // FIXME(rbultje) maybe replace left/top pointers with HAVE_TOP/
  46.     // HAVE_LEFT/HAVE_TOPRIGHT flags instead, and then handle it in-place?
  47.     // also needs to fit in with what h264/vp8/etc do
  48.     void (*intra_pred[N_TXFM_SIZES][N_INTRA_PRED_MODES])(uint8_t *dst,
  49.                                                          ptrdiff_t stride,
  50.                                                          const uint8_t *left,
  51.                                                          const uint8_t *top);
  52.  
  53.     /*
  54.      * dimension 1: 0=4x4, 1=8x8, 2=16x16, 3=32x32, 4=lossless (3-4=dct only)
  55.      * dimension 2: 0=dct/dct, 1=dct/adst, 2=adst/dct, 3=adst/adst
  56.      *
  57.      * dst is aligned by transform-size (i.e. 4, 8, 16 or 32 pixels)
  58.      * stride is aligned by 16 pixels
  59.      * block is 16-byte aligned
  60.      * eob indicates the position (+1) of the last non-zero coefficient,
  61.      * in scan-order. This can be used to write faster versions, e.g. a
  62.      * dc-only 4x4/8x8/16x16/32x32, or a 4x4-only (eob<10) 8x8/16x16/32x32,
  63.      * etc.
  64.      */
  65.     // FIXME also write idct_add_block() versions for whole (inter) pred
  66.     // blocks, so we can do 2 4x4s at once
  67.     void (*itxfm_add[N_TXFM_SIZES + 1][N_TXFM_TYPES])(uint8_t *dst,
  68.                                                       ptrdiff_t stride,
  69.                                                       int16_t *block, int eob);
  70.  
  71.     /*
  72.      * dimension 1: width of filter (0=4, 1=8, 2=16)
  73.      * dimension 2: 0=col-edge filter (h), 1=row-edge filter (v)
  74.      *
  75.      * dst/stride are aligned by 8
  76.      */
  77.     void (*loop_filter_8[3][2])(uint8_t *dst, ptrdiff_t stride,
  78.                                 int mb_lim, int lim, int hev_thr);
  79.  
  80.     /*
  81.      * dimension 1: 0=col-edge filter (h), 1=row-edge filter (v)
  82.      *
  83.      * The width of filter is assumed to be 16; dst/stride are aligned by 16
  84.      */
  85.     void (*loop_filter_16[2])(uint8_t *dst, ptrdiff_t stride,
  86.                               int mb_lim, int lim, int hev_thr);
  87.  
  88.     /*
  89.      * dimension 1/2: width of filter (0=4, 1=8) for each filter half
  90.      * dimension 3: 0=col-edge filter (h), 1=row-edge filter (v)
  91.      *
  92.      * dst/stride are aligned by operation size
  93.      * this basically calls loop_filter[d1][d3][0](), followed by
  94.      * loop_filter[d2][d3][0]() on the next 8 pixels
  95.      * mb_lim/lim/hev_thr contain two values in the lowest two bytes of the
  96.      * integer.
  97.      */
  98.     // FIXME perhaps a mix4 that operates on 32px (for AVX2)
  99.     void (*loop_filter_mix2[2][2][2])(uint8_t *dst, ptrdiff_t stride,
  100.                                       int mb_lim, int lim, int hev_thr);
  101.  
  102.     /*
  103.      * dimension 1: hsize (0: 64, 1: 32, 2: 16, 3: 8, 4: 4)
  104.      * dimension 2: filter type (0: smooth, 1: regular, 2: sharp, 3: bilin)
  105.      * dimension 3: averaging type (0: put, 1: avg)
  106.      * dimension 4: x subpel interpolation (0: none, 1: 8tap/bilin)
  107.      * dimension 5: y subpel interpolation (1: none, 1: 8tap/bilin)
  108.      *
  109.      * dst/stride are aligned by hsize
  110.      */
  111.     vp9_mc_func mc[5][4][2][2][2];
  112. } VP9DSPContext;
  113.  
  114. void ff_vp9dsp_init(VP9DSPContext *dsp);
  115.  
  116. void ff_vp9dsp_init_x86(VP9DSPContext *dsp);
  117.  
  118. #endif /* AVCODEC_VP9DSP_H */
  119.