FFmpeg
cavs.h
Go to the documentation of this file.
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 "libavutil/mem_internal.h"
26 
27 #include "cavsdsp.h"
28 #include "blockdsp.h"
29 #include "h264chroma.h"
30 #include "idctdsp.h"
31 #include "get_bits.h"
32 #include "videodsp.h"
33 
34 #define SLICE_MAX_START_CODE 0x000001af
35 #define EXT_START_CODE 0x000001b5
36 #define USER_START_CODE 0x000001b2
37 #define CAVS_START_CODE 0x000001b0
38 #define PIC_I_START_CODE 0x000001b3
39 #define PIC_PB_START_CODE 0x000001b6
40 
41 #define A_AVAIL 1
42 #define B_AVAIL 2
43 #define C_AVAIL 4
44 #define D_AVAIL 8
45 #define NOT_AVAIL -1
46 #define REF_INTRA -2
47 #define REF_DIR -3
48 
49 #define ESCAPE_CODE 59
50 
51 #define FWD0 0x01
52 #define FWD1 0x02
53 #define BWD0 0x04
54 #define BWD1 0x08
55 #define SYM0 0x10
56 #define SYM1 0x20
57 #define SPLITH 0x40
58 #define SPLITV 0x80
59 
60 #define MV_BWD_OFFS 12
61 #define MV_STRIDE 4
62 
63 enum cavs_mb {
64  I_8X8 = 0,
75  B_8X8 = 29
76 };
77 
83 };
84 
94 };
95 
104 };
105 
113 };
114 
120 };
121 
143 };
144 
145 DECLARE_ALIGNED(8, typedef, struct) {
146  int16_t x;
147  int16_t y;
148  int16_t dist;
149  int16_t ref;
150 } cavs_vector;
151 
152 struct dec_2dvlc {
153  int8_t rltab[59][3];
154  int8_t level_add[27];
155  int8_t golomb_order;
157  int8_t max_run;
158 };
159 
160 typedef struct AVSFrame {
162  int poc;
163 } AVSFrame;
164 
165 typedef struct AVSContext {
173  AVSFrame cur; ///< currently decoded frame
174  AVSFrame DPB[2]; ///< reference frames
175  int dist[2]; ///< temporal distances from current frame to ref frames
179  int mb_width, mb_height;
180  int width, height;
181  int stream_revision; ///<0 for samples from 2006, 1 for rm52j encoder
184  int skip_mode_flag; ///< select between skip_count or one skip_flag per MB
186  int alpha_offset, beta_offset;
187  int ref_flag;
188  int mbx, mby, mbidx; ///< macroblock coordinates
189  int flags; ///< availability flags of neighbouring macroblocks
190  int stc; ///< last start code
191  uint8_t *cy, *cu, *cv; ///< current MB sample pointers
192  int left_qp;
194 
195  /** mv motion vector cache
196  0: D3 B2 B3 C2
197  4: A1 X0 X1 -
198  8: A3 X2 X3 -
199 
200  X are the vectors in the current macroblock (5,6,9,10)
201  A is the macroblock to the left (4,8)
202  B is the macroblock to the top (1,2)
203  C is the macroblock to the top-right (3)
204  D is the macroblock to the top-left (0)
205 
206  the same is repeated for backward motion vectors */
207  cavs_vector mv[2*4*3];
208  cavs_vector *top_mv[2];
210 
211  /** luma pred mode cache
212  0: -- B2 B3
213  3: A1 X0 X1
214  6: A3 X2 X3 */
215  int pred_mode_Y[3*3];
217  ptrdiff_t l_stride, c_stride;
218  int luma_scan[4];
219  int qp;
220  int qp_fixed;
222  int cbp;
224 
225  /** intra prediction is done with un-deblocked samples
226  they are saved here before deblocking the MB */
227  uint8_t *top_border_y, *top_border_u, *top_border_v;
228  uint8_t left_border_y[26], left_border_u[10], left_border_v[10];
229  uint8_t intern_border_y[26];
230  uint8_t topleft_border_y, topleft_border_u, topleft_border_v;
231 
232  void (*intra_pred_l[8])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride);
233  void (*intra_pred_c[7])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride);
235 
236  /* scaling factors for MV prediction */
237  int sym_factor; ///< for scaling in symmetrical B block
238  int direct_den[2]; ///< for scaling in direct B block
239  int scale_den[2]; ///< for scaling neighbouring MVs
240 
242 
244  int16_t *block;
245 } AVSContext;
246 
247 extern const uint8_t ff_cavs_chroma_qp[64];
248 extern const uint8_t ff_cavs_partition_flags[30];
249 extern const cavs_vector ff_cavs_intra_mv;
250 extern const cavs_vector ff_cavs_dir_mv;
251 
252 static inline void set_mvs(cavs_vector *mv, enum cavs_block size) {
253  switch(size) {
254  case BLK_16X16:
255  mv[MV_STRIDE ] = mv[0];
256  mv[MV_STRIDE+1] = mv[0];
257  case BLK_16X8:
258  mv[1] = mv[0];
259  break;
260  case BLK_8X16:
261  mv[MV_STRIDE] = mv[0];
262  break;
263  }
264 }
265 
266 void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type);
268  int block);
270 void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv);
271 void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type);
272 void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC,
273  enum cavs_mv_pred mode, enum cavs_block size, int ref);
274 void ff_cavs_init_mb(AVSContext *h);
278 int ff_cavs_init(AVCodecContext *avctx);
279 int ff_cavs_end (AVCodecContext *avctx);
280 
281 #endif /* AVCODEC_CAVS_H */
cavs_mv_loc
Definition: cavs.h:122
int pic_structure
Definition: cavs.h:183
uint8_t topleft_border_y
Definition: cavs.h:230
cavs_intra_luma
Definition: cavs.h:85
Definition: cavs.h:75
int got_keyframe
Definition: cavs.h:243
AVCodecContext * avctx
Definition: cavs.h:166
int inc_limit
Definition: cavs.h:156
This structure describes decoded (raw) audio or video data.
Definition: frame.h:314
uint8_t * edge_emu_buffer
Definition: cavs.h:241
int cbp
Definition: cavs.h:222
const cavs_vector ff_cavs_intra_mv
mark block as using intra prediction
Definition: cavsdata.c:69
Definition: cavs.h:64
int16_t x
Definition: cavs.h:146
const uint8_t ff_cavs_chroma_qp[64]
Definition: cavsdata.c:57
cavs_vector * col_mv
Definition: cavs.h:209
int poc
Definition: cavs.h:162
Scantable.
Definition: idctdsp.h:31
Definition: cavs.h:71
void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv)
Definition: cavs.c:365
Definition: cavs.h:68
int qp
Definition: cavs.h:219
int loop_filter_disable
Definition: cavs.h:185
int left_qp
Definition: cavs.h:192
void ff_cavs_init_mb(AVSContext *h)
initialise predictors for motion vectors and intra prediction
Definition: cavs.c:639
int ff_cavs_init(AVCodecContext *avctx)
Definition: cavs.c:796
void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left, int block)
Definition: cavs.c:187
cavs_mb
Definition: cavs.h:63
#define MV_BWD_OFFS
Definition: cavs.h:60
ScanTable scantable
Definition: cavs.h:223
The exact code depends on how similar the blocks are and how related they are to the block
uint8_t
int ref_flag
Definition: cavs.h:187
uint8_t * top_qp
Definition: cavs.h:193
int8_t rltab[59][3]
Definition: cavs.h:153
uint8_t * top_border_y
intra prediction is done with un-deblocked samples they are saved here before deblocking the MB ...
Definition: cavs.h:227
int width
Definition: cavs.h:180
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:117
#define height
cavs_intra_chroma
Definition: cavs.h:96
int8_t golomb_order
Definition: cavs.h:155
bitstream reader API header.
ptrdiff_t size
Definition: opengl_enc.c:100
int mby
Definition: cavs.h:188
GetBitContext gb
Definition: cavs.h:172
uint8_t * cy
Definition: cavs.h:191
int ff_cavs_next_mb(AVSContext *h)
save predictors for later macroblocks and increase macroblock address
Definition: cavs.c:680
void ff_cavs_load_intra_pred_chroma(AVSContext *h)
Definition: cavs.c:238
Definition: cavs.h:69
int ff_cavs_end(AVCodecContext *avctx)
Definition: cavs.c:842
int progressive
Definition: cavs.h:182
AVSFrame cur
currently decoded frame
Definition: cavs.h:173
Definition: cavs.h:80
CAVSDSPContext cdsp
Definition: cavs.h:171
int ff_cavs_init_top_lines(AVSContext *h)
some predictions require data from the top-neighbouring macroblock.
Definition: cavs.c:761
Definition: cavs.h:67
void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC, enum cavs_mv_pred mode, enum cavs_block size, int ref)
Definition: cavs.c:577
int skip_mode_flag
select between skip_count or one skip_flag per MB
Definition: cavs.h:184
int stream_revision
0 for samples from 2006, 1 for rm52j encoder
Definition: cavs.h:181
int pic_qp_fixed
Definition: cavs.h:221
Definition: cavs.h:118
cavs_sub_mb
Definition: cavs.h:78
int16_t dist
Definition: cavs.h:148
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
const uint8_t ff_cavs_partition_flags[30]
Definition: cavsdata.c:24
int16_t * block
Definition: cavs.h:244
const cavs_vector ff_cavs_dir_mv
mark block as "no prediction from this direction" e.g.
Definition: cavsdata.c:66
Definition: cavs.h:82
static const int8_t mv[256][2]
Definition: 4xm.c:78
Definition: cavs.h:117
int8_t max_run
Definition: cavs.h:157
void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type)
Definition: cavs.c:496
main external API structure.
Definition: avcodec.h:531
int sym_factor
for scaling in symmetrical B block
Definition: cavs.h:237
cavs_block
Definition: cavs.h:115
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2]...the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so...,+,-,+,-,+,+,-,+,-,+,...hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32-hcoeff[1]-hcoeff[2]-...a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2}an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||.........intra?||||:Block01:yes no||||:Block02:.................||||:Block03::y DC::ref index:||||:Block04::cb DC::motion x:||||.........:cr DC::motion y:||||.................|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------------------------------|||Y subbands||Cb subbands||Cr subbands||||------||------||------|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||------||------||------||||------||------||------|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||------||------||------||||------||------||------|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||------||------||------||||------||------||------|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------------------------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction------------|\Dequantization-------------------\||Reference frames|\IDWT|--------------|Motion\|||Frame 0||Frame 1||Compensation.OBMC v-------|--------------|--------------.\------> Frame n output Frame Frame<----------------------------------/|...|-------------------Range Coder:============Binary Range Coder:-------------------The implemented range coder is an adapted version based upon"Range encoding: an algorithm for removing redundancy from a digitised message."by G.N.N.Martin.The symbols encoded by the Snow range coder are bits(0|1).The associated probabilities are not fix but change depending on the symbol mix seen so far.bit seen|new state---------+-----------------------------------------------0|256-state_transition_table[256-old_state];1|state_transition_table[old_state];state_transition_table={0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:-------------------------FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1.the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:206
Definition: cavs.h:81
int * top_pred_Y
Definition: cavs.h:216
int16_t ref
Definition: cavs.h:149
int8_t level_add[27]
Definition: cavs.h:154
void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type)
in-loop deblocking filter for a single macroblock
Definition: cavs.c:111
Definition: cavs.h:66
int profile
Definition: cavs.h:177
int stc
last start code
Definition: cavs.h:190
BlockDSPContext bdsp
Definition: cavs.h:167
uint8_t level
Definition: svq3.c:206
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
int qp_fixed
Definition: cavs.h:220
Definition: cavs.h:160
cavs_mv_pred
Definition: cavs.h:106
int flags
availability flags of neighbouring macroblocks
Definition: cavs.h:189
ptrdiff_t l_stride
Definition: cavs.h:217
Definition: cavs.h:65
Core video DSP helper functions.
int beta_offset
Definition: cavs.h:186
Decoded Picture Buffer (DPB).
Definition: vaapi_h264.c:82
#define MV_STRIDE
Definition: cavs.h:61
Definition: cavs.h:119
static void set_mvs(cavs_vector *mv, enum cavs_block size)
Definition: cavs.h:252
IDCTDSPContext idsp
Definition: cavs.h:169
Definition: cavs.h:70
int aspect_ratio
Definition: cavs.h:178
#define stride
int16_t y
Definition: cavs.h:147
VideoDSPContext vdsp
Definition: cavs.h:170
H264ChromaContext h264chroma
Definition: cavs.h:168
mode
Use these values in ebur128_init (or&#39;ed).
Definition: ebur128.h:83
int mb_width
Definition: cavs.h:179
AVFrame * f
Definition: cavs.h:161
int low_delay
Definition: cavs.h:176
uint8_t * col_type_base
Definition: cavs.h:234
int ff_cavs_init_pic(AVSContext *h)
Definition: cavs.c:725