Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
  3.  * Copyright (c) 2006  Stefan Gehrer <stefan.gehrer@gmx.de>
  4.  *
  5.  * This file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21.  
  22. #ifndef AVCODEC_CAVS_H
  23. #define AVCODEC_CAVS_H
  24.  
  25. #include "cavsdsp.h"
  26. #include "dsputil.h"
  27. #include "h264chroma.h"
  28. #include "get_bits.h"
  29. #include "videodsp.h"
  30.  
  31. #define SLICE_MAX_START_CODE    0x000001af
  32. #define EXT_START_CODE          0x000001b5
  33. #define USER_START_CODE         0x000001b2
  34. #define CAVS_START_CODE         0x000001b0
  35. #define PIC_I_START_CODE        0x000001b3
  36. #define PIC_PB_START_CODE       0x000001b6
  37.  
  38. #define A_AVAIL                          1
  39. #define B_AVAIL                          2
  40. #define C_AVAIL                          4
  41. #define D_AVAIL                          8
  42. #define NOT_AVAIL                       -1
  43. #define REF_INTRA                       -2
  44. #define REF_DIR                         -3
  45.  
  46. #define ESCAPE_CODE                     59
  47.  
  48. #define FWD0                          0x01
  49. #define FWD1                          0x02
  50. #define BWD0                          0x04
  51. #define BWD1                          0x08
  52. #define SYM0                          0x10
  53. #define SYM1                          0x20
  54. #define SPLITH                        0x40
  55. #define SPLITV                        0x80
  56.  
  57. #define MV_BWD_OFFS                     12
  58. #define MV_STRIDE                        4
  59.  
  60. enum cavs_mb {
  61.   I_8X8 = 0,
  62.   P_SKIP,
  63.   P_16X16,
  64.   P_16X8,
  65.   P_8X16,
  66.   P_8X8,
  67.   B_SKIP,
  68.   B_DIRECT,
  69.   B_FWD_16X16,
  70.   B_BWD_16X16,
  71.   B_SYM_16X16,
  72.   B_8X8 = 29
  73. };
  74.  
  75. enum cavs_sub_mb {
  76.   B_SUB_DIRECT,
  77.   B_SUB_FWD,
  78.   B_SUB_BWD,
  79.   B_SUB_SYM
  80. };
  81.  
  82. enum cavs_intra_luma {
  83.   INTRA_L_VERT,
  84.   INTRA_L_HORIZ,
  85.   INTRA_L_LP,
  86.   INTRA_L_DOWN_LEFT,
  87.   INTRA_L_DOWN_RIGHT,
  88.   INTRA_L_LP_LEFT,
  89.   INTRA_L_LP_TOP,
  90.   INTRA_L_DC_128
  91. };
  92.  
  93. enum cavs_intra_chroma {
  94.   INTRA_C_LP,
  95.   INTRA_C_HORIZ,
  96.   INTRA_C_VERT,
  97.   INTRA_C_PLANE,
  98.   INTRA_C_LP_LEFT,
  99.   INTRA_C_LP_TOP,
  100.   INTRA_C_DC_128,
  101. };
  102.  
  103. enum cavs_mv_pred {
  104.   MV_PRED_MEDIAN,
  105.   MV_PRED_LEFT,
  106.   MV_PRED_TOP,
  107.   MV_PRED_TOPRIGHT,
  108.   MV_PRED_PSKIP,
  109.   MV_PRED_BSKIP
  110. };
  111.  
  112. enum cavs_block {
  113.   BLK_16X16,
  114.   BLK_16X8,
  115.   BLK_8X16,
  116.   BLK_8X8
  117. };
  118.  
  119. enum cavs_mv_loc {
  120.   MV_FWD_D3 = 0,
  121.   MV_FWD_B2,
  122.   MV_FWD_B3,
  123.   MV_FWD_C2,
  124.   MV_FWD_A1,
  125.   MV_FWD_X0,
  126.   MV_FWD_X1,
  127.   MV_FWD_A3 = 8,
  128.   MV_FWD_X2,
  129.   MV_FWD_X3,
  130.   MV_BWD_D3 = MV_BWD_OFFS,
  131.   MV_BWD_B2,
  132.   MV_BWD_B3,
  133.   MV_BWD_C2,
  134.   MV_BWD_A1,
  135.   MV_BWD_X0,
  136.   MV_BWD_X1,
  137.   MV_BWD_A3 = MV_BWD_OFFS+8,
  138.   MV_BWD_X2,
  139.   MV_BWD_X3
  140. };
  141.  
  142. DECLARE_ALIGNED(8, typedef, struct) {
  143.     int16_t x;
  144.     int16_t y;
  145.     int16_t dist;
  146.     int16_t ref;
  147. } cavs_vector;
  148.  
  149. struct dec_2dvlc {
  150.   int8_t rltab[59][3];
  151.   int8_t level_add[27];
  152.   int8_t golomb_order;
  153.   int inc_limit;
  154.   int8_t max_run;
  155. };
  156.  
  157. typedef struct AVSFrame {
  158.     AVFrame *f;
  159.     int poc;
  160. } AVSFrame;
  161.  
  162. typedef struct AVSContext {
  163.     AVCodecContext *avctx;
  164.     DSPContext       dsp;
  165.     H264ChromaContext h264chroma;
  166.     VideoDSPContext vdsp;
  167.     CAVSDSPContext  cdsp;
  168.     GetBitContext gb;
  169.     AVSFrame cur;     ///< currently decoded frame
  170.     AVSFrame DPB[2];  ///< reference frames
  171.     int dist[2];     ///< temporal distances from current frame to ref frames
  172.     int low_delay;
  173.     int profile, level;
  174.     int aspect_ratio;
  175.     int mb_width, mb_height;
  176.     int width, height;
  177.     int stream_revision; ///<0 for samples from 2006, 1 for rm52j encoder
  178.     int progressive;
  179.     int pic_structure;
  180.     int skip_mode_flag; ///< select between skip_count or one skip_flag per MB
  181.     int loop_filter_disable;
  182.     int alpha_offset, beta_offset;
  183.     int ref_flag;
  184.     int mbx, mby, mbidx; ///< macroblock coordinates
  185.     int flags;         ///< availability flags of neighbouring macroblocks
  186.     int stc;           ///< last start code
  187.     uint8_t *cy, *cu, *cv; ///< current MB sample pointers
  188.     int left_qp;
  189.     uint8_t *top_qp;
  190.  
  191.     /** mv motion vector cache
  192.        0:    D3  B2  B3  C2
  193.        4:    A1  X0  X1   -
  194.        8:    A3  X2  X3   -
  195.  
  196.        X are the vectors in the current macroblock (5,6,9,10)
  197.        A is the macroblock to the left (4,8)
  198.        B is the macroblock to the top (1,2)
  199.        C is the macroblock to the top-right (3)
  200.        D is the macroblock to the top-left (0)
  201.  
  202.        the same is repeated for backward motion vectors */
  203.     cavs_vector mv[2*4*3];
  204.     cavs_vector *top_mv[2];
  205.     cavs_vector *col_mv;
  206.  
  207.     /** luma pred mode cache
  208.        0:    --  B2  B3
  209.        3:    A1  X0  X1
  210.        6:    A3  X2  X3   */
  211.     int pred_mode_Y[3*3];
  212.     int *top_pred_Y;
  213.     ptrdiff_t l_stride, c_stride;
  214.     int luma_scan[4];
  215.     int qp;
  216.     int qp_fixed;
  217.     int cbp;
  218.     ScanTable scantable;
  219.  
  220.     /** intra prediction is done with un-deblocked samples
  221.      they are saved here before deblocking the MB  */
  222.     uint8_t *top_border_y, *top_border_u, *top_border_v;
  223.     uint8_t left_border_y[26], left_border_u[10], left_border_v[10];
  224.     uint8_t intern_border_y[26];
  225.     uint8_t topleft_border_y, topleft_border_u, topleft_border_v;
  226.  
  227.     void (*intra_pred_l[8])(uint8_t *d,uint8_t *top,uint8_t *left,int stride);
  228.     void (*intra_pred_c[7])(uint8_t *d,uint8_t *top,uint8_t *left,int stride);
  229.     uint8_t *col_type_base;
  230.  
  231.     /* scaling factors for MV prediction */
  232.     int sym_factor;    ///< for scaling in symmetrical B block
  233.     int direct_den[2]; ///< for scaling in direct B block
  234.     int scale_den[2];  ///< for scaling neighbouring MVs
  235.  
  236.     uint8_t *edge_emu_buffer;
  237.  
  238.     int got_keyframe;
  239.     int16_t *block;
  240. } AVSContext;
  241.  
  242. extern const uint8_t     ff_cavs_partition_flags[30];
  243. extern const cavs_vector ff_cavs_intra_mv;
  244. extern const cavs_vector ff_cavs_dir_mv;
  245.  
  246. static inline void set_mvs(cavs_vector *mv, enum cavs_block size) {
  247.     switch(size) {
  248.     case BLK_16X16:
  249.         mv[MV_STRIDE  ] = mv[0];
  250.         mv[MV_STRIDE+1] = mv[0];
  251.     case BLK_16X8:
  252.         mv[1] = mv[0];
  253.         break;
  254.     case BLK_8X16:
  255.         mv[MV_STRIDE] = mv[0];
  256.         break;
  257.     }
  258. }
  259.  
  260. void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type);
  261. void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left,
  262.                                   int block);
  263. void ff_cavs_load_intra_pred_chroma(AVSContext *h);
  264. void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv);
  265. void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type);
  266. void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC,
  267.                 enum cavs_mv_pred mode, enum cavs_block size, int ref);
  268. void ff_cavs_init_mb(AVSContext *h);
  269. int  ff_cavs_next_mb(AVSContext *h);
  270. int ff_cavs_init_pic(AVSContext *h);
  271. void ff_cavs_init_top_lines(AVSContext *h);
  272. int ff_cavs_init(AVCodecContext *avctx);
  273. int ff_cavs_end (AVCodecContext *avctx);
  274.  
  275. #endif /* AVCODEC_CAVS_H */
  276.