annotate cavs.h @ 5319:40af705cef7e libavcodec

AC-3 decoder, soc revision 69, Aug 31 07:12:56 2006 UTC by cloud9 Fix the bugs: 1. The quality of output because of incorrect windowing coefficients. New code for window generation. 2. Dynrng values were reset where dynrng value is present in the first block, but not in the subsequent block.
author jbr
date Sat, 14 Jul 2007 16:03:14 +0000
parents 727a49c28c51
children cb5d5d2ee6fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
1 /*
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
2 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
3 * Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de>
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
4 *
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
5 * This file is part of FFmpeg.
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
6 *
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
11 *
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
15 * Lesser General Public License for more details.
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
16 *
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
5215
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 4944
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
20 */
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
21
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
22 #ifndef CAVS_H
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
23 #define CAVS_H
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
24
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
25 #include "dsputil.h"
5236
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
26 #include "mpegvideo.h"
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
27
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
28 #define SLICE_MIN_START_CODE 0x00000101
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
29 #define SLICE_MAX_START_CODE 0x000001af
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
30 #define EXT_START_CODE 0x000001b5
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
31 #define USER_START_CODE 0x000001b2
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
32 #define CAVS_START_CODE 0x000001b0
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
33 #define PIC_I_START_CODE 0x000001b3
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
34 #define PIC_PB_START_CODE 0x000001b6
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
35
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
36 #define A_AVAIL 1
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
37 #define B_AVAIL 2
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
38 #define C_AVAIL 4
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
39 #define D_AVAIL 8
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
40 #define NOT_AVAIL -1
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
41 #define REF_INTRA -2
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
42 #define REF_DIR -3
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
43
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
44 #define ESCAPE_CODE 59
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
45
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
46 #define FWD0 0x01
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
47 #define FWD1 0x02
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
48 #define BWD0 0x04
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
49 #define BWD1 0x08
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
50 #define SYM0 0x10
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
51 #define SYM1 0x20
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
52 #define SPLITH 0x40
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
53 #define SPLITV 0x80
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
54
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
55 #define MV_BWD_OFFS 12
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
56 #define MV_STRIDE 4
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
57
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
58 enum mb_t {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
59 I_8X8 = 0,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
60 P_SKIP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
61 P_16X16,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
62 P_16X8,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
63 P_8X16,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
64 P_8X8,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
65 B_SKIP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
66 B_DIRECT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
67 B_FWD_16X16,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
68 B_BWD_16X16,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
69 B_SYM_16X16,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
70 B_8X8 = 29
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
71 };
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
72
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
73 enum sub_mb_t {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
74 B_SUB_DIRECT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
75 B_SUB_FWD,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
76 B_SUB_BWD,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
77 B_SUB_SYM
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
78 };
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
79
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
80 enum intra_luma_t {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
81 INTRA_L_VERT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
82 INTRA_L_HORIZ,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
83 INTRA_L_LP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
84 INTRA_L_DOWN_LEFT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
85 INTRA_L_DOWN_RIGHT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
86 INTRA_L_LP_LEFT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
87 INTRA_L_LP_TOP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
88 INTRA_L_DC_128
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
89 };
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
90
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
91 enum intra_chroma_t {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
92 INTRA_C_LP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
93 INTRA_C_HORIZ,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
94 INTRA_C_VERT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
95 INTRA_C_PLANE,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
96 INTRA_C_LP_LEFT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
97 INTRA_C_LP_TOP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
98 INTRA_C_DC_128,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
99 };
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
100
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
101 enum mv_pred_t {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
102 MV_PRED_MEDIAN,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
103 MV_PRED_LEFT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
104 MV_PRED_TOP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
105 MV_PRED_TOPRIGHT,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
106 MV_PRED_PSKIP,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
107 MV_PRED_BSKIP
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
108 };
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
109
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
110 enum block_t {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
111 BLK_16X16,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
112 BLK_16X8,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
113 BLK_8X16,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
114 BLK_8X8
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
115 };
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
116
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
117 enum mv_loc_t {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
118 MV_FWD_D3 = 0,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
119 MV_FWD_B2,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
120 MV_FWD_B3,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
121 MV_FWD_C2,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
122 MV_FWD_A1,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
123 MV_FWD_X0,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
124 MV_FWD_X1,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
125 MV_FWD_A3 = 8,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
126 MV_FWD_X2,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
127 MV_FWD_X3,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
128 MV_BWD_D3 = MV_BWD_OFFS,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
129 MV_BWD_B2,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
130 MV_BWD_B3,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
131 MV_BWD_C2,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
132 MV_BWD_A1,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
133 MV_BWD_X0,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
134 MV_BWD_X1,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
135 MV_BWD_A3 = MV_BWD_OFFS+8,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
136 MV_BWD_X2,
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
137 MV_BWD_X3
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
138 };
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
139
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
140 DECLARE_ALIGNED_8(typedef, struct) {
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
141 int16_t x;
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
142 int16_t y;
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
143 int16_t dist;
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
144 int16_t ref;
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
145 } vector_t;
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
146
5242
deb5b8213d4e cosmetic: rename VLC tables to make clear they
stefang
parents: 5241
diff changeset
147 typedef struct dec_2dvlc_t {
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
148 int8_t rltab[59][3];
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
149 int8_t level_add[27];
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
150 int8_t golomb_order;
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
151 int inc_limit;
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
152 int8_t max_run;
5242
deb5b8213d4e cosmetic: rename VLC tables to make clear they
stefang
parents: 5241
diff changeset
153 } dec_2dvlc_t;
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
154
5236
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
155 typedef struct {
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
156 MpegEncContext s;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
157 Picture picture; ///< currently decoded frame
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
158 Picture DPB[2]; ///< reference frames
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
159 int dist[2]; ///< temporal distances from current frame to ref frames
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
160 int profile, level;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
161 int aspect_ratio;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
162 int mb_width, mb_height;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
163 int pic_type;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
164 int progressive;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
165 int pic_structure;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
166 int skip_mode_flag; ///< select between skip_count or one skip_flag per MB
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
167 int loop_filter_disable;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
168 int alpha_offset, beta_offset;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
169 int ref_flag;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
170 int mbx, mby; ///< macroblock coordinates
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
171 int flags; ///< availability flags of neighbouring macroblocks
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
172 int stc; ///< last start code
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
173 uint8_t *cy, *cu, *cv; ///< current MB sample pointers
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
174 int left_qp;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
175 uint8_t *top_qp;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
176
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
177 /** mv motion vector cache
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
178 0: D3 B2 B3 C2
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
179 4: A1 X0 X1 -
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
180 8: A3 X2 X3 -
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
181
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
182 X are the vectors in the current macroblock (5,6,9,10)
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
183 A is the macroblock to the left (4,8)
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
184 B is the macroblock to the top (1,2)
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
185 C is the macroblock to the top-right (3)
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
186 D is the macroblock to the top-left (0)
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
187
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
188 the same is repeated for backward motion vectors */
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
189 vector_t mv[2*4*3];
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
190 vector_t *top_mv[2];
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
191 vector_t *col_mv;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
192
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
193 /** luma pred mode cache
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
194 0: -- B2 B3
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
195 3: A1 X0 X1
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
196 6: A3 X2 X3 */
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
197 int pred_mode_Y[3*3];
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
198 int *top_pred_Y;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
199 int l_stride, c_stride;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
200 int luma_scan[4];
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
201 int qp;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
202 int qp_fixed;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
203 int cbp;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
204 ScanTable scantable;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
205
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
206 /** intra prediction is done with un-deblocked samples
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
207 they are saved here before deblocking the MB */
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
208 uint8_t *top_border_y, *top_border_u, *top_border_v;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
209 uint8_t left_border_y[26], left_border_u[10], left_border_v[10];
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
210 uint8_t intern_border_y[26];
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
211 uint8_t topleft_border_y, topleft_border_u, topleft_border_v;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
212
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
213 void (*intra_pred_l[8])(uint8_t *d,uint8_t *top,uint8_t *left,int stride);
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
214 void (*intra_pred_c[7])(uint8_t *d,uint8_t *top,uint8_t *left,int stride);
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
215 uint8_t *col_type_base;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
216 uint8_t *col_type;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
217
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
218 /* scaling factors for MV prediction */
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
219 int sym_factor; ///< for scaling in symmetrical B block
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
220 int direct_den[2]; ///< for scaling in direct B block
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
221 int scale_den[2]; ///< for scaling neighbouring MVs
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
222
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
223 int got_keyframe;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
224 DCTELEM *block;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
225 } AVSContext;
1e80bd238744 move context structure definition from cavs.c to cavs.h
stefang
parents: 5215
diff changeset
226
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
227 extern const uint8_t ff_cavs_dequant_shift[64];
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
228 extern const uint16_t ff_cavs_dequant_mul[64];
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
229 extern const dec_2dvlc_t ff_cavs_intra_dec[7];
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
230 extern const dec_2dvlc_t ff_cavs_inter_dec[7];
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
231 extern const dec_2dvlc_t ff_cavs_chroma_dec[5];
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
232 extern const uint8_t ff_cavs_chroma_qp[64];
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
233 extern const uint8_t ff_cavs_scan3x3[4];
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
234 extern const uint8_t ff_cavs_partition_flags[30];
5239
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
235 extern const int_fast8_t ff_left_modifier_l[8];
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
236 extern const int_fast8_t ff_top_modifier_l[8];
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
237 extern const int_fast8_t ff_left_modifier_c[7];
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
238 extern const int_fast8_t ff_top_modifier_c[7];
5241
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
239 extern const vector_t ff_cavs_intra_mv;
5237
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
240 extern const vector_t ff_cavs_un_mv;
5249
dc2579bede07 prepare splitting decoder-only parts into own file:
stefang
parents: 5244
diff changeset
241 extern const vector_t ff_cavs_dir_mv;
5237
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
242
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
243 static inline void load_intra_pred_luma(AVSContext *h, uint8_t *top,
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
244 uint8_t **left, int block) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
245 int i;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
246
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
247 switch(block) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
248 case 0:
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
249 *left = h->left_border_y;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
250 h->left_border_y[0] = h->left_border_y[1];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
251 memset(&h->left_border_y[17],h->left_border_y[16],9);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
252 memcpy(&top[1],&h->top_border_y[h->mbx*16],16);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
253 top[17] = top[16];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
254 top[0] = top[1];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
255 if((h->flags & A_AVAIL) && (h->flags & B_AVAIL))
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
256 h->left_border_y[0] = top[0] = h->topleft_border_y;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
257 break;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
258 case 1:
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
259 *left = h->intern_border_y;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
260 for(i=0;i<8;i++)
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
261 h->intern_border_y[i+1] = *(h->cy + 7 + i*h->l_stride);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
262 memset(&h->intern_border_y[9],h->intern_border_y[8],9);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
263 h->intern_border_y[0] = h->intern_border_y[1];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
264 memcpy(&top[1],&h->top_border_y[h->mbx*16+8],8);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
265 if(h->flags & C_AVAIL)
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
266 memcpy(&top[9],&h->top_border_y[(h->mbx + 1)*16],8);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
267 else
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
268 memset(&top[9],top[8],9);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
269 top[17] = top[16];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
270 top[0] = top[1];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
271 if(h->flags & B_AVAIL)
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
272 h->intern_border_y[0] = top[0] = h->top_border_y[h->mbx*16+7];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
273 break;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
274 case 2:
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
275 *left = &h->left_border_y[8];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
276 memcpy(&top[1],h->cy + 7*h->l_stride,16);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
277 top[17] = top[16];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
278 top[0] = top[1];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
279 if(h->flags & A_AVAIL)
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
280 top[0] = h->left_border_y[8];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
281 break;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
282 case 3:
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
283 *left = &h->intern_border_y[8];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
284 for(i=0;i<8;i++)
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
285 h->intern_border_y[i+9] = *(h->cy + 7 + (i+8)*h->l_stride);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
286 memset(&h->intern_border_y[17],h->intern_border_y[16],9);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
287 memcpy(&top[0],h->cy + 7 + 7*h->l_stride,9);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
288 memset(&top[9],top[8],9);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
289 break;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
290 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
291 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
292
5238
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
293 static inline void load_intra_pred_chroma(AVSContext *h) {
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
294 /* extend borders by one pixel */
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
295 h->left_border_u[9] = h->left_border_u[8];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
296 h->left_border_v[9] = h->left_border_v[8];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
297 h->top_border_u[h->mbx*10+9] = h->top_border_u[h->mbx*10+8];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
298 h->top_border_v[h->mbx*10+9] = h->top_border_v[h->mbx*10+8];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
299 if(h->mbx && h->mby) {
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
300 h->top_border_u[h->mbx*10] = h->left_border_u[0] = h->topleft_border_u;
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
301 h->top_border_v[h->mbx*10] = h->left_border_v[0] = h->topleft_border_v;
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
302 } else {
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
303 h->left_border_u[0] = h->left_border_u[1];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
304 h->left_border_v[0] = h->left_border_v[1];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
305 h->top_border_u[h->mbx*10] = h->top_border_u[h->mbx*10+1];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
306 h->top_border_v[h->mbx*10] = h->top_border_v[h->mbx*10+1];
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
307 }
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
308 }
871a49faf887 move preparation of chroma intra prediction into its
stefang
parents: 5237
diff changeset
309
5237
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
310 static inline void modify_pred(const int_fast8_t *mod_table, int *mode) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
311 *mode = mod_table[*mode];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
312 if(*mode < 0) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
313 av_log(NULL, AV_LOG_ERROR, "Illegal intra prediction mode\n");
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
314 *mode = 0;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
315 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
316 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
317
5239
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
318 static inline void modify_mb_i(AVSContext *h, int *pred_mode_uv) {
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
319 /* save pred modes before they get modified */
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
320 h->pred_mode_Y[3] = h->pred_mode_Y[5];
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
321 h->pred_mode_Y[6] = h->pred_mode_Y[8];
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
322 h->top_pred_Y[h->mbx*2+0] = h->pred_mode_Y[7];
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
323 h->top_pred_Y[h->mbx*2+1] = h->pred_mode_Y[8];
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
324
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
325 /* modify pred modes according to availability of neighbour samples */
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
326 if(!(h->flags & A_AVAIL)) {
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
327 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[4] );
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
328 modify_pred(ff_left_modifier_l, &h->pred_mode_Y[7] );
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
329 modify_pred(ff_left_modifier_c, pred_mode_uv );
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
330 }
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
331 if(!(h->flags & B_AVAIL)) {
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
332 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[4] );
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
333 modify_pred(ff_top_modifier_l, &h->pred_mode_Y[5] );
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
334 modify_pred(ff_top_modifier_c, pred_mode_uv );
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
335 }
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
336 }
5760ab0250aa move modification of intra prediction modes into
stefang
parents: 5238
diff changeset
337
5240
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
338 static inline void set_intra_mode_default(AVSContext *h) {
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
339 h->pred_mode_Y[3] = h->pred_mode_Y[6] = INTRA_L_LP;
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
340 h->top_pred_Y[h->mbx*2+0] = h->top_pred_Y[h->mbx*2+1] = INTRA_L_LP;
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
341 }
1701ce572fed setting intra prediction modes to default values
stefang
parents: 5239
diff changeset
342
5237
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
343 static inline void set_mvs(vector_t *mv, enum block_t size) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
344 switch(size) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
345 case BLK_16X16:
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
346 mv[MV_STRIDE ] = mv[0];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
347 mv[MV_STRIDE+1] = mv[0];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
348 case BLK_16X8:
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
349 mv[1] = mv[0];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
350 break;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
351 case BLK_8X16:
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
352 mv[MV_STRIDE] = mv[0];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
353 break;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
354 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
355 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
356
5241
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
357 static inline void set_mv_intra(AVSContext *h) {
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
358 h->mv[MV_FWD_X0] = ff_cavs_intra_mv;
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
359 set_mvs(&h->mv[MV_FWD_X0], BLK_16X16);
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
360 h->mv[MV_BWD_X0] = ff_cavs_intra_mv;
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
361 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
362 if(h->pic_type != FF_B_TYPE)
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
363 *h->col_type = I_8X8;
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
364 }
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
365
74b6423a5a0d setting special motion vectors in intra macroblocks
stefang
parents: 5240
diff changeset
366
5237
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
367 /**
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
368 * initialise predictors for motion vectors and intra prediction
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
369 */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
370 static inline void init_mb(AVSContext *h) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
371 int i;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
372
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
373 /* copy predictors from top line (MB B and C) into cache */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
374 for(i=0;i<3;i++) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
375 h->mv[MV_FWD_B2+i] = h->top_mv[0][h->mbx*2+i];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
376 h->mv[MV_BWD_B2+i] = h->top_mv[1][h->mbx*2+i];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
377 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
378 h->pred_mode_Y[1] = h->top_pred_Y[h->mbx*2+0];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
379 h->pred_mode_Y[2] = h->top_pred_Y[h->mbx*2+1];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
380 /* clear top predictors if MB B is not available */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
381 if(!(h->flags & B_AVAIL)) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
382 h->mv[MV_FWD_B2] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
383 h->mv[MV_FWD_B3] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
384 h->mv[MV_BWD_B2] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
385 h->mv[MV_BWD_B3] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
386 h->pred_mode_Y[1] = h->pred_mode_Y[2] = NOT_AVAIL;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
387 h->flags &= ~(C_AVAIL|D_AVAIL);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
388 } else if(h->mbx) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
389 h->flags |= D_AVAIL;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
390 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
391 if(h->mbx == h->mb_width-1) //MB C not available
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
392 h->flags &= ~C_AVAIL;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
393 /* clear top-right predictors if MB C is not available */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
394 if(!(h->flags & C_AVAIL)) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
395 h->mv[MV_FWD_C2] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
396 h->mv[MV_BWD_C2] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
397 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
398 /* clear top-left predictors if MB D is not available */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
399 if(!(h->flags & D_AVAIL)) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
400 h->mv[MV_FWD_D3] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
401 h->mv[MV_BWD_D3] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
402 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
403 /* set pointer for co-located macroblock type */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
404 h->col_type = &h->col_type_base[h->mby*h->mb_width + h->mbx];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
405 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
406
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
407 /**
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
408 * save predictors for later macroblocks and increase
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
409 * macroblock address
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
410 * @returns 0 if end of frame is reached, 1 otherwise
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
411 */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
412 static inline int next_mb(AVSContext *h) {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
413 int i;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
414
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
415 h->flags |= A_AVAIL;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
416 h->cy += 16;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
417 h->cu += 8;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
418 h->cv += 8;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
419 /* copy mvs as predictors to the left */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
420 for(i=0;i<=20;i+=4)
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
421 h->mv[i] = h->mv[i+2];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
422 /* copy bottom mvs from cache to top line */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
423 h->top_mv[0][h->mbx*2+0] = h->mv[MV_FWD_X2];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
424 h->top_mv[0][h->mbx*2+1] = h->mv[MV_FWD_X3];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
425 h->top_mv[1][h->mbx*2+0] = h->mv[MV_BWD_X2];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
426 h->top_mv[1][h->mbx*2+1] = h->mv[MV_BWD_X3];
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
427 /* next MB address */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
428 h->mbx++;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
429 if(h->mbx == h->mb_width) { //new mb line
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
430 h->flags = B_AVAIL|C_AVAIL;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
431 /* clear left pred_modes */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
432 h->pred_mode_Y[3] = h->pred_mode_Y[6] = NOT_AVAIL;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
433 /* clear left mv predictors */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
434 for(i=0;i<=20;i+=4)
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
435 h->mv[i] = ff_cavs_un_mv;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
436 h->mbx = 0;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
437 h->mby++;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
438 /* re-calculate sample pointers */
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
439 h->cy = h->picture.data[0] + h->mby*16*h->l_stride;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
440 h->cu = h->picture.data[1] + h->mby*8*h->c_stride;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
441 h->cv = h->picture.data[2] + h->mby*8*h->c_stride;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
442 if(h->mby == h->mb_height) { //frame end
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
443 return 0;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
444 } else {
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
445 //check_for_slice(h);
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
446 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
447 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
448 return 1;
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
449 }
6aa42985b8e9 move existing inline functions from cavs.c to cavs.h
stefang
parents: 5236
diff changeset
450
5243
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
451 static inline int dequant(AVSContext *h, DCTELEM *level_buf, uint8_t *run_buf,
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
452 DCTELEM *dst, int mul, int shift, int coeff_num) {
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
453 int round = 1 << (shift - 1);
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
454 int pos = -1;
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
455 const uint8_t *scantab = h->scantable.permutated;
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
456
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
457 /* inverse scan and dequantization */
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
458 while(--coeff_num >= 0){
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
459 pos += run_buf[coeff_num];
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
460 if(pos > 63) {
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
461 av_log(h->s.avctx, AV_LOG_ERROR,
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
462 "position out of block bounds at pic %d MB(%d,%d)\n",
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
463 h->picture.poc, h->mbx, h->mby);
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
464 return -1;
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
465 }
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
466 dst[scantab[pos]] = (level_buf[coeff_num]*mul + round) >> shift;
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
467 }
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
468 return 0;
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
469 }
dd11d0b32cc9 move dequantization into its own inline function
stefang
parents: 5242
diff changeset
470
5244
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
471 void ff_cavs_filter(AVSContext *h, enum mb_t mb_type);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
472 void ff_cavs_inter(AVSContext *h, enum mb_t mb_type);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
473 void ff_cavs_mv(AVSContext *h, enum mv_loc_t nP, enum mv_loc_t nC,
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
474 enum mv_pred_t mode, enum block_t size, int ref);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
475 void ff_cavs_init_pic(AVSContext *h);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
476 void ff_cavs_init_top_lines(AVSContext *h);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
477 int ff_cavs_init(AVCodecContext *avctx);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
478 int ff_cavs_end (AVCodecContext *avctx);
eeba62cd2181 prepare splitting decoder-only parts into own file:
stefang
parents: 5243
diff changeset
479
4944
5d4544d7cbbc move defines and enums out of cavsdata.h
aurel
parents:
diff changeset
480 #endif /* CAVS_H */