yading@10
|
1 /*
|
yading@10
|
2 * VC-1 and WMV3 decoder
|
yading@10
|
3 * Copyright (c) 2011 Mashiat Sarker Shakkhar
|
yading@10
|
4 * Copyright (c) 2006-2007 Konstantin Shishkov
|
yading@10
|
5 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
|
yading@10
|
6 *
|
yading@10
|
7 * This file is part of FFmpeg.
|
yading@10
|
8 *
|
yading@10
|
9 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
10 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
11 * License as published by the Free Software Foundation; either
|
yading@10
|
12 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
13 *
|
yading@10
|
14 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
17 * Lesser General Public License for more details.
|
yading@10
|
18 *
|
yading@10
|
19 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
20 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
22 */
|
yading@10
|
23
|
yading@10
|
24 /**
|
yading@10
|
25 * @file
|
yading@10
|
26 * VC-1 and WMV3 decoder
|
yading@10
|
27 */
|
yading@10
|
28
|
yading@10
|
29 #include "internal.h"
|
yading@10
|
30 #include "avcodec.h"
|
yading@10
|
31 #include "error_resilience.h"
|
yading@10
|
32 #include "mpegvideo.h"
|
yading@10
|
33 #include "h263.h"
|
yading@10
|
34 #include "h264chroma.h"
|
yading@10
|
35 #include "vc1.h"
|
yading@10
|
36 #include "vc1data.h"
|
yading@10
|
37 #include "vc1acdata.h"
|
yading@10
|
38 #include "msmpeg4data.h"
|
yading@10
|
39 #include "unary.h"
|
yading@10
|
40 #include "mathops.h"
|
yading@10
|
41 #include "vdpau_internal.h"
|
yading@10
|
42 #include "libavutil/avassert.h"
|
yading@10
|
43
|
yading@10
|
44 #undef NDEBUG
|
yading@10
|
45 #include <assert.h>
|
yading@10
|
46
|
yading@10
|
47 #define MB_INTRA_VLC_BITS 9
|
yading@10
|
48 #define DC_VLC_BITS 9
|
yading@10
|
49
|
yading@10
|
50
|
yading@10
|
51 // offset tables for interlaced picture MVDATA decoding
|
yading@10
|
52 static const int offset_table1[9] = { 0, 1, 2, 4, 8, 16, 32, 64, 128 };
|
yading@10
|
53 static const int offset_table2[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
|
yading@10
|
54
|
yading@10
|
55 /***********************************************************************/
|
yading@10
|
56 /**
|
yading@10
|
57 * @name VC-1 Bitplane decoding
|
yading@10
|
58 * @see 8.7, p56
|
yading@10
|
59 * @{
|
yading@10
|
60 */
|
yading@10
|
61
|
yading@10
|
62 /**
|
yading@10
|
63 * Imode types
|
yading@10
|
64 * @{
|
yading@10
|
65 */
|
yading@10
|
66 enum Imode {
|
yading@10
|
67 IMODE_RAW,
|
yading@10
|
68 IMODE_NORM2,
|
yading@10
|
69 IMODE_DIFF2,
|
yading@10
|
70 IMODE_NORM6,
|
yading@10
|
71 IMODE_DIFF6,
|
yading@10
|
72 IMODE_ROWSKIP,
|
yading@10
|
73 IMODE_COLSKIP
|
yading@10
|
74 };
|
yading@10
|
75 /** @} */ //imode defines
|
yading@10
|
76
|
yading@10
|
77 static void init_block_index(VC1Context *v)
|
yading@10
|
78 {
|
yading@10
|
79 MpegEncContext *s = &v->s;
|
yading@10
|
80 ff_init_block_index(s);
|
yading@10
|
81 if (v->field_mode && !(v->second_field ^ v->tff)) {
|
yading@10
|
82 s->dest[0] += s->current_picture_ptr->f.linesize[0];
|
yading@10
|
83 s->dest[1] += s->current_picture_ptr->f.linesize[1];
|
yading@10
|
84 s->dest[2] += s->current_picture_ptr->f.linesize[2];
|
yading@10
|
85 }
|
yading@10
|
86 }
|
yading@10
|
87
|
yading@10
|
88
|
yading@10
|
89 /** @} */ //Bitplane group
|
yading@10
|
90
|
yading@10
|
91 static void vc1_put_signed_blocks_clamped(VC1Context *v)
|
yading@10
|
92 {
|
yading@10
|
93 MpegEncContext *s = &v->s;
|
yading@10
|
94 int topleft_mb_pos, top_mb_pos;
|
yading@10
|
95 int stride_y, fieldtx = 0;
|
yading@10
|
96 int v_dist;
|
yading@10
|
97
|
yading@10
|
98 /* The put pixels loop is always one MB row behind the decoding loop,
|
yading@10
|
99 * because we can only put pixels when overlap filtering is done, and
|
yading@10
|
100 * for filtering of the bottom edge of a MB, we need the next MB row
|
yading@10
|
101 * present as well.
|
yading@10
|
102 * Within the row, the put pixels loop is also one MB col behind the
|
yading@10
|
103 * decoding loop. The reason for this is again, because for filtering
|
yading@10
|
104 * of the right MB edge, we need the next MB present. */
|
yading@10
|
105 if (!s->first_slice_line) {
|
yading@10
|
106 if (s->mb_x) {
|
yading@10
|
107 topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1;
|
yading@10
|
108 if (v->fcm == ILACE_FRAME)
|
yading@10
|
109 fieldtx = v->fieldtx_plane[topleft_mb_pos];
|
yading@10
|
110 stride_y = s->linesize << fieldtx;
|
yading@10
|
111 v_dist = (16 - fieldtx) >> (fieldtx == 0);
|
yading@10
|
112 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
|
yading@10
|
113 s->dest[0] - 16 * s->linesize - 16,
|
yading@10
|
114 stride_y);
|
yading@10
|
115 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
|
yading@10
|
116 s->dest[0] - 16 * s->linesize - 8,
|
yading@10
|
117 stride_y);
|
yading@10
|
118 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
|
yading@10
|
119 s->dest[0] - v_dist * s->linesize - 16,
|
yading@10
|
120 stride_y);
|
yading@10
|
121 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
|
yading@10
|
122 s->dest[0] - v_dist * s->linesize - 8,
|
yading@10
|
123 stride_y);
|
yading@10
|
124 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
|
yading@10
|
125 s->dest[1] - 8 * s->uvlinesize - 8,
|
yading@10
|
126 s->uvlinesize);
|
yading@10
|
127 s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
|
yading@10
|
128 s->dest[2] - 8 * s->uvlinesize - 8,
|
yading@10
|
129 s->uvlinesize);
|
yading@10
|
130 }
|
yading@10
|
131 if (s->mb_x == s->mb_width - 1) {
|
yading@10
|
132 top_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x;
|
yading@10
|
133 if (v->fcm == ILACE_FRAME)
|
yading@10
|
134 fieldtx = v->fieldtx_plane[top_mb_pos];
|
yading@10
|
135 stride_y = s->linesize << fieldtx;
|
yading@10
|
136 v_dist = fieldtx ? 15 : 8;
|
yading@10
|
137 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
|
yading@10
|
138 s->dest[0] - 16 * s->linesize,
|
yading@10
|
139 stride_y);
|
yading@10
|
140 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
|
yading@10
|
141 s->dest[0] - 16 * s->linesize + 8,
|
yading@10
|
142 stride_y);
|
yading@10
|
143 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
|
yading@10
|
144 s->dest[0] - v_dist * s->linesize,
|
yading@10
|
145 stride_y);
|
yading@10
|
146 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
|
yading@10
|
147 s->dest[0] - v_dist * s->linesize + 8,
|
yading@10
|
148 stride_y);
|
yading@10
|
149 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
|
yading@10
|
150 s->dest[1] - 8 * s->uvlinesize,
|
yading@10
|
151 s->uvlinesize);
|
yading@10
|
152 s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
|
yading@10
|
153 s->dest[2] - 8 * s->uvlinesize,
|
yading@10
|
154 s->uvlinesize);
|
yading@10
|
155 }
|
yading@10
|
156 }
|
yading@10
|
157
|
yading@10
|
158 #define inc_blk_idx(idx) do { \
|
yading@10
|
159 idx++; \
|
yading@10
|
160 if (idx >= v->n_allocated_blks) \
|
yading@10
|
161 idx = 0; \
|
yading@10
|
162 } while (0)
|
yading@10
|
163
|
yading@10
|
164 inc_blk_idx(v->topleft_blk_idx);
|
yading@10
|
165 inc_blk_idx(v->top_blk_idx);
|
yading@10
|
166 inc_blk_idx(v->left_blk_idx);
|
yading@10
|
167 inc_blk_idx(v->cur_blk_idx);
|
yading@10
|
168 }
|
yading@10
|
169
|
yading@10
|
170 static void vc1_loop_filter_iblk(VC1Context *v, int pq)
|
yading@10
|
171 {
|
yading@10
|
172 MpegEncContext *s = &v->s;
|
yading@10
|
173 int j;
|
yading@10
|
174 if (!s->first_slice_line) {
|
yading@10
|
175 v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
|
yading@10
|
176 if (s->mb_x)
|
yading@10
|
177 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
|
yading@10
|
178 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
|
yading@10
|
179 for (j = 0; j < 2; j++) {
|
yading@10
|
180 v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1], s->uvlinesize, pq);
|
yading@10
|
181 if (s->mb_x)
|
yading@10
|
182 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
|
yading@10
|
183 }
|
yading@10
|
184 }
|
yading@10
|
185 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8 * s->linesize, s->linesize, pq);
|
yading@10
|
186
|
yading@10
|
187 if (s->mb_y == s->end_mb_y - 1) {
|
yading@10
|
188 if (s->mb_x) {
|
yading@10
|
189 v->vc1dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
|
yading@10
|
190 v->vc1dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
|
yading@10
|
191 v->vc1dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
|
yading@10
|
192 }
|
yading@10
|
193 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
|
yading@10
|
194 }
|
yading@10
|
195 }
|
yading@10
|
196
|
yading@10
|
197 static void vc1_loop_filter_iblk_delayed(VC1Context *v, int pq)
|
yading@10
|
198 {
|
yading@10
|
199 MpegEncContext *s = &v->s;
|
yading@10
|
200 int j;
|
yading@10
|
201
|
yading@10
|
202 /* The loopfilter runs 1 row and 1 column behind the overlap filter, which
|
yading@10
|
203 * means it runs two rows/cols behind the decoding loop. */
|
yading@10
|
204 if (!s->first_slice_line) {
|
yading@10
|
205 if (s->mb_x) {
|
yading@10
|
206 if (s->mb_y >= s->start_mb_y + 2) {
|
yading@10
|
207 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
|
yading@10
|
208
|
yading@10
|
209 if (s->mb_x >= 2)
|
yading@10
|
210 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 16, s->linesize, pq);
|
yading@10
|
211 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 8, s->linesize, pq);
|
yading@10
|
212 for (j = 0; j < 2; j++) {
|
yading@10
|
213 v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
|
yading@10
|
214 if (s->mb_x >= 2) {
|
yading@10
|
215 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq);
|
yading@10
|
216 }
|
yading@10
|
217 }
|
yading@10
|
218 }
|
yading@10
|
219 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq);
|
yading@10
|
220 }
|
yading@10
|
221
|
yading@10
|
222 if (s->mb_x == s->mb_width - 1) {
|
yading@10
|
223 if (s->mb_y >= s->start_mb_y + 2) {
|
yading@10
|
224 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
|
yading@10
|
225
|
yading@10
|
226 if (s->mb_x)
|
yading@10
|
227 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize, s->linesize, pq);
|
yading@10
|
228 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize + 8, s->linesize, pq);
|
yading@10
|
229 for (j = 0; j < 2; j++) {
|
yading@10
|
230 v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
|
yading@10
|
231 if (s->mb_x >= 2) {
|
yading@10
|
232 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize, s->uvlinesize, pq);
|
yading@10
|
233 }
|
yading@10
|
234 }
|
yading@10
|
235 }
|
yading@10
|
236 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq);
|
yading@10
|
237 }
|
yading@10
|
238
|
yading@10
|
239 if (s->mb_y == s->end_mb_y) {
|
yading@10
|
240 if (s->mb_x) {
|
yading@10
|
241 if (s->mb_x >= 2)
|
yading@10
|
242 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
|
yading@10
|
243 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 8, s->linesize, pq);
|
yading@10
|
244 if (s->mb_x >= 2) {
|
yading@10
|
245 for (j = 0; j < 2; j++) {
|
yading@10
|
246 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
|
yading@10
|
247 }
|
yading@10
|
248 }
|
yading@10
|
249 }
|
yading@10
|
250
|
yading@10
|
251 if (s->mb_x == s->mb_width - 1) {
|
yading@10
|
252 if (s->mb_x)
|
yading@10
|
253 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
|
yading@10
|
254 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
|
yading@10
|
255 if (s->mb_x) {
|
yading@10
|
256 for (j = 0; j < 2; j++) {
|
yading@10
|
257 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
|
yading@10
|
258 }
|
yading@10
|
259 }
|
yading@10
|
260 }
|
yading@10
|
261 }
|
yading@10
|
262 }
|
yading@10
|
263 }
|
yading@10
|
264
|
yading@10
|
265 static void vc1_smooth_overlap_filter_iblk(VC1Context *v)
|
yading@10
|
266 {
|
yading@10
|
267 MpegEncContext *s = &v->s;
|
yading@10
|
268 int mb_pos;
|
yading@10
|
269
|
yading@10
|
270 if (v->condover == CONDOVER_NONE)
|
yading@10
|
271 return;
|
yading@10
|
272
|
yading@10
|
273 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
274
|
yading@10
|
275 /* Within a MB, the horizontal overlap always runs before the vertical.
|
yading@10
|
276 * To accomplish that, we run the H on left and internal borders of the
|
yading@10
|
277 * currently decoded MB. Then, we wait for the next overlap iteration
|
yading@10
|
278 * to do H overlap on the right edge of this MB, before moving over and
|
yading@10
|
279 * running the V overlap. Therefore, the V overlap makes us trail by one
|
yading@10
|
280 * MB col and the H overlap filter makes us trail by one MB row. This
|
yading@10
|
281 * is reflected in the time at which we run the put_pixels loop. */
|
yading@10
|
282 if (v->condover == CONDOVER_ALL || v->pq >= 9 || v->over_flags_plane[mb_pos]) {
|
yading@10
|
283 if (s->mb_x && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
|
yading@10
|
284 v->over_flags_plane[mb_pos - 1])) {
|
yading@10
|
285 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][1],
|
yading@10
|
286 v->block[v->cur_blk_idx][0]);
|
yading@10
|
287 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][3],
|
yading@10
|
288 v->block[v->cur_blk_idx][2]);
|
yading@10
|
289 if (!(s->flags & CODEC_FLAG_GRAY)) {
|
yading@10
|
290 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][4],
|
yading@10
|
291 v->block[v->cur_blk_idx][4]);
|
yading@10
|
292 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][5],
|
yading@10
|
293 v->block[v->cur_blk_idx][5]);
|
yading@10
|
294 }
|
yading@10
|
295 }
|
yading@10
|
296 v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][0],
|
yading@10
|
297 v->block[v->cur_blk_idx][1]);
|
yading@10
|
298 v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][2],
|
yading@10
|
299 v->block[v->cur_blk_idx][3]);
|
yading@10
|
300
|
yading@10
|
301 if (s->mb_x == s->mb_width - 1) {
|
yading@10
|
302 if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
|
yading@10
|
303 v->over_flags_plane[mb_pos - s->mb_stride])) {
|
yading@10
|
304 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][2],
|
yading@10
|
305 v->block[v->cur_blk_idx][0]);
|
yading@10
|
306 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][3],
|
yading@10
|
307 v->block[v->cur_blk_idx][1]);
|
yading@10
|
308 if (!(s->flags & CODEC_FLAG_GRAY)) {
|
yading@10
|
309 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][4],
|
yading@10
|
310 v->block[v->cur_blk_idx][4]);
|
yading@10
|
311 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][5],
|
yading@10
|
312 v->block[v->cur_blk_idx][5]);
|
yading@10
|
313 }
|
yading@10
|
314 }
|
yading@10
|
315 v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][0],
|
yading@10
|
316 v->block[v->cur_blk_idx][2]);
|
yading@10
|
317 v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][1],
|
yading@10
|
318 v->block[v->cur_blk_idx][3]);
|
yading@10
|
319 }
|
yading@10
|
320 }
|
yading@10
|
321 if (s->mb_x && (v->condover == CONDOVER_ALL || v->over_flags_plane[mb_pos - 1])) {
|
yading@10
|
322 if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
|
yading@10
|
323 v->over_flags_plane[mb_pos - s->mb_stride - 1])) {
|
yading@10
|
324 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][2],
|
yading@10
|
325 v->block[v->left_blk_idx][0]);
|
yading@10
|
326 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][3],
|
yading@10
|
327 v->block[v->left_blk_idx][1]);
|
yading@10
|
328 if (!(s->flags & CODEC_FLAG_GRAY)) {
|
yading@10
|
329 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][4],
|
yading@10
|
330 v->block[v->left_blk_idx][4]);
|
yading@10
|
331 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][5],
|
yading@10
|
332 v->block[v->left_blk_idx][5]);
|
yading@10
|
333 }
|
yading@10
|
334 }
|
yading@10
|
335 v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][0],
|
yading@10
|
336 v->block[v->left_blk_idx][2]);
|
yading@10
|
337 v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][1],
|
yading@10
|
338 v->block[v->left_blk_idx][3]);
|
yading@10
|
339 }
|
yading@10
|
340 }
|
yading@10
|
341
|
yading@10
|
342 /** Do motion compensation over 1 macroblock
|
yading@10
|
343 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
|
yading@10
|
344 */
|
yading@10
|
345 static void vc1_mc_1mv(VC1Context *v, int dir)
|
yading@10
|
346 {
|
yading@10
|
347 MpegEncContext *s = &v->s;
|
yading@10
|
348 H264ChromaContext *h264chroma = &v->h264chroma;
|
yading@10
|
349 uint8_t *srcY, *srcU, *srcV;
|
yading@10
|
350 int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
|
yading@10
|
351 int off, off_uv;
|
yading@10
|
352 int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
yading@10
|
353 int i;
|
yading@10
|
354
|
yading@10
|
355 if ((!v->field_mode ||
|
yading@10
|
356 (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) &&
|
yading@10
|
357 !v->s.last_picture.f.data[0])
|
yading@10
|
358 return;
|
yading@10
|
359
|
yading@10
|
360 mx = s->mv[dir][0][0];
|
yading@10
|
361 my = s->mv[dir][0][1];
|
yading@10
|
362
|
yading@10
|
363 // store motion vectors for further use in B frames
|
yading@10
|
364 if (s->pict_type == AV_PICTURE_TYPE_P) {
|
yading@10
|
365 for (i = 0; i < 4; i++) {
|
yading@10
|
366 s->current_picture.motion_val[1][s->block_index[i] + v->blocks_off][0] = mx;
|
yading@10
|
367 s->current_picture.motion_val[1][s->block_index[i] + v->blocks_off][1] = my;
|
yading@10
|
368 }
|
yading@10
|
369 }
|
yading@10
|
370
|
yading@10
|
371 uvmx = (mx + ((mx & 3) == 3)) >> 1;
|
yading@10
|
372 uvmy = (my + ((my & 3) == 3)) >> 1;
|
yading@10
|
373 v->luma_mv[s->mb_x][0] = uvmx;
|
yading@10
|
374 v->luma_mv[s->mb_x][1] = uvmy;
|
yading@10
|
375
|
yading@10
|
376 if (v->field_mode &&
|
yading@10
|
377 v->cur_field_type != v->ref_field_type[dir]) {
|
yading@10
|
378 my = my - 2 + 4 * v->cur_field_type;
|
yading@10
|
379 uvmy = uvmy - 2 + 4 * v->cur_field_type;
|
yading@10
|
380 }
|
yading@10
|
381
|
yading@10
|
382 // fastuvmc shall be ignored for interlaced frame picture
|
yading@10
|
383 if (v->fastuvmc && (v->fcm != ILACE_FRAME)) {
|
yading@10
|
384 uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
|
yading@10
|
385 uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
|
yading@10
|
386 }
|
yading@10
|
387 if (v->field_mode) { // interlaced field picture
|
yading@10
|
388 if (!dir) {
|
yading@10
|
389 if ((v->cur_field_type != v->ref_field_type[dir]) && v->second_field) {
|
yading@10
|
390 srcY = s->current_picture.f.data[0];
|
yading@10
|
391 srcU = s->current_picture.f.data[1];
|
yading@10
|
392 srcV = s->current_picture.f.data[2];
|
yading@10
|
393 } else {
|
yading@10
|
394 srcY = s->last_picture.f.data[0];
|
yading@10
|
395 srcU = s->last_picture.f.data[1];
|
yading@10
|
396 srcV = s->last_picture.f.data[2];
|
yading@10
|
397 }
|
yading@10
|
398 } else {
|
yading@10
|
399 srcY = s->next_picture.f.data[0];
|
yading@10
|
400 srcU = s->next_picture.f.data[1];
|
yading@10
|
401 srcV = s->next_picture.f.data[2];
|
yading@10
|
402 }
|
yading@10
|
403 } else {
|
yading@10
|
404 if (!dir) {
|
yading@10
|
405 srcY = s->last_picture.f.data[0];
|
yading@10
|
406 srcU = s->last_picture.f.data[1];
|
yading@10
|
407 srcV = s->last_picture.f.data[2];
|
yading@10
|
408 } else {
|
yading@10
|
409 srcY = s->next_picture.f.data[0];
|
yading@10
|
410 srcU = s->next_picture.f.data[1];
|
yading@10
|
411 srcV = s->next_picture.f.data[2];
|
yading@10
|
412 }
|
yading@10
|
413 }
|
yading@10
|
414
|
yading@10
|
415 if(!srcY)
|
yading@10
|
416 return;
|
yading@10
|
417
|
yading@10
|
418 src_x = s->mb_x * 16 + (mx >> 2);
|
yading@10
|
419 src_y = s->mb_y * 16 + (my >> 2);
|
yading@10
|
420 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
|
yading@10
|
421 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
|
yading@10
|
422
|
yading@10
|
423 if (v->profile != PROFILE_ADVANCED) {
|
yading@10
|
424 src_x = av_clip( src_x, -16, s->mb_width * 16);
|
yading@10
|
425 src_y = av_clip( src_y, -16, s->mb_height * 16);
|
yading@10
|
426 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
|
yading@10
|
427 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
|
yading@10
|
428 } else {
|
yading@10
|
429 src_x = av_clip( src_x, -17, s->avctx->coded_width);
|
yading@10
|
430 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
|
yading@10
|
431 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
|
yading@10
|
432 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
|
yading@10
|
433 }
|
yading@10
|
434
|
yading@10
|
435 srcY += src_y * s->linesize + src_x;
|
yading@10
|
436 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
437 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
438
|
yading@10
|
439 if (v->field_mode && v->ref_field_type[dir]) {
|
yading@10
|
440 srcY += s->current_picture_ptr->f.linesize[0];
|
yading@10
|
441 srcU += s->current_picture_ptr->f.linesize[1];
|
yading@10
|
442 srcV += s->current_picture_ptr->f.linesize[2];
|
yading@10
|
443 }
|
yading@10
|
444
|
yading@10
|
445 /* for grayscale we should not try to read from unknown area */
|
yading@10
|
446 if (s->flags & CODEC_FLAG_GRAY) {
|
yading@10
|
447 srcU = s->edge_emu_buffer + 18 * s->linesize;
|
yading@10
|
448 srcV = s->edge_emu_buffer + 18 * s->linesize;
|
yading@10
|
449 }
|
yading@10
|
450
|
yading@10
|
451 if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
|
yading@10
|
452 || s->h_edge_pos < 22 || v_edge_pos < 22
|
yading@10
|
453 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3
|
yading@10
|
454 || (unsigned)(src_y - 1) > v_edge_pos - (my&3) - 16 - 3) {
|
yading@10
|
455 uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
|
yading@10
|
456
|
yading@10
|
457 srcY -= s->mspel * (1 + s->linesize);
|
yading@10
|
458 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
|
yading@10
|
459 17 + s->mspel * 2, 17 + s->mspel * 2,
|
yading@10
|
460 src_x - s->mspel, src_y - s->mspel,
|
yading@10
|
461 s->h_edge_pos, v_edge_pos);
|
yading@10
|
462 srcY = s->edge_emu_buffer;
|
yading@10
|
463 s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
|
yading@10
|
464 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
|
yading@10
|
465 s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
|
yading@10
|
466 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
|
yading@10
|
467 srcU = uvbuf;
|
yading@10
|
468 srcV = uvbuf + 16;
|
yading@10
|
469 /* if we deal with range reduction we need to scale source blocks */
|
yading@10
|
470 if (v->rangeredfrm) {
|
yading@10
|
471 int i, j;
|
yading@10
|
472 uint8_t *src, *src2;
|
yading@10
|
473
|
yading@10
|
474 src = srcY;
|
yading@10
|
475 for (j = 0; j < 17 + s->mspel * 2; j++) {
|
yading@10
|
476 for (i = 0; i < 17 + s->mspel * 2; i++)
|
yading@10
|
477 src[i] = ((src[i] - 128) >> 1) + 128;
|
yading@10
|
478 src += s->linesize;
|
yading@10
|
479 }
|
yading@10
|
480 src = srcU;
|
yading@10
|
481 src2 = srcV;
|
yading@10
|
482 for (j = 0; j < 9; j++) {
|
yading@10
|
483 for (i = 0; i < 9; i++) {
|
yading@10
|
484 src[i] = ((src[i] - 128) >> 1) + 128;
|
yading@10
|
485 src2[i] = ((src2[i] - 128) >> 1) + 128;
|
yading@10
|
486 }
|
yading@10
|
487 src += s->uvlinesize;
|
yading@10
|
488 src2 += s->uvlinesize;
|
yading@10
|
489 }
|
yading@10
|
490 }
|
yading@10
|
491 /* if we deal with intensity compensation we need to scale source blocks */
|
yading@10
|
492 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
yading@10
|
493 int i, j;
|
yading@10
|
494 uint8_t *src, *src2;
|
yading@10
|
495
|
yading@10
|
496 src = srcY;
|
yading@10
|
497 for (j = 0; j < 17 + s->mspel * 2; j++) {
|
yading@10
|
498 for (i = 0; i < 17 + s->mspel * 2; i++)
|
yading@10
|
499 src[i] = v->luty[src[i]];
|
yading@10
|
500 src += s->linesize;
|
yading@10
|
501 }
|
yading@10
|
502 src = srcU;
|
yading@10
|
503 src2 = srcV;
|
yading@10
|
504 for (j = 0; j < 9; j++) {
|
yading@10
|
505 for (i = 0; i < 9; i++) {
|
yading@10
|
506 src[i] = v->lutuv[src[i]];
|
yading@10
|
507 src2[i] = v->lutuv[src2[i]];
|
yading@10
|
508 }
|
yading@10
|
509 src += s->uvlinesize;
|
yading@10
|
510 src2 += s->uvlinesize;
|
yading@10
|
511 }
|
yading@10
|
512 }
|
yading@10
|
513 srcY += s->mspel * (1 + s->linesize);
|
yading@10
|
514 }
|
yading@10
|
515
|
yading@10
|
516 off = 0;
|
yading@10
|
517 off_uv = 0;
|
yading@10
|
518 if (s->mspel) {
|
yading@10
|
519 dxy = ((my & 3) << 2) | (mx & 3);
|
yading@10
|
520 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off , srcY , s->linesize, v->rnd);
|
yading@10
|
521 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
|
yading@10
|
522 srcY += s->linesize * 8;
|
yading@10
|
523 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize , srcY , s->linesize, v->rnd);
|
yading@10
|
524 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
|
yading@10
|
525 } else { // hpel mc - always used for luma
|
yading@10
|
526 dxy = (my & 2) | ((mx & 2) >> 1);
|
yading@10
|
527 if (!v->rnd)
|
yading@10
|
528 s->hdsp.put_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
|
yading@10
|
529 else
|
yading@10
|
530 s->hdsp.put_no_rnd_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
|
yading@10
|
531 }
|
yading@10
|
532
|
yading@10
|
533 if (s->flags & CODEC_FLAG_GRAY) return;
|
yading@10
|
534 /* Chroma MC always uses qpel bilinear */
|
yading@10
|
535 uvmx = (uvmx & 3) << 1;
|
yading@10
|
536 uvmy = (uvmy & 3) << 1;
|
yading@10
|
537 if (!v->rnd) {
|
yading@10
|
538 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
539 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
540 } else {
|
yading@10
|
541 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
542 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
543 }
|
yading@10
|
544 }
|
yading@10
|
545
|
yading@10
|
546 static inline int median4(int a, int b, int c, int d)
|
yading@10
|
547 {
|
yading@10
|
548 if (a < b) {
|
yading@10
|
549 if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
|
yading@10
|
550 else return (FFMIN(b, c) + FFMAX(a, d)) / 2;
|
yading@10
|
551 } else {
|
yading@10
|
552 if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
|
yading@10
|
553 else return (FFMIN(a, c) + FFMAX(b, d)) / 2;
|
yading@10
|
554 }
|
yading@10
|
555 }
|
yading@10
|
556
|
yading@10
|
557 /** Do motion compensation for 4-MV macroblock - luminance block
|
yading@10
|
558 */
|
yading@10
|
559 static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg)
|
yading@10
|
560 {
|
yading@10
|
561 MpegEncContext *s = &v->s;
|
yading@10
|
562 uint8_t *srcY;
|
yading@10
|
563 int dxy, mx, my, src_x, src_y;
|
yading@10
|
564 int off;
|
yading@10
|
565 int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0;
|
yading@10
|
566 int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
yading@10
|
567
|
yading@10
|
568 if ((!v->field_mode ||
|
yading@10
|
569 (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) &&
|
yading@10
|
570 !v->s.last_picture.f.data[0])
|
yading@10
|
571 return;
|
yading@10
|
572
|
yading@10
|
573 mx = s->mv[dir][n][0];
|
yading@10
|
574 my = s->mv[dir][n][1];
|
yading@10
|
575
|
yading@10
|
576 if (!dir) {
|
yading@10
|
577 if (v->field_mode) {
|
yading@10
|
578 if ((v->cur_field_type != v->ref_field_type[dir]) && v->second_field)
|
yading@10
|
579 srcY = s->current_picture.f.data[0];
|
yading@10
|
580 else
|
yading@10
|
581 srcY = s->last_picture.f.data[0];
|
yading@10
|
582 } else
|
yading@10
|
583 srcY = s->last_picture.f.data[0];
|
yading@10
|
584 } else
|
yading@10
|
585 srcY = s->next_picture.f.data[0];
|
yading@10
|
586
|
yading@10
|
587 if(!srcY)
|
yading@10
|
588 return;
|
yading@10
|
589
|
yading@10
|
590 if (v->field_mode) {
|
yading@10
|
591 if (v->cur_field_type != v->ref_field_type[dir])
|
yading@10
|
592 my = my - 2 + 4 * v->cur_field_type;
|
yading@10
|
593 }
|
yading@10
|
594
|
yading@10
|
595 if (s->pict_type == AV_PICTURE_TYPE_P && n == 3 && v->field_mode) {
|
yading@10
|
596 int same_count = 0, opp_count = 0, k;
|
yading@10
|
597 int chosen_mv[2][4][2], f;
|
yading@10
|
598 int tx, ty;
|
yading@10
|
599 for (k = 0; k < 4; k++) {
|
yading@10
|
600 f = v->mv_f[0][s->block_index[k] + v->blocks_off];
|
yading@10
|
601 chosen_mv[f][f ? opp_count : same_count][0] = s->mv[0][k][0];
|
yading@10
|
602 chosen_mv[f][f ? opp_count : same_count][1] = s->mv[0][k][1];
|
yading@10
|
603 opp_count += f;
|
yading@10
|
604 same_count += 1 - f;
|
yading@10
|
605 }
|
yading@10
|
606 f = opp_count > same_count;
|
yading@10
|
607 switch (f ? opp_count : same_count) {
|
yading@10
|
608 case 4:
|
yading@10
|
609 tx = median4(chosen_mv[f][0][0], chosen_mv[f][1][0],
|
yading@10
|
610 chosen_mv[f][2][0], chosen_mv[f][3][0]);
|
yading@10
|
611 ty = median4(chosen_mv[f][0][1], chosen_mv[f][1][1],
|
yading@10
|
612 chosen_mv[f][2][1], chosen_mv[f][3][1]);
|
yading@10
|
613 break;
|
yading@10
|
614 case 3:
|
yading@10
|
615 tx = mid_pred(chosen_mv[f][0][0], chosen_mv[f][1][0], chosen_mv[f][2][0]);
|
yading@10
|
616 ty = mid_pred(chosen_mv[f][0][1], chosen_mv[f][1][1], chosen_mv[f][2][1]);
|
yading@10
|
617 break;
|
yading@10
|
618 case 2:
|
yading@10
|
619 tx = (chosen_mv[f][0][0] + chosen_mv[f][1][0]) / 2;
|
yading@10
|
620 ty = (chosen_mv[f][0][1] + chosen_mv[f][1][1]) / 2;
|
yading@10
|
621 break;
|
yading@10
|
622 default:
|
yading@10
|
623 av_assert2(0);
|
yading@10
|
624 }
|
yading@10
|
625 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
|
yading@10
|
626 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
|
yading@10
|
627 for (k = 0; k < 4; k++)
|
yading@10
|
628 v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
|
yading@10
|
629 }
|
yading@10
|
630
|
yading@10
|
631 if (v->fcm == ILACE_FRAME) { // not sure if needed for other types of picture
|
yading@10
|
632 int qx, qy;
|
yading@10
|
633 int width = s->avctx->coded_width;
|
yading@10
|
634 int height = s->avctx->coded_height >> 1;
|
yading@10
|
635 if (s->pict_type == AV_PICTURE_TYPE_P) {
|
yading@10
|
636 s->current_picture.motion_val[1][s->block_index[n] + v->blocks_off][0] = mx;
|
yading@10
|
637 s->current_picture.motion_val[1][s->block_index[n] + v->blocks_off][1] = my;
|
yading@10
|
638 }
|
yading@10
|
639 qx = (s->mb_x * 16) + (mx >> 2);
|
yading@10
|
640 qy = (s->mb_y * 8) + (my >> 3);
|
yading@10
|
641
|
yading@10
|
642 if (qx < -17)
|
yading@10
|
643 mx -= 4 * (qx + 17);
|
yading@10
|
644 else if (qx > width)
|
yading@10
|
645 mx -= 4 * (qx - width);
|
yading@10
|
646 if (qy < -18)
|
yading@10
|
647 my -= 8 * (qy + 18);
|
yading@10
|
648 else if (qy > height + 1)
|
yading@10
|
649 my -= 8 * (qy - height - 1);
|
yading@10
|
650 }
|
yading@10
|
651
|
yading@10
|
652 if ((v->fcm == ILACE_FRAME) && fieldmv)
|
yading@10
|
653 off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
|
yading@10
|
654 else
|
yading@10
|
655 off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
|
yading@10
|
656
|
yading@10
|
657 src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2);
|
yading@10
|
658 if (!fieldmv)
|
yading@10
|
659 src_y = s->mb_y * 16 + (n & 2) * 4 + (my >> 2);
|
yading@10
|
660 else
|
yading@10
|
661 src_y = s->mb_y * 16 + ((n > 1) ? 1 : 0) + (my >> 2);
|
yading@10
|
662
|
yading@10
|
663 if (v->profile != PROFILE_ADVANCED) {
|
yading@10
|
664 src_x = av_clip(src_x, -16, s->mb_width * 16);
|
yading@10
|
665 src_y = av_clip(src_y, -16, s->mb_height * 16);
|
yading@10
|
666 } else {
|
yading@10
|
667 src_x = av_clip(src_x, -17, s->avctx->coded_width);
|
yading@10
|
668 if (v->fcm == ILACE_FRAME) {
|
yading@10
|
669 if (src_y & 1)
|
yading@10
|
670 src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
|
yading@10
|
671 else
|
yading@10
|
672 src_y = av_clip(src_y, -18, s->avctx->coded_height);
|
yading@10
|
673 } else {
|
yading@10
|
674 src_y = av_clip(src_y, -18, s->avctx->coded_height + 1);
|
yading@10
|
675 }
|
yading@10
|
676 }
|
yading@10
|
677
|
yading@10
|
678 srcY += src_y * s->linesize + src_x;
|
yading@10
|
679 if (v->field_mode && v->ref_field_type[dir])
|
yading@10
|
680 srcY += s->current_picture_ptr->f.linesize[0];
|
yading@10
|
681
|
yading@10
|
682 if (fieldmv && !(src_y & 1))
|
yading@10
|
683 v_edge_pos--;
|
yading@10
|
684 if (fieldmv && (src_y & 1) && src_y < 4)
|
yading@10
|
685 src_y--;
|
yading@10
|
686 if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
|
yading@10
|
687 || s->h_edge_pos < 13 || v_edge_pos < 23
|
yading@10
|
688 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2
|
yading@10
|
689 || (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) {
|
yading@10
|
690 srcY -= s->mspel * (1 + (s->linesize << fieldmv));
|
yading@10
|
691 /* check emulate edge stride and offset */
|
yading@10
|
692 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
|
yading@10
|
693 9 + s->mspel * 2, (9 + s->mspel * 2) << fieldmv,
|
yading@10
|
694 src_x - s->mspel, src_y - (s->mspel << fieldmv),
|
yading@10
|
695 s->h_edge_pos, v_edge_pos);
|
yading@10
|
696 srcY = s->edge_emu_buffer;
|
yading@10
|
697 /* if we deal with range reduction we need to scale source blocks */
|
yading@10
|
698 if (v->rangeredfrm) {
|
yading@10
|
699 int i, j;
|
yading@10
|
700 uint8_t *src;
|
yading@10
|
701
|
yading@10
|
702 src = srcY;
|
yading@10
|
703 for (j = 0; j < 9 + s->mspel * 2; j++) {
|
yading@10
|
704 for (i = 0; i < 9 + s->mspel * 2; i++)
|
yading@10
|
705 src[i] = ((src[i] - 128) >> 1) + 128;
|
yading@10
|
706 src += s->linesize << fieldmv;
|
yading@10
|
707 }
|
yading@10
|
708 }
|
yading@10
|
709 /* if we deal with intensity compensation we need to scale source blocks */
|
yading@10
|
710 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
yading@10
|
711 int i, j;
|
yading@10
|
712 uint8_t *src;
|
yading@10
|
713
|
yading@10
|
714 src = srcY;
|
yading@10
|
715 for (j = 0; j < 9 + s->mspel * 2; j++) {
|
yading@10
|
716 for (i = 0; i < 9 + s->mspel * 2; i++)
|
yading@10
|
717 src[i] = v->luty[src[i]];
|
yading@10
|
718 src += s->linesize << fieldmv;
|
yading@10
|
719 }
|
yading@10
|
720 }
|
yading@10
|
721 srcY += s->mspel * (1 + (s->linesize << fieldmv));
|
yading@10
|
722 }
|
yading@10
|
723
|
yading@10
|
724 if (s->mspel) {
|
yading@10
|
725 dxy = ((my & 3) << 2) | (mx & 3);
|
yading@10
|
726 if (avg)
|
yading@10
|
727 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
|
yading@10
|
728 else
|
yading@10
|
729 v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
|
yading@10
|
730 } else { // hpel mc - always used for luma
|
yading@10
|
731 dxy = (my & 2) | ((mx & 2) >> 1);
|
yading@10
|
732 if (!v->rnd)
|
yading@10
|
733 s->hdsp.put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
|
yading@10
|
734 else
|
yading@10
|
735 s->hdsp.put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
|
yading@10
|
736 }
|
yading@10
|
737 }
|
yading@10
|
738
|
yading@10
|
739 static av_always_inline int get_chroma_mv(int *mvx, int *mvy, int *a, int flag, int *tx, int *ty)
|
yading@10
|
740 {
|
yading@10
|
741 int idx, i;
|
yading@10
|
742 static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
|
yading@10
|
743
|
yading@10
|
744 idx = ((a[3] != flag) << 3)
|
yading@10
|
745 | ((a[2] != flag) << 2)
|
yading@10
|
746 | ((a[1] != flag) << 1)
|
yading@10
|
747 | (a[0] != flag);
|
yading@10
|
748 if (!idx) {
|
yading@10
|
749 *tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
|
yading@10
|
750 *ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
|
yading@10
|
751 return 4;
|
yading@10
|
752 } else if (count[idx] == 1) {
|
yading@10
|
753 switch (idx) {
|
yading@10
|
754 case 0x1:
|
yading@10
|
755 *tx = mid_pred(mvx[1], mvx[2], mvx[3]);
|
yading@10
|
756 *ty = mid_pred(mvy[1], mvy[2], mvy[3]);
|
yading@10
|
757 return 3;
|
yading@10
|
758 case 0x2:
|
yading@10
|
759 *tx = mid_pred(mvx[0], mvx[2], mvx[3]);
|
yading@10
|
760 *ty = mid_pred(mvy[0], mvy[2], mvy[3]);
|
yading@10
|
761 return 3;
|
yading@10
|
762 case 0x4:
|
yading@10
|
763 *tx = mid_pred(mvx[0], mvx[1], mvx[3]);
|
yading@10
|
764 *ty = mid_pred(mvy[0], mvy[1], mvy[3]);
|
yading@10
|
765 return 3;
|
yading@10
|
766 case 0x8:
|
yading@10
|
767 *tx = mid_pred(mvx[0], mvx[1], mvx[2]);
|
yading@10
|
768 *ty = mid_pred(mvy[0], mvy[1], mvy[2]);
|
yading@10
|
769 return 3;
|
yading@10
|
770 }
|
yading@10
|
771 } else if (count[idx] == 2) {
|
yading@10
|
772 int t1 = 0, t2 = 0;
|
yading@10
|
773 for (i = 0; i < 3; i++)
|
yading@10
|
774 if (!a[i]) {
|
yading@10
|
775 t1 = i;
|
yading@10
|
776 break;
|
yading@10
|
777 }
|
yading@10
|
778 for (i = t1 + 1; i < 4; i++)
|
yading@10
|
779 if (!a[i]) {
|
yading@10
|
780 t2 = i;
|
yading@10
|
781 break;
|
yading@10
|
782 }
|
yading@10
|
783 *tx = (mvx[t1] + mvx[t2]) / 2;
|
yading@10
|
784 *ty = (mvy[t1] + mvy[t2]) / 2;
|
yading@10
|
785 return 2;
|
yading@10
|
786 } else {
|
yading@10
|
787 return 0;
|
yading@10
|
788 }
|
yading@10
|
789 return -1;
|
yading@10
|
790 }
|
yading@10
|
791
|
yading@10
|
792 /** Do motion compensation for 4-MV macroblock - both chroma blocks
|
yading@10
|
793 */
|
yading@10
|
794 static void vc1_mc_4mv_chroma(VC1Context *v, int dir)
|
yading@10
|
795 {
|
yading@10
|
796 MpegEncContext *s = &v->s;
|
yading@10
|
797 H264ChromaContext *h264chroma = &v->h264chroma;
|
yading@10
|
798 uint8_t *srcU, *srcV;
|
yading@10
|
799 int uvmx, uvmy, uvsrc_x, uvsrc_y;
|
yading@10
|
800 int k, tx = 0, ty = 0;
|
yading@10
|
801 int mvx[4], mvy[4], intra[4], mv_f[4];
|
yading@10
|
802 int valid_count;
|
yading@10
|
803 int chroma_ref_type = v->cur_field_type, off = 0;
|
yading@10
|
804 int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
yading@10
|
805
|
yading@10
|
806 if (!v->field_mode && !v->s.last_picture.f.data[0])
|
yading@10
|
807 return;
|
yading@10
|
808 if (s->flags & CODEC_FLAG_GRAY)
|
yading@10
|
809 return;
|
yading@10
|
810
|
yading@10
|
811 for (k = 0; k < 4; k++) {
|
yading@10
|
812 mvx[k] = s->mv[dir][k][0];
|
yading@10
|
813 mvy[k] = s->mv[dir][k][1];
|
yading@10
|
814 intra[k] = v->mb_type[0][s->block_index[k]];
|
yading@10
|
815 if (v->field_mode)
|
yading@10
|
816 mv_f[k] = v->mv_f[dir][s->block_index[k] + v->blocks_off];
|
yading@10
|
817 }
|
yading@10
|
818
|
yading@10
|
819 /* calculate chroma MV vector from four luma MVs */
|
yading@10
|
820 if (!v->field_mode || (v->field_mode && !v->numref)) {
|
yading@10
|
821 valid_count = get_chroma_mv(mvx, mvy, intra, 0, &tx, &ty);
|
yading@10
|
822 chroma_ref_type = v->reffield;
|
yading@10
|
823 if (!valid_count) {
|
yading@10
|
824 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
|
yading@10
|
825 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
|
yading@10
|
826 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
|
yading@10
|
827 return; //no need to do MC for intra blocks
|
yading@10
|
828 }
|
yading@10
|
829 } else {
|
yading@10
|
830 int dominant = 0;
|
yading@10
|
831 if (mv_f[0] + mv_f[1] + mv_f[2] + mv_f[3] > 2)
|
yading@10
|
832 dominant = 1;
|
yading@10
|
833 valid_count = get_chroma_mv(mvx, mvy, mv_f, dominant, &tx, &ty);
|
yading@10
|
834 if (dominant)
|
yading@10
|
835 chroma_ref_type = !v->cur_field_type;
|
yading@10
|
836 }
|
yading@10
|
837 if (v->field_mode && chroma_ref_type == 1 && v->cur_field_type == 1 && !v->s.last_picture.f.data[0])
|
yading@10
|
838 return;
|
yading@10
|
839 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
|
yading@10
|
840 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
|
yading@10
|
841 uvmx = (tx + ((tx & 3) == 3)) >> 1;
|
yading@10
|
842 uvmy = (ty + ((ty & 3) == 3)) >> 1;
|
yading@10
|
843
|
yading@10
|
844 v->luma_mv[s->mb_x][0] = uvmx;
|
yading@10
|
845 v->luma_mv[s->mb_x][1] = uvmy;
|
yading@10
|
846
|
yading@10
|
847 if (v->fastuvmc) {
|
yading@10
|
848 uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
|
yading@10
|
849 uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
|
yading@10
|
850 }
|
yading@10
|
851 // Field conversion bias
|
yading@10
|
852 if (v->cur_field_type != chroma_ref_type)
|
yading@10
|
853 uvmy += 2 - 4 * chroma_ref_type;
|
yading@10
|
854
|
yading@10
|
855 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
|
yading@10
|
856 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
|
yading@10
|
857
|
yading@10
|
858 if (v->profile != PROFILE_ADVANCED) {
|
yading@10
|
859 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
|
yading@10
|
860 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
|
yading@10
|
861 } else {
|
yading@10
|
862 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
|
yading@10
|
863 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
|
yading@10
|
864 }
|
yading@10
|
865
|
yading@10
|
866 if (!dir) {
|
yading@10
|
867 if (v->field_mode) {
|
yading@10
|
868 if ((v->cur_field_type != chroma_ref_type) && v->cur_field_type) {
|
yading@10
|
869 srcU = s->current_picture.f.data[1];
|
yading@10
|
870 srcV = s->current_picture.f.data[2];
|
yading@10
|
871 } else {
|
yading@10
|
872 srcU = s->last_picture.f.data[1];
|
yading@10
|
873 srcV = s->last_picture.f.data[2];
|
yading@10
|
874 }
|
yading@10
|
875 } else {
|
yading@10
|
876 srcU = s->last_picture.f.data[1];
|
yading@10
|
877 srcV = s->last_picture.f.data[2];
|
yading@10
|
878 }
|
yading@10
|
879 } else {
|
yading@10
|
880 srcU = s->next_picture.f.data[1];
|
yading@10
|
881 srcV = s->next_picture.f.data[2];
|
yading@10
|
882 }
|
yading@10
|
883
|
yading@10
|
884 if(!srcU)
|
yading@10
|
885 return;
|
yading@10
|
886
|
yading@10
|
887 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
888 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
889
|
yading@10
|
890 if (v->field_mode) {
|
yading@10
|
891 if (chroma_ref_type) {
|
yading@10
|
892 srcU += s->current_picture_ptr->f.linesize[1];
|
yading@10
|
893 srcV += s->current_picture_ptr->f.linesize[2];
|
yading@10
|
894 }
|
yading@10
|
895 off = 0;
|
yading@10
|
896 }
|
yading@10
|
897
|
yading@10
|
898 if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
|
yading@10
|
899 || s->h_edge_pos < 18 || v_edge_pos < 18
|
yading@10
|
900 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
|
yading@10
|
901 || (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9) {
|
yading@10
|
902 s->vdsp.emulated_edge_mc(s->edge_emu_buffer , srcU, s->uvlinesize,
|
yading@10
|
903 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
|
yading@10
|
904 s->h_edge_pos >> 1, v_edge_pos >> 1);
|
yading@10
|
905 s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
|
yading@10
|
906 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
|
yading@10
|
907 s->h_edge_pos >> 1, v_edge_pos >> 1);
|
yading@10
|
908 srcU = s->edge_emu_buffer;
|
yading@10
|
909 srcV = s->edge_emu_buffer + 16;
|
yading@10
|
910
|
yading@10
|
911 /* if we deal with range reduction we need to scale source blocks */
|
yading@10
|
912 if (v->rangeredfrm) {
|
yading@10
|
913 int i, j;
|
yading@10
|
914 uint8_t *src, *src2;
|
yading@10
|
915
|
yading@10
|
916 src = srcU;
|
yading@10
|
917 src2 = srcV;
|
yading@10
|
918 for (j = 0; j < 9; j++) {
|
yading@10
|
919 for (i = 0; i < 9; i++) {
|
yading@10
|
920 src[i] = ((src[i] - 128) >> 1) + 128;
|
yading@10
|
921 src2[i] = ((src2[i] - 128) >> 1) + 128;
|
yading@10
|
922 }
|
yading@10
|
923 src += s->uvlinesize;
|
yading@10
|
924 src2 += s->uvlinesize;
|
yading@10
|
925 }
|
yading@10
|
926 }
|
yading@10
|
927 /* if we deal with intensity compensation we need to scale source blocks */
|
yading@10
|
928 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
yading@10
|
929 int i, j;
|
yading@10
|
930 uint8_t *src, *src2;
|
yading@10
|
931
|
yading@10
|
932 src = srcU;
|
yading@10
|
933 src2 = srcV;
|
yading@10
|
934 for (j = 0; j < 9; j++) {
|
yading@10
|
935 for (i = 0; i < 9; i++) {
|
yading@10
|
936 src[i] = v->lutuv[src[i]];
|
yading@10
|
937 src2[i] = v->lutuv[src2[i]];
|
yading@10
|
938 }
|
yading@10
|
939 src += s->uvlinesize;
|
yading@10
|
940 src2 += s->uvlinesize;
|
yading@10
|
941 }
|
yading@10
|
942 }
|
yading@10
|
943 }
|
yading@10
|
944
|
yading@10
|
945 /* Chroma MC always uses qpel bilinear */
|
yading@10
|
946 uvmx = (uvmx & 3) << 1;
|
yading@10
|
947 uvmy = (uvmy & 3) << 1;
|
yading@10
|
948 if (!v->rnd) {
|
yading@10
|
949 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
950 h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
951 } else {
|
yading@10
|
952 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
953 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
954 }
|
yading@10
|
955 }
|
yading@10
|
956
|
yading@10
|
957 /** Do motion compensation for 4-MV field chroma macroblock (both U and V)
|
yading@10
|
958 */
|
yading@10
|
959 static void vc1_mc_4mv_chroma4(VC1Context *v)
|
yading@10
|
960 {
|
yading@10
|
961 MpegEncContext *s = &v->s;
|
yading@10
|
962 H264ChromaContext *h264chroma = &v->h264chroma;
|
yading@10
|
963 uint8_t *srcU, *srcV;
|
yading@10
|
964 int uvsrc_x, uvsrc_y;
|
yading@10
|
965 int uvmx_field[4], uvmy_field[4];
|
yading@10
|
966 int i, off, tx, ty;
|
yading@10
|
967 int fieldmv = v->blk_mv_type[s->block_index[0]];
|
yading@10
|
968 static const int s_rndtblfield[16] = { 0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12 };
|
yading@10
|
969 int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks
|
yading@10
|
970 int v_edge_pos = s->v_edge_pos >> 1;
|
yading@10
|
971
|
yading@10
|
972 if (!v->s.last_picture.f.data[0])
|
yading@10
|
973 return;
|
yading@10
|
974 if (s->flags & CODEC_FLAG_GRAY)
|
yading@10
|
975 return;
|
yading@10
|
976
|
yading@10
|
977 for (i = 0; i < 4; i++) {
|
yading@10
|
978 tx = s->mv[0][i][0];
|
yading@10
|
979 uvmx_field[i] = (tx + ((tx & 3) == 3)) >> 1;
|
yading@10
|
980 ty = s->mv[0][i][1];
|
yading@10
|
981 if (fieldmv)
|
yading@10
|
982 uvmy_field[i] = (ty >> 4) * 8 + s_rndtblfield[ty & 0xF];
|
yading@10
|
983 else
|
yading@10
|
984 uvmy_field[i] = (ty + ((ty & 3) == 3)) >> 1;
|
yading@10
|
985 }
|
yading@10
|
986
|
yading@10
|
987 for (i = 0; i < 4; i++) {
|
yading@10
|
988 off = (i & 1) * 4 + ((i & 2) ? v_dist * s->uvlinesize : 0);
|
yading@10
|
989 uvsrc_x = s->mb_x * 8 + (i & 1) * 4 + (uvmx_field[i] >> 2);
|
yading@10
|
990 uvsrc_y = s->mb_y * 8 + ((i & 2) ? v_dist : 0) + (uvmy_field[i] >> 2);
|
yading@10
|
991 // FIXME: implement proper pull-back (see vc1cropmv.c, vc1CROPMV_ChromaPullBack())
|
yading@10
|
992 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
|
yading@10
|
993 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
|
yading@10
|
994 srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
995 srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
996 uvmx_field[i] = (uvmx_field[i] & 3) << 1;
|
yading@10
|
997 uvmy_field[i] = (uvmy_field[i] & 3) << 1;
|
yading@10
|
998
|
yading@10
|
999 if (fieldmv && !(uvsrc_y & 1))
|
yading@10
|
1000 v_edge_pos = (s->v_edge_pos >> 1) - 1;
|
yading@10
|
1001
|
yading@10
|
1002 if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2)
|
yading@10
|
1003 uvsrc_y--;
|
yading@10
|
1004 if ((v->mv_mode == MV_PMODE_INTENSITY_COMP)
|
yading@10
|
1005 || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv)
|
yading@10
|
1006 || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5
|
yading@10
|
1007 || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) {
|
yading@10
|
1008 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize,
|
yading@10
|
1009 5, (5 << fieldmv), uvsrc_x, uvsrc_y,
|
yading@10
|
1010 s->h_edge_pos >> 1, v_edge_pos);
|
yading@10
|
1011 s->vdsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
|
yading@10
|
1012 5, (5 << fieldmv), uvsrc_x, uvsrc_y,
|
yading@10
|
1013 s->h_edge_pos >> 1, v_edge_pos);
|
yading@10
|
1014 srcU = s->edge_emu_buffer;
|
yading@10
|
1015 srcV = s->edge_emu_buffer + 16;
|
yading@10
|
1016
|
yading@10
|
1017 /* if we deal with intensity compensation we need to scale source blocks */
|
yading@10
|
1018 if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
|
yading@10
|
1019 int i, j;
|
yading@10
|
1020 uint8_t *src, *src2;
|
yading@10
|
1021
|
yading@10
|
1022 src = srcU;
|
yading@10
|
1023 src2 = srcV;
|
yading@10
|
1024 for (j = 0; j < 5; j++) {
|
yading@10
|
1025 for (i = 0; i < 5; i++) {
|
yading@10
|
1026 src[i] = v->lutuv[src[i]];
|
yading@10
|
1027 src2[i] = v->lutuv[src2[i]];
|
yading@10
|
1028 }
|
yading@10
|
1029 src += s->uvlinesize << 1;
|
yading@10
|
1030 src2 += s->uvlinesize << 1;
|
yading@10
|
1031 }
|
yading@10
|
1032 }
|
yading@10
|
1033 }
|
yading@10
|
1034 if (!v->rnd) {
|
yading@10
|
1035 h264chroma->put_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
|
yading@10
|
1036 h264chroma->put_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
|
yading@10
|
1037 } else {
|
yading@10
|
1038 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
|
yading@10
|
1039 v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
|
yading@10
|
1040 }
|
yading@10
|
1041 }
|
yading@10
|
1042 }
|
yading@10
|
1043
|
yading@10
|
1044 /***********************************************************************/
|
yading@10
|
1045 /**
|
yading@10
|
1046 * @name VC-1 Block-level functions
|
yading@10
|
1047 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
|
yading@10
|
1048 * @{
|
yading@10
|
1049 */
|
yading@10
|
1050
|
yading@10
|
1051 /**
|
yading@10
|
1052 * @def GET_MQUANT
|
yading@10
|
1053 * @brief Get macroblock-level quantizer scale
|
yading@10
|
1054 */
|
yading@10
|
1055 #define GET_MQUANT() \
|
yading@10
|
1056 if (v->dquantfrm) { \
|
yading@10
|
1057 int edges = 0; \
|
yading@10
|
1058 if (v->dqprofile == DQPROFILE_ALL_MBS) { \
|
yading@10
|
1059 if (v->dqbilevel) { \
|
yading@10
|
1060 mquant = (get_bits1(gb)) ? v->altpq : v->pq; \
|
yading@10
|
1061 } else { \
|
yading@10
|
1062 mqdiff = get_bits(gb, 3); \
|
yading@10
|
1063 if (mqdiff != 7) \
|
yading@10
|
1064 mquant = v->pq + mqdiff; \
|
yading@10
|
1065 else \
|
yading@10
|
1066 mquant = get_bits(gb, 5); \
|
yading@10
|
1067 } \
|
yading@10
|
1068 } \
|
yading@10
|
1069 if (v->dqprofile == DQPROFILE_SINGLE_EDGE) \
|
yading@10
|
1070 edges = 1 << v->dqsbedge; \
|
yading@10
|
1071 else if (v->dqprofile == DQPROFILE_DOUBLE_EDGES) \
|
yading@10
|
1072 edges = (3 << v->dqsbedge) % 15; \
|
yading@10
|
1073 else if (v->dqprofile == DQPROFILE_FOUR_EDGES) \
|
yading@10
|
1074 edges = 15; \
|
yading@10
|
1075 if ((edges&1) && !s->mb_x) \
|
yading@10
|
1076 mquant = v->altpq; \
|
yading@10
|
1077 if ((edges&2) && s->first_slice_line) \
|
yading@10
|
1078 mquant = v->altpq; \
|
yading@10
|
1079 if ((edges&4) && s->mb_x == (s->mb_width - 1)) \
|
yading@10
|
1080 mquant = v->altpq; \
|
yading@10
|
1081 if ((edges&8) && s->mb_y == (s->mb_height - 1)) \
|
yading@10
|
1082 mquant = v->altpq; \
|
yading@10
|
1083 if (!mquant || mquant > 31) { \
|
yading@10
|
1084 av_log(v->s.avctx, AV_LOG_ERROR, \
|
yading@10
|
1085 "Overriding invalid mquant %d\n", mquant); \
|
yading@10
|
1086 mquant = 1; \
|
yading@10
|
1087 } \
|
yading@10
|
1088 }
|
yading@10
|
1089
|
yading@10
|
1090 /**
|
yading@10
|
1091 * @def GET_MVDATA(_dmv_x, _dmv_y)
|
yading@10
|
1092 * @brief Get MV differentials
|
yading@10
|
1093 * @see MVDATA decoding from 8.3.5.2, p(1)20
|
yading@10
|
1094 * @param _dmv_x Horizontal differential for decoded MV
|
yading@10
|
1095 * @param _dmv_y Vertical differential for decoded MV
|
yading@10
|
1096 */
|
yading@10
|
1097 #define GET_MVDATA(_dmv_x, _dmv_y) \
|
yading@10
|
1098 index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table, \
|
yading@10
|
1099 VC1_MV_DIFF_VLC_BITS, 2); \
|
yading@10
|
1100 if (index > 36) { \
|
yading@10
|
1101 mb_has_coeffs = 1; \
|
yading@10
|
1102 index -= 37; \
|
yading@10
|
1103 } else \
|
yading@10
|
1104 mb_has_coeffs = 0; \
|
yading@10
|
1105 s->mb_intra = 0; \
|
yading@10
|
1106 if (!index) { \
|
yading@10
|
1107 _dmv_x = _dmv_y = 0; \
|
yading@10
|
1108 } else if (index == 35) { \
|
yading@10
|
1109 _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample); \
|
yading@10
|
1110 _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample); \
|
yading@10
|
1111 } else if (index == 36) { \
|
yading@10
|
1112 _dmv_x = 0; \
|
yading@10
|
1113 _dmv_y = 0; \
|
yading@10
|
1114 s->mb_intra = 1; \
|
yading@10
|
1115 } else { \
|
yading@10
|
1116 index1 = index % 6; \
|
yading@10
|
1117 if (!s->quarter_sample && index1 == 5) val = 1; \
|
yading@10
|
1118 else val = 0; \
|
yading@10
|
1119 if (size_table[index1] - val > 0) \
|
yading@10
|
1120 val = get_bits(gb, size_table[index1] - val); \
|
yading@10
|
1121 else val = 0; \
|
yading@10
|
1122 sign = 0 - (val&1); \
|
yading@10
|
1123 _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
|
yading@10
|
1124 \
|
yading@10
|
1125 index1 = index / 6; \
|
yading@10
|
1126 if (!s->quarter_sample && index1 == 5) val = 1; \
|
yading@10
|
1127 else val = 0; \
|
yading@10
|
1128 if (size_table[index1] - val > 0) \
|
yading@10
|
1129 val = get_bits(gb, size_table[index1] - val); \
|
yading@10
|
1130 else val = 0; \
|
yading@10
|
1131 sign = 0 - (val & 1); \
|
yading@10
|
1132 _dmv_y = (sign ^ ((val >> 1) + offset_table[index1])) - sign; \
|
yading@10
|
1133 }
|
yading@10
|
1134
|
yading@10
|
1135 static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x,
|
yading@10
|
1136 int *dmv_y, int *pred_flag)
|
yading@10
|
1137 {
|
yading@10
|
1138 int index, index1;
|
yading@10
|
1139 int extend_x = 0, extend_y = 0;
|
yading@10
|
1140 GetBitContext *gb = &v->s.gb;
|
yading@10
|
1141 int bits, esc;
|
yading@10
|
1142 int val, sign;
|
yading@10
|
1143 const int* offs_tab;
|
yading@10
|
1144
|
yading@10
|
1145 if (v->numref) {
|
yading@10
|
1146 bits = VC1_2REF_MVDATA_VLC_BITS;
|
yading@10
|
1147 esc = 125;
|
yading@10
|
1148 } else {
|
yading@10
|
1149 bits = VC1_1REF_MVDATA_VLC_BITS;
|
yading@10
|
1150 esc = 71;
|
yading@10
|
1151 }
|
yading@10
|
1152 switch (v->dmvrange) {
|
yading@10
|
1153 case 1:
|
yading@10
|
1154 extend_x = 1;
|
yading@10
|
1155 break;
|
yading@10
|
1156 case 2:
|
yading@10
|
1157 extend_y = 1;
|
yading@10
|
1158 break;
|
yading@10
|
1159 case 3:
|
yading@10
|
1160 extend_x = extend_y = 1;
|
yading@10
|
1161 break;
|
yading@10
|
1162 }
|
yading@10
|
1163 index = get_vlc2(gb, v->imv_vlc->table, bits, 3);
|
yading@10
|
1164 if (index == esc) {
|
yading@10
|
1165 *dmv_x = get_bits(gb, v->k_x);
|
yading@10
|
1166 *dmv_y = get_bits(gb, v->k_y);
|
yading@10
|
1167 if (v->numref) {
|
yading@10
|
1168 if (pred_flag) {
|
yading@10
|
1169 *pred_flag = *dmv_y & 1;
|
yading@10
|
1170 *dmv_y = (*dmv_y + *pred_flag) >> 1;
|
yading@10
|
1171 } else {
|
yading@10
|
1172 *dmv_y = (*dmv_y + (*dmv_y & 1)) >> 1;
|
yading@10
|
1173 }
|
yading@10
|
1174 }
|
yading@10
|
1175 }
|
yading@10
|
1176 else {
|
yading@10
|
1177 av_assert0(index < esc);
|
yading@10
|
1178 if (extend_x)
|
yading@10
|
1179 offs_tab = offset_table2;
|
yading@10
|
1180 else
|
yading@10
|
1181 offs_tab = offset_table1;
|
yading@10
|
1182 index1 = (index + 1) % 9;
|
yading@10
|
1183 if (index1 != 0) {
|
yading@10
|
1184 val = get_bits(gb, index1 + extend_x);
|
yading@10
|
1185 sign = 0 -(val & 1);
|
yading@10
|
1186 *dmv_x = (sign ^ ((val >> 1) + offs_tab[index1])) - sign;
|
yading@10
|
1187 } else
|
yading@10
|
1188 *dmv_x = 0;
|
yading@10
|
1189 if (extend_y)
|
yading@10
|
1190 offs_tab = offset_table2;
|
yading@10
|
1191 else
|
yading@10
|
1192 offs_tab = offset_table1;
|
yading@10
|
1193 index1 = (index + 1) / 9;
|
yading@10
|
1194 if (index1 > v->numref) {
|
yading@10
|
1195 val = get_bits(gb, (index1 + (extend_y << v->numref)) >> v->numref);
|
yading@10
|
1196 sign = 0 - (val & 1);
|
yading@10
|
1197 *dmv_y = (sign ^ ((val >> 1) + offs_tab[index1 >> v->numref])) - sign;
|
yading@10
|
1198 } else
|
yading@10
|
1199 *dmv_y = 0;
|
yading@10
|
1200 if (v->numref && pred_flag)
|
yading@10
|
1201 *pred_flag = index1 & 1;
|
yading@10
|
1202 }
|
yading@10
|
1203 }
|
yading@10
|
1204
|
yading@10
|
1205 static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int dir)
|
yading@10
|
1206 {
|
yading@10
|
1207 int scaledvalue, refdist;
|
yading@10
|
1208 int scalesame1, scalesame2;
|
yading@10
|
1209 int scalezone1_x, zone1offset_x;
|
yading@10
|
1210 int table_index = dir ^ v->second_field;
|
yading@10
|
1211
|
yading@10
|
1212 if (v->s.pict_type != AV_PICTURE_TYPE_B)
|
yading@10
|
1213 refdist = v->refdist;
|
yading@10
|
1214 else
|
yading@10
|
1215 refdist = dir ? v->brfd : v->frfd;
|
yading@10
|
1216 if (refdist > 3)
|
yading@10
|
1217 refdist = 3;
|
yading@10
|
1218 scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
|
yading@10
|
1219 scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
|
yading@10
|
1220 scalezone1_x = ff_vc1_field_mvpred_scales[table_index][3][refdist];
|
yading@10
|
1221 zone1offset_x = ff_vc1_field_mvpred_scales[table_index][5][refdist];
|
yading@10
|
1222
|
yading@10
|
1223 if (FFABS(n) > 255)
|
yading@10
|
1224 scaledvalue = n;
|
yading@10
|
1225 else {
|
yading@10
|
1226 if (FFABS(n) < scalezone1_x)
|
yading@10
|
1227 scaledvalue = (n * scalesame1) >> 8;
|
yading@10
|
1228 else {
|
yading@10
|
1229 if (n < 0)
|
yading@10
|
1230 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_x;
|
yading@10
|
1231 else
|
yading@10
|
1232 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_x;
|
yading@10
|
1233 }
|
yading@10
|
1234 }
|
yading@10
|
1235 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
|
yading@10
|
1236 }
|
yading@10
|
1237
|
yading@10
|
1238 static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, int dir)
|
yading@10
|
1239 {
|
yading@10
|
1240 int scaledvalue, refdist;
|
yading@10
|
1241 int scalesame1, scalesame2;
|
yading@10
|
1242 int scalezone1_y, zone1offset_y;
|
yading@10
|
1243 int table_index = dir ^ v->second_field;
|
yading@10
|
1244
|
yading@10
|
1245 if (v->s.pict_type != AV_PICTURE_TYPE_B)
|
yading@10
|
1246 refdist = v->refdist;
|
yading@10
|
1247 else
|
yading@10
|
1248 refdist = dir ? v->brfd : v->frfd;
|
yading@10
|
1249 if (refdist > 3)
|
yading@10
|
1250 refdist = 3;
|
yading@10
|
1251 scalesame1 = ff_vc1_field_mvpred_scales[table_index][1][refdist];
|
yading@10
|
1252 scalesame2 = ff_vc1_field_mvpred_scales[table_index][2][refdist];
|
yading@10
|
1253 scalezone1_y = ff_vc1_field_mvpred_scales[table_index][4][refdist];
|
yading@10
|
1254 zone1offset_y = ff_vc1_field_mvpred_scales[table_index][6][refdist];
|
yading@10
|
1255
|
yading@10
|
1256 if (FFABS(n) > 63)
|
yading@10
|
1257 scaledvalue = n;
|
yading@10
|
1258 else {
|
yading@10
|
1259 if (FFABS(n) < scalezone1_y)
|
yading@10
|
1260 scaledvalue = (n * scalesame1) >> 8;
|
yading@10
|
1261 else {
|
yading@10
|
1262 if (n < 0)
|
yading@10
|
1263 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_y;
|
yading@10
|
1264 else
|
yading@10
|
1265 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_y;
|
yading@10
|
1266 }
|
yading@10
|
1267 }
|
yading@10
|
1268
|
yading@10
|
1269 if (v->cur_field_type && !v->ref_field_type[dir])
|
yading@10
|
1270 return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
|
yading@10
|
1271 else
|
yading@10
|
1272 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
|
yading@10
|
1273 }
|
yading@10
|
1274
|
yading@10
|
1275 static av_always_inline int scaleforopp_x(VC1Context *v, int n /* MV */)
|
yading@10
|
1276 {
|
yading@10
|
1277 int scalezone1_x, zone1offset_x;
|
yading@10
|
1278 int scaleopp1, scaleopp2, brfd;
|
yading@10
|
1279 int scaledvalue;
|
yading@10
|
1280
|
yading@10
|
1281 brfd = FFMIN(v->brfd, 3);
|
yading@10
|
1282 scalezone1_x = ff_vc1_b_field_mvpred_scales[3][brfd];
|
yading@10
|
1283 zone1offset_x = ff_vc1_b_field_mvpred_scales[5][brfd];
|
yading@10
|
1284 scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
|
yading@10
|
1285 scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
|
yading@10
|
1286
|
yading@10
|
1287 if (FFABS(n) > 255)
|
yading@10
|
1288 scaledvalue = n;
|
yading@10
|
1289 else {
|
yading@10
|
1290 if (FFABS(n) < scalezone1_x)
|
yading@10
|
1291 scaledvalue = (n * scaleopp1) >> 8;
|
yading@10
|
1292 else {
|
yading@10
|
1293 if (n < 0)
|
yading@10
|
1294 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_x;
|
yading@10
|
1295 else
|
yading@10
|
1296 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_x;
|
yading@10
|
1297 }
|
yading@10
|
1298 }
|
yading@10
|
1299 return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
|
yading@10
|
1300 }
|
yading@10
|
1301
|
yading@10
|
1302 static av_always_inline int scaleforopp_y(VC1Context *v, int n /* MV */, int dir)
|
yading@10
|
1303 {
|
yading@10
|
1304 int scalezone1_y, zone1offset_y;
|
yading@10
|
1305 int scaleopp1, scaleopp2, brfd;
|
yading@10
|
1306 int scaledvalue;
|
yading@10
|
1307
|
yading@10
|
1308 brfd = FFMIN(v->brfd, 3);
|
yading@10
|
1309 scalezone1_y = ff_vc1_b_field_mvpred_scales[4][brfd];
|
yading@10
|
1310 zone1offset_y = ff_vc1_b_field_mvpred_scales[6][brfd];
|
yading@10
|
1311 scaleopp1 = ff_vc1_b_field_mvpred_scales[1][brfd];
|
yading@10
|
1312 scaleopp2 = ff_vc1_b_field_mvpred_scales[2][brfd];
|
yading@10
|
1313
|
yading@10
|
1314 if (FFABS(n) > 63)
|
yading@10
|
1315 scaledvalue = n;
|
yading@10
|
1316 else {
|
yading@10
|
1317 if (FFABS(n) < scalezone1_y)
|
yading@10
|
1318 scaledvalue = (n * scaleopp1) >> 8;
|
yading@10
|
1319 else {
|
yading@10
|
1320 if (n < 0)
|
yading@10
|
1321 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_y;
|
yading@10
|
1322 else
|
yading@10
|
1323 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_y;
|
yading@10
|
1324 }
|
yading@10
|
1325 }
|
yading@10
|
1326 if (v->cur_field_type && !v->ref_field_type[dir]) {
|
yading@10
|
1327 return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
|
yading@10
|
1328 } else {
|
yading@10
|
1329 return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
|
yading@10
|
1330 }
|
yading@10
|
1331 }
|
yading@10
|
1332
|
yading@10
|
1333 static av_always_inline int scaleforsame(VC1Context *v, int i, int n /* MV */,
|
yading@10
|
1334 int dim, int dir)
|
yading@10
|
1335 {
|
yading@10
|
1336 int brfd, scalesame;
|
yading@10
|
1337 int hpel = 1 - v->s.quarter_sample;
|
yading@10
|
1338
|
yading@10
|
1339 n >>= hpel;
|
yading@10
|
1340 if (v->s.pict_type != AV_PICTURE_TYPE_B || v->second_field || !dir) {
|
yading@10
|
1341 if (dim)
|
yading@10
|
1342 n = scaleforsame_y(v, i, n, dir) << hpel;
|
yading@10
|
1343 else
|
yading@10
|
1344 n = scaleforsame_x(v, n, dir) << hpel;
|
yading@10
|
1345 return n;
|
yading@10
|
1346 }
|
yading@10
|
1347 brfd = FFMIN(v->brfd, 3);
|
yading@10
|
1348 scalesame = ff_vc1_b_field_mvpred_scales[0][brfd];
|
yading@10
|
1349
|
yading@10
|
1350 n = (n * scalesame >> 8) << hpel;
|
yading@10
|
1351 return n;
|
yading@10
|
1352 }
|
yading@10
|
1353
|
yading@10
|
1354 static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */,
|
yading@10
|
1355 int dim, int dir)
|
yading@10
|
1356 {
|
yading@10
|
1357 int refdist, scaleopp;
|
yading@10
|
1358 int hpel = 1 - v->s.quarter_sample;
|
yading@10
|
1359
|
yading@10
|
1360 n >>= hpel;
|
yading@10
|
1361 if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) {
|
yading@10
|
1362 if (dim)
|
yading@10
|
1363 n = scaleforopp_y(v, n, dir) << hpel;
|
yading@10
|
1364 else
|
yading@10
|
1365 n = scaleforopp_x(v, n) << hpel;
|
yading@10
|
1366 return n;
|
yading@10
|
1367 }
|
yading@10
|
1368 if (v->s.pict_type != AV_PICTURE_TYPE_B)
|
yading@10
|
1369 refdist = FFMIN(v->refdist, 3);
|
yading@10
|
1370 else
|
yading@10
|
1371 refdist = dir ? v->brfd : v->frfd;
|
yading@10
|
1372 scaleopp = ff_vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist];
|
yading@10
|
1373
|
yading@10
|
1374 n = (n * scaleopp >> 8) << hpel;
|
yading@10
|
1375 return n;
|
yading@10
|
1376 }
|
yading@10
|
1377
|
yading@10
|
1378 /** Predict and set motion vector
|
yading@10
|
1379 */
|
yading@10
|
1380 static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
|
yading@10
|
1381 int mv1, int r_x, int r_y, uint8_t* is_intra,
|
yading@10
|
1382 int pred_flag, int dir)
|
yading@10
|
1383 {
|
yading@10
|
1384 MpegEncContext *s = &v->s;
|
yading@10
|
1385 int xy, wrap, off = 0;
|
yading@10
|
1386 int16_t *A, *B, *C;
|
yading@10
|
1387 int px, py;
|
yading@10
|
1388 int sum;
|
yading@10
|
1389 int mixedmv_pic, num_samefield = 0, num_oppfield = 0;
|
yading@10
|
1390 int opposite, a_f, b_f, c_f;
|
yading@10
|
1391 int16_t field_predA[2];
|
yading@10
|
1392 int16_t field_predB[2];
|
yading@10
|
1393 int16_t field_predC[2];
|
yading@10
|
1394 int a_valid, b_valid, c_valid;
|
yading@10
|
1395 int hybridmv_thresh, y_bias = 0;
|
yading@10
|
1396
|
yading@10
|
1397 if (v->mv_mode == MV_PMODE_MIXED_MV ||
|
yading@10
|
1398 ((v->mv_mode == MV_PMODE_INTENSITY_COMP) && (v->mv_mode2 == MV_PMODE_MIXED_MV)))
|
yading@10
|
1399 mixedmv_pic = 1;
|
yading@10
|
1400 else
|
yading@10
|
1401 mixedmv_pic = 0;
|
yading@10
|
1402 /* scale MV difference to be quad-pel */
|
yading@10
|
1403 dmv_x <<= 1 - s->quarter_sample;
|
yading@10
|
1404 dmv_y <<= 1 - s->quarter_sample;
|
yading@10
|
1405
|
yading@10
|
1406 wrap = s->b8_stride;
|
yading@10
|
1407 xy = s->block_index[n];
|
yading@10
|
1408
|
yading@10
|
1409 if (s->mb_intra) {
|
yading@10
|
1410 s->mv[0][n][0] = s->current_picture.motion_val[0][xy + v->blocks_off][0] = 0;
|
yading@10
|
1411 s->mv[0][n][1] = s->current_picture.motion_val[0][xy + v->blocks_off][1] = 0;
|
yading@10
|
1412 s->current_picture.motion_val[1][xy + v->blocks_off][0] = 0;
|
yading@10
|
1413 s->current_picture.motion_val[1][xy + v->blocks_off][1] = 0;
|
yading@10
|
1414 if (mv1) { /* duplicate motion data for 1-MV block */
|
yading@10
|
1415 s->current_picture.motion_val[0][xy + 1 + v->blocks_off][0] = 0;
|
yading@10
|
1416 s->current_picture.motion_val[0][xy + 1 + v->blocks_off][1] = 0;
|
yading@10
|
1417 s->current_picture.motion_val[0][xy + wrap + v->blocks_off][0] = 0;
|
yading@10
|
1418 s->current_picture.motion_val[0][xy + wrap + v->blocks_off][1] = 0;
|
yading@10
|
1419 s->current_picture.motion_val[0][xy + wrap + 1 + v->blocks_off][0] = 0;
|
yading@10
|
1420 s->current_picture.motion_val[0][xy + wrap + 1 + v->blocks_off][1] = 0;
|
yading@10
|
1421 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
|
yading@10
|
1422 s->current_picture.motion_val[1][xy + 1 + v->blocks_off][0] = 0;
|
yading@10
|
1423 s->current_picture.motion_val[1][xy + 1 + v->blocks_off][1] = 0;
|
yading@10
|
1424 s->current_picture.motion_val[1][xy + wrap][0] = 0;
|
yading@10
|
1425 s->current_picture.motion_val[1][xy + wrap + v->blocks_off][1] = 0;
|
yading@10
|
1426 s->current_picture.motion_val[1][xy + wrap + 1 + v->blocks_off][0] = 0;
|
yading@10
|
1427 s->current_picture.motion_val[1][xy + wrap + 1 + v->blocks_off][1] = 0;
|
yading@10
|
1428 }
|
yading@10
|
1429 return;
|
yading@10
|
1430 }
|
yading@10
|
1431
|
yading@10
|
1432 C = s->current_picture.motion_val[dir][xy - 1 + v->blocks_off];
|
yading@10
|
1433 A = s->current_picture.motion_val[dir][xy - wrap + v->blocks_off];
|
yading@10
|
1434 if (mv1) {
|
yading@10
|
1435 if (v->field_mode && mixedmv_pic)
|
yading@10
|
1436 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
|
yading@10
|
1437 else
|
yading@10
|
1438 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
|
yading@10
|
1439 } else {
|
yading@10
|
1440 //in 4-MV mode different blocks have different B predictor position
|
yading@10
|
1441 switch (n) {
|
yading@10
|
1442 case 0:
|
yading@10
|
1443 off = (s->mb_x > 0) ? -1 : 1;
|
yading@10
|
1444 break;
|
yading@10
|
1445 case 1:
|
yading@10
|
1446 off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
|
yading@10
|
1447 break;
|
yading@10
|
1448 case 2:
|
yading@10
|
1449 off = 1;
|
yading@10
|
1450 break;
|
yading@10
|
1451 case 3:
|
yading@10
|
1452 off = -1;
|
yading@10
|
1453 }
|
yading@10
|
1454 }
|
yading@10
|
1455 B = s->current_picture.motion_val[dir][xy - wrap + off + v->blocks_off];
|
yading@10
|
1456
|
yading@10
|
1457 a_valid = !s->first_slice_line || (n == 2 || n == 3);
|
yading@10
|
1458 b_valid = a_valid && (s->mb_width > 1);
|
yading@10
|
1459 c_valid = s->mb_x || (n == 1 || n == 3);
|
yading@10
|
1460 if (v->field_mode) {
|
yading@10
|
1461 a_valid = a_valid && !is_intra[xy - wrap];
|
yading@10
|
1462 b_valid = b_valid && !is_intra[xy - wrap + off];
|
yading@10
|
1463 c_valid = c_valid && !is_intra[xy - 1];
|
yading@10
|
1464 }
|
yading@10
|
1465
|
yading@10
|
1466 if (a_valid) {
|
yading@10
|
1467 a_f = v->mv_f[dir][xy - wrap + v->blocks_off];
|
yading@10
|
1468 num_oppfield += a_f;
|
yading@10
|
1469 num_samefield += 1 - a_f;
|
yading@10
|
1470 field_predA[0] = A[0];
|
yading@10
|
1471 field_predA[1] = A[1];
|
yading@10
|
1472 } else {
|
yading@10
|
1473 field_predA[0] = field_predA[1] = 0;
|
yading@10
|
1474 a_f = 0;
|
yading@10
|
1475 }
|
yading@10
|
1476 if (b_valid) {
|
yading@10
|
1477 b_f = v->mv_f[dir][xy - wrap + off + v->blocks_off];
|
yading@10
|
1478 num_oppfield += b_f;
|
yading@10
|
1479 num_samefield += 1 - b_f;
|
yading@10
|
1480 field_predB[0] = B[0];
|
yading@10
|
1481 field_predB[1] = B[1];
|
yading@10
|
1482 } else {
|
yading@10
|
1483 field_predB[0] = field_predB[1] = 0;
|
yading@10
|
1484 b_f = 0;
|
yading@10
|
1485 }
|
yading@10
|
1486 if (c_valid) {
|
yading@10
|
1487 c_f = v->mv_f[dir][xy - 1 + v->blocks_off];
|
yading@10
|
1488 num_oppfield += c_f;
|
yading@10
|
1489 num_samefield += 1 - c_f;
|
yading@10
|
1490 field_predC[0] = C[0];
|
yading@10
|
1491 field_predC[1] = C[1];
|
yading@10
|
1492 } else {
|
yading@10
|
1493 field_predC[0] = field_predC[1] = 0;
|
yading@10
|
1494 c_f = 0;
|
yading@10
|
1495 }
|
yading@10
|
1496
|
yading@10
|
1497 if (v->field_mode) {
|
yading@10
|
1498 if (!v->numref)
|
yading@10
|
1499 // REFFIELD determines if the last field or the second-last field is
|
yading@10
|
1500 // to be used as reference
|
yading@10
|
1501 opposite = 1 - v->reffield;
|
yading@10
|
1502 else {
|
yading@10
|
1503 if (num_samefield <= num_oppfield)
|
yading@10
|
1504 opposite = 1 - pred_flag;
|
yading@10
|
1505 else
|
yading@10
|
1506 opposite = pred_flag;
|
yading@10
|
1507 }
|
yading@10
|
1508 } else
|
yading@10
|
1509 opposite = 0;
|
yading@10
|
1510 if (opposite) {
|
yading@10
|
1511 if (a_valid && !a_f) {
|
yading@10
|
1512 field_predA[0] = scaleforopp(v, field_predA[0], 0, dir);
|
yading@10
|
1513 field_predA[1] = scaleforopp(v, field_predA[1], 1, dir);
|
yading@10
|
1514 }
|
yading@10
|
1515 if (b_valid && !b_f) {
|
yading@10
|
1516 field_predB[0] = scaleforopp(v, field_predB[0], 0, dir);
|
yading@10
|
1517 field_predB[1] = scaleforopp(v, field_predB[1], 1, dir);
|
yading@10
|
1518 }
|
yading@10
|
1519 if (c_valid && !c_f) {
|
yading@10
|
1520 field_predC[0] = scaleforopp(v, field_predC[0], 0, dir);
|
yading@10
|
1521 field_predC[1] = scaleforopp(v, field_predC[1], 1, dir);
|
yading@10
|
1522 }
|
yading@10
|
1523 v->mv_f[dir][xy + v->blocks_off] = 1;
|
yading@10
|
1524 v->ref_field_type[dir] = !v->cur_field_type;
|
yading@10
|
1525 } else {
|
yading@10
|
1526 if (a_valid && a_f) {
|
yading@10
|
1527 field_predA[0] = scaleforsame(v, n, field_predA[0], 0, dir);
|
yading@10
|
1528 field_predA[1] = scaleforsame(v, n, field_predA[1], 1, dir);
|
yading@10
|
1529 }
|
yading@10
|
1530 if (b_valid && b_f) {
|
yading@10
|
1531 field_predB[0] = scaleforsame(v, n, field_predB[0], 0, dir);
|
yading@10
|
1532 field_predB[1] = scaleforsame(v, n, field_predB[1], 1, dir);
|
yading@10
|
1533 }
|
yading@10
|
1534 if (c_valid && c_f) {
|
yading@10
|
1535 field_predC[0] = scaleforsame(v, n, field_predC[0], 0, dir);
|
yading@10
|
1536 field_predC[1] = scaleforsame(v, n, field_predC[1], 1, dir);
|
yading@10
|
1537 }
|
yading@10
|
1538 v->mv_f[dir][xy + v->blocks_off] = 0;
|
yading@10
|
1539 v->ref_field_type[dir] = v->cur_field_type;
|
yading@10
|
1540 }
|
yading@10
|
1541
|
yading@10
|
1542 if (a_valid) {
|
yading@10
|
1543 px = field_predA[0];
|
yading@10
|
1544 py = field_predA[1];
|
yading@10
|
1545 } else if (c_valid) {
|
yading@10
|
1546 px = field_predC[0];
|
yading@10
|
1547 py = field_predC[1];
|
yading@10
|
1548 } else if (b_valid) {
|
yading@10
|
1549 px = field_predB[0];
|
yading@10
|
1550 py = field_predB[1];
|
yading@10
|
1551 } else {
|
yading@10
|
1552 px = 0;
|
yading@10
|
1553 py = 0;
|
yading@10
|
1554 }
|
yading@10
|
1555
|
yading@10
|
1556 if (num_samefield + num_oppfield > 1) {
|
yading@10
|
1557 px = mid_pred(field_predA[0], field_predB[0], field_predC[0]);
|
yading@10
|
1558 py = mid_pred(field_predA[1], field_predB[1], field_predC[1]);
|
yading@10
|
1559 }
|
yading@10
|
1560
|
yading@10
|
1561 /* Pullback MV as specified in 8.3.5.3.4 */
|
yading@10
|
1562 if (!v->field_mode) {
|
yading@10
|
1563 int qx, qy, X, Y;
|
yading@10
|
1564 qx = (s->mb_x << 6) + ((n == 1 || n == 3) ? 32 : 0);
|
yading@10
|
1565 qy = (s->mb_y << 6) + ((n == 2 || n == 3) ? 32 : 0);
|
yading@10
|
1566 X = (s->mb_width << 6) - 4;
|
yading@10
|
1567 Y = (s->mb_height << 6) - 4;
|
yading@10
|
1568 if (mv1) {
|
yading@10
|
1569 if (qx + px < -60) px = -60 - qx;
|
yading@10
|
1570 if (qy + py < -60) py = -60 - qy;
|
yading@10
|
1571 } else {
|
yading@10
|
1572 if (qx + px < -28) px = -28 - qx;
|
yading@10
|
1573 if (qy + py < -28) py = -28 - qy;
|
yading@10
|
1574 }
|
yading@10
|
1575 if (qx + px > X) px = X - qx;
|
yading@10
|
1576 if (qy + py > Y) py = Y - qy;
|
yading@10
|
1577 }
|
yading@10
|
1578
|
yading@10
|
1579 if (!v->field_mode || s->pict_type != AV_PICTURE_TYPE_B) {
|
yading@10
|
1580 /* Calculate hybrid prediction as specified in 8.3.5.3.5 (also 10.3.5.4.3.5) */
|
yading@10
|
1581 hybridmv_thresh = 32;
|
yading@10
|
1582 if (a_valid && c_valid) {
|
yading@10
|
1583 if (is_intra[xy - wrap])
|
yading@10
|
1584 sum = FFABS(px) + FFABS(py);
|
yading@10
|
1585 else
|
yading@10
|
1586 sum = FFABS(px - field_predA[0]) + FFABS(py - field_predA[1]);
|
yading@10
|
1587 if (sum > hybridmv_thresh) {
|
yading@10
|
1588 if (get_bits1(&s->gb)) { // read HYBRIDPRED bit
|
yading@10
|
1589 px = field_predA[0];
|
yading@10
|
1590 py = field_predA[1];
|
yading@10
|
1591 } else {
|
yading@10
|
1592 px = field_predC[0];
|
yading@10
|
1593 py = field_predC[1];
|
yading@10
|
1594 }
|
yading@10
|
1595 } else {
|
yading@10
|
1596 if (is_intra[xy - 1])
|
yading@10
|
1597 sum = FFABS(px) + FFABS(py);
|
yading@10
|
1598 else
|
yading@10
|
1599 sum = FFABS(px - field_predC[0]) + FFABS(py - field_predC[1]);
|
yading@10
|
1600 if (sum > hybridmv_thresh) {
|
yading@10
|
1601 if (get_bits1(&s->gb)) {
|
yading@10
|
1602 px = field_predA[0];
|
yading@10
|
1603 py = field_predA[1];
|
yading@10
|
1604 } else {
|
yading@10
|
1605 px = field_predC[0];
|
yading@10
|
1606 py = field_predC[1];
|
yading@10
|
1607 }
|
yading@10
|
1608 }
|
yading@10
|
1609 }
|
yading@10
|
1610 }
|
yading@10
|
1611 }
|
yading@10
|
1612
|
yading@10
|
1613 if (v->field_mode && v->numref)
|
yading@10
|
1614 r_y >>= 1;
|
yading@10
|
1615 if (v->field_mode && v->cur_field_type && v->ref_field_type[dir] == 0)
|
yading@10
|
1616 y_bias = 1;
|
yading@10
|
1617 /* store MV using signed modulus of MV range defined in 4.11 */
|
yading@10
|
1618 s->mv[dir][n][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
|
yading@10
|
1619 s->mv[dir][n][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1] = ((py + dmv_y + r_y - y_bias) & ((r_y << 1) - 1)) - r_y + y_bias;
|
yading@10
|
1620 if (mv1) { /* duplicate motion data for 1-MV block */
|
yading@10
|
1621 s->current_picture.motion_val[dir][xy + 1 + v->blocks_off][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0];
|
yading@10
|
1622 s->current_picture.motion_val[dir][xy + 1 + v->blocks_off][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1];
|
yading@10
|
1623 s->current_picture.motion_val[dir][xy + wrap + v->blocks_off][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0];
|
yading@10
|
1624 s->current_picture.motion_val[dir][xy + wrap + v->blocks_off][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1];
|
yading@10
|
1625 s->current_picture.motion_val[dir][xy + wrap + 1 + v->blocks_off][0] = s->current_picture.motion_val[dir][xy + v->blocks_off][0];
|
yading@10
|
1626 s->current_picture.motion_val[dir][xy + wrap + 1 + v->blocks_off][1] = s->current_picture.motion_val[dir][xy + v->blocks_off][1];
|
yading@10
|
1627 v->mv_f[dir][xy + 1 + v->blocks_off] = v->mv_f[dir][xy + v->blocks_off];
|
yading@10
|
1628 v->mv_f[dir][xy + wrap + v->blocks_off] = v->mv_f[dir][xy + wrap + 1 + v->blocks_off] = v->mv_f[dir][xy + v->blocks_off];
|
yading@10
|
1629 }
|
yading@10
|
1630 }
|
yading@10
|
1631
|
yading@10
|
1632 /** Predict and set motion vector for interlaced frame picture MBs
|
yading@10
|
1633 */
|
yading@10
|
1634 static inline void vc1_pred_mv_intfr(VC1Context *v, int n, int dmv_x, int dmv_y,
|
yading@10
|
1635 int mvn, int r_x, int r_y, uint8_t* is_intra, int dir)
|
yading@10
|
1636 {
|
yading@10
|
1637 MpegEncContext *s = &v->s;
|
yading@10
|
1638 int xy, wrap, off = 0;
|
yading@10
|
1639 int A[2], B[2], C[2];
|
yading@10
|
1640 int px, py;
|
yading@10
|
1641 int a_valid = 0, b_valid = 0, c_valid = 0;
|
yading@10
|
1642 int field_a, field_b, field_c; // 0: same, 1: opposit
|
yading@10
|
1643 int total_valid, num_samefield, num_oppfield;
|
yading@10
|
1644 int pos_c, pos_b, n_adj;
|
yading@10
|
1645
|
yading@10
|
1646 wrap = s->b8_stride;
|
yading@10
|
1647 xy = s->block_index[n];
|
yading@10
|
1648
|
yading@10
|
1649 if (s->mb_intra) {
|
yading@10
|
1650 s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0;
|
yading@10
|
1651 s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0;
|
yading@10
|
1652 s->current_picture.motion_val[1][xy][0] = 0;
|
yading@10
|
1653 s->current_picture.motion_val[1][xy][1] = 0;
|
yading@10
|
1654 if (mvn == 1) { /* duplicate motion data for 1-MV block */
|
yading@10
|
1655 s->current_picture.motion_val[0][xy + 1][0] = 0;
|
yading@10
|
1656 s->current_picture.motion_val[0][xy + 1][1] = 0;
|
yading@10
|
1657 s->current_picture.motion_val[0][xy + wrap][0] = 0;
|
yading@10
|
1658 s->current_picture.motion_val[0][xy + wrap][1] = 0;
|
yading@10
|
1659 s->current_picture.motion_val[0][xy + wrap + 1][0] = 0;
|
yading@10
|
1660 s->current_picture.motion_val[0][xy + wrap + 1][1] = 0;
|
yading@10
|
1661 v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
|
yading@10
|
1662 s->current_picture.motion_val[1][xy + 1][0] = 0;
|
yading@10
|
1663 s->current_picture.motion_val[1][xy + 1][1] = 0;
|
yading@10
|
1664 s->current_picture.motion_val[1][xy + wrap][0] = 0;
|
yading@10
|
1665 s->current_picture.motion_val[1][xy + wrap][1] = 0;
|
yading@10
|
1666 s->current_picture.motion_val[1][xy + wrap + 1][0] = 0;
|
yading@10
|
1667 s->current_picture.motion_val[1][xy + wrap + 1][1] = 0;
|
yading@10
|
1668 }
|
yading@10
|
1669 return;
|
yading@10
|
1670 }
|
yading@10
|
1671
|
yading@10
|
1672 off = ((n == 0) || (n == 1)) ? 1 : -1;
|
yading@10
|
1673 /* predict A */
|
yading@10
|
1674 if (s->mb_x || (n == 1) || (n == 3)) {
|
yading@10
|
1675 if ((v->blk_mv_type[xy]) // current block (MB) has a field MV
|
yading@10
|
1676 || (!v->blk_mv_type[xy] && !v->blk_mv_type[xy - 1])) { // or both have frame MV
|
yading@10
|
1677 A[0] = s->current_picture.motion_val[dir][xy - 1][0];
|
yading@10
|
1678 A[1] = s->current_picture.motion_val[dir][xy - 1][1];
|
yading@10
|
1679 a_valid = 1;
|
yading@10
|
1680 } else { // current block has frame mv and cand. has field MV (so average)
|
yading@10
|
1681 A[0] = (s->current_picture.motion_val[dir][xy - 1][0]
|
yading@10
|
1682 + s->current_picture.motion_val[dir][xy - 1 + off * wrap][0] + 1) >> 1;
|
yading@10
|
1683 A[1] = (s->current_picture.motion_val[dir][xy - 1][1]
|
yading@10
|
1684 + s->current_picture.motion_val[dir][xy - 1 + off * wrap][1] + 1) >> 1;
|
yading@10
|
1685 a_valid = 1;
|
yading@10
|
1686 }
|
yading@10
|
1687 if (!(n & 1) && v->is_intra[s->mb_x - 1]) {
|
yading@10
|
1688 a_valid = 0;
|
yading@10
|
1689 A[0] = A[1] = 0;
|
yading@10
|
1690 }
|
yading@10
|
1691 } else
|
yading@10
|
1692 A[0] = A[1] = 0;
|
yading@10
|
1693 /* Predict B and C */
|
yading@10
|
1694 B[0] = B[1] = C[0] = C[1] = 0;
|
yading@10
|
1695 if (n == 0 || n == 1 || v->blk_mv_type[xy]) {
|
yading@10
|
1696 if (!s->first_slice_line) {
|
yading@10
|
1697 if (!v->is_intra[s->mb_x - s->mb_stride]) {
|
yading@10
|
1698 b_valid = 1;
|
yading@10
|
1699 n_adj = n | 2;
|
yading@10
|
1700 pos_b = s->block_index[n_adj] - 2 * wrap;
|
yading@10
|
1701 if (v->blk_mv_type[pos_b] && v->blk_mv_type[xy]) {
|
yading@10
|
1702 n_adj = (n & 2) | (n & 1);
|
yading@10
|
1703 }
|
yading@10
|
1704 B[0] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap][0];
|
yading@10
|
1705 B[1] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap][1];
|
yading@10
|
1706 if (v->blk_mv_type[pos_b] && !v->blk_mv_type[xy]) {
|
yading@10
|
1707 B[0] = (B[0] + s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap][0] + 1) >> 1;
|
yading@10
|
1708 B[1] = (B[1] + s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap][1] + 1) >> 1;
|
yading@10
|
1709 }
|
yading@10
|
1710 }
|
yading@10
|
1711 if (s->mb_width > 1) {
|
yading@10
|
1712 if (!v->is_intra[s->mb_x - s->mb_stride + 1]) {
|
yading@10
|
1713 c_valid = 1;
|
yading@10
|
1714 n_adj = 2;
|
yading@10
|
1715 pos_c = s->block_index[2] - 2 * wrap + 2;
|
yading@10
|
1716 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
|
yading@10
|
1717 n_adj = n & 2;
|
yading@10
|
1718 }
|
yading@10
|
1719 C[0] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap + 2][0];
|
yading@10
|
1720 C[1] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap + 2][1];
|
yading@10
|
1721 if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
|
yading@10
|
1722 C[0] = (1 + C[0] + (s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap + 2][0])) >> 1;
|
yading@10
|
1723 C[1] = (1 + C[1] + (s->current_picture.motion_val[dir][s->block_index[n_adj ^ 2] - 2 * wrap + 2][1])) >> 1;
|
yading@10
|
1724 }
|
yading@10
|
1725 if (s->mb_x == s->mb_width - 1) {
|
yading@10
|
1726 if (!v->is_intra[s->mb_x - s->mb_stride - 1]) {
|
yading@10
|
1727 c_valid = 1;
|
yading@10
|
1728 n_adj = 3;
|
yading@10
|
1729 pos_c = s->block_index[3] - 2 * wrap - 2;
|
yading@10
|
1730 if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
|
yading@10
|
1731 n_adj = n | 1;
|
yading@10
|
1732 }
|
yading@10
|
1733 C[0] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap - 2][0];
|
yading@10
|
1734 C[1] = s->current_picture.motion_val[dir][s->block_index[n_adj] - 2 * wrap - 2][1];
|
yading@10
|
1735 if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
|
yading@10
|
1736 C[0] = (1 + C[0] + s->current_picture.motion_val[dir][s->block_index[1] - 2 * wrap - 2][0]) >> 1;
|
yading@10
|
1737 C[1] = (1 + C[1] + s->current_picture.motion_val[dir][s->block_index[1] - 2 * wrap - 2][1]) >> 1;
|
yading@10
|
1738 }
|
yading@10
|
1739 } else
|
yading@10
|
1740 c_valid = 0;
|
yading@10
|
1741 }
|
yading@10
|
1742 }
|
yading@10
|
1743 }
|
yading@10
|
1744 }
|
yading@10
|
1745 } else {
|
yading@10
|
1746 pos_b = s->block_index[1];
|
yading@10
|
1747 b_valid = 1;
|
yading@10
|
1748 B[0] = s->current_picture.motion_val[dir][pos_b][0];
|
yading@10
|
1749 B[1] = s->current_picture.motion_val[dir][pos_b][1];
|
yading@10
|
1750 pos_c = s->block_index[0];
|
yading@10
|
1751 c_valid = 1;
|
yading@10
|
1752 C[0] = s->current_picture.motion_val[dir][pos_c][0];
|
yading@10
|
1753 C[1] = s->current_picture.motion_val[dir][pos_c][1];
|
yading@10
|
1754 }
|
yading@10
|
1755
|
yading@10
|
1756 total_valid = a_valid + b_valid + c_valid;
|
yading@10
|
1757 // check if predictor A is out of bounds
|
yading@10
|
1758 if (!s->mb_x && !(n == 1 || n == 3)) {
|
yading@10
|
1759 A[0] = A[1] = 0;
|
yading@10
|
1760 }
|
yading@10
|
1761 // check if predictor B is out of bounds
|
yading@10
|
1762 if ((s->first_slice_line && v->blk_mv_type[xy]) || (s->first_slice_line && !(n & 2))) {
|
yading@10
|
1763 B[0] = B[1] = C[0] = C[1] = 0;
|
yading@10
|
1764 }
|
yading@10
|
1765 if (!v->blk_mv_type[xy]) {
|
yading@10
|
1766 if (s->mb_width == 1) {
|
yading@10
|
1767 px = B[0];
|
yading@10
|
1768 py = B[1];
|
yading@10
|
1769 } else {
|
yading@10
|
1770 if (total_valid >= 2) {
|
yading@10
|
1771 px = mid_pred(A[0], B[0], C[0]);
|
yading@10
|
1772 py = mid_pred(A[1], B[1], C[1]);
|
yading@10
|
1773 } else if (total_valid) {
|
yading@10
|
1774 if (a_valid) { px = A[0]; py = A[1]; }
|
yading@10
|
1775 else if (b_valid) { px = B[0]; py = B[1]; }
|
yading@10
|
1776 else if (c_valid) { px = C[0]; py = C[1]; }
|
yading@10
|
1777 else av_assert2(0);
|
yading@10
|
1778 } else
|
yading@10
|
1779 px = py = 0;
|
yading@10
|
1780 }
|
yading@10
|
1781 } else {
|
yading@10
|
1782 if (a_valid)
|
yading@10
|
1783 field_a = (A[1] & 4) ? 1 : 0;
|
yading@10
|
1784 else
|
yading@10
|
1785 field_a = 0;
|
yading@10
|
1786 if (b_valid)
|
yading@10
|
1787 field_b = (B[1] & 4) ? 1 : 0;
|
yading@10
|
1788 else
|
yading@10
|
1789 field_b = 0;
|
yading@10
|
1790 if (c_valid)
|
yading@10
|
1791 field_c = (C[1] & 4) ? 1 : 0;
|
yading@10
|
1792 else
|
yading@10
|
1793 field_c = 0;
|
yading@10
|
1794
|
yading@10
|
1795 num_oppfield = field_a + field_b + field_c;
|
yading@10
|
1796 num_samefield = total_valid - num_oppfield;
|
yading@10
|
1797 if (total_valid == 3) {
|
yading@10
|
1798 if ((num_samefield == 3) || (num_oppfield == 3)) {
|
yading@10
|
1799 px = mid_pred(A[0], B[0], C[0]);
|
yading@10
|
1800 py = mid_pred(A[1], B[1], C[1]);
|
yading@10
|
1801 } else if (num_samefield >= num_oppfield) {
|
yading@10
|
1802 /* take one MV from same field set depending on priority
|
yading@10
|
1803 the check for B may not be necessary */
|
yading@10
|
1804 px = !field_a ? A[0] : B[0];
|
yading@10
|
1805 py = !field_a ? A[1] : B[1];
|
yading@10
|
1806 } else {
|
yading@10
|
1807 px = field_a ? A[0] : B[0];
|
yading@10
|
1808 py = field_a ? A[1] : B[1];
|
yading@10
|
1809 }
|
yading@10
|
1810 } else if (total_valid == 2) {
|
yading@10
|
1811 if (num_samefield >= num_oppfield) {
|
yading@10
|
1812 if (!field_a && a_valid) {
|
yading@10
|
1813 px = A[0];
|
yading@10
|
1814 py = A[1];
|
yading@10
|
1815 } else if (!field_b && b_valid) {
|
yading@10
|
1816 px = B[0];
|
yading@10
|
1817 py = B[1];
|
yading@10
|
1818 } else if (c_valid) {
|
yading@10
|
1819 px = C[0];
|
yading@10
|
1820 py = C[1];
|
yading@10
|
1821 } else px = py = 0;
|
yading@10
|
1822 } else {
|
yading@10
|
1823 if (field_a && a_valid) {
|
yading@10
|
1824 px = A[0];
|
yading@10
|
1825 py = A[1];
|
yading@10
|
1826 } else if (field_b && b_valid) {
|
yading@10
|
1827 px = B[0];
|
yading@10
|
1828 py = B[1];
|
yading@10
|
1829 } else if (c_valid) {
|
yading@10
|
1830 px = C[0];
|
yading@10
|
1831 py = C[1];
|
yading@10
|
1832 } else px = py = 0;
|
yading@10
|
1833 }
|
yading@10
|
1834 } else if (total_valid == 1) {
|
yading@10
|
1835 px = (a_valid) ? A[0] : ((b_valid) ? B[0] : C[0]);
|
yading@10
|
1836 py = (a_valid) ? A[1] : ((b_valid) ? B[1] : C[1]);
|
yading@10
|
1837 } else
|
yading@10
|
1838 px = py = 0;
|
yading@10
|
1839 }
|
yading@10
|
1840
|
yading@10
|
1841 /* store MV using signed modulus of MV range defined in 4.11 */
|
yading@10
|
1842 s->mv[dir][n][0] = s->current_picture.motion_val[dir][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
|
yading@10
|
1843 s->mv[dir][n][1] = s->current_picture.motion_val[dir][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
|
yading@10
|
1844 if (mvn == 1) { /* duplicate motion data for 1-MV block */
|
yading@10
|
1845 s->current_picture.motion_val[dir][xy + 1 ][0] = s->current_picture.motion_val[dir][xy][0];
|
yading@10
|
1846 s->current_picture.motion_val[dir][xy + 1 ][1] = s->current_picture.motion_val[dir][xy][1];
|
yading@10
|
1847 s->current_picture.motion_val[dir][xy + wrap ][0] = s->current_picture.motion_val[dir][xy][0];
|
yading@10
|
1848 s->current_picture.motion_val[dir][xy + wrap ][1] = s->current_picture.motion_val[dir][xy][1];
|
yading@10
|
1849 s->current_picture.motion_val[dir][xy + wrap + 1][0] = s->current_picture.motion_val[dir][xy][0];
|
yading@10
|
1850 s->current_picture.motion_val[dir][xy + wrap + 1][1] = s->current_picture.motion_val[dir][xy][1];
|
yading@10
|
1851 } else if (mvn == 2) { /* duplicate motion data for 2-Field MV block */
|
yading@10
|
1852 s->current_picture.motion_val[dir][xy + 1][0] = s->current_picture.motion_val[dir][xy][0];
|
yading@10
|
1853 s->current_picture.motion_val[dir][xy + 1][1] = s->current_picture.motion_val[dir][xy][1];
|
yading@10
|
1854 s->mv[dir][n + 1][0] = s->mv[dir][n][0];
|
yading@10
|
1855 s->mv[dir][n + 1][1] = s->mv[dir][n][1];
|
yading@10
|
1856 }
|
yading@10
|
1857 }
|
yading@10
|
1858
|
yading@10
|
1859 /** Motion compensation for direct or interpolated blocks in B-frames
|
yading@10
|
1860 */
|
yading@10
|
1861 static void vc1_interp_mc(VC1Context *v)
|
yading@10
|
1862 {
|
yading@10
|
1863 MpegEncContext *s = &v->s;
|
yading@10
|
1864 H264ChromaContext *h264chroma = &v->h264chroma;
|
yading@10
|
1865 uint8_t *srcY, *srcU, *srcV;
|
yading@10
|
1866 int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
|
yading@10
|
1867 int off, off_uv;
|
yading@10
|
1868 int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
yading@10
|
1869
|
yading@10
|
1870 if (!v->field_mode && !v->s.next_picture.f.data[0])
|
yading@10
|
1871 return;
|
yading@10
|
1872
|
yading@10
|
1873 mx = s->mv[1][0][0];
|
yading@10
|
1874 my = s->mv[1][0][1];
|
yading@10
|
1875 uvmx = (mx + ((mx & 3) == 3)) >> 1;
|
yading@10
|
1876 uvmy = (my + ((my & 3) == 3)) >> 1;
|
yading@10
|
1877 if (v->field_mode) {
|
yading@10
|
1878 if (v->cur_field_type != v->ref_field_type[1])
|
yading@10
|
1879 my = my - 2 + 4 * v->cur_field_type;
|
yading@10
|
1880 uvmy = uvmy - 2 + 4 * v->cur_field_type;
|
yading@10
|
1881 }
|
yading@10
|
1882 if (v->fastuvmc) {
|
yading@10
|
1883 uvmx = uvmx + ((uvmx < 0) ? -(uvmx & 1) : (uvmx & 1));
|
yading@10
|
1884 uvmy = uvmy + ((uvmy < 0) ? -(uvmy & 1) : (uvmy & 1));
|
yading@10
|
1885 }
|
yading@10
|
1886 srcY = s->next_picture.f.data[0];
|
yading@10
|
1887 srcU = s->next_picture.f.data[1];
|
yading@10
|
1888 srcV = s->next_picture.f.data[2];
|
yading@10
|
1889
|
yading@10
|
1890 src_x = s->mb_x * 16 + (mx >> 2);
|
yading@10
|
1891 src_y = s->mb_y * 16 + (my >> 2);
|
yading@10
|
1892 uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
|
yading@10
|
1893 uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
|
yading@10
|
1894
|
yading@10
|
1895 if (v->profile != PROFILE_ADVANCED) {
|
yading@10
|
1896 src_x = av_clip( src_x, -16, s->mb_width * 16);
|
yading@10
|
1897 src_y = av_clip( src_y, -16, s->mb_height * 16);
|
yading@10
|
1898 uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8);
|
yading@10
|
1899 uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
|
yading@10
|
1900 } else {
|
yading@10
|
1901 src_x = av_clip( src_x, -17, s->avctx->coded_width);
|
yading@10
|
1902 src_y = av_clip( src_y, -18, s->avctx->coded_height + 1);
|
yading@10
|
1903 uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1);
|
yading@10
|
1904 uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
|
yading@10
|
1905 }
|
yading@10
|
1906
|
yading@10
|
1907 srcY += src_y * s->linesize + src_x;
|
yading@10
|
1908 srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
1909 srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
|
yading@10
|
1910
|
yading@10
|
1911 if (v->field_mode && v->ref_field_type[1]) {
|
yading@10
|
1912 srcY += s->current_picture_ptr->f.linesize[0];
|
yading@10
|
1913 srcU += s->current_picture_ptr->f.linesize[1];
|
yading@10
|
1914 srcV += s->current_picture_ptr->f.linesize[2];
|
yading@10
|
1915 }
|
yading@10
|
1916
|
yading@10
|
1917 /* for grayscale we should not try to read from unknown area */
|
yading@10
|
1918 if (s->flags & CODEC_FLAG_GRAY) {
|
yading@10
|
1919 srcU = s->edge_emu_buffer + 18 * s->linesize;
|
yading@10
|
1920 srcV = s->edge_emu_buffer + 18 * s->linesize;
|
yading@10
|
1921 }
|
yading@10
|
1922
|
yading@10
|
1923 if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22
|
yading@10
|
1924 || (unsigned)(src_x - 1) > s->h_edge_pos - (mx & 3) - 16 - 3
|
yading@10
|
1925 || (unsigned)(src_y - 1) > v_edge_pos - (my & 3) - 16 - 3) {
|
yading@10
|
1926 uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
|
yading@10
|
1927
|
yading@10
|
1928 srcY -= s->mspel * (1 + s->linesize);
|
yading@10
|
1929 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
|
yading@10
|
1930 17 + s->mspel * 2, 17 + s->mspel * 2,
|
yading@10
|
1931 src_x - s->mspel, src_y - s->mspel,
|
yading@10
|
1932 s->h_edge_pos, v_edge_pos);
|
yading@10
|
1933 srcY = s->edge_emu_buffer;
|
yading@10
|
1934 s->vdsp.emulated_edge_mc(uvbuf , srcU, s->uvlinesize, 8 + 1, 8 + 1,
|
yading@10
|
1935 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
|
yading@10
|
1936 s->vdsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
|
yading@10
|
1937 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
|
yading@10
|
1938 srcU = uvbuf;
|
yading@10
|
1939 srcV = uvbuf + 16;
|
yading@10
|
1940 /* if we deal with range reduction we need to scale source blocks */
|
yading@10
|
1941 if (v->rangeredfrm) {
|
yading@10
|
1942 int i, j;
|
yading@10
|
1943 uint8_t *src, *src2;
|
yading@10
|
1944
|
yading@10
|
1945 src = srcY;
|
yading@10
|
1946 for (j = 0; j < 17 + s->mspel * 2; j++) {
|
yading@10
|
1947 for (i = 0; i < 17 + s->mspel * 2; i++)
|
yading@10
|
1948 src[i] = ((src[i] - 128) >> 1) + 128;
|
yading@10
|
1949 src += s->linesize;
|
yading@10
|
1950 }
|
yading@10
|
1951 src = srcU;
|
yading@10
|
1952 src2 = srcV;
|
yading@10
|
1953 for (j = 0; j < 9; j++) {
|
yading@10
|
1954 for (i = 0; i < 9; i++) {
|
yading@10
|
1955 src[i] = ((src[i] - 128) >> 1) + 128;
|
yading@10
|
1956 src2[i] = ((src2[i] - 128) >> 1) + 128;
|
yading@10
|
1957 }
|
yading@10
|
1958 src += s->uvlinesize;
|
yading@10
|
1959 src2 += s->uvlinesize;
|
yading@10
|
1960 }
|
yading@10
|
1961 }
|
yading@10
|
1962 srcY += s->mspel * (1 + s->linesize);
|
yading@10
|
1963 }
|
yading@10
|
1964
|
yading@10
|
1965 off = 0;
|
yading@10
|
1966 off_uv = 0;
|
yading@10
|
1967
|
yading@10
|
1968 if (s->mspel) {
|
yading@10
|
1969 dxy = ((my & 3) << 2) | (mx & 3);
|
yading@10
|
1970 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off , srcY , s->linesize, v->rnd);
|
yading@10
|
1971 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
|
yading@10
|
1972 srcY += s->linesize * 8;
|
yading@10
|
1973 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize , srcY , s->linesize, v->rnd);
|
yading@10
|
1974 v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
|
yading@10
|
1975 } else { // hpel mc
|
yading@10
|
1976 dxy = (my & 2) | ((mx & 2) >> 1);
|
yading@10
|
1977
|
yading@10
|
1978 if (!v->rnd)
|
yading@10
|
1979 s->hdsp.avg_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
|
yading@10
|
1980 else
|
yading@10
|
1981 s->hdsp.avg_no_rnd_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, 16);
|
yading@10
|
1982 }
|
yading@10
|
1983
|
yading@10
|
1984 if (s->flags & CODEC_FLAG_GRAY) return;
|
yading@10
|
1985 /* Chroma MC always uses qpel blilinear */
|
yading@10
|
1986 uvmx = (uvmx & 3) << 1;
|
yading@10
|
1987 uvmy = (uvmy & 3) << 1;
|
yading@10
|
1988 if (!v->rnd) {
|
yading@10
|
1989 h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
1990 h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
1991 } else {
|
yading@10
|
1992 v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
1993 v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
|
yading@10
|
1994 }
|
yading@10
|
1995 }
|
yading@10
|
1996
|
yading@10
|
1997 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
|
yading@10
|
1998 {
|
yading@10
|
1999 int n = bfrac;
|
yading@10
|
2000
|
yading@10
|
2001 #if B_FRACTION_DEN==256
|
yading@10
|
2002 if (inv)
|
yading@10
|
2003 n -= 256;
|
yading@10
|
2004 if (!qs)
|
yading@10
|
2005 return 2 * ((value * n + 255) >> 9);
|
yading@10
|
2006 return (value * n + 128) >> 8;
|
yading@10
|
2007 #else
|
yading@10
|
2008 if (inv)
|
yading@10
|
2009 n -= B_FRACTION_DEN;
|
yading@10
|
2010 if (!qs)
|
yading@10
|
2011 return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
|
yading@10
|
2012 return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
|
yading@10
|
2013 #endif
|
yading@10
|
2014 }
|
yading@10
|
2015
|
yading@10
|
2016 /** Reconstruct motion vector for B-frame and do motion compensation
|
yading@10
|
2017 */
|
yading@10
|
2018 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
|
yading@10
|
2019 int direct, int mode)
|
yading@10
|
2020 {
|
yading@10
|
2021 if (v->use_ic) {
|
yading@10
|
2022 v->mv_mode2 = v->mv_mode;
|
yading@10
|
2023 v->mv_mode = MV_PMODE_INTENSITY_COMP;
|
yading@10
|
2024 }
|
yading@10
|
2025 if (direct) {
|
yading@10
|
2026 vc1_mc_1mv(v, 0);
|
yading@10
|
2027 vc1_interp_mc(v);
|
yading@10
|
2028 if (v->use_ic)
|
yading@10
|
2029 v->mv_mode = v->mv_mode2;
|
yading@10
|
2030 return;
|
yading@10
|
2031 }
|
yading@10
|
2032 if (mode == BMV_TYPE_INTERPOLATED) {
|
yading@10
|
2033 vc1_mc_1mv(v, 0);
|
yading@10
|
2034 vc1_interp_mc(v);
|
yading@10
|
2035 if (v->use_ic)
|
yading@10
|
2036 v->mv_mode = v->mv_mode2;
|
yading@10
|
2037 return;
|
yading@10
|
2038 }
|
yading@10
|
2039
|
yading@10
|
2040 if (v->use_ic && (mode == BMV_TYPE_BACKWARD))
|
yading@10
|
2041 v->mv_mode = v->mv_mode2;
|
yading@10
|
2042 vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
|
yading@10
|
2043 if (v->use_ic)
|
yading@10
|
2044 v->mv_mode = v->mv_mode2;
|
yading@10
|
2045 }
|
yading@10
|
2046
|
yading@10
|
2047 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2],
|
yading@10
|
2048 int direct, int mvtype)
|
yading@10
|
2049 {
|
yading@10
|
2050 MpegEncContext *s = &v->s;
|
yading@10
|
2051 int xy, wrap, off = 0;
|
yading@10
|
2052 int16_t *A, *B, *C;
|
yading@10
|
2053 int px, py;
|
yading@10
|
2054 int sum;
|
yading@10
|
2055 int r_x, r_y;
|
yading@10
|
2056 const uint8_t *is_intra = v->mb_type[0];
|
yading@10
|
2057
|
yading@10
|
2058 r_x = v->range_x;
|
yading@10
|
2059 r_y = v->range_y;
|
yading@10
|
2060 /* scale MV difference to be quad-pel */
|
yading@10
|
2061 dmv_x[0] <<= 1 - s->quarter_sample;
|
yading@10
|
2062 dmv_y[0] <<= 1 - s->quarter_sample;
|
yading@10
|
2063 dmv_x[1] <<= 1 - s->quarter_sample;
|
yading@10
|
2064 dmv_y[1] <<= 1 - s->quarter_sample;
|
yading@10
|
2065
|
yading@10
|
2066 wrap = s->b8_stride;
|
yading@10
|
2067 xy = s->block_index[0];
|
yading@10
|
2068
|
yading@10
|
2069 if (s->mb_intra) {
|
yading@10
|
2070 s->current_picture.motion_val[0][xy + v->blocks_off][0] =
|
yading@10
|
2071 s->current_picture.motion_val[0][xy + v->blocks_off][1] =
|
yading@10
|
2072 s->current_picture.motion_val[1][xy + v->blocks_off][0] =
|
yading@10
|
2073 s->current_picture.motion_val[1][xy + v->blocks_off][1] = 0;
|
yading@10
|
2074 return;
|
yading@10
|
2075 }
|
yading@10
|
2076 if (!v->field_mode) {
|
yading@10
|
2077 s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
|
yading@10
|
2078 s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
|
yading@10
|
2079 s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
|
yading@10
|
2080 s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
|
yading@10
|
2081
|
yading@10
|
2082 /* Pullback predicted motion vectors as specified in 8.4.5.4 */
|
yading@10
|
2083 s->mv[0][0][0] = av_clip(s->mv[0][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6));
|
yading@10
|
2084 s->mv[0][0][1] = av_clip(s->mv[0][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
|
yading@10
|
2085 s->mv[1][0][0] = av_clip(s->mv[1][0][0], -60 - (s->mb_x << 6), (s->mb_width << 6) - 4 - (s->mb_x << 6));
|
yading@10
|
2086 s->mv[1][0][1] = av_clip(s->mv[1][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
|
yading@10
|
2087 }
|
yading@10
|
2088 if (direct) {
|
yading@10
|
2089 s->current_picture.motion_val[0][xy + v->blocks_off][0] = s->mv[0][0][0];
|
yading@10
|
2090 s->current_picture.motion_val[0][xy + v->blocks_off][1] = s->mv[0][0][1];
|
yading@10
|
2091 s->current_picture.motion_val[1][xy + v->blocks_off][0] = s->mv[1][0][0];
|
yading@10
|
2092 s->current_picture.motion_val[1][xy + v->blocks_off][1] = s->mv[1][0][1];
|
yading@10
|
2093 return;
|
yading@10
|
2094 }
|
yading@10
|
2095
|
yading@10
|
2096 if ((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
|
yading@10
|
2097 C = s->current_picture.motion_val[0][xy - 2];
|
yading@10
|
2098 A = s->current_picture.motion_val[0][xy - wrap * 2];
|
yading@10
|
2099 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
|
yading@10
|
2100 B = s->current_picture.motion_val[0][xy - wrap * 2 + off];
|
yading@10
|
2101
|
yading@10
|
2102 if (!s->mb_x) C[0] = C[1] = 0;
|
yading@10
|
2103 if (!s->first_slice_line) { // predictor A is not out of bounds
|
yading@10
|
2104 if (s->mb_width == 1) {
|
yading@10
|
2105 px = A[0];
|
yading@10
|
2106 py = A[1];
|
yading@10
|
2107 } else {
|
yading@10
|
2108 px = mid_pred(A[0], B[0], C[0]);
|
yading@10
|
2109 py = mid_pred(A[1], B[1], C[1]);
|
yading@10
|
2110 }
|
yading@10
|
2111 } else if (s->mb_x) { // predictor C is not out of bounds
|
yading@10
|
2112 px = C[0];
|
yading@10
|
2113 py = C[1];
|
yading@10
|
2114 } else {
|
yading@10
|
2115 px = py = 0;
|
yading@10
|
2116 }
|
yading@10
|
2117 /* Pullback MV as specified in 8.3.5.3.4 */
|
yading@10
|
2118 {
|
yading@10
|
2119 int qx, qy, X, Y;
|
yading@10
|
2120 if (v->profile < PROFILE_ADVANCED) {
|
yading@10
|
2121 qx = (s->mb_x << 5);
|
yading@10
|
2122 qy = (s->mb_y << 5);
|
yading@10
|
2123 X = (s->mb_width << 5) - 4;
|
yading@10
|
2124 Y = (s->mb_height << 5) - 4;
|
yading@10
|
2125 if (qx + px < -28) px = -28 - qx;
|
yading@10
|
2126 if (qy + py < -28) py = -28 - qy;
|
yading@10
|
2127 if (qx + px > X) px = X - qx;
|
yading@10
|
2128 if (qy + py > Y) py = Y - qy;
|
yading@10
|
2129 } else {
|
yading@10
|
2130 qx = (s->mb_x << 6);
|
yading@10
|
2131 qy = (s->mb_y << 6);
|
yading@10
|
2132 X = (s->mb_width << 6) - 4;
|
yading@10
|
2133 Y = (s->mb_height << 6) - 4;
|
yading@10
|
2134 if (qx + px < -60) px = -60 - qx;
|
yading@10
|
2135 if (qy + py < -60) py = -60 - qy;
|
yading@10
|
2136 if (qx + px > X) px = X - qx;
|
yading@10
|
2137 if (qy + py > Y) py = Y - qy;
|
yading@10
|
2138 }
|
yading@10
|
2139 }
|
yading@10
|
2140 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
|
yading@10
|
2141 if (0 && !s->first_slice_line && s->mb_x) {
|
yading@10
|
2142 if (is_intra[xy - wrap])
|
yading@10
|
2143 sum = FFABS(px) + FFABS(py);
|
yading@10
|
2144 else
|
yading@10
|
2145 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
|
yading@10
|
2146 if (sum > 32) {
|
yading@10
|
2147 if (get_bits1(&s->gb)) {
|
yading@10
|
2148 px = A[0];
|
yading@10
|
2149 py = A[1];
|
yading@10
|
2150 } else {
|
yading@10
|
2151 px = C[0];
|
yading@10
|
2152 py = C[1];
|
yading@10
|
2153 }
|
yading@10
|
2154 } else {
|
yading@10
|
2155 if (is_intra[xy - 2])
|
yading@10
|
2156 sum = FFABS(px) + FFABS(py);
|
yading@10
|
2157 else
|
yading@10
|
2158 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
|
yading@10
|
2159 if (sum > 32) {
|
yading@10
|
2160 if (get_bits1(&s->gb)) {
|
yading@10
|
2161 px = A[0];
|
yading@10
|
2162 py = A[1];
|
yading@10
|
2163 } else {
|
yading@10
|
2164 px = C[0];
|
yading@10
|
2165 py = C[1];
|
yading@10
|
2166 }
|
yading@10
|
2167 }
|
yading@10
|
2168 }
|
yading@10
|
2169 }
|
yading@10
|
2170 /* store MV using signed modulus of MV range defined in 4.11 */
|
yading@10
|
2171 s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
|
yading@10
|
2172 s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
|
yading@10
|
2173 }
|
yading@10
|
2174 if ((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
|
yading@10
|
2175 C = s->current_picture.motion_val[1][xy - 2];
|
yading@10
|
2176 A = s->current_picture.motion_val[1][xy - wrap * 2];
|
yading@10
|
2177 off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
|
yading@10
|
2178 B = s->current_picture.motion_val[1][xy - wrap * 2 + off];
|
yading@10
|
2179
|
yading@10
|
2180 if (!s->mb_x)
|
yading@10
|
2181 C[0] = C[1] = 0;
|
yading@10
|
2182 if (!s->first_slice_line) { // predictor A is not out of bounds
|
yading@10
|
2183 if (s->mb_width == 1) {
|
yading@10
|
2184 px = A[0];
|
yading@10
|
2185 py = A[1];
|
yading@10
|
2186 } else {
|
yading@10
|
2187 px = mid_pred(A[0], B[0], C[0]);
|
yading@10
|
2188 py = mid_pred(A[1], B[1], C[1]);
|
yading@10
|
2189 }
|
yading@10
|
2190 } else if (s->mb_x) { // predictor C is not out of bounds
|
yading@10
|
2191 px = C[0];
|
yading@10
|
2192 py = C[1];
|
yading@10
|
2193 } else {
|
yading@10
|
2194 px = py = 0;
|
yading@10
|
2195 }
|
yading@10
|
2196 /* Pullback MV as specified in 8.3.5.3.4 */
|
yading@10
|
2197 {
|
yading@10
|
2198 int qx, qy, X, Y;
|
yading@10
|
2199 if (v->profile < PROFILE_ADVANCED) {
|
yading@10
|
2200 qx = (s->mb_x << 5);
|
yading@10
|
2201 qy = (s->mb_y << 5);
|
yading@10
|
2202 X = (s->mb_width << 5) - 4;
|
yading@10
|
2203 Y = (s->mb_height << 5) - 4;
|
yading@10
|
2204 if (qx + px < -28) px = -28 - qx;
|
yading@10
|
2205 if (qy + py < -28) py = -28 - qy;
|
yading@10
|
2206 if (qx + px > X) px = X - qx;
|
yading@10
|
2207 if (qy + py > Y) py = Y - qy;
|
yading@10
|
2208 } else {
|
yading@10
|
2209 qx = (s->mb_x << 6);
|
yading@10
|
2210 qy = (s->mb_y << 6);
|
yading@10
|
2211 X = (s->mb_width << 6) - 4;
|
yading@10
|
2212 Y = (s->mb_height << 6) - 4;
|
yading@10
|
2213 if (qx + px < -60) px = -60 - qx;
|
yading@10
|
2214 if (qy + py < -60) py = -60 - qy;
|
yading@10
|
2215 if (qx + px > X) px = X - qx;
|
yading@10
|
2216 if (qy + py > Y) py = Y - qy;
|
yading@10
|
2217 }
|
yading@10
|
2218 }
|
yading@10
|
2219 /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
|
yading@10
|
2220 if (0 && !s->first_slice_line && s->mb_x) {
|
yading@10
|
2221 if (is_intra[xy - wrap])
|
yading@10
|
2222 sum = FFABS(px) + FFABS(py);
|
yading@10
|
2223 else
|
yading@10
|
2224 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
|
yading@10
|
2225 if (sum > 32) {
|
yading@10
|
2226 if (get_bits1(&s->gb)) {
|
yading@10
|
2227 px = A[0];
|
yading@10
|
2228 py = A[1];
|
yading@10
|
2229 } else {
|
yading@10
|
2230 px = C[0];
|
yading@10
|
2231 py = C[1];
|
yading@10
|
2232 }
|
yading@10
|
2233 } else {
|
yading@10
|
2234 if (is_intra[xy - 2])
|
yading@10
|
2235 sum = FFABS(px) + FFABS(py);
|
yading@10
|
2236 else
|
yading@10
|
2237 sum = FFABS(px - C[0]) + FFABS(py - C[1]);
|
yading@10
|
2238 if (sum > 32) {
|
yading@10
|
2239 if (get_bits1(&s->gb)) {
|
yading@10
|
2240 px = A[0];
|
yading@10
|
2241 py = A[1];
|
yading@10
|
2242 } else {
|
yading@10
|
2243 px = C[0];
|
yading@10
|
2244 py = C[1];
|
yading@10
|
2245 }
|
yading@10
|
2246 }
|
yading@10
|
2247 }
|
yading@10
|
2248 }
|
yading@10
|
2249 /* store MV using signed modulus of MV range defined in 4.11 */
|
yading@10
|
2250
|
yading@10
|
2251 s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
|
yading@10
|
2252 s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
|
yading@10
|
2253 }
|
yading@10
|
2254 s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
|
yading@10
|
2255 s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
|
yading@10
|
2256 s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
|
yading@10
|
2257 s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
|
yading@10
|
2258 }
|
yading@10
|
2259
|
yading@10
|
2260 static inline void vc1_pred_b_mv_intfi(VC1Context *v, int n, int *dmv_x, int *dmv_y, int mv1, int *pred_flag)
|
yading@10
|
2261 {
|
yading@10
|
2262 int dir = (v->bmvtype == BMV_TYPE_BACKWARD) ? 1 : 0;
|
yading@10
|
2263 MpegEncContext *s = &v->s;
|
yading@10
|
2264 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
2265
|
yading@10
|
2266 if (v->bmvtype == BMV_TYPE_DIRECT) {
|
yading@10
|
2267 int total_opp, k, f;
|
yading@10
|
2268 if (s->next_picture.mb_type[mb_pos + v->mb_off] != MB_TYPE_INTRA) {
|
yading@10
|
2269 s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][0],
|
yading@10
|
2270 v->bfraction, 0, s->quarter_sample);
|
yading@10
|
2271 s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][1],
|
yading@10
|
2272 v->bfraction, 0, s->quarter_sample);
|
yading@10
|
2273 s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][0],
|
yading@10
|
2274 v->bfraction, 1, s->quarter_sample);
|
yading@10
|
2275 s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0] + v->blocks_off][1],
|
yading@10
|
2276 v->bfraction, 1, s->quarter_sample);
|
yading@10
|
2277
|
yading@10
|
2278 total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off]
|
yading@10
|
2279 + v->mv_f_next[0][s->block_index[1] + v->blocks_off]
|
yading@10
|
2280 + v->mv_f_next[0][s->block_index[2] + v->blocks_off]
|
yading@10
|
2281 + v->mv_f_next[0][s->block_index[3] + v->blocks_off];
|
yading@10
|
2282 f = (total_opp > 2) ? 1 : 0;
|
yading@10
|
2283 } else {
|
yading@10
|
2284 s->mv[0][0][0] = s->mv[0][0][1] = 0;
|
yading@10
|
2285 s->mv[1][0][0] = s->mv[1][0][1] = 0;
|
yading@10
|
2286 f = 0;
|
yading@10
|
2287 }
|
yading@10
|
2288 v->ref_field_type[0] = v->ref_field_type[1] = v->cur_field_type ^ f;
|
yading@10
|
2289 for (k = 0; k < 4; k++) {
|
yading@10
|
2290 s->current_picture.motion_val[0][s->block_index[k] + v->blocks_off][0] = s->mv[0][0][0];
|
yading@10
|
2291 s->current_picture.motion_val[0][s->block_index[k] + v->blocks_off][1] = s->mv[0][0][1];
|
yading@10
|
2292 s->current_picture.motion_val[1][s->block_index[k] + v->blocks_off][0] = s->mv[1][0][0];
|
yading@10
|
2293 s->current_picture.motion_val[1][s->block_index[k] + v->blocks_off][1] = s->mv[1][0][1];
|
yading@10
|
2294 v->mv_f[0][s->block_index[k] + v->blocks_off] = f;
|
yading@10
|
2295 v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
|
yading@10
|
2296 }
|
yading@10
|
2297 return;
|
yading@10
|
2298 }
|
yading@10
|
2299 if (v->bmvtype == BMV_TYPE_INTERPOLATED) {
|
yading@10
|
2300 vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0], 1, v->range_x, v->range_y, v->mb_type[0], pred_flag[0], 0);
|
yading@10
|
2301 vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1], 1, v->range_x, v->range_y, v->mb_type[0], pred_flag[1], 1);
|
yading@10
|
2302 return;
|
yading@10
|
2303 }
|
yading@10
|
2304 if (dir) { // backward
|
yading@10
|
2305 vc1_pred_mv(v, n, dmv_x[1], dmv_y[1], mv1, v->range_x, v->range_y, v->mb_type[0], pred_flag[1], 1);
|
yading@10
|
2306 if (n == 3 || mv1) {
|
yading@10
|
2307 vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0], 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
|
yading@10
|
2308 }
|
yading@10
|
2309 } else { // forward
|
yading@10
|
2310 vc1_pred_mv(v, n, dmv_x[0], dmv_y[0], mv1, v->range_x, v->range_y, v->mb_type[0], pred_flag[0], 0);
|
yading@10
|
2311 if (n == 3 || mv1) {
|
yading@10
|
2312 vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1], 1, v->range_x, v->range_y, v->mb_type[0], 0, 1);
|
yading@10
|
2313 }
|
yading@10
|
2314 }
|
yading@10
|
2315 }
|
yading@10
|
2316
|
yading@10
|
2317 /** Get predicted DC value for I-frames only
|
yading@10
|
2318 * prediction dir: left=0, top=1
|
yading@10
|
2319 * @param s MpegEncContext
|
yading@10
|
2320 * @param overlap flag indicating that overlap filtering is used
|
yading@10
|
2321 * @param pq integer part of picture quantizer
|
yading@10
|
2322 * @param[in] n block index in the current MB
|
yading@10
|
2323 * @param dc_val_ptr Pointer to DC predictor
|
yading@10
|
2324 * @param dir_ptr Prediction direction for use in AC prediction
|
yading@10
|
2325 */
|
yading@10
|
2326 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
|
yading@10
|
2327 int16_t **dc_val_ptr, int *dir_ptr)
|
yading@10
|
2328 {
|
yading@10
|
2329 int a, b, c, wrap, pred, scale;
|
yading@10
|
2330 int16_t *dc_val;
|
yading@10
|
2331 static const uint16_t dcpred[32] = {
|
yading@10
|
2332 -1, 1024, 512, 341, 256, 205, 171, 146, 128,
|
yading@10
|
2333 114, 102, 93, 85, 79, 73, 68, 64,
|
yading@10
|
2334 60, 57, 54, 51, 49, 47, 45, 43,
|
yading@10
|
2335 41, 39, 38, 37, 35, 34, 33
|
yading@10
|
2336 };
|
yading@10
|
2337
|
yading@10
|
2338 /* find prediction - wmv3_dc_scale always used here in fact */
|
yading@10
|
2339 if (n < 4) scale = s->y_dc_scale;
|
yading@10
|
2340 else scale = s->c_dc_scale;
|
yading@10
|
2341
|
yading@10
|
2342 wrap = s->block_wrap[n];
|
yading@10
|
2343 dc_val = s->dc_val[0] + s->block_index[n];
|
yading@10
|
2344
|
yading@10
|
2345 /* B A
|
yading@10
|
2346 * C X
|
yading@10
|
2347 */
|
yading@10
|
2348 c = dc_val[ - 1];
|
yading@10
|
2349 b = dc_val[ - 1 - wrap];
|
yading@10
|
2350 a = dc_val[ - wrap];
|
yading@10
|
2351
|
yading@10
|
2352 if (pq < 9 || !overlap) {
|
yading@10
|
2353 /* Set outer values */
|
yading@10
|
2354 if (s->first_slice_line && (n != 2 && n != 3))
|
yading@10
|
2355 b = a = dcpred[scale];
|
yading@10
|
2356 if (s->mb_x == 0 && (n != 1 && n != 3))
|
yading@10
|
2357 b = c = dcpred[scale];
|
yading@10
|
2358 } else {
|
yading@10
|
2359 /* Set outer values */
|
yading@10
|
2360 if (s->first_slice_line && (n != 2 && n != 3))
|
yading@10
|
2361 b = a = 0;
|
yading@10
|
2362 if (s->mb_x == 0 && (n != 1 && n != 3))
|
yading@10
|
2363 b = c = 0;
|
yading@10
|
2364 }
|
yading@10
|
2365
|
yading@10
|
2366 if (abs(a - b) <= abs(b - c)) {
|
yading@10
|
2367 pred = c;
|
yading@10
|
2368 *dir_ptr = 1; // left
|
yading@10
|
2369 } else {
|
yading@10
|
2370 pred = a;
|
yading@10
|
2371 *dir_ptr = 0; // top
|
yading@10
|
2372 }
|
yading@10
|
2373
|
yading@10
|
2374 /* update predictor */
|
yading@10
|
2375 *dc_val_ptr = &dc_val[0];
|
yading@10
|
2376 return pred;
|
yading@10
|
2377 }
|
yading@10
|
2378
|
yading@10
|
2379
|
yading@10
|
2380 /** Get predicted DC value
|
yading@10
|
2381 * prediction dir: left=0, top=1
|
yading@10
|
2382 * @param s MpegEncContext
|
yading@10
|
2383 * @param overlap flag indicating that overlap filtering is used
|
yading@10
|
2384 * @param pq integer part of picture quantizer
|
yading@10
|
2385 * @param[in] n block index in the current MB
|
yading@10
|
2386 * @param a_avail flag indicating top block availability
|
yading@10
|
2387 * @param c_avail flag indicating left block availability
|
yading@10
|
2388 * @param dc_val_ptr Pointer to DC predictor
|
yading@10
|
2389 * @param dir_ptr Prediction direction for use in AC prediction
|
yading@10
|
2390 */
|
yading@10
|
2391 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
|
yading@10
|
2392 int a_avail, int c_avail,
|
yading@10
|
2393 int16_t **dc_val_ptr, int *dir_ptr)
|
yading@10
|
2394 {
|
yading@10
|
2395 int a, b, c, wrap, pred;
|
yading@10
|
2396 int16_t *dc_val;
|
yading@10
|
2397 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
2398 int q1, q2 = 0;
|
yading@10
|
2399 int dqscale_index;
|
yading@10
|
2400
|
yading@10
|
2401 wrap = s->block_wrap[n];
|
yading@10
|
2402 dc_val = s->dc_val[0] + s->block_index[n];
|
yading@10
|
2403
|
yading@10
|
2404 /* B A
|
yading@10
|
2405 * C X
|
yading@10
|
2406 */
|
yading@10
|
2407 c = dc_val[ - 1];
|
yading@10
|
2408 b = dc_val[ - 1 - wrap];
|
yading@10
|
2409 a = dc_val[ - wrap];
|
yading@10
|
2410 /* scale predictors if needed */
|
yading@10
|
2411 q1 = s->current_picture.qscale_table[mb_pos];
|
yading@10
|
2412 dqscale_index = s->y_dc_scale_table[q1] - 1;
|
yading@10
|
2413 if (dqscale_index < 0)
|
yading@10
|
2414 return 0;
|
yading@10
|
2415 if (c_avail && (n != 1 && n != 3)) {
|
yading@10
|
2416 q2 = s->current_picture.qscale_table[mb_pos - 1];
|
yading@10
|
2417 if (q2 && q2 != q1)
|
yading@10
|
2418 c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
|
yading@10
|
2419 }
|
yading@10
|
2420 if (a_avail && (n != 2 && n != 3)) {
|
yading@10
|
2421 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
|
yading@10
|
2422 if (q2 && q2 != q1)
|
yading@10
|
2423 a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
|
yading@10
|
2424 }
|
yading@10
|
2425 if (a_avail && c_avail && (n != 3)) {
|
yading@10
|
2426 int off = mb_pos;
|
yading@10
|
2427 if (n != 1)
|
yading@10
|
2428 off--;
|
yading@10
|
2429 if (n != 2)
|
yading@10
|
2430 off -= s->mb_stride;
|
yading@10
|
2431 q2 = s->current_picture.qscale_table[off];
|
yading@10
|
2432 if (q2 && q2 != q1)
|
yading@10
|
2433 b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
|
yading@10
|
2434 }
|
yading@10
|
2435
|
yading@10
|
2436 if (a_avail && c_avail) {
|
yading@10
|
2437 if (abs(a - b) <= abs(b - c)) {
|
yading@10
|
2438 pred = c;
|
yading@10
|
2439 *dir_ptr = 1; // left
|
yading@10
|
2440 } else {
|
yading@10
|
2441 pred = a;
|
yading@10
|
2442 *dir_ptr = 0; // top
|
yading@10
|
2443 }
|
yading@10
|
2444 } else if (a_avail) {
|
yading@10
|
2445 pred = a;
|
yading@10
|
2446 *dir_ptr = 0; // top
|
yading@10
|
2447 } else if (c_avail) {
|
yading@10
|
2448 pred = c;
|
yading@10
|
2449 *dir_ptr = 1; // left
|
yading@10
|
2450 } else {
|
yading@10
|
2451 pred = 0;
|
yading@10
|
2452 *dir_ptr = 1; // left
|
yading@10
|
2453 }
|
yading@10
|
2454
|
yading@10
|
2455 /* update predictor */
|
yading@10
|
2456 *dc_val_ptr = &dc_val[0];
|
yading@10
|
2457 return pred;
|
yading@10
|
2458 }
|
yading@10
|
2459
|
yading@10
|
2460 /** @} */ // Block group
|
yading@10
|
2461
|
yading@10
|
2462 /**
|
yading@10
|
2463 * @name VC1 Macroblock-level functions in Simple/Main Profiles
|
yading@10
|
2464 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
|
yading@10
|
2465 * @{
|
yading@10
|
2466 */
|
yading@10
|
2467
|
yading@10
|
2468 static inline int vc1_coded_block_pred(MpegEncContext * s, int n,
|
yading@10
|
2469 uint8_t **coded_block_ptr)
|
yading@10
|
2470 {
|
yading@10
|
2471 int xy, wrap, pred, a, b, c;
|
yading@10
|
2472
|
yading@10
|
2473 xy = s->block_index[n];
|
yading@10
|
2474 wrap = s->b8_stride;
|
yading@10
|
2475
|
yading@10
|
2476 /* B C
|
yading@10
|
2477 * A X
|
yading@10
|
2478 */
|
yading@10
|
2479 a = s->coded_block[xy - 1 ];
|
yading@10
|
2480 b = s->coded_block[xy - 1 - wrap];
|
yading@10
|
2481 c = s->coded_block[xy - wrap];
|
yading@10
|
2482
|
yading@10
|
2483 if (b == c) {
|
yading@10
|
2484 pred = a;
|
yading@10
|
2485 } else {
|
yading@10
|
2486 pred = c;
|
yading@10
|
2487 }
|
yading@10
|
2488
|
yading@10
|
2489 /* store value */
|
yading@10
|
2490 *coded_block_ptr = &s->coded_block[xy];
|
yading@10
|
2491
|
yading@10
|
2492 return pred;
|
yading@10
|
2493 }
|
yading@10
|
2494
|
yading@10
|
2495 /**
|
yading@10
|
2496 * Decode one AC coefficient
|
yading@10
|
2497 * @param v The VC1 context
|
yading@10
|
2498 * @param last Last coefficient
|
yading@10
|
2499 * @param skip How much zero coefficients to skip
|
yading@10
|
2500 * @param value Decoded AC coefficient value
|
yading@10
|
2501 * @param codingset set of VLC to decode data
|
yading@10
|
2502 * @see 8.1.3.4
|
yading@10
|
2503 */
|
yading@10
|
2504 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
|
yading@10
|
2505 int *value, int codingset)
|
yading@10
|
2506 {
|
yading@10
|
2507 GetBitContext *gb = &v->s.gb;
|
yading@10
|
2508 int index, escape, run = 0, level = 0, lst = 0;
|
yading@10
|
2509
|
yading@10
|
2510 index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
|
yading@10
|
2511 if (index != ff_vc1_ac_sizes[codingset] - 1) {
|
yading@10
|
2512 run = vc1_index_decode_table[codingset][index][0];
|
yading@10
|
2513 level = vc1_index_decode_table[codingset][index][1];
|
yading@10
|
2514 lst = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0;
|
yading@10
|
2515 if (get_bits1(gb))
|
yading@10
|
2516 level = -level;
|
yading@10
|
2517 } else {
|
yading@10
|
2518 escape = decode210(gb);
|
yading@10
|
2519 if (escape != 2) {
|
yading@10
|
2520 index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
|
yading@10
|
2521 run = vc1_index_decode_table[codingset][index][0];
|
yading@10
|
2522 level = vc1_index_decode_table[codingset][index][1];
|
yading@10
|
2523 lst = index >= vc1_last_decode_table[codingset];
|
yading@10
|
2524 if (escape == 0) {
|
yading@10
|
2525 if (lst)
|
yading@10
|
2526 level += vc1_last_delta_level_table[codingset][run];
|
yading@10
|
2527 else
|
yading@10
|
2528 level += vc1_delta_level_table[codingset][run];
|
yading@10
|
2529 } else {
|
yading@10
|
2530 if (lst)
|
yading@10
|
2531 run += vc1_last_delta_run_table[codingset][level] + 1;
|
yading@10
|
2532 else
|
yading@10
|
2533 run += vc1_delta_run_table[codingset][level] + 1;
|
yading@10
|
2534 }
|
yading@10
|
2535 if (get_bits1(gb))
|
yading@10
|
2536 level = -level;
|
yading@10
|
2537 } else {
|
yading@10
|
2538 int sign;
|
yading@10
|
2539 lst = get_bits1(gb);
|
yading@10
|
2540 if (v->s.esc3_level_length == 0) {
|
yading@10
|
2541 if (v->pq < 8 || v->dquantfrm) { // table 59
|
yading@10
|
2542 v->s.esc3_level_length = get_bits(gb, 3);
|
yading@10
|
2543 if (!v->s.esc3_level_length)
|
yading@10
|
2544 v->s.esc3_level_length = get_bits(gb, 2) + 8;
|
yading@10
|
2545 } else { // table 60
|
yading@10
|
2546 v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
|
yading@10
|
2547 }
|
yading@10
|
2548 v->s.esc3_run_length = 3 + get_bits(gb, 2);
|
yading@10
|
2549 }
|
yading@10
|
2550 run = get_bits(gb, v->s.esc3_run_length);
|
yading@10
|
2551 sign = get_bits1(gb);
|
yading@10
|
2552 level = get_bits(gb, v->s.esc3_level_length);
|
yading@10
|
2553 if (sign)
|
yading@10
|
2554 level = -level;
|
yading@10
|
2555 }
|
yading@10
|
2556 }
|
yading@10
|
2557
|
yading@10
|
2558 *last = lst;
|
yading@10
|
2559 *skip = run;
|
yading@10
|
2560 *value = level;
|
yading@10
|
2561 }
|
yading@10
|
2562
|
yading@10
|
2563 /** Decode intra block in intra frames - should be faster than decode_intra_block
|
yading@10
|
2564 * @param v VC1Context
|
yading@10
|
2565 * @param block block to decode
|
yading@10
|
2566 * @param[in] n subblock index
|
yading@10
|
2567 * @param coded are AC coeffs present or not
|
yading@10
|
2568 * @param codingset set of VLC to decode data
|
yading@10
|
2569 */
|
yading@10
|
2570 static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
|
yading@10
|
2571 int coded, int codingset)
|
yading@10
|
2572 {
|
yading@10
|
2573 GetBitContext *gb = &v->s.gb;
|
yading@10
|
2574 MpegEncContext *s = &v->s;
|
yading@10
|
2575 int dc_pred_dir = 0; /* Direction of the DC prediction used */
|
yading@10
|
2576 int i;
|
yading@10
|
2577 int16_t *dc_val;
|
yading@10
|
2578 int16_t *ac_val, *ac_val2;
|
yading@10
|
2579 int dcdiff;
|
yading@10
|
2580
|
yading@10
|
2581 /* Get DC differential */
|
yading@10
|
2582 if (n < 4) {
|
yading@10
|
2583 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
2584 } else {
|
yading@10
|
2585 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
2586 }
|
yading@10
|
2587 if (dcdiff < 0) {
|
yading@10
|
2588 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
|
yading@10
|
2589 return -1;
|
yading@10
|
2590 }
|
yading@10
|
2591 if (dcdiff) {
|
yading@10
|
2592 if (dcdiff == 119 /* ESC index value */) {
|
yading@10
|
2593 /* TODO: Optimize */
|
yading@10
|
2594 if (v->pq == 1) dcdiff = get_bits(gb, 10);
|
yading@10
|
2595 else if (v->pq == 2) dcdiff = get_bits(gb, 9);
|
yading@10
|
2596 else dcdiff = get_bits(gb, 8);
|
yading@10
|
2597 } else {
|
yading@10
|
2598 if (v->pq == 1)
|
yading@10
|
2599 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
|
yading@10
|
2600 else if (v->pq == 2)
|
yading@10
|
2601 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
|
yading@10
|
2602 }
|
yading@10
|
2603 if (get_bits1(gb))
|
yading@10
|
2604 dcdiff = -dcdiff;
|
yading@10
|
2605 }
|
yading@10
|
2606
|
yading@10
|
2607 /* Prediction */
|
yading@10
|
2608 dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
|
yading@10
|
2609 *dc_val = dcdiff;
|
yading@10
|
2610
|
yading@10
|
2611 /* Store the quantized DC coeff, used for prediction */
|
yading@10
|
2612 if (n < 4) {
|
yading@10
|
2613 block[0] = dcdiff * s->y_dc_scale;
|
yading@10
|
2614 } else {
|
yading@10
|
2615 block[0] = dcdiff * s->c_dc_scale;
|
yading@10
|
2616 }
|
yading@10
|
2617 /* Skip ? */
|
yading@10
|
2618 if (!coded) {
|
yading@10
|
2619 goto not_coded;
|
yading@10
|
2620 }
|
yading@10
|
2621
|
yading@10
|
2622 // AC Decoding
|
yading@10
|
2623 i = 1;
|
yading@10
|
2624
|
yading@10
|
2625 {
|
yading@10
|
2626 int last = 0, skip, value;
|
yading@10
|
2627 const uint8_t *zz_table;
|
yading@10
|
2628 int scale;
|
yading@10
|
2629 int k;
|
yading@10
|
2630
|
yading@10
|
2631 scale = v->pq * 2 + v->halfpq;
|
yading@10
|
2632
|
yading@10
|
2633 if (v->s.ac_pred) {
|
yading@10
|
2634 if (!dc_pred_dir)
|
yading@10
|
2635 zz_table = v->zz_8x8[2];
|
yading@10
|
2636 else
|
yading@10
|
2637 zz_table = v->zz_8x8[3];
|
yading@10
|
2638 } else
|
yading@10
|
2639 zz_table = v->zz_8x8[1];
|
yading@10
|
2640
|
yading@10
|
2641 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
|
yading@10
|
2642 ac_val2 = ac_val;
|
yading@10
|
2643 if (dc_pred_dir) // left
|
yading@10
|
2644 ac_val -= 16;
|
yading@10
|
2645 else // top
|
yading@10
|
2646 ac_val -= 16 * s->block_wrap[n];
|
yading@10
|
2647
|
yading@10
|
2648 while (!last) {
|
yading@10
|
2649 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
|
yading@10
|
2650 i += skip;
|
yading@10
|
2651 if (i > 63)
|
yading@10
|
2652 break;
|
yading@10
|
2653 block[zz_table[i++]] = value;
|
yading@10
|
2654 }
|
yading@10
|
2655
|
yading@10
|
2656 /* apply AC prediction if needed */
|
yading@10
|
2657 if (s->ac_pred) {
|
yading@10
|
2658 if (dc_pred_dir) { // left
|
yading@10
|
2659 for (k = 1; k < 8; k++)
|
yading@10
|
2660 block[k << v->left_blk_sh] += ac_val[k];
|
yading@10
|
2661 } else { // top
|
yading@10
|
2662 for (k = 1; k < 8; k++)
|
yading@10
|
2663 block[k << v->top_blk_sh] += ac_val[k + 8];
|
yading@10
|
2664 }
|
yading@10
|
2665 }
|
yading@10
|
2666 /* save AC coeffs for further prediction */
|
yading@10
|
2667 for (k = 1; k < 8; k++) {
|
yading@10
|
2668 ac_val2[k] = block[k << v->left_blk_sh];
|
yading@10
|
2669 ac_val2[k + 8] = block[k << v->top_blk_sh];
|
yading@10
|
2670 }
|
yading@10
|
2671
|
yading@10
|
2672 /* scale AC coeffs */
|
yading@10
|
2673 for (k = 1; k < 64; k++)
|
yading@10
|
2674 if (block[k]) {
|
yading@10
|
2675 block[k] *= scale;
|
yading@10
|
2676 if (!v->pquantizer)
|
yading@10
|
2677 block[k] += (block[k] < 0) ? -v->pq : v->pq;
|
yading@10
|
2678 }
|
yading@10
|
2679
|
yading@10
|
2680 if (s->ac_pred) i = 63;
|
yading@10
|
2681 }
|
yading@10
|
2682
|
yading@10
|
2683 not_coded:
|
yading@10
|
2684 if (!coded) {
|
yading@10
|
2685 int k, scale;
|
yading@10
|
2686 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
|
yading@10
|
2687 ac_val2 = ac_val;
|
yading@10
|
2688
|
yading@10
|
2689 i = 0;
|
yading@10
|
2690 scale = v->pq * 2 + v->halfpq;
|
yading@10
|
2691 memset(ac_val2, 0, 16 * 2);
|
yading@10
|
2692 if (dc_pred_dir) { // left
|
yading@10
|
2693 ac_val -= 16;
|
yading@10
|
2694 if (s->ac_pred)
|
yading@10
|
2695 memcpy(ac_val2, ac_val, 8 * 2);
|
yading@10
|
2696 } else { // top
|
yading@10
|
2697 ac_val -= 16 * s->block_wrap[n];
|
yading@10
|
2698 if (s->ac_pred)
|
yading@10
|
2699 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
|
yading@10
|
2700 }
|
yading@10
|
2701
|
yading@10
|
2702 /* apply AC prediction if needed */
|
yading@10
|
2703 if (s->ac_pred) {
|
yading@10
|
2704 if (dc_pred_dir) { //left
|
yading@10
|
2705 for (k = 1; k < 8; k++) {
|
yading@10
|
2706 block[k << v->left_blk_sh] = ac_val[k] * scale;
|
yading@10
|
2707 if (!v->pquantizer && block[k << v->left_blk_sh])
|
yading@10
|
2708 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq;
|
yading@10
|
2709 }
|
yading@10
|
2710 } else { // top
|
yading@10
|
2711 for (k = 1; k < 8; k++) {
|
yading@10
|
2712 block[k << v->top_blk_sh] = ac_val[k + 8] * scale;
|
yading@10
|
2713 if (!v->pquantizer && block[k << v->top_blk_sh])
|
yading@10
|
2714 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq;
|
yading@10
|
2715 }
|
yading@10
|
2716 }
|
yading@10
|
2717 i = 63;
|
yading@10
|
2718 }
|
yading@10
|
2719 }
|
yading@10
|
2720 s->block_last_index[n] = i;
|
yading@10
|
2721
|
yading@10
|
2722 return 0;
|
yading@10
|
2723 }
|
yading@10
|
2724
|
yading@10
|
2725 /** Decode intra block in intra frames - should be faster than decode_intra_block
|
yading@10
|
2726 * @param v VC1Context
|
yading@10
|
2727 * @param block block to decode
|
yading@10
|
2728 * @param[in] n subblock number
|
yading@10
|
2729 * @param coded are AC coeffs present or not
|
yading@10
|
2730 * @param codingset set of VLC to decode data
|
yading@10
|
2731 * @param mquant quantizer value for this macroblock
|
yading@10
|
2732 */
|
yading@10
|
2733 static int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n,
|
yading@10
|
2734 int coded, int codingset, int mquant)
|
yading@10
|
2735 {
|
yading@10
|
2736 GetBitContext *gb = &v->s.gb;
|
yading@10
|
2737 MpegEncContext *s = &v->s;
|
yading@10
|
2738 int dc_pred_dir = 0; /* Direction of the DC prediction used */
|
yading@10
|
2739 int i;
|
yading@10
|
2740 int16_t *dc_val = NULL;
|
yading@10
|
2741 int16_t *ac_val, *ac_val2;
|
yading@10
|
2742 int dcdiff;
|
yading@10
|
2743 int a_avail = v->a_avail, c_avail = v->c_avail;
|
yading@10
|
2744 int use_pred = s->ac_pred;
|
yading@10
|
2745 int scale;
|
yading@10
|
2746 int q1, q2 = 0;
|
yading@10
|
2747 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
2748
|
yading@10
|
2749 /* Get DC differential */
|
yading@10
|
2750 if (n < 4) {
|
yading@10
|
2751 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
2752 } else {
|
yading@10
|
2753 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
2754 }
|
yading@10
|
2755 if (dcdiff < 0) {
|
yading@10
|
2756 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
|
yading@10
|
2757 return -1;
|
yading@10
|
2758 }
|
yading@10
|
2759 if (dcdiff) {
|
yading@10
|
2760 if (dcdiff == 119 /* ESC index value */) {
|
yading@10
|
2761 /* TODO: Optimize */
|
yading@10
|
2762 if (mquant == 1) dcdiff = get_bits(gb, 10);
|
yading@10
|
2763 else if (mquant == 2) dcdiff = get_bits(gb, 9);
|
yading@10
|
2764 else dcdiff = get_bits(gb, 8);
|
yading@10
|
2765 } else {
|
yading@10
|
2766 if (mquant == 1)
|
yading@10
|
2767 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
|
yading@10
|
2768 else if (mquant == 2)
|
yading@10
|
2769 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
|
yading@10
|
2770 }
|
yading@10
|
2771 if (get_bits1(gb))
|
yading@10
|
2772 dcdiff = -dcdiff;
|
yading@10
|
2773 }
|
yading@10
|
2774
|
yading@10
|
2775 /* Prediction */
|
yading@10
|
2776 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
|
yading@10
|
2777 *dc_val = dcdiff;
|
yading@10
|
2778
|
yading@10
|
2779 /* Store the quantized DC coeff, used for prediction */
|
yading@10
|
2780 if (n < 4) {
|
yading@10
|
2781 block[0] = dcdiff * s->y_dc_scale;
|
yading@10
|
2782 } else {
|
yading@10
|
2783 block[0] = dcdiff * s->c_dc_scale;
|
yading@10
|
2784 }
|
yading@10
|
2785
|
yading@10
|
2786 //AC Decoding
|
yading@10
|
2787 i = 1;
|
yading@10
|
2788
|
yading@10
|
2789 /* check if AC is needed at all */
|
yading@10
|
2790 if (!a_avail && !c_avail)
|
yading@10
|
2791 use_pred = 0;
|
yading@10
|
2792 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
|
yading@10
|
2793 ac_val2 = ac_val;
|
yading@10
|
2794
|
yading@10
|
2795 scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
|
yading@10
|
2796
|
yading@10
|
2797 if (dc_pred_dir) // left
|
yading@10
|
2798 ac_val -= 16;
|
yading@10
|
2799 else // top
|
yading@10
|
2800 ac_val -= 16 * s->block_wrap[n];
|
yading@10
|
2801
|
yading@10
|
2802 q1 = s->current_picture.qscale_table[mb_pos];
|
yading@10
|
2803 if ( dc_pred_dir && c_avail && mb_pos)
|
yading@10
|
2804 q2 = s->current_picture.qscale_table[mb_pos - 1];
|
yading@10
|
2805 if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
|
yading@10
|
2806 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
|
yading@10
|
2807 if ( dc_pred_dir && n == 1)
|
yading@10
|
2808 q2 = q1;
|
yading@10
|
2809 if (!dc_pred_dir && n == 2)
|
yading@10
|
2810 q2 = q1;
|
yading@10
|
2811 if (n == 3)
|
yading@10
|
2812 q2 = q1;
|
yading@10
|
2813
|
yading@10
|
2814 if (coded) {
|
yading@10
|
2815 int last = 0, skip, value;
|
yading@10
|
2816 const uint8_t *zz_table;
|
yading@10
|
2817 int k;
|
yading@10
|
2818
|
yading@10
|
2819 if (v->s.ac_pred) {
|
yading@10
|
2820 if (!use_pred && v->fcm == ILACE_FRAME) {
|
yading@10
|
2821 zz_table = v->zzi_8x8;
|
yading@10
|
2822 } else {
|
yading@10
|
2823 if (!dc_pred_dir) // top
|
yading@10
|
2824 zz_table = v->zz_8x8[2];
|
yading@10
|
2825 else // left
|
yading@10
|
2826 zz_table = v->zz_8x8[3];
|
yading@10
|
2827 }
|
yading@10
|
2828 } else {
|
yading@10
|
2829 if (v->fcm != ILACE_FRAME)
|
yading@10
|
2830 zz_table = v->zz_8x8[1];
|
yading@10
|
2831 else
|
yading@10
|
2832 zz_table = v->zzi_8x8;
|
yading@10
|
2833 }
|
yading@10
|
2834
|
yading@10
|
2835 while (!last) {
|
yading@10
|
2836 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
|
yading@10
|
2837 i += skip;
|
yading@10
|
2838 if (i > 63)
|
yading@10
|
2839 break;
|
yading@10
|
2840 block[zz_table[i++]] = value;
|
yading@10
|
2841 }
|
yading@10
|
2842
|
yading@10
|
2843 /* apply AC prediction if needed */
|
yading@10
|
2844 if (use_pred) {
|
yading@10
|
2845 /* scale predictors if needed*/
|
yading@10
|
2846 if (q2 && q1 != q2) {
|
yading@10
|
2847 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
2848 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
2849
|
yading@10
|
2850 if (q1 < 1)
|
yading@10
|
2851 return AVERROR_INVALIDDATA;
|
yading@10
|
2852 if (dc_pred_dir) { // left
|
yading@10
|
2853 for (k = 1; k < 8; k++)
|
yading@10
|
2854 block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
2855 } else { // top
|
yading@10
|
2856 for (k = 1; k < 8; k++)
|
yading@10
|
2857 block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
2858 }
|
yading@10
|
2859 } else {
|
yading@10
|
2860 if (dc_pred_dir) { //left
|
yading@10
|
2861 for (k = 1; k < 8; k++)
|
yading@10
|
2862 block[k << v->left_blk_sh] += ac_val[k];
|
yading@10
|
2863 } else { //top
|
yading@10
|
2864 for (k = 1; k < 8; k++)
|
yading@10
|
2865 block[k << v->top_blk_sh] += ac_val[k + 8];
|
yading@10
|
2866 }
|
yading@10
|
2867 }
|
yading@10
|
2868 }
|
yading@10
|
2869 /* save AC coeffs for further prediction */
|
yading@10
|
2870 for (k = 1; k < 8; k++) {
|
yading@10
|
2871 ac_val2[k ] = block[k << v->left_blk_sh];
|
yading@10
|
2872 ac_val2[k + 8] = block[k << v->top_blk_sh];
|
yading@10
|
2873 }
|
yading@10
|
2874
|
yading@10
|
2875 /* scale AC coeffs */
|
yading@10
|
2876 for (k = 1; k < 64; k++)
|
yading@10
|
2877 if (block[k]) {
|
yading@10
|
2878 block[k] *= scale;
|
yading@10
|
2879 if (!v->pquantizer)
|
yading@10
|
2880 block[k] += (block[k] < 0) ? -mquant : mquant;
|
yading@10
|
2881 }
|
yading@10
|
2882
|
yading@10
|
2883 if (use_pred) i = 63;
|
yading@10
|
2884 } else { // no AC coeffs
|
yading@10
|
2885 int k;
|
yading@10
|
2886
|
yading@10
|
2887 memset(ac_val2, 0, 16 * 2);
|
yading@10
|
2888 if (dc_pred_dir) { // left
|
yading@10
|
2889 if (use_pred) {
|
yading@10
|
2890 memcpy(ac_val2, ac_val, 8 * 2);
|
yading@10
|
2891 if (q2 && q1 != q2) {
|
yading@10
|
2892 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
2893 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
2894 if (q1 < 1)
|
yading@10
|
2895 return AVERROR_INVALIDDATA;
|
yading@10
|
2896 for (k = 1; k < 8; k++)
|
yading@10
|
2897 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
2898 }
|
yading@10
|
2899 }
|
yading@10
|
2900 } else { // top
|
yading@10
|
2901 if (use_pred) {
|
yading@10
|
2902 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
|
yading@10
|
2903 if (q2 && q1 != q2) {
|
yading@10
|
2904 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
2905 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
2906 if (q1 < 1)
|
yading@10
|
2907 return AVERROR_INVALIDDATA;
|
yading@10
|
2908 for (k = 1; k < 8; k++)
|
yading@10
|
2909 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
2910 }
|
yading@10
|
2911 }
|
yading@10
|
2912 }
|
yading@10
|
2913
|
yading@10
|
2914 /* apply AC prediction if needed */
|
yading@10
|
2915 if (use_pred) {
|
yading@10
|
2916 if (dc_pred_dir) { // left
|
yading@10
|
2917 for (k = 1; k < 8; k++) {
|
yading@10
|
2918 block[k << v->left_blk_sh] = ac_val2[k] * scale;
|
yading@10
|
2919 if (!v->pquantizer && block[k << v->left_blk_sh])
|
yading@10
|
2920 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
|
yading@10
|
2921 }
|
yading@10
|
2922 } else { // top
|
yading@10
|
2923 for (k = 1; k < 8; k++) {
|
yading@10
|
2924 block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
|
yading@10
|
2925 if (!v->pquantizer && block[k << v->top_blk_sh])
|
yading@10
|
2926 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
|
yading@10
|
2927 }
|
yading@10
|
2928 }
|
yading@10
|
2929 i = 63;
|
yading@10
|
2930 }
|
yading@10
|
2931 }
|
yading@10
|
2932 s->block_last_index[n] = i;
|
yading@10
|
2933
|
yading@10
|
2934 return 0;
|
yading@10
|
2935 }
|
yading@10
|
2936
|
yading@10
|
2937 /** Decode intra block in inter frames - more generic version than vc1_decode_i_block
|
yading@10
|
2938 * @param v VC1Context
|
yading@10
|
2939 * @param block block to decode
|
yading@10
|
2940 * @param[in] n subblock index
|
yading@10
|
2941 * @param coded are AC coeffs present or not
|
yading@10
|
2942 * @param mquant block quantizer
|
yading@10
|
2943 * @param codingset set of VLC to decode data
|
yading@10
|
2944 */
|
yading@10
|
2945 static int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n,
|
yading@10
|
2946 int coded, int mquant, int codingset)
|
yading@10
|
2947 {
|
yading@10
|
2948 GetBitContext *gb = &v->s.gb;
|
yading@10
|
2949 MpegEncContext *s = &v->s;
|
yading@10
|
2950 int dc_pred_dir = 0; /* Direction of the DC prediction used */
|
yading@10
|
2951 int i;
|
yading@10
|
2952 int16_t *dc_val = NULL;
|
yading@10
|
2953 int16_t *ac_val, *ac_val2;
|
yading@10
|
2954 int dcdiff;
|
yading@10
|
2955 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
2956 int a_avail = v->a_avail, c_avail = v->c_avail;
|
yading@10
|
2957 int use_pred = s->ac_pred;
|
yading@10
|
2958 int scale;
|
yading@10
|
2959 int q1, q2 = 0;
|
yading@10
|
2960
|
yading@10
|
2961 s->dsp.clear_block(block);
|
yading@10
|
2962
|
yading@10
|
2963 /* XXX: Guard against dumb values of mquant */
|
yading@10
|
2964 mquant = (mquant < 1) ? 0 : ((mquant > 31) ? 31 : mquant);
|
yading@10
|
2965
|
yading@10
|
2966 /* Set DC scale - y and c use the same */
|
yading@10
|
2967 s->y_dc_scale = s->y_dc_scale_table[mquant];
|
yading@10
|
2968 s->c_dc_scale = s->c_dc_scale_table[mquant];
|
yading@10
|
2969
|
yading@10
|
2970 /* Get DC differential */
|
yading@10
|
2971 if (n < 4) {
|
yading@10
|
2972 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
2973 } else {
|
yading@10
|
2974 dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
2975 }
|
yading@10
|
2976 if (dcdiff < 0) {
|
yading@10
|
2977 av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
|
yading@10
|
2978 return -1;
|
yading@10
|
2979 }
|
yading@10
|
2980 if (dcdiff) {
|
yading@10
|
2981 if (dcdiff == 119 /* ESC index value */) {
|
yading@10
|
2982 /* TODO: Optimize */
|
yading@10
|
2983 if (mquant == 1) dcdiff = get_bits(gb, 10);
|
yading@10
|
2984 else if (mquant == 2) dcdiff = get_bits(gb, 9);
|
yading@10
|
2985 else dcdiff = get_bits(gb, 8);
|
yading@10
|
2986 } else {
|
yading@10
|
2987 if (mquant == 1)
|
yading@10
|
2988 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
|
yading@10
|
2989 else if (mquant == 2)
|
yading@10
|
2990 dcdiff = (dcdiff << 1) + get_bits1(gb) - 1;
|
yading@10
|
2991 }
|
yading@10
|
2992 if (get_bits1(gb))
|
yading@10
|
2993 dcdiff = -dcdiff;
|
yading@10
|
2994 }
|
yading@10
|
2995
|
yading@10
|
2996 /* Prediction */
|
yading@10
|
2997 dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
|
yading@10
|
2998 *dc_val = dcdiff;
|
yading@10
|
2999
|
yading@10
|
3000 /* Store the quantized DC coeff, used for prediction */
|
yading@10
|
3001
|
yading@10
|
3002 if (n < 4) {
|
yading@10
|
3003 block[0] = dcdiff * s->y_dc_scale;
|
yading@10
|
3004 } else {
|
yading@10
|
3005 block[0] = dcdiff * s->c_dc_scale;
|
yading@10
|
3006 }
|
yading@10
|
3007
|
yading@10
|
3008 //AC Decoding
|
yading@10
|
3009 i = 1;
|
yading@10
|
3010
|
yading@10
|
3011 /* check if AC is needed at all and adjust direction if needed */
|
yading@10
|
3012 if (!a_avail) dc_pred_dir = 1;
|
yading@10
|
3013 if (!c_avail) dc_pred_dir = 0;
|
yading@10
|
3014 if (!a_avail && !c_avail) use_pred = 0;
|
yading@10
|
3015 ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
|
yading@10
|
3016 ac_val2 = ac_val;
|
yading@10
|
3017
|
yading@10
|
3018 scale = mquant * 2 + v->halfpq;
|
yading@10
|
3019
|
yading@10
|
3020 if (dc_pred_dir) //left
|
yading@10
|
3021 ac_val -= 16;
|
yading@10
|
3022 else //top
|
yading@10
|
3023 ac_val -= 16 * s->block_wrap[n];
|
yading@10
|
3024
|
yading@10
|
3025 q1 = s->current_picture.qscale_table[mb_pos];
|
yading@10
|
3026 if (dc_pred_dir && c_avail && mb_pos)
|
yading@10
|
3027 q2 = s->current_picture.qscale_table[mb_pos - 1];
|
yading@10
|
3028 if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
|
yading@10
|
3029 q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
|
yading@10
|
3030 if ( dc_pred_dir && n == 1)
|
yading@10
|
3031 q2 = q1;
|
yading@10
|
3032 if (!dc_pred_dir && n == 2)
|
yading@10
|
3033 q2 = q1;
|
yading@10
|
3034 if (n == 3) q2 = q1;
|
yading@10
|
3035
|
yading@10
|
3036 if (coded) {
|
yading@10
|
3037 int last = 0, skip, value;
|
yading@10
|
3038 int k;
|
yading@10
|
3039
|
yading@10
|
3040 while (!last) {
|
yading@10
|
3041 vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
|
yading@10
|
3042 i += skip;
|
yading@10
|
3043 if (i > 63)
|
yading@10
|
3044 break;
|
yading@10
|
3045 if (v->fcm == PROGRESSIVE)
|
yading@10
|
3046 block[v->zz_8x8[0][i++]] = value;
|
yading@10
|
3047 else {
|
yading@10
|
3048 if (use_pred && (v->fcm == ILACE_FRAME)) {
|
yading@10
|
3049 if (!dc_pred_dir) // top
|
yading@10
|
3050 block[v->zz_8x8[2][i++]] = value;
|
yading@10
|
3051 else // left
|
yading@10
|
3052 block[v->zz_8x8[3][i++]] = value;
|
yading@10
|
3053 } else {
|
yading@10
|
3054 block[v->zzi_8x8[i++]] = value;
|
yading@10
|
3055 }
|
yading@10
|
3056 }
|
yading@10
|
3057 }
|
yading@10
|
3058
|
yading@10
|
3059 /* apply AC prediction if needed */
|
yading@10
|
3060 if (use_pred) {
|
yading@10
|
3061 /* scale predictors if needed*/
|
yading@10
|
3062 if (q2 && q1 != q2) {
|
yading@10
|
3063 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
3064 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
3065
|
yading@10
|
3066 if (q1 < 1)
|
yading@10
|
3067 return AVERROR_INVALIDDATA;
|
yading@10
|
3068 if (dc_pred_dir) { // left
|
yading@10
|
3069 for (k = 1; k < 8; k++)
|
yading@10
|
3070 block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
3071 } else { //top
|
yading@10
|
3072 for (k = 1; k < 8; k++)
|
yading@10
|
3073 block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
3074 }
|
yading@10
|
3075 } else {
|
yading@10
|
3076 if (dc_pred_dir) { // left
|
yading@10
|
3077 for (k = 1; k < 8; k++)
|
yading@10
|
3078 block[k << v->left_blk_sh] += ac_val[k];
|
yading@10
|
3079 } else { // top
|
yading@10
|
3080 for (k = 1; k < 8; k++)
|
yading@10
|
3081 block[k << v->top_blk_sh] += ac_val[k + 8];
|
yading@10
|
3082 }
|
yading@10
|
3083 }
|
yading@10
|
3084 }
|
yading@10
|
3085 /* save AC coeffs for further prediction */
|
yading@10
|
3086 for (k = 1; k < 8; k++) {
|
yading@10
|
3087 ac_val2[k ] = block[k << v->left_blk_sh];
|
yading@10
|
3088 ac_val2[k + 8] = block[k << v->top_blk_sh];
|
yading@10
|
3089 }
|
yading@10
|
3090
|
yading@10
|
3091 /* scale AC coeffs */
|
yading@10
|
3092 for (k = 1; k < 64; k++)
|
yading@10
|
3093 if (block[k]) {
|
yading@10
|
3094 block[k] *= scale;
|
yading@10
|
3095 if (!v->pquantizer)
|
yading@10
|
3096 block[k] += (block[k] < 0) ? -mquant : mquant;
|
yading@10
|
3097 }
|
yading@10
|
3098
|
yading@10
|
3099 if (use_pred) i = 63;
|
yading@10
|
3100 } else { // no AC coeffs
|
yading@10
|
3101 int k;
|
yading@10
|
3102
|
yading@10
|
3103 memset(ac_val2, 0, 16 * 2);
|
yading@10
|
3104 if (dc_pred_dir) { // left
|
yading@10
|
3105 if (use_pred) {
|
yading@10
|
3106 memcpy(ac_val2, ac_val, 8 * 2);
|
yading@10
|
3107 if (q2 && q1 != q2) {
|
yading@10
|
3108 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
3109 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
3110 if (q1 < 1)
|
yading@10
|
3111 return AVERROR_INVALIDDATA;
|
yading@10
|
3112 for (k = 1; k < 8; k++)
|
yading@10
|
3113 ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
3114 }
|
yading@10
|
3115 }
|
yading@10
|
3116 } else { // top
|
yading@10
|
3117 if (use_pred) {
|
yading@10
|
3118 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
|
yading@10
|
3119 if (q2 && q1 != q2) {
|
yading@10
|
3120 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
3121 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
|
yading@10
|
3122 if (q1 < 1)
|
yading@10
|
3123 return AVERROR_INVALIDDATA;
|
yading@10
|
3124 for (k = 1; k < 8; k++)
|
yading@10
|
3125 ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
|
yading@10
|
3126 }
|
yading@10
|
3127 }
|
yading@10
|
3128 }
|
yading@10
|
3129
|
yading@10
|
3130 /* apply AC prediction if needed */
|
yading@10
|
3131 if (use_pred) {
|
yading@10
|
3132 if (dc_pred_dir) { // left
|
yading@10
|
3133 for (k = 1; k < 8; k++) {
|
yading@10
|
3134 block[k << v->left_blk_sh] = ac_val2[k] * scale;
|
yading@10
|
3135 if (!v->pquantizer && block[k << v->left_blk_sh])
|
yading@10
|
3136 block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
|
yading@10
|
3137 }
|
yading@10
|
3138 } else { // top
|
yading@10
|
3139 for (k = 1; k < 8; k++) {
|
yading@10
|
3140 block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
|
yading@10
|
3141 if (!v->pquantizer && block[k << v->top_blk_sh])
|
yading@10
|
3142 block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
|
yading@10
|
3143 }
|
yading@10
|
3144 }
|
yading@10
|
3145 i = 63;
|
yading@10
|
3146 }
|
yading@10
|
3147 }
|
yading@10
|
3148 s->block_last_index[n] = i;
|
yading@10
|
3149
|
yading@10
|
3150 return 0;
|
yading@10
|
3151 }
|
yading@10
|
3152
|
yading@10
|
3153 /** Decode P block
|
yading@10
|
3154 */
|
yading@10
|
3155 static int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n,
|
yading@10
|
3156 int mquant, int ttmb, int first_block,
|
yading@10
|
3157 uint8_t *dst, int linesize, int skip_block,
|
yading@10
|
3158 int *ttmb_out)
|
yading@10
|
3159 {
|
yading@10
|
3160 MpegEncContext *s = &v->s;
|
yading@10
|
3161 GetBitContext *gb = &s->gb;
|
yading@10
|
3162 int i, j;
|
yading@10
|
3163 int subblkpat = 0;
|
yading@10
|
3164 int scale, off, idx, last, skip, value;
|
yading@10
|
3165 int ttblk = ttmb & 7;
|
yading@10
|
3166 int pat = 0;
|
yading@10
|
3167
|
yading@10
|
3168 s->dsp.clear_block(block);
|
yading@10
|
3169
|
yading@10
|
3170 if (ttmb == -1) {
|
yading@10
|
3171 ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
|
yading@10
|
3172 }
|
yading@10
|
3173 if (ttblk == TT_4X4) {
|
yading@10
|
3174 subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
|
yading@10
|
3175 }
|
yading@10
|
3176 if ((ttblk != TT_8X8 && ttblk != TT_4X4)
|
yading@10
|
3177 && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
|
yading@10
|
3178 || (!v->res_rtm_flag && !first_block))) {
|
yading@10
|
3179 subblkpat = decode012(gb);
|
yading@10
|
3180 if (subblkpat)
|
yading@10
|
3181 subblkpat ^= 3; // swap decoded pattern bits
|
yading@10
|
3182 if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM)
|
yading@10
|
3183 ttblk = TT_8X4;
|
yading@10
|
3184 if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT)
|
yading@10
|
3185 ttblk = TT_4X8;
|
yading@10
|
3186 }
|
yading@10
|
3187 scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
|
yading@10
|
3188
|
yading@10
|
3189 // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
|
yading@10
|
3190 if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
|
yading@10
|
3191 subblkpat = 2 - (ttblk == TT_8X4_TOP);
|
yading@10
|
3192 ttblk = TT_8X4;
|
yading@10
|
3193 }
|
yading@10
|
3194 if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
|
yading@10
|
3195 subblkpat = 2 - (ttblk == TT_4X8_LEFT);
|
yading@10
|
3196 ttblk = TT_4X8;
|
yading@10
|
3197 }
|
yading@10
|
3198 switch (ttblk) {
|
yading@10
|
3199 case TT_8X8:
|
yading@10
|
3200 pat = 0xF;
|
yading@10
|
3201 i = 0;
|
yading@10
|
3202 last = 0;
|
yading@10
|
3203 while (!last) {
|
yading@10
|
3204 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
|
yading@10
|
3205 i += skip;
|
yading@10
|
3206 if (i > 63)
|
yading@10
|
3207 break;
|
yading@10
|
3208 if (!v->fcm)
|
yading@10
|
3209 idx = v->zz_8x8[0][i++];
|
yading@10
|
3210 else
|
yading@10
|
3211 idx = v->zzi_8x8[i++];
|
yading@10
|
3212 block[idx] = value * scale;
|
yading@10
|
3213 if (!v->pquantizer)
|
yading@10
|
3214 block[idx] += (block[idx] < 0) ? -mquant : mquant;
|
yading@10
|
3215 }
|
yading@10
|
3216 if (!skip_block) {
|
yading@10
|
3217 if (i == 1)
|
yading@10
|
3218 v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
|
yading@10
|
3219 else {
|
yading@10
|
3220 v->vc1dsp.vc1_inv_trans_8x8(block);
|
yading@10
|
3221 s->dsp.add_pixels_clamped(block, dst, linesize);
|
yading@10
|
3222 }
|
yading@10
|
3223 }
|
yading@10
|
3224 break;
|
yading@10
|
3225 case TT_4X4:
|
yading@10
|
3226 pat = ~subblkpat & 0xF;
|
yading@10
|
3227 for (j = 0; j < 4; j++) {
|
yading@10
|
3228 last = subblkpat & (1 << (3 - j));
|
yading@10
|
3229 i = 0;
|
yading@10
|
3230 off = (j & 1) * 4 + (j & 2) * 16;
|
yading@10
|
3231 while (!last) {
|
yading@10
|
3232 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
|
yading@10
|
3233 i += skip;
|
yading@10
|
3234 if (i > 15)
|
yading@10
|
3235 break;
|
yading@10
|
3236 if (!v->fcm)
|
yading@10
|
3237 idx = ff_vc1_simple_progressive_4x4_zz[i++];
|
yading@10
|
3238 else
|
yading@10
|
3239 idx = ff_vc1_adv_interlaced_4x4_zz[i++];
|
yading@10
|
3240 block[idx + off] = value * scale;
|
yading@10
|
3241 if (!v->pquantizer)
|
yading@10
|
3242 block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
|
yading@10
|
3243 }
|
yading@10
|
3244 if (!(subblkpat & (1 << (3 - j))) && !skip_block) {
|
yading@10
|
3245 if (i == 1)
|
yading@10
|
3246 v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
|
yading@10
|
3247 else
|
yading@10
|
3248 v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
|
yading@10
|
3249 }
|
yading@10
|
3250 }
|
yading@10
|
3251 break;
|
yading@10
|
3252 case TT_8X4:
|
yading@10
|
3253 pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF;
|
yading@10
|
3254 for (j = 0; j < 2; j++) {
|
yading@10
|
3255 last = subblkpat & (1 << (1 - j));
|
yading@10
|
3256 i = 0;
|
yading@10
|
3257 off = j * 32;
|
yading@10
|
3258 while (!last) {
|
yading@10
|
3259 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
|
yading@10
|
3260 i += skip;
|
yading@10
|
3261 if (i > 31)
|
yading@10
|
3262 break;
|
yading@10
|
3263 if (!v->fcm)
|
yading@10
|
3264 idx = v->zz_8x4[i++] + off;
|
yading@10
|
3265 else
|
yading@10
|
3266 idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off;
|
yading@10
|
3267 block[idx] = value * scale;
|
yading@10
|
3268 if (!v->pquantizer)
|
yading@10
|
3269 block[idx] += (block[idx] < 0) ? -mquant : mquant;
|
yading@10
|
3270 }
|
yading@10
|
3271 if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
|
yading@10
|
3272 if (i == 1)
|
yading@10
|
3273 v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off);
|
yading@10
|
3274 else
|
yading@10
|
3275 v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off);
|
yading@10
|
3276 }
|
yading@10
|
3277 }
|
yading@10
|
3278 break;
|
yading@10
|
3279 case TT_4X8:
|
yading@10
|
3280 pat = ~(subblkpat * 5) & 0xF;
|
yading@10
|
3281 for (j = 0; j < 2; j++) {
|
yading@10
|
3282 last = subblkpat & (1 << (1 - j));
|
yading@10
|
3283 i = 0;
|
yading@10
|
3284 off = j * 4;
|
yading@10
|
3285 while (!last) {
|
yading@10
|
3286 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
|
yading@10
|
3287 i += skip;
|
yading@10
|
3288 if (i > 31)
|
yading@10
|
3289 break;
|
yading@10
|
3290 if (!v->fcm)
|
yading@10
|
3291 idx = v->zz_4x8[i++] + off;
|
yading@10
|
3292 else
|
yading@10
|
3293 idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off;
|
yading@10
|
3294 block[idx] = value * scale;
|
yading@10
|
3295 if (!v->pquantizer)
|
yading@10
|
3296 block[idx] += (block[idx] < 0) ? -mquant : mquant;
|
yading@10
|
3297 }
|
yading@10
|
3298 if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
|
yading@10
|
3299 if (i == 1)
|
yading@10
|
3300 v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off);
|
yading@10
|
3301 else
|
yading@10
|
3302 v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
|
yading@10
|
3303 }
|
yading@10
|
3304 }
|
yading@10
|
3305 break;
|
yading@10
|
3306 }
|
yading@10
|
3307 if (ttmb_out)
|
yading@10
|
3308 *ttmb_out |= ttblk << (n * 4);
|
yading@10
|
3309 return pat;
|
yading@10
|
3310 }
|
yading@10
|
3311
|
yading@10
|
3312 /** @} */ // Macroblock group
|
yading@10
|
3313
|
yading@10
|
3314 static const int size_table [6] = { 0, 2, 3, 4, 5, 8 };
|
yading@10
|
3315 static const int offset_table[6] = { 0, 1, 3, 7, 15, 31 };
|
yading@10
|
3316
|
yading@10
|
3317 static av_always_inline void vc1_apply_p_v_loop_filter(VC1Context *v, int block_num)
|
yading@10
|
3318 {
|
yading@10
|
3319 MpegEncContext *s = &v->s;
|
yading@10
|
3320 int mb_cbp = v->cbp[s->mb_x - s->mb_stride],
|
yading@10
|
3321 block_cbp = mb_cbp >> (block_num * 4), bottom_cbp,
|
yading@10
|
3322 mb_is_intra = v->is_intra[s->mb_x - s->mb_stride],
|
yading@10
|
3323 block_is_intra = mb_is_intra >> (block_num * 4), bottom_is_intra;
|
yading@10
|
3324 int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
|
yading@10
|
3325 uint8_t *dst;
|
yading@10
|
3326
|
yading@10
|
3327 if (block_num > 3) {
|
yading@10
|
3328 dst = s->dest[block_num - 3];
|
yading@10
|
3329 } else {
|
yading@10
|
3330 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 8) * linesize;
|
yading@10
|
3331 }
|
yading@10
|
3332 if (s->mb_y != s->end_mb_y || block_num < 2) {
|
yading@10
|
3333 int16_t (*mv)[2];
|
yading@10
|
3334 int mv_stride;
|
yading@10
|
3335
|
yading@10
|
3336 if (block_num > 3) {
|
yading@10
|
3337 bottom_cbp = v->cbp[s->mb_x] >> (block_num * 4);
|
yading@10
|
3338 bottom_is_intra = v->is_intra[s->mb_x] >> (block_num * 4);
|
yading@10
|
3339 mv = &v->luma_mv[s->mb_x - s->mb_stride];
|
yading@10
|
3340 mv_stride = s->mb_stride;
|
yading@10
|
3341 } else {
|
yading@10
|
3342 bottom_cbp = (block_num < 2) ? (mb_cbp >> ((block_num + 2) * 4))
|
yading@10
|
3343 : (v->cbp[s->mb_x] >> ((block_num - 2) * 4));
|
yading@10
|
3344 bottom_is_intra = (block_num < 2) ? (mb_is_intra >> ((block_num + 2) * 4))
|
yading@10
|
3345 : (v->is_intra[s->mb_x] >> ((block_num - 2) * 4));
|
yading@10
|
3346 mv_stride = s->b8_stride;
|
yading@10
|
3347 mv = &s->current_picture.motion_val[0][s->block_index[block_num] - 2 * mv_stride];
|
yading@10
|
3348 }
|
yading@10
|
3349
|
yading@10
|
3350 if (bottom_is_intra & 1 || block_is_intra & 1 ||
|
yading@10
|
3351 mv[0][0] != mv[mv_stride][0] || mv[0][1] != mv[mv_stride][1]) {
|
yading@10
|
3352 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
|
yading@10
|
3353 } else {
|
yading@10
|
3354 idx = ((bottom_cbp >> 2) | block_cbp) & 3;
|
yading@10
|
3355 if (idx == 3) {
|
yading@10
|
3356 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
|
yading@10
|
3357 } else if (idx) {
|
yading@10
|
3358 if (idx == 1)
|
yading@10
|
3359 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
|
yading@10
|
3360 else
|
yading@10
|
3361 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
|
yading@10
|
3362 }
|
yading@10
|
3363 }
|
yading@10
|
3364 }
|
yading@10
|
3365
|
yading@10
|
3366 dst -= 4 * linesize;
|
yading@10
|
3367 ttblk = (v->ttblk[s->mb_x - s->mb_stride] >> (block_num * 4)) & 0xF;
|
yading@10
|
3368 if (ttblk == TT_4X4 || ttblk == TT_8X4) {
|
yading@10
|
3369 idx = (block_cbp | (block_cbp >> 2)) & 3;
|
yading@10
|
3370 if (idx == 3) {
|
yading@10
|
3371 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
|
yading@10
|
3372 } else if (idx) {
|
yading@10
|
3373 if (idx == 1)
|
yading@10
|
3374 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
|
yading@10
|
3375 else
|
yading@10
|
3376 v->vc1dsp.vc1_v_loop_filter4(dst, linesize, v->pq);
|
yading@10
|
3377 }
|
yading@10
|
3378 }
|
yading@10
|
3379 }
|
yading@10
|
3380
|
yading@10
|
3381 static av_always_inline void vc1_apply_p_h_loop_filter(VC1Context *v, int block_num)
|
yading@10
|
3382 {
|
yading@10
|
3383 MpegEncContext *s = &v->s;
|
yading@10
|
3384 int mb_cbp = v->cbp[s->mb_x - 1 - s->mb_stride],
|
yading@10
|
3385 block_cbp = mb_cbp >> (block_num * 4), right_cbp,
|
yading@10
|
3386 mb_is_intra = v->is_intra[s->mb_x - 1 - s->mb_stride],
|
yading@10
|
3387 block_is_intra = mb_is_intra >> (block_num * 4), right_is_intra;
|
yading@10
|
3388 int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
|
yading@10
|
3389 uint8_t *dst;
|
yading@10
|
3390
|
yading@10
|
3391 if (block_num > 3) {
|
yading@10
|
3392 dst = s->dest[block_num - 3] - 8 * linesize;
|
yading@10
|
3393 } else {
|
yading@10
|
3394 dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 16) * linesize - 8;
|
yading@10
|
3395 }
|
yading@10
|
3396
|
yading@10
|
3397 if (s->mb_x != s->mb_width || !(block_num & 5)) {
|
yading@10
|
3398 int16_t (*mv)[2];
|
yading@10
|
3399
|
yading@10
|
3400 if (block_num > 3) {
|
yading@10
|
3401 right_cbp = v->cbp[s->mb_x - s->mb_stride] >> (block_num * 4);
|
yading@10
|
3402 right_is_intra = v->is_intra[s->mb_x - s->mb_stride] >> (block_num * 4);
|
yading@10
|
3403 mv = &v->luma_mv[s->mb_x - s->mb_stride - 1];
|
yading@10
|
3404 } else {
|
yading@10
|
3405 right_cbp = (block_num & 1) ? (v->cbp[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4))
|
yading@10
|
3406 : (mb_cbp >> ((block_num + 1) * 4));
|
yading@10
|
3407 right_is_intra = (block_num & 1) ? (v->is_intra[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4))
|
yading@10
|
3408 : (mb_is_intra >> ((block_num + 1) * 4));
|
yading@10
|
3409 mv = &s->current_picture.motion_val[0][s->block_index[block_num] - s->b8_stride * 2 - 2];
|
yading@10
|
3410 }
|
yading@10
|
3411 if (block_is_intra & 1 || right_is_intra & 1 || mv[0][0] != mv[1][0] || mv[0][1] != mv[1][1]) {
|
yading@10
|
3412 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
|
yading@10
|
3413 } else {
|
yading@10
|
3414 idx = ((right_cbp >> 1) | block_cbp) & 5; // FIXME check
|
yading@10
|
3415 if (idx == 5) {
|
yading@10
|
3416 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
|
yading@10
|
3417 } else if (idx) {
|
yading@10
|
3418 if (idx == 1)
|
yading@10
|
3419 v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize, linesize, v->pq);
|
yading@10
|
3420 else
|
yading@10
|
3421 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
|
yading@10
|
3422 }
|
yading@10
|
3423 }
|
yading@10
|
3424 }
|
yading@10
|
3425
|
yading@10
|
3426 dst -= 4;
|
yading@10
|
3427 ttblk = (v->ttblk[s->mb_x - s->mb_stride - 1] >> (block_num * 4)) & 0xf;
|
yading@10
|
3428 if (ttblk == TT_4X4 || ttblk == TT_4X8) {
|
yading@10
|
3429 idx = (block_cbp | (block_cbp >> 1)) & 5;
|
yading@10
|
3430 if (idx == 5) {
|
yading@10
|
3431 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
|
yading@10
|
3432 } else if (idx) {
|
yading@10
|
3433 if (idx == 1)
|
yading@10
|
3434 v->vc1dsp.vc1_h_loop_filter4(dst + linesize * 4, linesize, v->pq);
|
yading@10
|
3435 else
|
yading@10
|
3436 v->vc1dsp.vc1_h_loop_filter4(dst, linesize, v->pq);
|
yading@10
|
3437 }
|
yading@10
|
3438 }
|
yading@10
|
3439 }
|
yading@10
|
3440
|
yading@10
|
3441 static void vc1_apply_p_loop_filter(VC1Context *v)
|
yading@10
|
3442 {
|
yading@10
|
3443 MpegEncContext *s = &v->s;
|
yading@10
|
3444 int i;
|
yading@10
|
3445
|
yading@10
|
3446 for (i = 0; i < 6; i++) {
|
yading@10
|
3447 vc1_apply_p_v_loop_filter(v, i);
|
yading@10
|
3448 }
|
yading@10
|
3449
|
yading@10
|
3450 /* V always precedes H, therefore we run H one MB before V;
|
yading@10
|
3451 * at the end of a row, we catch up to complete the row */
|
yading@10
|
3452 if (s->mb_x) {
|
yading@10
|
3453 for (i = 0; i < 6; i++) {
|
yading@10
|
3454 vc1_apply_p_h_loop_filter(v, i);
|
yading@10
|
3455 }
|
yading@10
|
3456 if (s->mb_x == s->mb_width - 1) {
|
yading@10
|
3457 s->mb_x++;
|
yading@10
|
3458 ff_update_block_index(s);
|
yading@10
|
3459 for (i = 0; i < 6; i++) {
|
yading@10
|
3460 vc1_apply_p_h_loop_filter(v, i);
|
yading@10
|
3461 }
|
yading@10
|
3462 }
|
yading@10
|
3463 }
|
yading@10
|
3464 }
|
yading@10
|
3465
|
yading@10
|
3466 /** Decode one P-frame MB
|
yading@10
|
3467 */
|
yading@10
|
3468 static int vc1_decode_p_mb(VC1Context *v)
|
yading@10
|
3469 {
|
yading@10
|
3470 MpegEncContext *s = &v->s;
|
yading@10
|
3471 GetBitContext *gb = &s->gb;
|
yading@10
|
3472 int i, j;
|
yading@10
|
3473 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
3474 int cbp; /* cbp decoding stuff */
|
yading@10
|
3475 int mqdiff, mquant; /* MB quantization */
|
yading@10
|
3476 int ttmb = v->ttfrm; /* MB Transform type */
|
yading@10
|
3477
|
yading@10
|
3478 int mb_has_coeffs = 1; /* last_flag */
|
yading@10
|
3479 int dmv_x, dmv_y; /* Differential MV components */
|
yading@10
|
3480 int index, index1; /* LUT indexes */
|
yading@10
|
3481 int val, sign; /* temp values */
|
yading@10
|
3482 int first_block = 1;
|
yading@10
|
3483 int dst_idx, off;
|
yading@10
|
3484 int skipped, fourmv;
|
yading@10
|
3485 int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
|
yading@10
|
3486
|
yading@10
|
3487 mquant = v->pq; /* lossy initialization */
|
yading@10
|
3488
|
yading@10
|
3489 if (v->mv_type_is_raw)
|
yading@10
|
3490 fourmv = get_bits1(gb);
|
yading@10
|
3491 else
|
yading@10
|
3492 fourmv = v->mv_type_mb_plane[mb_pos];
|
yading@10
|
3493 if (v->skip_is_raw)
|
yading@10
|
3494 skipped = get_bits1(gb);
|
yading@10
|
3495 else
|
yading@10
|
3496 skipped = v->s.mbskip_table[mb_pos];
|
yading@10
|
3497
|
yading@10
|
3498 if (!fourmv) { /* 1MV mode */
|
yading@10
|
3499 if (!skipped) {
|
yading@10
|
3500 GET_MVDATA(dmv_x, dmv_y);
|
yading@10
|
3501
|
yading@10
|
3502 if (s->mb_intra) {
|
yading@10
|
3503 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
|
yading@10
|
3504 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
|
yading@10
|
3505 }
|
yading@10
|
3506 s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
|
yading@10
|
3507 vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
|
yading@10
|
3508
|
yading@10
|
3509 /* FIXME Set DC val for inter block ? */
|
yading@10
|
3510 if (s->mb_intra && !mb_has_coeffs) {
|
yading@10
|
3511 GET_MQUANT();
|
yading@10
|
3512 s->ac_pred = get_bits1(gb);
|
yading@10
|
3513 cbp = 0;
|
yading@10
|
3514 } else if (mb_has_coeffs) {
|
yading@10
|
3515 if (s->mb_intra)
|
yading@10
|
3516 s->ac_pred = get_bits1(gb);
|
yading@10
|
3517 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
3518 GET_MQUANT();
|
yading@10
|
3519 } else {
|
yading@10
|
3520 mquant = v->pq;
|
yading@10
|
3521 cbp = 0;
|
yading@10
|
3522 }
|
yading@10
|
3523 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
3524
|
yading@10
|
3525 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
|
yading@10
|
3526 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
|
yading@10
|
3527 VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
3528 if (!s->mb_intra) vc1_mc_1mv(v, 0);
|
yading@10
|
3529 dst_idx = 0;
|
yading@10
|
3530 for (i = 0; i < 6; i++) {
|
yading@10
|
3531 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3532 dst_idx += i >> 2;
|
yading@10
|
3533 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
3534 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
|
yading@10
|
3535 v->mb_type[0][s->block_index[i]] = s->mb_intra;
|
yading@10
|
3536 if (s->mb_intra) {
|
yading@10
|
3537 /* check if prediction blocks A and C are available */
|
yading@10
|
3538 v->a_avail = v->c_avail = 0;
|
yading@10
|
3539 if (i == 2 || i == 3 || !s->first_slice_line)
|
yading@10
|
3540 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
|
yading@10
|
3541 if (i == 1 || i == 3 || s->mb_x)
|
yading@10
|
3542 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
|
yading@10
|
3543
|
yading@10
|
3544 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
|
yading@10
|
3545 (i & 4) ? v->codingset2 : v->codingset);
|
yading@10
|
3546 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
|
yading@10
|
3547 continue;
|
yading@10
|
3548 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
|
yading@10
|
3549 if (v->rangeredfrm)
|
yading@10
|
3550 for (j = 0; j < 64; j++)
|
yading@10
|
3551 s->block[i][j] <<= 1;
|
yading@10
|
3552 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
3553 if (v->pq >= 9 && v->overlap) {
|
yading@10
|
3554 if (v->c_avail)
|
yading@10
|
3555 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
3556 if (v->a_avail)
|
yading@10
|
3557 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
3558 }
|
yading@10
|
3559 block_cbp |= 0xF << (i << 2);
|
yading@10
|
3560 block_intra |= 1 << i;
|
yading@10
|
3561 } else if (val) {
|
yading@10
|
3562 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block,
|
yading@10
|
3563 s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize,
|
yading@10
|
3564 (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
|
yading@10
|
3565 block_cbp |= pat << (i << 2);
|
yading@10
|
3566 if (!v->ttmbf && ttmb < 8)
|
yading@10
|
3567 ttmb = -1;
|
yading@10
|
3568 first_block = 0;
|
yading@10
|
3569 }
|
yading@10
|
3570 }
|
yading@10
|
3571 } else { // skipped
|
yading@10
|
3572 s->mb_intra = 0;
|
yading@10
|
3573 for (i = 0; i < 6; i++) {
|
yading@10
|
3574 v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
3575 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3576 }
|
yading@10
|
3577 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
|
yading@10
|
3578 s->current_picture.qscale_table[mb_pos] = 0;
|
yading@10
|
3579 vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
|
yading@10
|
3580 vc1_mc_1mv(v, 0);
|
yading@10
|
3581 }
|
yading@10
|
3582 } else { // 4MV mode
|
yading@10
|
3583 if (!skipped /* unskipped MB */) {
|
yading@10
|
3584 int intra_count = 0, coded_inter = 0;
|
yading@10
|
3585 int is_intra[6], is_coded[6];
|
yading@10
|
3586 /* Get CBPCY */
|
yading@10
|
3587 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
3588 for (i = 0; i < 6; i++) {
|
yading@10
|
3589 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
3590 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3591 s->mb_intra = 0;
|
yading@10
|
3592 if (i < 4) {
|
yading@10
|
3593 dmv_x = dmv_y = 0;
|
yading@10
|
3594 s->mb_intra = 0;
|
yading@10
|
3595 mb_has_coeffs = 0;
|
yading@10
|
3596 if (val) {
|
yading@10
|
3597 GET_MVDATA(dmv_x, dmv_y);
|
yading@10
|
3598 }
|
yading@10
|
3599 vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
|
yading@10
|
3600 if (!s->mb_intra)
|
yading@10
|
3601 vc1_mc_4mv_luma(v, i, 0, 0);
|
yading@10
|
3602 intra_count += s->mb_intra;
|
yading@10
|
3603 is_intra[i] = s->mb_intra;
|
yading@10
|
3604 is_coded[i] = mb_has_coeffs;
|
yading@10
|
3605 }
|
yading@10
|
3606 if (i & 4) {
|
yading@10
|
3607 is_intra[i] = (intra_count >= 3);
|
yading@10
|
3608 is_coded[i] = val;
|
yading@10
|
3609 }
|
yading@10
|
3610 if (i == 4)
|
yading@10
|
3611 vc1_mc_4mv_chroma(v, 0);
|
yading@10
|
3612 v->mb_type[0][s->block_index[i]] = is_intra[i];
|
yading@10
|
3613 if (!coded_inter)
|
yading@10
|
3614 coded_inter = !is_intra[i] & is_coded[i];
|
yading@10
|
3615 }
|
yading@10
|
3616 // if there are no coded blocks then don't do anything more
|
yading@10
|
3617 dst_idx = 0;
|
yading@10
|
3618 if (!intra_count && !coded_inter)
|
yading@10
|
3619 goto end;
|
yading@10
|
3620 GET_MQUANT();
|
yading@10
|
3621 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
3622 /* test if block is intra and has pred */
|
yading@10
|
3623 {
|
yading@10
|
3624 int intrapred = 0;
|
yading@10
|
3625 for (i = 0; i < 6; i++)
|
yading@10
|
3626 if (is_intra[i]) {
|
yading@10
|
3627 if (((!s->first_slice_line || (i == 2 || i == 3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
|
yading@10
|
3628 || ((s->mb_x || (i == 1 || i == 3)) && v->mb_type[0][s->block_index[i] - 1])) {
|
yading@10
|
3629 intrapred = 1;
|
yading@10
|
3630 break;
|
yading@10
|
3631 }
|
yading@10
|
3632 }
|
yading@10
|
3633 if (intrapred)
|
yading@10
|
3634 s->ac_pred = get_bits1(gb);
|
yading@10
|
3635 else
|
yading@10
|
3636 s->ac_pred = 0;
|
yading@10
|
3637 }
|
yading@10
|
3638 if (!v->ttmbf && coded_inter)
|
yading@10
|
3639 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
3640 for (i = 0; i < 6; i++) {
|
yading@10
|
3641 dst_idx += i >> 2;
|
yading@10
|
3642 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
|
yading@10
|
3643 s->mb_intra = is_intra[i];
|
yading@10
|
3644 if (is_intra[i]) {
|
yading@10
|
3645 /* check if prediction blocks A and C are available */
|
yading@10
|
3646 v->a_avail = v->c_avail = 0;
|
yading@10
|
3647 if (i == 2 || i == 3 || !s->first_slice_line)
|
yading@10
|
3648 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
|
yading@10
|
3649 if (i == 1 || i == 3 || s->mb_x)
|
yading@10
|
3650 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
|
yading@10
|
3651
|
yading@10
|
3652 vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant,
|
yading@10
|
3653 (i & 4) ? v->codingset2 : v->codingset);
|
yading@10
|
3654 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
|
yading@10
|
3655 continue;
|
yading@10
|
3656 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
|
yading@10
|
3657 if (v->rangeredfrm)
|
yading@10
|
3658 for (j = 0; j < 64; j++)
|
yading@10
|
3659 s->block[i][j] <<= 1;
|
yading@10
|
3660 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off,
|
yading@10
|
3661 (i & 4) ? s->uvlinesize : s->linesize);
|
yading@10
|
3662 if (v->pq >= 9 && v->overlap) {
|
yading@10
|
3663 if (v->c_avail)
|
yading@10
|
3664 v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
3665 if (v->a_avail)
|
yading@10
|
3666 v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
3667 }
|
yading@10
|
3668 block_cbp |= 0xF << (i << 2);
|
yading@10
|
3669 block_intra |= 1 << i;
|
yading@10
|
3670 } else if (is_coded[i]) {
|
yading@10
|
3671 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
|
yading@10
|
3672 first_block, s->dest[dst_idx] + off,
|
yading@10
|
3673 (i & 4) ? s->uvlinesize : s->linesize,
|
yading@10
|
3674 (i & 4) && (s->flags & CODEC_FLAG_GRAY),
|
yading@10
|
3675 &block_tt);
|
yading@10
|
3676 block_cbp |= pat << (i << 2);
|
yading@10
|
3677 if (!v->ttmbf && ttmb < 8)
|
yading@10
|
3678 ttmb = -1;
|
yading@10
|
3679 first_block = 0;
|
yading@10
|
3680 }
|
yading@10
|
3681 }
|
yading@10
|
3682 } else { // skipped MB
|
yading@10
|
3683 s->mb_intra = 0;
|
yading@10
|
3684 s->current_picture.qscale_table[mb_pos] = 0;
|
yading@10
|
3685 for (i = 0; i < 6; i++) {
|
yading@10
|
3686 v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
3687 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3688 }
|
yading@10
|
3689 for (i = 0; i < 4; i++) {
|
yading@10
|
3690 vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
|
yading@10
|
3691 vc1_mc_4mv_luma(v, i, 0, 0);
|
yading@10
|
3692 }
|
yading@10
|
3693 vc1_mc_4mv_chroma(v, 0);
|
yading@10
|
3694 s->current_picture.qscale_table[mb_pos] = 0;
|
yading@10
|
3695 }
|
yading@10
|
3696 }
|
yading@10
|
3697 end:
|
yading@10
|
3698 v->cbp[s->mb_x] = block_cbp;
|
yading@10
|
3699 v->ttblk[s->mb_x] = block_tt;
|
yading@10
|
3700 v->is_intra[s->mb_x] = block_intra;
|
yading@10
|
3701
|
yading@10
|
3702 return 0;
|
yading@10
|
3703 }
|
yading@10
|
3704
|
yading@10
|
3705 /* Decode one macroblock in an interlaced frame p picture */
|
yading@10
|
3706
|
yading@10
|
3707 static int vc1_decode_p_mb_intfr(VC1Context *v)
|
yading@10
|
3708 {
|
yading@10
|
3709 MpegEncContext *s = &v->s;
|
yading@10
|
3710 GetBitContext *gb = &s->gb;
|
yading@10
|
3711 int i;
|
yading@10
|
3712 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
3713 int cbp = 0; /* cbp decoding stuff */
|
yading@10
|
3714 int mqdiff, mquant; /* MB quantization */
|
yading@10
|
3715 int ttmb = v->ttfrm; /* MB Transform type */
|
yading@10
|
3716
|
yading@10
|
3717 int mb_has_coeffs = 1; /* last_flag */
|
yading@10
|
3718 int dmv_x, dmv_y; /* Differential MV components */
|
yading@10
|
3719 int val; /* temp value */
|
yading@10
|
3720 int first_block = 1;
|
yading@10
|
3721 int dst_idx, off;
|
yading@10
|
3722 int skipped, fourmv = 0, twomv = 0;
|
yading@10
|
3723 int block_cbp = 0, pat, block_tt = 0;
|
yading@10
|
3724 int idx_mbmode = 0, mvbp;
|
yading@10
|
3725 int stride_y, fieldtx;
|
yading@10
|
3726
|
yading@10
|
3727 mquant = v->pq; /* Lossy initialization */
|
yading@10
|
3728
|
yading@10
|
3729 if (v->skip_is_raw)
|
yading@10
|
3730 skipped = get_bits1(gb);
|
yading@10
|
3731 else
|
yading@10
|
3732 skipped = v->s.mbskip_table[mb_pos];
|
yading@10
|
3733 if (!skipped) {
|
yading@10
|
3734 if (v->fourmvswitch)
|
yading@10
|
3735 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done
|
yading@10
|
3736 else
|
yading@10
|
3737 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line
|
yading@10
|
3738 switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) {
|
yading@10
|
3739 /* store the motion vector type in a flag (useful later) */
|
yading@10
|
3740 case MV_PMODE_INTFR_4MV:
|
yading@10
|
3741 fourmv = 1;
|
yading@10
|
3742 v->blk_mv_type[s->block_index[0]] = 0;
|
yading@10
|
3743 v->blk_mv_type[s->block_index[1]] = 0;
|
yading@10
|
3744 v->blk_mv_type[s->block_index[2]] = 0;
|
yading@10
|
3745 v->blk_mv_type[s->block_index[3]] = 0;
|
yading@10
|
3746 break;
|
yading@10
|
3747 case MV_PMODE_INTFR_4MV_FIELD:
|
yading@10
|
3748 fourmv = 1;
|
yading@10
|
3749 v->blk_mv_type[s->block_index[0]] = 1;
|
yading@10
|
3750 v->blk_mv_type[s->block_index[1]] = 1;
|
yading@10
|
3751 v->blk_mv_type[s->block_index[2]] = 1;
|
yading@10
|
3752 v->blk_mv_type[s->block_index[3]] = 1;
|
yading@10
|
3753 break;
|
yading@10
|
3754 case MV_PMODE_INTFR_2MV_FIELD:
|
yading@10
|
3755 twomv = 1;
|
yading@10
|
3756 v->blk_mv_type[s->block_index[0]] = 1;
|
yading@10
|
3757 v->blk_mv_type[s->block_index[1]] = 1;
|
yading@10
|
3758 v->blk_mv_type[s->block_index[2]] = 1;
|
yading@10
|
3759 v->blk_mv_type[s->block_index[3]] = 1;
|
yading@10
|
3760 break;
|
yading@10
|
3761 case MV_PMODE_INTFR_1MV:
|
yading@10
|
3762 v->blk_mv_type[s->block_index[0]] = 0;
|
yading@10
|
3763 v->blk_mv_type[s->block_index[1]] = 0;
|
yading@10
|
3764 v->blk_mv_type[s->block_index[2]] = 0;
|
yading@10
|
3765 v->blk_mv_type[s->block_index[3]] = 0;
|
yading@10
|
3766 break;
|
yading@10
|
3767 }
|
yading@10
|
3768 if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
|
yading@10
|
3769 for (i = 0; i < 4; i++) {
|
yading@10
|
3770 s->current_picture.motion_val[1][s->block_index[i]][0] = 0;
|
yading@10
|
3771 s->current_picture.motion_val[1][s->block_index[i]][1] = 0;
|
yading@10
|
3772 }
|
yading@10
|
3773 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
|
yading@10
|
3774 s->mb_intra = v->is_intra[s->mb_x] = 1;
|
yading@10
|
3775 for (i = 0; i < 6; i++)
|
yading@10
|
3776 v->mb_type[0][s->block_index[i]] = 1;
|
yading@10
|
3777 fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
|
yading@10
|
3778 mb_has_coeffs = get_bits1(gb);
|
yading@10
|
3779 if (mb_has_coeffs)
|
yading@10
|
3780 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
3781 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
|
yading@10
|
3782 GET_MQUANT();
|
yading@10
|
3783 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
3784 /* Set DC scale - y and c use the same (not sure if necessary here) */
|
yading@10
|
3785 s->y_dc_scale = s->y_dc_scale_table[mquant];
|
yading@10
|
3786 s->c_dc_scale = s->c_dc_scale_table[mquant];
|
yading@10
|
3787 dst_idx = 0;
|
yading@10
|
3788 for (i = 0; i < 6; i++) {
|
yading@10
|
3789 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3790 dst_idx += i >> 2;
|
yading@10
|
3791 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
3792 v->mb_type[0][s->block_index[i]] = s->mb_intra;
|
yading@10
|
3793 v->a_avail = v->c_avail = 0;
|
yading@10
|
3794 if (i == 2 || i == 3 || !s->first_slice_line)
|
yading@10
|
3795 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
|
yading@10
|
3796 if (i == 1 || i == 3 || s->mb_x)
|
yading@10
|
3797 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
|
yading@10
|
3798
|
yading@10
|
3799 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
|
yading@10
|
3800 (i & 4) ? v->codingset2 : v->codingset);
|
yading@10
|
3801 if ((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
|
yading@10
|
3802 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
|
yading@10
|
3803 if (i < 4) {
|
yading@10
|
3804 stride_y = s->linesize << fieldtx;
|
yading@10
|
3805 off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
|
yading@10
|
3806 } else {
|
yading@10
|
3807 stride_y = s->uvlinesize;
|
yading@10
|
3808 off = 0;
|
yading@10
|
3809 }
|
yading@10
|
3810 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
|
yading@10
|
3811 //TODO: loop filter
|
yading@10
|
3812 }
|
yading@10
|
3813
|
yading@10
|
3814 } else { // inter MB
|
yading@10
|
3815 mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3];
|
yading@10
|
3816 if (mb_has_coeffs)
|
yading@10
|
3817 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
3818 if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
|
yading@10
|
3819 v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
|
yading@10
|
3820 } else {
|
yading@10
|
3821 if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV)
|
yading@10
|
3822 || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) {
|
yading@10
|
3823 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
|
yading@10
|
3824 }
|
yading@10
|
3825 }
|
yading@10
|
3826 s->mb_intra = v->is_intra[s->mb_x] = 0;
|
yading@10
|
3827 for (i = 0; i < 6; i++)
|
yading@10
|
3828 v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
3829 fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1];
|
yading@10
|
3830 /* for all motion vector read MVDATA and motion compensate each block */
|
yading@10
|
3831 dst_idx = 0;
|
yading@10
|
3832 if (fourmv) {
|
yading@10
|
3833 mvbp = v->fourmvbp;
|
yading@10
|
3834 for (i = 0; i < 6; i++) {
|
yading@10
|
3835 if (i < 4) {
|
yading@10
|
3836 dmv_x = dmv_y = 0;
|
yading@10
|
3837 val = ((mvbp >> (3 - i)) & 1);
|
yading@10
|
3838 if (val) {
|
yading@10
|
3839 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
3840 }
|
yading@10
|
3841 vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0);
|
yading@10
|
3842 vc1_mc_4mv_luma(v, i, 0, 0);
|
yading@10
|
3843 } else if (i == 4) {
|
yading@10
|
3844 vc1_mc_4mv_chroma4(v);
|
yading@10
|
3845 }
|
yading@10
|
3846 }
|
yading@10
|
3847 } else if (twomv) {
|
yading@10
|
3848 mvbp = v->twomvbp;
|
yading@10
|
3849 dmv_x = dmv_y = 0;
|
yading@10
|
3850 if (mvbp & 2) {
|
yading@10
|
3851 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
3852 }
|
yading@10
|
3853 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], 0);
|
yading@10
|
3854 vc1_mc_4mv_luma(v, 0, 0, 0);
|
yading@10
|
3855 vc1_mc_4mv_luma(v, 1, 0, 0);
|
yading@10
|
3856 dmv_x = dmv_y = 0;
|
yading@10
|
3857 if (mvbp & 1) {
|
yading@10
|
3858 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
3859 }
|
yading@10
|
3860 vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], 0);
|
yading@10
|
3861 vc1_mc_4mv_luma(v, 2, 0, 0);
|
yading@10
|
3862 vc1_mc_4mv_luma(v, 3, 0, 0);
|
yading@10
|
3863 vc1_mc_4mv_chroma4(v);
|
yading@10
|
3864 } else {
|
yading@10
|
3865 mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2];
|
yading@10
|
3866 dmv_x = dmv_y = 0;
|
yading@10
|
3867 if (mvbp) {
|
yading@10
|
3868 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
3869 }
|
yading@10
|
3870 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0);
|
yading@10
|
3871 vc1_mc_1mv(v, 0);
|
yading@10
|
3872 }
|
yading@10
|
3873 if (cbp)
|
yading@10
|
3874 GET_MQUANT(); // p. 227
|
yading@10
|
3875 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
3876 if (!v->ttmbf && cbp)
|
yading@10
|
3877 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
3878 for (i = 0; i < 6; i++) {
|
yading@10
|
3879 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3880 dst_idx += i >> 2;
|
yading@10
|
3881 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
3882 if (!fieldtx)
|
yading@10
|
3883 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
|
yading@10
|
3884 else
|
yading@10
|
3885 off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
|
yading@10
|
3886 if (val) {
|
yading@10
|
3887 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
|
yading@10
|
3888 first_block, s->dest[dst_idx] + off,
|
yading@10
|
3889 (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
|
yading@10
|
3890 (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
|
yading@10
|
3891 block_cbp |= pat << (i << 2);
|
yading@10
|
3892 if (!v->ttmbf && ttmb < 8)
|
yading@10
|
3893 ttmb = -1;
|
yading@10
|
3894 first_block = 0;
|
yading@10
|
3895 }
|
yading@10
|
3896 }
|
yading@10
|
3897 }
|
yading@10
|
3898 } else { // skipped
|
yading@10
|
3899 s->mb_intra = v->is_intra[s->mb_x] = 0;
|
yading@10
|
3900 for (i = 0; i < 6; i++) {
|
yading@10
|
3901 v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
3902 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3903 }
|
yading@10
|
3904 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
|
yading@10
|
3905 s->current_picture.qscale_table[mb_pos] = 0;
|
yading@10
|
3906 v->blk_mv_type[s->block_index[0]] = 0;
|
yading@10
|
3907 v->blk_mv_type[s->block_index[1]] = 0;
|
yading@10
|
3908 v->blk_mv_type[s->block_index[2]] = 0;
|
yading@10
|
3909 v->blk_mv_type[s->block_index[3]] = 0;
|
yading@10
|
3910 vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0);
|
yading@10
|
3911 vc1_mc_1mv(v, 0);
|
yading@10
|
3912 }
|
yading@10
|
3913 if (s->mb_x == s->mb_width - 1)
|
yading@10
|
3914 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
|
yading@10
|
3915 return 0;
|
yading@10
|
3916 }
|
yading@10
|
3917
|
yading@10
|
3918 static int vc1_decode_p_mb_intfi(VC1Context *v)
|
yading@10
|
3919 {
|
yading@10
|
3920 MpegEncContext *s = &v->s;
|
yading@10
|
3921 GetBitContext *gb = &s->gb;
|
yading@10
|
3922 int i;
|
yading@10
|
3923 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
3924 int cbp = 0; /* cbp decoding stuff */
|
yading@10
|
3925 int mqdiff, mquant; /* MB quantization */
|
yading@10
|
3926 int ttmb = v->ttfrm; /* MB Transform type */
|
yading@10
|
3927
|
yading@10
|
3928 int mb_has_coeffs = 1; /* last_flag */
|
yading@10
|
3929 int dmv_x, dmv_y; /* Differential MV components */
|
yading@10
|
3930 int val; /* temp values */
|
yading@10
|
3931 int first_block = 1;
|
yading@10
|
3932 int dst_idx, off;
|
yading@10
|
3933 int pred_flag = 0;
|
yading@10
|
3934 int block_cbp = 0, pat, block_tt = 0;
|
yading@10
|
3935 int idx_mbmode = 0;
|
yading@10
|
3936
|
yading@10
|
3937 mquant = v->pq; /* Lossy initialization */
|
yading@10
|
3938
|
yading@10
|
3939 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
|
yading@10
|
3940 if (idx_mbmode <= 1) { // intra MB
|
yading@10
|
3941 s->mb_intra = v->is_intra[s->mb_x] = 1;
|
yading@10
|
3942 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
|
yading@10
|
3943 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
|
yading@10
|
3944 s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
|
yading@10
|
3945 GET_MQUANT();
|
yading@10
|
3946 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
3947 /* Set DC scale - y and c use the same (not sure if necessary here) */
|
yading@10
|
3948 s->y_dc_scale = s->y_dc_scale_table[mquant];
|
yading@10
|
3949 s->c_dc_scale = s->c_dc_scale_table[mquant];
|
yading@10
|
3950 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
|
yading@10
|
3951 mb_has_coeffs = idx_mbmode & 1;
|
yading@10
|
3952 if (mb_has_coeffs)
|
yading@10
|
3953 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
|
yading@10
|
3954 dst_idx = 0;
|
yading@10
|
3955 for (i = 0; i < 6; i++) {
|
yading@10
|
3956 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
3957 v->mb_type[0][s->block_index[i]] = 1;
|
yading@10
|
3958 dst_idx += i >> 2;
|
yading@10
|
3959 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
3960 v->a_avail = v->c_avail = 0;
|
yading@10
|
3961 if (i == 2 || i == 3 || !s->first_slice_line)
|
yading@10
|
3962 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
|
yading@10
|
3963 if (i == 1 || i == 3 || s->mb_x)
|
yading@10
|
3964 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
|
yading@10
|
3965
|
yading@10
|
3966 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
|
yading@10
|
3967 (i & 4) ? v->codingset2 : v->codingset);
|
yading@10
|
3968 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
|
yading@10
|
3969 continue;
|
yading@10
|
3970 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
|
yading@10
|
3971 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
|
yading@10
|
3972 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
|
yading@10
|
3973 // TODO: loop filter
|
yading@10
|
3974 }
|
yading@10
|
3975 } else {
|
yading@10
|
3976 s->mb_intra = v->is_intra[s->mb_x] = 0;
|
yading@10
|
3977 s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
|
yading@10
|
3978 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
3979 if (idx_mbmode <= 5) { // 1-MV
|
yading@10
|
3980 dmv_x = dmv_y = pred_flag = 0;
|
yading@10
|
3981 if (idx_mbmode & 1) {
|
yading@10
|
3982 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
|
yading@10
|
3983 }
|
yading@10
|
3984 vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
|
yading@10
|
3985 vc1_mc_1mv(v, 0);
|
yading@10
|
3986 mb_has_coeffs = !(idx_mbmode & 2);
|
yading@10
|
3987 } else { // 4-MV
|
yading@10
|
3988 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
|
yading@10
|
3989 for (i = 0; i < 6; i++) {
|
yading@10
|
3990 if (i < 4) {
|
yading@10
|
3991 dmv_x = dmv_y = pred_flag = 0;
|
yading@10
|
3992 val = ((v->fourmvbp >> (3 - i)) & 1);
|
yading@10
|
3993 if (val) {
|
yading@10
|
3994 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
|
yading@10
|
3995 }
|
yading@10
|
3996 vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
|
yading@10
|
3997 vc1_mc_4mv_luma(v, i, 0, 0);
|
yading@10
|
3998 } else if (i == 4)
|
yading@10
|
3999 vc1_mc_4mv_chroma(v, 0);
|
yading@10
|
4000 }
|
yading@10
|
4001 mb_has_coeffs = idx_mbmode & 1;
|
yading@10
|
4002 }
|
yading@10
|
4003 if (mb_has_coeffs)
|
yading@10
|
4004 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
4005 if (cbp) {
|
yading@10
|
4006 GET_MQUANT();
|
yading@10
|
4007 }
|
yading@10
|
4008 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4009 if (!v->ttmbf && cbp) {
|
yading@10
|
4010 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
4011 }
|
yading@10
|
4012 dst_idx = 0;
|
yading@10
|
4013 for (i = 0; i < 6; i++) {
|
yading@10
|
4014 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4015 dst_idx += i >> 2;
|
yading@10
|
4016 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
4017 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
|
yading@10
|
4018 if (val) {
|
yading@10
|
4019 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
|
yading@10
|
4020 first_block, s->dest[dst_idx] + off,
|
yading@10
|
4021 (i & 4) ? s->uvlinesize : s->linesize,
|
yading@10
|
4022 (i & 4) && (s->flags & CODEC_FLAG_GRAY),
|
yading@10
|
4023 &block_tt);
|
yading@10
|
4024 block_cbp |= pat << (i << 2);
|
yading@10
|
4025 if (!v->ttmbf && ttmb < 8) ttmb = -1;
|
yading@10
|
4026 first_block = 0;
|
yading@10
|
4027 }
|
yading@10
|
4028 }
|
yading@10
|
4029 }
|
yading@10
|
4030 if (s->mb_x == s->mb_width - 1)
|
yading@10
|
4031 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
|
yading@10
|
4032 return 0;
|
yading@10
|
4033 }
|
yading@10
|
4034
|
yading@10
|
4035 /** Decode one B-frame MB (in Main profile)
|
yading@10
|
4036 */
|
yading@10
|
4037 static void vc1_decode_b_mb(VC1Context *v)
|
yading@10
|
4038 {
|
yading@10
|
4039 MpegEncContext *s = &v->s;
|
yading@10
|
4040 GetBitContext *gb = &s->gb;
|
yading@10
|
4041 int i, j;
|
yading@10
|
4042 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
4043 int cbp = 0; /* cbp decoding stuff */
|
yading@10
|
4044 int mqdiff, mquant; /* MB quantization */
|
yading@10
|
4045 int ttmb = v->ttfrm; /* MB Transform type */
|
yading@10
|
4046 int mb_has_coeffs = 0; /* last_flag */
|
yading@10
|
4047 int index, index1; /* LUT indexes */
|
yading@10
|
4048 int val, sign; /* temp values */
|
yading@10
|
4049 int first_block = 1;
|
yading@10
|
4050 int dst_idx, off;
|
yading@10
|
4051 int skipped, direct;
|
yading@10
|
4052 int dmv_x[2], dmv_y[2];
|
yading@10
|
4053 int bmvtype = BMV_TYPE_BACKWARD;
|
yading@10
|
4054
|
yading@10
|
4055 mquant = v->pq; /* lossy initialization */
|
yading@10
|
4056 s->mb_intra = 0;
|
yading@10
|
4057
|
yading@10
|
4058 if (v->dmb_is_raw)
|
yading@10
|
4059 direct = get_bits1(gb);
|
yading@10
|
4060 else
|
yading@10
|
4061 direct = v->direct_mb_plane[mb_pos];
|
yading@10
|
4062 if (v->skip_is_raw)
|
yading@10
|
4063 skipped = get_bits1(gb);
|
yading@10
|
4064 else
|
yading@10
|
4065 skipped = v->s.mbskip_table[mb_pos];
|
yading@10
|
4066
|
yading@10
|
4067 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
|
yading@10
|
4068 for (i = 0; i < 6; i++) {
|
yading@10
|
4069 v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
4070 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4071 }
|
yading@10
|
4072 s->current_picture.qscale_table[mb_pos] = 0;
|
yading@10
|
4073
|
yading@10
|
4074 if (!direct) {
|
yading@10
|
4075 if (!skipped) {
|
yading@10
|
4076 GET_MVDATA(dmv_x[0], dmv_y[0]);
|
yading@10
|
4077 dmv_x[1] = dmv_x[0];
|
yading@10
|
4078 dmv_y[1] = dmv_y[0];
|
yading@10
|
4079 }
|
yading@10
|
4080 if (skipped || !s->mb_intra) {
|
yading@10
|
4081 bmvtype = decode012(gb);
|
yading@10
|
4082 switch (bmvtype) {
|
yading@10
|
4083 case 0:
|
yading@10
|
4084 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
|
yading@10
|
4085 break;
|
yading@10
|
4086 case 1:
|
yading@10
|
4087 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
|
yading@10
|
4088 break;
|
yading@10
|
4089 case 2:
|
yading@10
|
4090 bmvtype = BMV_TYPE_INTERPOLATED;
|
yading@10
|
4091 dmv_x[0] = dmv_y[0] = 0;
|
yading@10
|
4092 }
|
yading@10
|
4093 }
|
yading@10
|
4094 }
|
yading@10
|
4095 for (i = 0; i < 6; i++)
|
yading@10
|
4096 v->mb_type[0][s->block_index[i]] = s->mb_intra;
|
yading@10
|
4097
|
yading@10
|
4098 if (skipped) {
|
yading@10
|
4099 if (direct)
|
yading@10
|
4100 bmvtype = BMV_TYPE_INTERPOLATED;
|
yading@10
|
4101 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4102 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4103 return;
|
yading@10
|
4104 }
|
yading@10
|
4105 if (direct) {
|
yading@10
|
4106 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
4107 GET_MQUANT();
|
yading@10
|
4108 s->mb_intra = 0;
|
yading@10
|
4109 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4110 if (!v->ttmbf)
|
yading@10
|
4111 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
4112 dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
|
yading@10
|
4113 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4114 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4115 } else {
|
yading@10
|
4116 if (!mb_has_coeffs && !s->mb_intra) {
|
yading@10
|
4117 /* no coded blocks - effectively skipped */
|
yading@10
|
4118 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4119 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4120 return;
|
yading@10
|
4121 }
|
yading@10
|
4122 if (s->mb_intra && !mb_has_coeffs) {
|
yading@10
|
4123 GET_MQUANT();
|
yading@10
|
4124 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4125 s->ac_pred = get_bits1(gb);
|
yading@10
|
4126 cbp = 0;
|
yading@10
|
4127 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4128 } else {
|
yading@10
|
4129 if (bmvtype == BMV_TYPE_INTERPOLATED) {
|
yading@10
|
4130 GET_MVDATA(dmv_x[0], dmv_y[0]);
|
yading@10
|
4131 if (!mb_has_coeffs) {
|
yading@10
|
4132 /* interpolated skipped block */
|
yading@10
|
4133 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4134 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4135 return;
|
yading@10
|
4136 }
|
yading@10
|
4137 }
|
yading@10
|
4138 vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4139 if (!s->mb_intra) {
|
yading@10
|
4140 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
|
yading@10
|
4141 }
|
yading@10
|
4142 if (s->mb_intra)
|
yading@10
|
4143 s->ac_pred = get_bits1(gb);
|
yading@10
|
4144 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
4145 GET_MQUANT();
|
yading@10
|
4146 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4147 if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
|
yading@10
|
4148 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
4149 }
|
yading@10
|
4150 }
|
yading@10
|
4151 dst_idx = 0;
|
yading@10
|
4152 for (i = 0; i < 6; i++) {
|
yading@10
|
4153 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4154 dst_idx += i >> 2;
|
yading@10
|
4155 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
4156 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
|
yading@10
|
4157 v->mb_type[0][s->block_index[i]] = s->mb_intra;
|
yading@10
|
4158 if (s->mb_intra) {
|
yading@10
|
4159 /* check if prediction blocks A and C are available */
|
yading@10
|
4160 v->a_avail = v->c_avail = 0;
|
yading@10
|
4161 if (i == 2 || i == 3 || !s->first_slice_line)
|
yading@10
|
4162 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
|
yading@10
|
4163 if (i == 1 || i == 3 || s->mb_x)
|
yading@10
|
4164 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
|
yading@10
|
4165
|
yading@10
|
4166 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
|
yading@10
|
4167 (i & 4) ? v->codingset2 : v->codingset);
|
yading@10
|
4168 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
|
yading@10
|
4169 continue;
|
yading@10
|
4170 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
|
yading@10
|
4171 if (v->rangeredfrm)
|
yading@10
|
4172 for (j = 0; j < 64; j++)
|
yading@10
|
4173 s->block[i][j] <<= 1;
|
yading@10
|
4174 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
4175 } else if (val) {
|
yading@10
|
4176 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
|
yading@10
|
4177 first_block, s->dest[dst_idx] + off,
|
yading@10
|
4178 (i & 4) ? s->uvlinesize : s->linesize,
|
yading@10
|
4179 (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
|
yading@10
|
4180 if (!v->ttmbf && ttmb < 8)
|
yading@10
|
4181 ttmb = -1;
|
yading@10
|
4182 first_block = 0;
|
yading@10
|
4183 }
|
yading@10
|
4184 }
|
yading@10
|
4185 }
|
yading@10
|
4186
|
yading@10
|
4187 /** Decode one B-frame MB (in interlaced field B picture)
|
yading@10
|
4188 */
|
yading@10
|
4189 static void vc1_decode_b_mb_intfi(VC1Context *v)
|
yading@10
|
4190 {
|
yading@10
|
4191 MpegEncContext *s = &v->s;
|
yading@10
|
4192 GetBitContext *gb = &s->gb;
|
yading@10
|
4193 int i, j;
|
yading@10
|
4194 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
4195 int cbp = 0; /* cbp decoding stuff */
|
yading@10
|
4196 int mqdiff, mquant; /* MB quantization */
|
yading@10
|
4197 int ttmb = v->ttfrm; /* MB Transform type */
|
yading@10
|
4198 int mb_has_coeffs = 0; /* last_flag */
|
yading@10
|
4199 int val; /* temp value */
|
yading@10
|
4200 int first_block = 1;
|
yading@10
|
4201 int dst_idx, off;
|
yading@10
|
4202 int fwd;
|
yading@10
|
4203 int dmv_x[2], dmv_y[2], pred_flag[2];
|
yading@10
|
4204 int bmvtype = BMV_TYPE_BACKWARD;
|
yading@10
|
4205 int idx_mbmode, interpmvp;
|
yading@10
|
4206
|
yading@10
|
4207 mquant = v->pq; /* Lossy initialization */
|
yading@10
|
4208 s->mb_intra = 0;
|
yading@10
|
4209
|
yading@10
|
4210 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
|
yading@10
|
4211 if (idx_mbmode <= 1) { // intra MB
|
yading@10
|
4212 s->mb_intra = v->is_intra[s->mb_x] = 1;
|
yading@10
|
4213 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
|
yading@10
|
4214 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
|
yading@10
|
4215 s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
|
yading@10
|
4216 GET_MQUANT();
|
yading@10
|
4217 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4218 /* Set DC scale - y and c use the same (not sure if necessary here) */
|
yading@10
|
4219 s->y_dc_scale = s->y_dc_scale_table[mquant];
|
yading@10
|
4220 s->c_dc_scale = s->c_dc_scale_table[mquant];
|
yading@10
|
4221 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
|
yading@10
|
4222 mb_has_coeffs = idx_mbmode & 1;
|
yading@10
|
4223 if (mb_has_coeffs)
|
yading@10
|
4224 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
|
yading@10
|
4225 dst_idx = 0;
|
yading@10
|
4226 for (i = 0; i < 6; i++) {
|
yading@10
|
4227 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4228 dst_idx += i >> 2;
|
yading@10
|
4229 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
4230 v->mb_type[0][s->block_index[i]] = s->mb_intra;
|
yading@10
|
4231 v->a_avail = v->c_avail = 0;
|
yading@10
|
4232 if (i == 2 || i == 3 || !s->first_slice_line)
|
yading@10
|
4233 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
|
yading@10
|
4234 if (i == 1 || i == 3 || s->mb_x)
|
yading@10
|
4235 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
|
yading@10
|
4236
|
yading@10
|
4237 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
|
yading@10
|
4238 (i & 4) ? v->codingset2 : v->codingset);
|
yading@10
|
4239 if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
|
yading@10
|
4240 continue;
|
yading@10
|
4241 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
|
yading@10
|
4242 if (v->rangeredfrm)
|
yading@10
|
4243 for (j = 0; j < 64; j++)
|
yading@10
|
4244 s->block[i][j] <<= 1;
|
yading@10
|
4245 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
|
yading@10
|
4246 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
|
yading@10
|
4247 // TODO: yet to perform loop filter
|
yading@10
|
4248 }
|
yading@10
|
4249 } else {
|
yading@10
|
4250 s->mb_intra = v->is_intra[s->mb_x] = 0;
|
yading@10
|
4251 s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
|
yading@10
|
4252 for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
4253 if (v->fmb_is_raw)
|
yading@10
|
4254 fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb);
|
yading@10
|
4255 else
|
yading@10
|
4256 fwd = v->forward_mb_plane[mb_pos];
|
yading@10
|
4257 if (idx_mbmode <= 5) { // 1-MV
|
yading@10
|
4258 dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
|
yading@10
|
4259 pred_flag[0] = pred_flag[1] = 0;
|
yading@10
|
4260 if (fwd)
|
yading@10
|
4261 bmvtype = BMV_TYPE_FORWARD;
|
yading@10
|
4262 else {
|
yading@10
|
4263 bmvtype = decode012(gb);
|
yading@10
|
4264 switch (bmvtype) {
|
yading@10
|
4265 case 0:
|
yading@10
|
4266 bmvtype = BMV_TYPE_BACKWARD;
|
yading@10
|
4267 break;
|
yading@10
|
4268 case 1:
|
yading@10
|
4269 bmvtype = BMV_TYPE_DIRECT;
|
yading@10
|
4270 break;
|
yading@10
|
4271 case 2:
|
yading@10
|
4272 bmvtype = BMV_TYPE_INTERPOLATED;
|
yading@10
|
4273 interpmvp = get_bits1(gb);
|
yading@10
|
4274 }
|
yading@10
|
4275 }
|
yading@10
|
4276 v->bmvtype = bmvtype;
|
yading@10
|
4277 if (bmvtype != BMV_TYPE_DIRECT && idx_mbmode & 1) {
|
yading@10
|
4278 get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
|
yading@10
|
4279 }
|
yading@10
|
4280 if (bmvtype == BMV_TYPE_INTERPOLATED && interpmvp) {
|
yading@10
|
4281 get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]);
|
yading@10
|
4282 }
|
yading@10
|
4283 if (bmvtype == BMV_TYPE_DIRECT) {
|
yading@10
|
4284 dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
|
yading@10
|
4285 dmv_x[1] = dmv_y[1] = pred_flag[0] = 0;
|
yading@10
|
4286 }
|
yading@10
|
4287 vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag);
|
yading@10
|
4288 vc1_b_mc(v, dmv_x, dmv_y, (bmvtype == BMV_TYPE_DIRECT), bmvtype);
|
yading@10
|
4289 mb_has_coeffs = !(idx_mbmode & 2);
|
yading@10
|
4290 } else { // 4-MV
|
yading@10
|
4291 if (fwd)
|
yading@10
|
4292 bmvtype = BMV_TYPE_FORWARD;
|
yading@10
|
4293 v->bmvtype = bmvtype;
|
yading@10
|
4294 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
|
yading@10
|
4295 for (i = 0; i < 6; i++) {
|
yading@10
|
4296 if (i < 4) {
|
yading@10
|
4297 dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
|
yading@10
|
4298 dmv_x[1] = dmv_y[1] = pred_flag[1] = 0;
|
yading@10
|
4299 val = ((v->fourmvbp >> (3 - i)) & 1);
|
yading@10
|
4300 if (val) {
|
yading@10
|
4301 get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD],
|
yading@10
|
4302 &dmv_y[bmvtype == BMV_TYPE_BACKWARD],
|
yading@10
|
4303 &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
|
yading@10
|
4304 }
|
yading@10
|
4305 vc1_pred_b_mv_intfi(v, i, dmv_x, dmv_y, 0, pred_flag);
|
yading@10
|
4306 vc1_mc_4mv_luma(v, i, bmvtype == BMV_TYPE_BACKWARD, 0);
|
yading@10
|
4307 } else if (i == 4)
|
yading@10
|
4308 vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD);
|
yading@10
|
4309 }
|
yading@10
|
4310 mb_has_coeffs = idx_mbmode & 1;
|
yading@10
|
4311 }
|
yading@10
|
4312 if (mb_has_coeffs)
|
yading@10
|
4313 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
4314 if (cbp) {
|
yading@10
|
4315 GET_MQUANT();
|
yading@10
|
4316 }
|
yading@10
|
4317 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4318 if (!v->ttmbf && cbp) {
|
yading@10
|
4319 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
4320 }
|
yading@10
|
4321 dst_idx = 0;
|
yading@10
|
4322 for (i = 0; i < 6; i++) {
|
yading@10
|
4323 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4324 dst_idx += i >> 2;
|
yading@10
|
4325 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
4326 off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
|
yading@10
|
4327 if (val) {
|
yading@10
|
4328 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
|
yading@10
|
4329 first_block, s->dest[dst_idx] + off,
|
yading@10
|
4330 (i & 4) ? s->uvlinesize : s->linesize,
|
yading@10
|
4331 (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
|
yading@10
|
4332 if (!v->ttmbf && ttmb < 8)
|
yading@10
|
4333 ttmb = -1;
|
yading@10
|
4334 first_block = 0;
|
yading@10
|
4335 }
|
yading@10
|
4336 }
|
yading@10
|
4337 }
|
yading@10
|
4338 }
|
yading@10
|
4339
|
yading@10
|
4340 /** Decode one B-frame MB (in interlaced frame B picture)
|
yading@10
|
4341 */
|
yading@10
|
4342 static int vc1_decode_b_mb_intfr(VC1Context *v)
|
yading@10
|
4343 {
|
yading@10
|
4344 MpegEncContext *s = &v->s;
|
yading@10
|
4345 GetBitContext *gb = &s->gb;
|
yading@10
|
4346 int i, j;
|
yading@10
|
4347 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
4348 int cbp = 0; /* cbp decoding stuff */
|
yading@10
|
4349 int mqdiff, mquant; /* MB quantization */
|
yading@10
|
4350 int ttmb = v->ttfrm; /* MB Transform type */
|
yading@10
|
4351 int mvsw = 0; /* motion vector switch */
|
yading@10
|
4352 int mb_has_coeffs = 1; /* last_flag */
|
yading@10
|
4353 int dmv_x, dmv_y; /* Differential MV components */
|
yading@10
|
4354 int val; /* temp value */
|
yading@10
|
4355 int first_block = 1;
|
yading@10
|
4356 int dst_idx, off;
|
yading@10
|
4357 int skipped, direct, twomv = 0;
|
yading@10
|
4358 int block_cbp = 0, pat, block_tt = 0;
|
yading@10
|
4359 int idx_mbmode = 0, mvbp;
|
yading@10
|
4360 int stride_y, fieldtx;
|
yading@10
|
4361 int bmvtype = BMV_TYPE_BACKWARD;
|
yading@10
|
4362 int dir, dir2;
|
yading@10
|
4363
|
yading@10
|
4364 mquant = v->pq; /* Lossy initialization */
|
yading@10
|
4365 s->mb_intra = 0;
|
yading@10
|
4366 if (v->skip_is_raw)
|
yading@10
|
4367 skipped = get_bits1(gb);
|
yading@10
|
4368 else
|
yading@10
|
4369 skipped = v->s.mbskip_table[mb_pos];
|
yading@10
|
4370
|
yading@10
|
4371 if (!skipped) {
|
yading@10
|
4372 idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2);
|
yading@10
|
4373 if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD)
|
yading@10
|
4374 {
|
yading@10
|
4375 twomv = 1;
|
yading@10
|
4376 v->blk_mv_type[s->block_index[0]] = 1;
|
yading@10
|
4377 v->blk_mv_type[s->block_index[1]] = 1;
|
yading@10
|
4378 v->blk_mv_type[s->block_index[2]] = 1;
|
yading@10
|
4379 v->blk_mv_type[s->block_index[3]] = 1;
|
yading@10
|
4380 } else {
|
yading@10
|
4381 v->blk_mv_type[s->block_index[0]] = 0;
|
yading@10
|
4382 v->blk_mv_type[s->block_index[1]] = 0;
|
yading@10
|
4383 v->blk_mv_type[s->block_index[2]] = 0;
|
yading@10
|
4384 v->blk_mv_type[s->block_index[3]] = 0;
|
yading@10
|
4385 }
|
yading@10
|
4386 }
|
yading@10
|
4387
|
yading@10
|
4388 if (v->dmb_is_raw)
|
yading@10
|
4389 direct = get_bits1(gb);
|
yading@10
|
4390 else
|
yading@10
|
4391 direct = v->direct_mb_plane[mb_pos];
|
yading@10
|
4392
|
yading@10
|
4393 if (direct) {
|
yading@10
|
4394 s->mv[0][0][0] = s->current_picture.motion_val[0][s->block_index[0]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][0], v->bfraction, 0, s->quarter_sample);
|
yading@10
|
4395 s->mv[0][0][1] = s->current_picture.motion_val[0][s->block_index[0]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][1], v->bfraction, 0, s->quarter_sample);
|
yading@10
|
4396 s->mv[1][0][0] = s->current_picture.motion_val[1][s->block_index[0]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][0], v->bfraction, 1, s->quarter_sample);
|
yading@10
|
4397 s->mv[1][0][1] = s->current_picture.motion_val[1][s->block_index[0]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][1], v->bfraction, 1, s->quarter_sample);
|
yading@10
|
4398
|
yading@10
|
4399 if (twomv) {
|
yading@10
|
4400 s->mv[0][2][0] = s->current_picture.motion_val[0][s->block_index[2]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][0], v->bfraction, 0, s->quarter_sample);
|
yading@10
|
4401 s->mv[0][2][1] = s->current_picture.motion_val[0][s->block_index[2]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][1], v->bfraction, 0, s->quarter_sample);
|
yading@10
|
4402 s->mv[1][2][0] = s->current_picture.motion_val[1][s->block_index[2]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][0], v->bfraction, 1, s->quarter_sample);
|
yading@10
|
4403 s->mv[1][2][1] = s->current_picture.motion_val[1][s->block_index[2]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][1], v->bfraction, 1, s->quarter_sample);
|
yading@10
|
4404
|
yading@10
|
4405 for (i = 1; i < 4; i+=2) {
|
yading@10
|
4406 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = s->mv[0][i-1][0];
|
yading@10
|
4407 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = s->mv[0][i-1][1];
|
yading@10
|
4408 s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = s->mv[1][i-1][0];
|
yading@10
|
4409 s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = s->mv[1][i-1][1];
|
yading@10
|
4410 }
|
yading@10
|
4411 } else {
|
yading@10
|
4412 for (i = 1; i < 4; i++) {
|
yading@10
|
4413 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = s->mv[0][0][0];
|
yading@10
|
4414 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = s->mv[0][0][1];
|
yading@10
|
4415 s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = s->mv[1][0][0];
|
yading@10
|
4416 s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = s->mv[1][0][1];
|
yading@10
|
4417 }
|
yading@10
|
4418 }
|
yading@10
|
4419 }
|
yading@10
|
4420
|
yading@10
|
4421 if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
|
yading@10
|
4422 for (i = 0; i < 4; i++) {
|
yading@10
|
4423 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = 0;
|
yading@10
|
4424 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = 0;
|
yading@10
|
4425 s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = 0;
|
yading@10
|
4426 s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = 0;
|
yading@10
|
4427 }
|
yading@10
|
4428 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
|
yading@10
|
4429 s->mb_intra = v->is_intra[s->mb_x] = 1;
|
yading@10
|
4430 for (i = 0; i < 6; i++)
|
yading@10
|
4431 v->mb_type[0][s->block_index[i]] = 1;
|
yading@10
|
4432 fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
|
yading@10
|
4433 mb_has_coeffs = get_bits1(gb);
|
yading@10
|
4434 if (mb_has_coeffs)
|
yading@10
|
4435 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
4436 v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
|
yading@10
|
4437 GET_MQUANT();
|
yading@10
|
4438 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4439 /* Set DC scale - y and c use the same (not sure if necessary here) */
|
yading@10
|
4440 s->y_dc_scale = s->y_dc_scale_table[mquant];
|
yading@10
|
4441 s->c_dc_scale = s->c_dc_scale_table[mquant];
|
yading@10
|
4442 dst_idx = 0;
|
yading@10
|
4443 for (i = 0; i < 6; i++) {
|
yading@10
|
4444 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4445 dst_idx += i >> 2;
|
yading@10
|
4446 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
4447 v->mb_type[0][s->block_index[i]] = s->mb_intra;
|
yading@10
|
4448 v->a_avail = v->c_avail = 0;
|
yading@10
|
4449 if (i == 2 || i == 3 || !s->first_slice_line)
|
yading@10
|
4450 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
|
yading@10
|
4451 if (i == 1 || i == 3 || s->mb_x)
|
yading@10
|
4452 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
|
yading@10
|
4453
|
yading@10
|
4454 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
|
yading@10
|
4455 (i & 4) ? v->codingset2 : v->codingset);
|
yading@10
|
4456 if ((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
|
yading@10
|
4457 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
|
yading@10
|
4458 if (i < 4) {
|
yading@10
|
4459 stride_y = s->linesize << fieldtx;
|
yading@10
|
4460 off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
|
yading@10
|
4461 } else {
|
yading@10
|
4462 stride_y = s->uvlinesize;
|
yading@10
|
4463 off = 0;
|
yading@10
|
4464 }
|
yading@10
|
4465 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
|
yading@10
|
4466 }
|
yading@10
|
4467 } else {
|
yading@10
|
4468 s->mb_intra = v->is_intra[s->mb_x] = 0;
|
yading@10
|
4469 if (!direct) {
|
yading@10
|
4470 if (skipped || !s->mb_intra) {
|
yading@10
|
4471 bmvtype = decode012(gb);
|
yading@10
|
4472 switch (bmvtype) {
|
yading@10
|
4473 case 0:
|
yading@10
|
4474 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
|
yading@10
|
4475 break;
|
yading@10
|
4476 case 1:
|
yading@10
|
4477 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
|
yading@10
|
4478 break;
|
yading@10
|
4479 case 2:
|
yading@10
|
4480 bmvtype = BMV_TYPE_INTERPOLATED;
|
yading@10
|
4481 }
|
yading@10
|
4482 }
|
yading@10
|
4483
|
yading@10
|
4484 if (twomv && bmvtype != BMV_TYPE_INTERPOLATED)
|
yading@10
|
4485 mvsw = get_bits1(gb);
|
yading@10
|
4486 }
|
yading@10
|
4487
|
yading@10
|
4488 if (!skipped) { // inter MB
|
yading@10
|
4489 mb_has_coeffs = ff_vc1_mbmode_intfrp[0][idx_mbmode][3];
|
yading@10
|
4490 if (mb_has_coeffs)
|
yading@10
|
4491 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
|
yading@10
|
4492 if (!direct) {
|
yading@10
|
4493 if (bmvtype == BMV_TYPE_INTERPOLATED & twomv) {
|
yading@10
|
4494 v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
|
yading@10
|
4495 }
|
yading@10
|
4496 else if (bmvtype == BMV_TYPE_INTERPOLATED | twomv) {
|
yading@10
|
4497 v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
|
yading@10
|
4498 }
|
yading@10
|
4499 }
|
yading@10
|
4500
|
yading@10
|
4501 for (i = 0; i < 6; i++)
|
yading@10
|
4502 v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
4503 fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[0][idx_mbmode][1];
|
yading@10
|
4504 /* for all motion vector read MVDATA and motion compensate each block */
|
yading@10
|
4505 dst_idx = 0;
|
yading@10
|
4506 if (direct) {
|
yading@10
|
4507 if (twomv) {
|
yading@10
|
4508 for (i = 0; i < 4; i++) {
|
yading@10
|
4509 vc1_mc_4mv_luma(v, i, 0, 0);
|
yading@10
|
4510 vc1_mc_4mv_luma(v, i, 1, 1);
|
yading@10
|
4511 }
|
yading@10
|
4512 vc1_mc_4mv_chroma4(v);
|
yading@10
|
4513 } else {
|
yading@10
|
4514 vc1_mc_1mv(v, 0);
|
yading@10
|
4515 vc1_interp_mc(v);
|
yading@10
|
4516 }
|
yading@10
|
4517 } else if (twomv && bmvtype == BMV_TYPE_INTERPOLATED) {
|
yading@10
|
4518 mvbp = v->fourmvbp;
|
yading@10
|
4519 for (i = 0; i < 4; i++) {
|
yading@10
|
4520 dir = i==1 || i==3;
|
yading@10
|
4521 dmv_x = dmv_y = 0;
|
yading@10
|
4522 val = ((mvbp >> (3 - i)) & 1);
|
yading@10
|
4523 if (val) {
|
yading@10
|
4524 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
4525 }
|
yading@10
|
4526 j = i > 1 ? 2 : 0;
|
yading@10
|
4527 vc1_pred_mv_intfr(v, j, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir);
|
yading@10
|
4528 vc1_mc_4mv_luma(v, j, dir, dir);
|
yading@10
|
4529 vc1_mc_4mv_luma(v, j+1, dir, dir);
|
yading@10
|
4530 }
|
yading@10
|
4531
|
yading@10
|
4532 vc1_mc_4mv_chroma4(v);
|
yading@10
|
4533 } else if (bmvtype == BMV_TYPE_INTERPOLATED) {
|
yading@10
|
4534 mvbp = v->twomvbp;
|
yading@10
|
4535 dmv_x = dmv_y = 0;
|
yading@10
|
4536 if (mvbp & 2) {
|
yading@10
|
4537 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
4538 }
|
yading@10
|
4539
|
yading@10
|
4540 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0);
|
yading@10
|
4541 vc1_mc_1mv(v, 0);
|
yading@10
|
4542
|
yading@10
|
4543 dmv_x = dmv_y = 0;
|
yading@10
|
4544 if (mvbp & 1) {
|
yading@10
|
4545 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
4546 }
|
yading@10
|
4547
|
yading@10
|
4548 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 1);
|
yading@10
|
4549 vc1_interp_mc(v);
|
yading@10
|
4550 } else if (twomv) {
|
yading@10
|
4551 dir = bmvtype == BMV_TYPE_BACKWARD;
|
yading@10
|
4552 dir2 = dir;
|
yading@10
|
4553 if (mvsw)
|
yading@10
|
4554 dir2 = !dir;
|
yading@10
|
4555 mvbp = v->twomvbp;
|
yading@10
|
4556 dmv_x = dmv_y = 0;
|
yading@10
|
4557 if (mvbp & 2) {
|
yading@10
|
4558 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
4559 }
|
yading@10
|
4560 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir);
|
yading@10
|
4561
|
yading@10
|
4562 dmv_x = dmv_y = 0;
|
yading@10
|
4563 if (mvbp & 1) {
|
yading@10
|
4564 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
4565 }
|
yading@10
|
4566 vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0], dir2);
|
yading@10
|
4567
|
yading@10
|
4568 if (mvsw) {
|
yading@10
|
4569 for (i = 0; i<2; i++) {
|
yading@10
|
4570 s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->current_picture.motion_val[dir][s->block_index[i+2]][0] = s->current_picture.motion_val[dir][s->block_index[i]][0];
|
yading@10
|
4571 s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->current_picture.motion_val[dir][s->block_index[i+2]][1] = s->current_picture.motion_val[dir][s->block_index[i]][1];
|
yading@10
|
4572 s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->current_picture.motion_val[dir2][s->block_index[i]][0] = s->current_picture.motion_val[dir2][s->block_index[i+2]][0];
|
yading@10
|
4573 s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->current_picture.motion_val[dir2][s->block_index[i]][1] = s->current_picture.motion_val[dir2][s->block_index[i+2]][1];
|
yading@10
|
4574 }
|
yading@10
|
4575 } else {
|
yading@10
|
4576 vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, v->mb_type[0], !dir);
|
yading@10
|
4577 vc1_pred_mv_intfr(v, 2, 0, 0, 2, v->range_x, v->range_y, v->mb_type[0], !dir);
|
yading@10
|
4578 }
|
yading@10
|
4579
|
yading@10
|
4580 vc1_mc_4mv_luma(v, 0, dir, 0);
|
yading@10
|
4581 vc1_mc_4mv_luma(v, 1, dir, 0);
|
yading@10
|
4582 vc1_mc_4mv_luma(v, 2, dir2, 0);
|
yading@10
|
4583 vc1_mc_4mv_luma(v, 3, dir2, 0);
|
yading@10
|
4584 vc1_mc_4mv_chroma4(v);
|
yading@10
|
4585 } else {
|
yading@10
|
4586 dir = bmvtype == BMV_TYPE_BACKWARD;
|
yading@10
|
4587
|
yading@10
|
4588 mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2];
|
yading@10
|
4589 dmv_x = dmv_y = 0;
|
yading@10
|
4590 if (mvbp) {
|
yading@10
|
4591 get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
|
yading@10
|
4592 }
|
yading@10
|
4593
|
yading@10
|
4594 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], dir);
|
yading@10
|
4595 v->blk_mv_type[s->block_index[0]] = 1;
|
yading@10
|
4596 v->blk_mv_type[s->block_index[1]] = 1;
|
yading@10
|
4597 v->blk_mv_type[s->block_index[2]] = 1;
|
yading@10
|
4598 v->blk_mv_type[s->block_index[3]] = 1;
|
yading@10
|
4599 vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, 0, !dir);
|
yading@10
|
4600 for (i = 0; i<2; i++) {
|
yading@10
|
4601 s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->current_picture.motion_val[!dir][s->block_index[i+2]][0] = s->current_picture.motion_val[!dir][s->block_index[i]][0];
|
yading@10
|
4602 s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->current_picture.motion_val[!dir][s->block_index[i+2]][1] = s->current_picture.motion_val[!dir][s->block_index[i]][1];
|
yading@10
|
4603 }
|
yading@10
|
4604 vc1_mc_1mv(v, dir);
|
yading@10
|
4605 }
|
yading@10
|
4606
|
yading@10
|
4607 if (cbp)
|
yading@10
|
4608 GET_MQUANT(); // p. 227
|
yading@10
|
4609 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4610 if (!v->ttmbf && cbp)
|
yading@10
|
4611 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
|
yading@10
|
4612 for (i = 0; i < 6; i++) {
|
yading@10
|
4613 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4614 dst_idx += i >> 2;
|
yading@10
|
4615 val = ((cbp >> (5 - i)) & 1);
|
yading@10
|
4616 if (!fieldtx)
|
yading@10
|
4617 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
|
yading@10
|
4618 else
|
yading@10
|
4619 off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
|
yading@10
|
4620 if (val) {
|
yading@10
|
4621 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
|
yading@10
|
4622 first_block, s->dest[dst_idx] + off,
|
yading@10
|
4623 (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
|
yading@10
|
4624 (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
|
yading@10
|
4625 block_cbp |= pat << (i << 2);
|
yading@10
|
4626 if (!v->ttmbf && ttmb < 8)
|
yading@10
|
4627 ttmb = -1;
|
yading@10
|
4628 first_block = 0;
|
yading@10
|
4629 }
|
yading@10
|
4630 }
|
yading@10
|
4631
|
yading@10
|
4632 } else { // skipped
|
yading@10
|
4633 dir = 0;
|
yading@10
|
4634 for (i = 0; i < 6; i++) {
|
yading@10
|
4635 v->mb_type[0][s->block_index[i]] = 0;
|
yading@10
|
4636 s->dc_val[0][s->block_index[i]] = 0;
|
yading@10
|
4637 }
|
yading@10
|
4638 s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
|
yading@10
|
4639 s->current_picture.qscale_table[mb_pos] = 0;
|
yading@10
|
4640 v->blk_mv_type[s->block_index[0]] = 0;
|
yading@10
|
4641 v->blk_mv_type[s->block_index[1]] = 0;
|
yading@10
|
4642 v->blk_mv_type[s->block_index[2]] = 0;
|
yading@10
|
4643 v->blk_mv_type[s->block_index[3]] = 0;
|
yading@10
|
4644
|
yading@10
|
4645 if (!direct) {
|
yading@10
|
4646 if (bmvtype == BMV_TYPE_INTERPOLATED) {
|
yading@10
|
4647 vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0);
|
yading@10
|
4648 vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 1);
|
yading@10
|
4649 } else {
|
yading@10
|
4650 dir = bmvtype == BMV_TYPE_BACKWARD;
|
yading@10
|
4651 vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], dir);
|
yading@10
|
4652 if (mvsw) {
|
yading@10
|
4653 int dir2 = dir;
|
yading@10
|
4654 if (mvsw)
|
yading@10
|
4655 dir2 = !dir;
|
yading@10
|
4656 for (i = 0; i<2; i++) {
|
yading@10
|
4657 s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->current_picture.motion_val[dir][s->block_index[i+2]][0] = s->current_picture.motion_val[dir][s->block_index[i]][0];
|
yading@10
|
4658 s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->current_picture.motion_val[dir][s->block_index[i+2]][1] = s->current_picture.motion_val[dir][s->block_index[i]][1];
|
yading@10
|
4659 s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->current_picture.motion_val[dir2][s->block_index[i]][0] = s->current_picture.motion_val[dir2][s->block_index[i+2]][0];
|
yading@10
|
4660 s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->current_picture.motion_val[dir2][s->block_index[i]][1] = s->current_picture.motion_val[dir2][s->block_index[i+2]][1];
|
yading@10
|
4661 }
|
yading@10
|
4662 } else {
|
yading@10
|
4663 v->blk_mv_type[s->block_index[0]] = 1;
|
yading@10
|
4664 v->blk_mv_type[s->block_index[1]] = 1;
|
yading@10
|
4665 v->blk_mv_type[s->block_index[2]] = 1;
|
yading@10
|
4666 v->blk_mv_type[s->block_index[3]] = 1;
|
yading@10
|
4667 vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, 0, !dir);
|
yading@10
|
4668 for (i = 0; i<2; i++) {
|
yading@10
|
4669 s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->current_picture.motion_val[!dir][s->block_index[i+2]][0] = s->current_picture.motion_val[!dir][s->block_index[i]][0];
|
yading@10
|
4670 s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->current_picture.motion_val[!dir][s->block_index[i+2]][1] = s->current_picture.motion_val[!dir][s->block_index[i]][1];
|
yading@10
|
4671 }
|
yading@10
|
4672 }
|
yading@10
|
4673 }
|
yading@10
|
4674 }
|
yading@10
|
4675
|
yading@10
|
4676 vc1_mc_1mv(v, dir);
|
yading@10
|
4677 if (direct || bmvtype == BMV_TYPE_INTERPOLATED) {
|
yading@10
|
4678 vc1_interp_mc(v);
|
yading@10
|
4679 }
|
yading@10
|
4680 }
|
yading@10
|
4681 }
|
yading@10
|
4682 if (s->mb_x == s->mb_width - 1)
|
yading@10
|
4683 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
|
yading@10
|
4684 v->cbp[s->mb_x] = block_cbp;
|
yading@10
|
4685 v->ttblk[s->mb_x] = block_tt;
|
yading@10
|
4686 return 0;
|
yading@10
|
4687 }
|
yading@10
|
4688
|
yading@10
|
4689 /** Decode blocks of I-frame
|
yading@10
|
4690 */
|
yading@10
|
4691 static void vc1_decode_i_blocks(VC1Context *v)
|
yading@10
|
4692 {
|
yading@10
|
4693 int k, j;
|
yading@10
|
4694 MpegEncContext *s = &v->s;
|
yading@10
|
4695 int cbp, val;
|
yading@10
|
4696 uint8_t *coded_val;
|
yading@10
|
4697 int mb_pos;
|
yading@10
|
4698
|
yading@10
|
4699 /* select codingmode used for VLC tables selection */
|
yading@10
|
4700 switch (v->y_ac_table_index) {
|
yading@10
|
4701 case 0:
|
yading@10
|
4702 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
|
yading@10
|
4703 break;
|
yading@10
|
4704 case 1:
|
yading@10
|
4705 v->codingset = CS_HIGH_MOT_INTRA;
|
yading@10
|
4706 break;
|
yading@10
|
4707 case 2:
|
yading@10
|
4708 v->codingset = CS_MID_RATE_INTRA;
|
yading@10
|
4709 break;
|
yading@10
|
4710 }
|
yading@10
|
4711
|
yading@10
|
4712 switch (v->c_ac_table_index) {
|
yading@10
|
4713 case 0:
|
yading@10
|
4714 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
|
yading@10
|
4715 break;
|
yading@10
|
4716 case 1:
|
yading@10
|
4717 v->codingset2 = CS_HIGH_MOT_INTER;
|
yading@10
|
4718 break;
|
yading@10
|
4719 case 2:
|
yading@10
|
4720 v->codingset2 = CS_MID_RATE_INTER;
|
yading@10
|
4721 break;
|
yading@10
|
4722 }
|
yading@10
|
4723
|
yading@10
|
4724 /* Set DC scale - y and c use the same */
|
yading@10
|
4725 s->y_dc_scale = s->y_dc_scale_table[v->pq];
|
yading@10
|
4726 s->c_dc_scale = s->c_dc_scale_table[v->pq];
|
yading@10
|
4727
|
yading@10
|
4728 //do frame decode
|
yading@10
|
4729 s->mb_x = s->mb_y = 0;
|
yading@10
|
4730 s->mb_intra = 1;
|
yading@10
|
4731 s->first_slice_line = 1;
|
yading@10
|
4732 for (s->mb_y = 0; s->mb_y < s->end_mb_y; s->mb_y++) {
|
yading@10
|
4733 s->mb_x = 0;
|
yading@10
|
4734 init_block_index(v);
|
yading@10
|
4735 for (; s->mb_x < v->end_mb_x; s->mb_x++) {
|
yading@10
|
4736 uint8_t *dst[6];
|
yading@10
|
4737 ff_update_block_index(s);
|
yading@10
|
4738 dst[0] = s->dest[0];
|
yading@10
|
4739 dst[1] = dst[0] + 8;
|
yading@10
|
4740 dst[2] = s->dest[0] + s->linesize * 8;
|
yading@10
|
4741 dst[3] = dst[2] + 8;
|
yading@10
|
4742 dst[4] = s->dest[1];
|
yading@10
|
4743 dst[5] = s->dest[2];
|
yading@10
|
4744 s->dsp.clear_blocks(s->block[0]);
|
yading@10
|
4745 mb_pos = s->mb_x + s->mb_y * s->mb_width;
|
yading@10
|
4746 s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
|
yading@10
|
4747 s->current_picture.qscale_table[mb_pos] = v->pq;
|
yading@10
|
4748 s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
|
yading@10
|
4749 s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
|
yading@10
|
4750
|
yading@10
|
4751 // do actual MB decoding and displaying
|
yading@10
|
4752 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
|
yading@10
|
4753 v->s.ac_pred = get_bits1(&v->s.gb);
|
yading@10
|
4754
|
yading@10
|
4755 for (k = 0; k < 6; k++) {
|
yading@10
|
4756 val = ((cbp >> (5 - k)) & 1);
|
yading@10
|
4757
|
yading@10
|
4758 if (k < 4) {
|
yading@10
|
4759 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
|
yading@10
|
4760 val = val ^ pred;
|
yading@10
|
4761 *coded_val = val;
|
yading@10
|
4762 }
|
yading@10
|
4763 cbp |= val << (5 - k);
|
yading@10
|
4764
|
yading@10
|
4765 vc1_decode_i_block(v, s->block[k], k, val, (k < 4) ? v->codingset : v->codingset2);
|
yading@10
|
4766
|
yading@10
|
4767 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
|
yading@10
|
4768 continue;
|
yading@10
|
4769 v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
|
yading@10
|
4770 if (v->pq >= 9 && v->overlap) {
|
yading@10
|
4771 if (v->rangeredfrm)
|
yading@10
|
4772 for (j = 0; j < 64; j++)
|
yading@10
|
4773 s->block[k][j] <<= 1;
|
yading@10
|
4774 s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
4775 } else {
|
yading@10
|
4776 if (v->rangeredfrm)
|
yading@10
|
4777 for (j = 0; j < 64; j++)
|
yading@10
|
4778 s->block[k][j] = (s->block[k][j] - 64) << 1;
|
yading@10
|
4779 s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
|
yading@10
|
4780 }
|
yading@10
|
4781 }
|
yading@10
|
4782
|
yading@10
|
4783 if (v->pq >= 9 && v->overlap) {
|
yading@10
|
4784 if (s->mb_x) {
|
yading@10
|
4785 v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
|
yading@10
|
4786 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
|
yading@10
|
4787 if (!(s->flags & CODEC_FLAG_GRAY)) {
|
yading@10
|
4788 v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
|
yading@10
|
4789 v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
|
yading@10
|
4790 }
|
yading@10
|
4791 }
|
yading@10
|
4792 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
|
yading@10
|
4793 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
|
yading@10
|
4794 if (!s->first_slice_line) {
|
yading@10
|
4795 v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
|
yading@10
|
4796 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
|
yading@10
|
4797 if (!(s->flags & CODEC_FLAG_GRAY)) {
|
yading@10
|
4798 v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
|
yading@10
|
4799 v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
|
yading@10
|
4800 }
|
yading@10
|
4801 }
|
yading@10
|
4802 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
|
yading@10
|
4803 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
|
yading@10
|
4804 }
|
yading@10
|
4805 if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
|
yading@10
|
4806
|
yading@10
|
4807 if (get_bits_count(&s->gb) > v->bits) {
|
yading@10
|
4808 ff_er_add_slice(&s->er, 0, 0, s->mb_x, s->mb_y, ER_MB_ERROR);
|
yading@10
|
4809 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
|
yading@10
|
4810 get_bits_count(&s->gb), v->bits);
|
yading@10
|
4811 return;
|
yading@10
|
4812 }
|
yading@10
|
4813 }
|
yading@10
|
4814 if (!v->s.loop_filter)
|
yading@10
|
4815 ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
|
yading@10
|
4816 else if (s->mb_y)
|
yading@10
|
4817 ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
|
yading@10
|
4818
|
yading@10
|
4819 s->first_slice_line = 0;
|
yading@10
|
4820 }
|
yading@10
|
4821 if (v->s.loop_filter)
|
yading@10
|
4822 ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
|
yading@10
|
4823
|
yading@10
|
4824 /* This is intentionally mb_height and not end_mb_y - unlike in advanced
|
yading@10
|
4825 * profile, these only differ are when decoding MSS2 rectangles. */
|
yading@10
|
4826 ff_er_add_slice(&s->er, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END);
|
yading@10
|
4827 }
|
yading@10
|
4828
|
yading@10
|
4829 /** Decode blocks of I-frame for advanced profile
|
yading@10
|
4830 */
|
yading@10
|
4831 static void vc1_decode_i_blocks_adv(VC1Context *v)
|
yading@10
|
4832 {
|
yading@10
|
4833 int k;
|
yading@10
|
4834 MpegEncContext *s = &v->s;
|
yading@10
|
4835 int cbp, val;
|
yading@10
|
4836 uint8_t *coded_val;
|
yading@10
|
4837 int mb_pos;
|
yading@10
|
4838 int mquant = v->pq;
|
yading@10
|
4839 int mqdiff;
|
yading@10
|
4840 GetBitContext *gb = &s->gb;
|
yading@10
|
4841
|
yading@10
|
4842 /* select codingmode used for VLC tables selection */
|
yading@10
|
4843 switch (v->y_ac_table_index) {
|
yading@10
|
4844 case 0:
|
yading@10
|
4845 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
|
yading@10
|
4846 break;
|
yading@10
|
4847 case 1:
|
yading@10
|
4848 v->codingset = CS_HIGH_MOT_INTRA;
|
yading@10
|
4849 break;
|
yading@10
|
4850 case 2:
|
yading@10
|
4851 v->codingset = CS_MID_RATE_INTRA;
|
yading@10
|
4852 break;
|
yading@10
|
4853 }
|
yading@10
|
4854
|
yading@10
|
4855 switch (v->c_ac_table_index) {
|
yading@10
|
4856 case 0:
|
yading@10
|
4857 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
|
yading@10
|
4858 break;
|
yading@10
|
4859 case 1:
|
yading@10
|
4860 v->codingset2 = CS_HIGH_MOT_INTER;
|
yading@10
|
4861 break;
|
yading@10
|
4862 case 2:
|
yading@10
|
4863 v->codingset2 = CS_MID_RATE_INTER;
|
yading@10
|
4864 break;
|
yading@10
|
4865 }
|
yading@10
|
4866
|
yading@10
|
4867 // do frame decode
|
yading@10
|
4868 s->mb_x = s->mb_y = 0;
|
yading@10
|
4869 s->mb_intra = 1;
|
yading@10
|
4870 s->first_slice_line = 1;
|
yading@10
|
4871 s->mb_y = s->start_mb_y;
|
yading@10
|
4872 if (s->start_mb_y) {
|
yading@10
|
4873 s->mb_x = 0;
|
yading@10
|
4874 init_block_index(v);
|
yading@10
|
4875 memset(&s->coded_block[s->block_index[0] - s->b8_stride], 0,
|
yading@10
|
4876 (1 + s->b8_stride) * sizeof(*s->coded_block));
|
yading@10
|
4877 }
|
yading@10
|
4878 for (; s->mb_y < s->end_mb_y; s->mb_y++) {
|
yading@10
|
4879 s->mb_x = 0;
|
yading@10
|
4880 init_block_index(v);
|
yading@10
|
4881 for (;s->mb_x < s->mb_width; s->mb_x++) {
|
yading@10
|
4882 int16_t (*block)[64] = v->block[v->cur_blk_idx];
|
yading@10
|
4883 ff_update_block_index(s);
|
yading@10
|
4884 s->dsp.clear_blocks(block[0]);
|
yading@10
|
4885 mb_pos = s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
4886 s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
|
yading@10
|
4887 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
|
yading@10
|
4888 s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
|
yading@10
|
4889
|
yading@10
|
4890 // do actual MB decoding and displaying
|
yading@10
|
4891 if (v->fieldtx_is_raw)
|
yading@10
|
4892 v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb);
|
yading@10
|
4893 cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
|
yading@10
|
4894 if ( v->acpred_is_raw)
|
yading@10
|
4895 v->s.ac_pred = get_bits1(&v->s.gb);
|
yading@10
|
4896 else
|
yading@10
|
4897 v->s.ac_pred = v->acpred_plane[mb_pos];
|
yading@10
|
4898
|
yading@10
|
4899 if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
|
yading@10
|
4900 v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
|
yading@10
|
4901
|
yading@10
|
4902 GET_MQUANT();
|
yading@10
|
4903
|
yading@10
|
4904 s->current_picture.qscale_table[mb_pos] = mquant;
|
yading@10
|
4905 /* Set DC scale - y and c use the same */
|
yading@10
|
4906 s->y_dc_scale = s->y_dc_scale_table[mquant];
|
yading@10
|
4907 s->c_dc_scale = s->c_dc_scale_table[mquant];
|
yading@10
|
4908
|
yading@10
|
4909 for (k = 0; k < 6; k++) {
|
yading@10
|
4910 val = ((cbp >> (5 - k)) & 1);
|
yading@10
|
4911
|
yading@10
|
4912 if (k < 4) {
|
yading@10
|
4913 int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
|
yading@10
|
4914 val = val ^ pred;
|
yading@10
|
4915 *coded_val = val;
|
yading@10
|
4916 }
|
yading@10
|
4917 cbp |= val << (5 - k);
|
yading@10
|
4918
|
yading@10
|
4919 v->a_avail = !s->first_slice_line || (k == 2 || k == 3);
|
yading@10
|
4920 v->c_avail = !!s->mb_x || (k == 1 || k == 3);
|
yading@10
|
4921
|
yading@10
|
4922 vc1_decode_i_block_adv(v, block[k], k, val,
|
yading@10
|
4923 (k < 4) ? v->codingset : v->codingset2, mquant);
|
yading@10
|
4924
|
yading@10
|
4925 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
|
yading@10
|
4926 continue;
|
yading@10
|
4927 v->vc1dsp.vc1_inv_trans_8x8(block[k]);
|
yading@10
|
4928 }
|
yading@10
|
4929
|
yading@10
|
4930 vc1_smooth_overlap_filter_iblk(v);
|
yading@10
|
4931 vc1_put_signed_blocks_clamped(v);
|
yading@10
|
4932 if (v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
|
yading@10
|
4933
|
yading@10
|
4934 if (get_bits_count(&s->gb) > v->bits) {
|
yading@10
|
4935 // TODO: may need modification to handle slice coding
|
yading@10
|
4936 ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
|
yading@10
|
4937 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
|
yading@10
|
4938 get_bits_count(&s->gb), v->bits);
|
yading@10
|
4939 return;
|
yading@10
|
4940 }
|
yading@10
|
4941 }
|
yading@10
|
4942 if (!v->s.loop_filter)
|
yading@10
|
4943 ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
|
yading@10
|
4944 else if (s->mb_y)
|
yading@10
|
4945 ff_mpeg_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
|
yading@10
|
4946 s->first_slice_line = 0;
|
yading@10
|
4947 }
|
yading@10
|
4948
|
yading@10
|
4949 /* raw bottom MB row */
|
yading@10
|
4950 s->mb_x = 0;
|
yading@10
|
4951 init_block_index(v);
|
yading@10
|
4952
|
yading@10
|
4953 for (;s->mb_x < s->mb_width; s->mb_x++) {
|
yading@10
|
4954 ff_update_block_index(s);
|
yading@10
|
4955 vc1_put_signed_blocks_clamped(v);
|
yading@10
|
4956 if (v->s.loop_filter)
|
yading@10
|
4957 vc1_loop_filter_iblk_delayed(v, v->pq);
|
yading@10
|
4958 }
|
yading@10
|
4959 if (v->s.loop_filter)
|
yading@10
|
4960 ff_mpeg_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
|
yading@10
|
4961 ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
|
yading@10
|
4962 (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
|
yading@10
|
4963 }
|
yading@10
|
4964
|
yading@10
|
4965 static void vc1_decode_p_blocks(VC1Context *v)
|
yading@10
|
4966 {
|
yading@10
|
4967 MpegEncContext *s = &v->s;
|
yading@10
|
4968 int apply_loop_filter;
|
yading@10
|
4969
|
yading@10
|
4970 /* select codingmode used for VLC tables selection */
|
yading@10
|
4971 switch (v->c_ac_table_index) {
|
yading@10
|
4972 case 0:
|
yading@10
|
4973 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
|
yading@10
|
4974 break;
|
yading@10
|
4975 case 1:
|
yading@10
|
4976 v->codingset = CS_HIGH_MOT_INTRA;
|
yading@10
|
4977 break;
|
yading@10
|
4978 case 2:
|
yading@10
|
4979 v->codingset = CS_MID_RATE_INTRA;
|
yading@10
|
4980 break;
|
yading@10
|
4981 }
|
yading@10
|
4982
|
yading@10
|
4983 switch (v->c_ac_table_index) {
|
yading@10
|
4984 case 0:
|
yading@10
|
4985 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
|
yading@10
|
4986 break;
|
yading@10
|
4987 case 1:
|
yading@10
|
4988 v->codingset2 = CS_HIGH_MOT_INTER;
|
yading@10
|
4989 break;
|
yading@10
|
4990 case 2:
|
yading@10
|
4991 v->codingset2 = CS_MID_RATE_INTER;
|
yading@10
|
4992 break;
|
yading@10
|
4993 }
|
yading@10
|
4994
|
yading@10
|
4995 apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
|
yading@10
|
4996 s->first_slice_line = 1;
|
yading@10
|
4997 memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
|
yading@10
|
4998 for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
|
yading@10
|
4999 s->mb_x = 0;
|
yading@10
|
5000 init_block_index(v);
|
yading@10
|
5001 for (; s->mb_x < s->mb_width; s->mb_x++) {
|
yading@10
|
5002 ff_update_block_index(s);
|
yading@10
|
5003
|
yading@10
|
5004 if (v->fcm == ILACE_FIELD)
|
yading@10
|
5005 vc1_decode_p_mb_intfi(v);
|
yading@10
|
5006 else if (v->fcm == ILACE_FRAME)
|
yading@10
|
5007 vc1_decode_p_mb_intfr(v);
|
yading@10
|
5008 else vc1_decode_p_mb(v);
|
yading@10
|
5009 if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == PROGRESSIVE)
|
yading@10
|
5010 vc1_apply_p_loop_filter(v);
|
yading@10
|
5011 if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
|
yading@10
|
5012 // TODO: may need modification to handle slice coding
|
yading@10
|
5013 ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
|
yading@10
|
5014 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
|
yading@10
|
5015 get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
|
yading@10
|
5016 return;
|
yading@10
|
5017 }
|
yading@10
|
5018 }
|
yading@10
|
5019 memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0]) * s->mb_stride);
|
yading@10
|
5020 memmove(v->ttblk_base, v->ttblk, sizeof(v->ttblk_base[0]) * s->mb_stride);
|
yading@10
|
5021 memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
|
yading@10
|
5022 memmove(v->luma_mv_base, v->luma_mv, sizeof(v->luma_mv_base[0]) * s->mb_stride);
|
yading@10
|
5023 if (s->mb_y != s->start_mb_y) ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
|
yading@10
|
5024 s->first_slice_line = 0;
|
yading@10
|
5025 }
|
yading@10
|
5026 if (apply_loop_filter && v->fcm == PROGRESSIVE) {
|
yading@10
|
5027 s->mb_x = 0;
|
yading@10
|
5028 init_block_index(v);
|
yading@10
|
5029 for (; s->mb_x < s->mb_width; s->mb_x++) {
|
yading@10
|
5030 ff_update_block_index(s);
|
yading@10
|
5031 vc1_apply_p_loop_filter(v);
|
yading@10
|
5032 }
|
yading@10
|
5033 }
|
yading@10
|
5034 if (s->end_mb_y >= s->start_mb_y)
|
yading@10
|
5035 ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
|
yading@10
|
5036 ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
|
yading@10
|
5037 (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
|
yading@10
|
5038 }
|
yading@10
|
5039
|
yading@10
|
5040 static void vc1_decode_b_blocks(VC1Context *v)
|
yading@10
|
5041 {
|
yading@10
|
5042 MpegEncContext *s = &v->s;
|
yading@10
|
5043
|
yading@10
|
5044 /* select codingmode used for VLC tables selection */
|
yading@10
|
5045 switch (v->c_ac_table_index) {
|
yading@10
|
5046 case 0:
|
yading@10
|
5047 v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
|
yading@10
|
5048 break;
|
yading@10
|
5049 case 1:
|
yading@10
|
5050 v->codingset = CS_HIGH_MOT_INTRA;
|
yading@10
|
5051 break;
|
yading@10
|
5052 case 2:
|
yading@10
|
5053 v->codingset = CS_MID_RATE_INTRA;
|
yading@10
|
5054 break;
|
yading@10
|
5055 }
|
yading@10
|
5056
|
yading@10
|
5057 switch (v->c_ac_table_index) {
|
yading@10
|
5058 case 0:
|
yading@10
|
5059 v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
|
yading@10
|
5060 break;
|
yading@10
|
5061 case 1:
|
yading@10
|
5062 v->codingset2 = CS_HIGH_MOT_INTER;
|
yading@10
|
5063 break;
|
yading@10
|
5064 case 2:
|
yading@10
|
5065 v->codingset2 = CS_MID_RATE_INTER;
|
yading@10
|
5066 break;
|
yading@10
|
5067 }
|
yading@10
|
5068
|
yading@10
|
5069 s->first_slice_line = 1;
|
yading@10
|
5070 for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
|
yading@10
|
5071 s->mb_x = 0;
|
yading@10
|
5072 init_block_index(v);
|
yading@10
|
5073 for (; s->mb_x < s->mb_width; s->mb_x++) {
|
yading@10
|
5074 ff_update_block_index(s);
|
yading@10
|
5075
|
yading@10
|
5076 if (v->fcm == ILACE_FIELD)
|
yading@10
|
5077 vc1_decode_b_mb_intfi(v);
|
yading@10
|
5078 else if (v->fcm == ILACE_FRAME)
|
yading@10
|
5079 vc1_decode_b_mb_intfr(v);
|
yading@10
|
5080 else
|
yading@10
|
5081 vc1_decode_b_mb(v);
|
yading@10
|
5082 if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
|
yading@10
|
5083 // TODO: may need modification to handle slice coding
|
yading@10
|
5084 ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
|
yading@10
|
5085 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
|
yading@10
|
5086 get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
|
yading@10
|
5087 return;
|
yading@10
|
5088 }
|
yading@10
|
5089 if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
|
yading@10
|
5090 }
|
yading@10
|
5091 if (!v->s.loop_filter)
|
yading@10
|
5092 ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
|
yading@10
|
5093 else if (s->mb_y)
|
yading@10
|
5094 ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
|
yading@10
|
5095 s->first_slice_line = 0;
|
yading@10
|
5096 }
|
yading@10
|
5097 if (v->s.loop_filter)
|
yading@10
|
5098 ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
|
yading@10
|
5099 ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
|
yading@10
|
5100 (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
|
yading@10
|
5101 }
|
yading@10
|
5102
|
yading@10
|
5103 static void vc1_decode_skip_blocks(VC1Context *v)
|
yading@10
|
5104 {
|
yading@10
|
5105 MpegEncContext *s = &v->s;
|
yading@10
|
5106
|
yading@10
|
5107 ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, ER_MB_END);
|
yading@10
|
5108 s->first_slice_line = 1;
|
yading@10
|
5109 for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
|
yading@10
|
5110 s->mb_x = 0;
|
yading@10
|
5111 init_block_index(v);
|
yading@10
|
5112 ff_update_block_index(s);
|
yading@10
|
5113 if (s->last_picture.f.data[0]) {
|
yading@10
|
5114 memcpy(s->dest[0], s->last_picture.f.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
|
yading@10
|
5115 memcpy(s->dest[1], s->last_picture.f.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
|
yading@10
|
5116 memcpy(s->dest[2], s->last_picture.f.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
|
yading@10
|
5117 }
|
yading@10
|
5118 ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
|
yading@10
|
5119 s->first_slice_line = 0;
|
yading@10
|
5120 }
|
yading@10
|
5121 s->pict_type = AV_PICTURE_TYPE_P;
|
yading@10
|
5122 }
|
yading@10
|
5123
|
yading@10
|
5124 void ff_vc1_decode_blocks(VC1Context *v)
|
yading@10
|
5125 {
|
yading@10
|
5126
|
yading@10
|
5127 v->s.esc3_level_length = 0;
|
yading@10
|
5128 if (v->x8_type) {
|
yading@10
|
5129 ff_intrax8_decode_picture(&v->x8, 2*v->pq + v->halfpq, v->pq * !v->pquantizer);
|
yading@10
|
5130 } else {
|
yading@10
|
5131 v->cur_blk_idx = 0;
|
yading@10
|
5132 v->left_blk_idx = -1;
|
yading@10
|
5133 v->topleft_blk_idx = 1;
|
yading@10
|
5134 v->top_blk_idx = 2;
|
yading@10
|
5135 switch (v->s.pict_type) {
|
yading@10
|
5136 case AV_PICTURE_TYPE_I:
|
yading@10
|
5137 if (v->profile == PROFILE_ADVANCED)
|
yading@10
|
5138 vc1_decode_i_blocks_adv(v);
|
yading@10
|
5139 else
|
yading@10
|
5140 vc1_decode_i_blocks(v);
|
yading@10
|
5141 break;
|
yading@10
|
5142 case AV_PICTURE_TYPE_P:
|
yading@10
|
5143 if (v->p_frame_skipped)
|
yading@10
|
5144 vc1_decode_skip_blocks(v);
|
yading@10
|
5145 else
|
yading@10
|
5146 vc1_decode_p_blocks(v);
|
yading@10
|
5147 break;
|
yading@10
|
5148 case AV_PICTURE_TYPE_B:
|
yading@10
|
5149 if (v->bi_type) {
|
yading@10
|
5150 if (v->profile == PROFILE_ADVANCED)
|
yading@10
|
5151 vc1_decode_i_blocks_adv(v);
|
yading@10
|
5152 else
|
yading@10
|
5153 vc1_decode_i_blocks(v);
|
yading@10
|
5154 } else
|
yading@10
|
5155 vc1_decode_b_blocks(v);
|
yading@10
|
5156 break;
|
yading@10
|
5157 }
|
yading@10
|
5158 }
|
yading@10
|
5159 }
|
yading@10
|
5160
|
yading@10
|
5161 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
|
yading@10
|
5162
|
yading@10
|
5163 typedef struct {
|
yading@10
|
5164 /**
|
yading@10
|
5165 * Transform coefficients for both sprites in 16.16 fixed point format,
|
yading@10
|
5166 * in the order they appear in the bitstream:
|
yading@10
|
5167 * x scale
|
yading@10
|
5168 * rotation 1 (unused)
|
yading@10
|
5169 * x offset
|
yading@10
|
5170 * rotation 2 (unused)
|
yading@10
|
5171 * y scale
|
yading@10
|
5172 * y offset
|
yading@10
|
5173 * alpha
|
yading@10
|
5174 */
|
yading@10
|
5175 int coefs[2][7];
|
yading@10
|
5176
|
yading@10
|
5177 int effect_type, effect_flag;
|
yading@10
|
5178 int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
|
yading@10
|
5179 int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
|
yading@10
|
5180 } SpriteData;
|
yading@10
|
5181
|
yading@10
|
5182 static inline int get_fp_val(GetBitContext* gb)
|
yading@10
|
5183 {
|
yading@10
|
5184 return (get_bits_long(gb, 30) - (1 << 29)) << 1;
|
yading@10
|
5185 }
|
yading@10
|
5186
|
yading@10
|
5187 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
|
yading@10
|
5188 {
|
yading@10
|
5189 c[1] = c[3] = 0;
|
yading@10
|
5190
|
yading@10
|
5191 switch (get_bits(gb, 2)) {
|
yading@10
|
5192 case 0:
|
yading@10
|
5193 c[0] = 1 << 16;
|
yading@10
|
5194 c[2] = get_fp_val(gb);
|
yading@10
|
5195 c[4] = 1 << 16;
|
yading@10
|
5196 break;
|
yading@10
|
5197 case 1:
|
yading@10
|
5198 c[0] = c[4] = get_fp_val(gb);
|
yading@10
|
5199 c[2] = get_fp_val(gb);
|
yading@10
|
5200 break;
|
yading@10
|
5201 case 2:
|
yading@10
|
5202 c[0] = get_fp_val(gb);
|
yading@10
|
5203 c[2] = get_fp_val(gb);
|
yading@10
|
5204 c[4] = get_fp_val(gb);
|
yading@10
|
5205 break;
|
yading@10
|
5206 case 3:
|
yading@10
|
5207 c[0] = get_fp_val(gb);
|
yading@10
|
5208 c[1] = get_fp_val(gb);
|
yading@10
|
5209 c[2] = get_fp_val(gb);
|
yading@10
|
5210 c[3] = get_fp_val(gb);
|
yading@10
|
5211 c[4] = get_fp_val(gb);
|
yading@10
|
5212 break;
|
yading@10
|
5213 }
|
yading@10
|
5214 c[5] = get_fp_val(gb);
|
yading@10
|
5215 if (get_bits1(gb))
|
yading@10
|
5216 c[6] = get_fp_val(gb);
|
yading@10
|
5217 else
|
yading@10
|
5218 c[6] = 1 << 16;
|
yading@10
|
5219 }
|
yading@10
|
5220
|
yading@10
|
5221 static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
|
yading@10
|
5222 {
|
yading@10
|
5223 AVCodecContext *avctx = v->s.avctx;
|
yading@10
|
5224 int sprite, i;
|
yading@10
|
5225
|
yading@10
|
5226 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
|
yading@10
|
5227 vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
|
yading@10
|
5228 if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
|
yading@10
|
5229 avpriv_request_sample(avctx, "Non-zero rotation coefficients");
|
yading@10
|
5230 av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
|
yading@10
|
5231 for (i = 0; i < 7; i++)
|
yading@10
|
5232 av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
|
yading@10
|
5233 sd->coefs[sprite][i] / (1<<16),
|
yading@10
|
5234 (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1 << 16));
|
yading@10
|
5235 av_log(avctx, AV_LOG_DEBUG, "\n");
|
yading@10
|
5236 }
|
yading@10
|
5237
|
yading@10
|
5238 skip_bits(gb, 2);
|
yading@10
|
5239 if (sd->effect_type = get_bits_long(gb, 30)) {
|
yading@10
|
5240 switch (sd->effect_pcount1 = get_bits(gb, 4)) {
|
yading@10
|
5241 case 7:
|
yading@10
|
5242 vc1_sprite_parse_transform(gb, sd->effect_params1);
|
yading@10
|
5243 break;
|
yading@10
|
5244 case 14:
|
yading@10
|
5245 vc1_sprite_parse_transform(gb, sd->effect_params1);
|
yading@10
|
5246 vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
|
yading@10
|
5247 break;
|
yading@10
|
5248 default:
|
yading@10
|
5249 for (i = 0; i < sd->effect_pcount1; i++)
|
yading@10
|
5250 sd->effect_params1[i] = get_fp_val(gb);
|
yading@10
|
5251 }
|
yading@10
|
5252 if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
|
yading@10
|
5253 // effect 13 is simple alpha blending and matches the opacity above
|
yading@10
|
5254 av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
|
yading@10
|
5255 for (i = 0; i < sd->effect_pcount1; i++)
|
yading@10
|
5256 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
|
yading@10
|
5257 sd->effect_params1[i] / (1 << 16),
|
yading@10
|
5258 (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1 << 16));
|
yading@10
|
5259 av_log(avctx, AV_LOG_DEBUG, "\n");
|
yading@10
|
5260 }
|
yading@10
|
5261
|
yading@10
|
5262 sd->effect_pcount2 = get_bits(gb, 16);
|
yading@10
|
5263 if (sd->effect_pcount2 > 10) {
|
yading@10
|
5264 av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
|
yading@10
|
5265 return;
|
yading@10
|
5266 } else if (sd->effect_pcount2) {
|
yading@10
|
5267 i = -1;
|
yading@10
|
5268 av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
|
yading@10
|
5269 while (++i < sd->effect_pcount2) {
|
yading@10
|
5270 sd->effect_params2[i] = get_fp_val(gb);
|
yading@10
|
5271 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
|
yading@10
|
5272 sd->effect_params2[i] / (1 << 16),
|
yading@10
|
5273 (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1 << 16));
|
yading@10
|
5274 }
|
yading@10
|
5275 av_log(avctx, AV_LOG_DEBUG, "\n");
|
yading@10
|
5276 }
|
yading@10
|
5277 }
|
yading@10
|
5278 if (sd->effect_flag = get_bits1(gb))
|
yading@10
|
5279 av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
|
yading@10
|
5280
|
yading@10
|
5281 if (get_bits_count(gb) >= gb->size_in_bits +
|
yading@10
|
5282 (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0))
|
yading@10
|
5283 av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
|
yading@10
|
5284 if (get_bits_count(gb) < gb->size_in_bits - 8)
|
yading@10
|
5285 av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
|
yading@10
|
5286 }
|
yading@10
|
5287
|
yading@10
|
5288 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
|
yading@10
|
5289 {
|
yading@10
|
5290 int i, plane, row, sprite;
|
yading@10
|
5291 int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
|
yading@10
|
5292 uint8_t* src_h[2][2];
|
yading@10
|
5293 int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
|
yading@10
|
5294 int ysub[2];
|
yading@10
|
5295 MpegEncContext *s = &v->s;
|
yading@10
|
5296
|
yading@10
|
5297 for (i = 0; i < 2; i++) {
|
yading@10
|
5298 xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
|
yading@10
|
5299 xadv[i] = sd->coefs[i][0];
|
yading@10
|
5300 if (xadv[i] != 1<<16 || (v->sprite_width << 16) - (v->output_width << 16) - xoff[i])
|
yading@10
|
5301 xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
|
yading@10
|
5302
|
yading@10
|
5303 yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
|
yading@10
|
5304 yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height << 16) - yoff[i]) / v->output_height);
|
yading@10
|
5305 }
|
yading@10
|
5306 alpha = av_clip(sd->coefs[1][6], 0, (1<<16) - 1);
|
yading@10
|
5307
|
yading@10
|
5308 for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++) {
|
yading@10
|
5309 int width = v->output_width>>!!plane;
|
yading@10
|
5310
|
yading@10
|
5311 for (row = 0; row < v->output_height>>!!plane; row++) {
|
yading@10
|
5312 uint8_t *dst = v->sprite_output_frame.data[plane] +
|
yading@10
|
5313 v->sprite_output_frame.linesize[plane] * row;
|
yading@10
|
5314
|
yading@10
|
5315 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
|
yading@10
|
5316 uint8_t *iplane = s->current_picture.f.data[plane];
|
yading@10
|
5317 int iline = s->current_picture.f.linesize[plane];
|
yading@10
|
5318 int ycoord = yoff[sprite] + yadv[sprite] * row;
|
yading@10
|
5319 int yline = ycoord >> 16;
|
yading@10
|
5320 int next_line;
|
yading@10
|
5321 ysub[sprite] = ycoord & 0xFFFF;
|
yading@10
|
5322 if (sprite) {
|
yading@10
|
5323 iplane = s->last_picture.f.data[plane];
|
yading@10
|
5324 iline = s->last_picture.f.linesize[plane];
|
yading@10
|
5325 }
|
yading@10
|
5326 next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
|
yading@10
|
5327 if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
|
yading@10
|
5328 src_h[sprite][0] = iplane + (xoff[sprite] >> 16) + yline * iline;
|
yading@10
|
5329 if (ysub[sprite])
|
yading@10
|
5330 src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
|
yading@10
|
5331 } else {
|
yading@10
|
5332 if (sr_cache[sprite][0] != yline) {
|
yading@10
|
5333 if (sr_cache[sprite][1] == yline) {
|
yading@10
|
5334 FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
|
yading@10
|
5335 FFSWAP(int, sr_cache[sprite][0], sr_cache[sprite][1]);
|
yading@10
|
5336 } else {
|
yading@10
|
5337 v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
|
yading@10
|
5338 sr_cache[sprite][0] = yline;
|
yading@10
|
5339 }
|
yading@10
|
5340 }
|
yading@10
|
5341 if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
|
yading@10
|
5342 v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
|
yading@10
|
5343 iplane + next_line, xoff[sprite],
|
yading@10
|
5344 xadv[sprite], width);
|
yading@10
|
5345 sr_cache[sprite][1] = yline + 1;
|
yading@10
|
5346 }
|
yading@10
|
5347 src_h[sprite][0] = v->sr_rows[sprite][0];
|
yading@10
|
5348 src_h[sprite][1] = v->sr_rows[sprite][1];
|
yading@10
|
5349 }
|
yading@10
|
5350 }
|
yading@10
|
5351
|
yading@10
|
5352 if (!v->two_sprites) {
|
yading@10
|
5353 if (ysub[0]) {
|
yading@10
|
5354 v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
|
yading@10
|
5355 } else {
|
yading@10
|
5356 memcpy(dst, src_h[0][0], width);
|
yading@10
|
5357 }
|
yading@10
|
5358 } else {
|
yading@10
|
5359 if (ysub[0] && ysub[1]) {
|
yading@10
|
5360 v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
|
yading@10
|
5361 src_h[1][0], src_h[1][1], ysub[1], alpha, width);
|
yading@10
|
5362 } else if (ysub[0]) {
|
yading@10
|
5363 v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
|
yading@10
|
5364 src_h[1][0], alpha, width);
|
yading@10
|
5365 } else if (ysub[1]) {
|
yading@10
|
5366 v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
|
yading@10
|
5367 src_h[0][0], (1<<16)-1-alpha, width);
|
yading@10
|
5368 } else {
|
yading@10
|
5369 v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
|
yading@10
|
5370 }
|
yading@10
|
5371 }
|
yading@10
|
5372 }
|
yading@10
|
5373
|
yading@10
|
5374 if (!plane) {
|
yading@10
|
5375 for (i = 0; i < 2; i++) {
|
yading@10
|
5376 xoff[i] >>= 1;
|
yading@10
|
5377 yoff[i] >>= 1;
|
yading@10
|
5378 }
|
yading@10
|
5379 }
|
yading@10
|
5380
|
yading@10
|
5381 }
|
yading@10
|
5382 }
|
yading@10
|
5383
|
yading@10
|
5384
|
yading@10
|
5385 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
|
yading@10
|
5386 {
|
yading@10
|
5387 int ret;
|
yading@10
|
5388 MpegEncContext *s = &v->s;
|
yading@10
|
5389 AVCodecContext *avctx = s->avctx;
|
yading@10
|
5390 SpriteData sd;
|
yading@10
|
5391
|
yading@10
|
5392 vc1_parse_sprites(v, gb, &sd);
|
yading@10
|
5393
|
yading@10
|
5394 if (!s->current_picture.f.data[0]) {
|
yading@10
|
5395 av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
|
yading@10
|
5396 return -1;
|
yading@10
|
5397 }
|
yading@10
|
5398
|
yading@10
|
5399 if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f.data[0])) {
|
yading@10
|
5400 av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
|
yading@10
|
5401 v->two_sprites = 0;
|
yading@10
|
5402 }
|
yading@10
|
5403
|
yading@10
|
5404 av_frame_unref(&v->sprite_output_frame);
|
yading@10
|
5405 if ((ret = ff_get_buffer(avctx, &v->sprite_output_frame, 0)) < 0)
|
yading@10
|
5406 return ret;
|
yading@10
|
5407
|
yading@10
|
5408 vc1_draw_sprites(v, &sd);
|
yading@10
|
5409
|
yading@10
|
5410 return 0;
|
yading@10
|
5411 }
|
yading@10
|
5412
|
yading@10
|
5413 static void vc1_sprite_flush(AVCodecContext *avctx)
|
yading@10
|
5414 {
|
yading@10
|
5415 VC1Context *v = avctx->priv_data;
|
yading@10
|
5416 MpegEncContext *s = &v->s;
|
yading@10
|
5417 AVFrame *f = &s->current_picture.f;
|
yading@10
|
5418 int plane, i;
|
yading@10
|
5419
|
yading@10
|
5420 /* Windows Media Image codecs have a convergence interval of two keyframes.
|
yading@10
|
5421 Since we can't enforce it, clear to black the missing sprite. This is
|
yading@10
|
5422 wrong but it looks better than doing nothing. */
|
yading@10
|
5423
|
yading@10
|
5424 if (f->data[0])
|
yading@10
|
5425 for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++)
|
yading@10
|
5426 for (i = 0; i < v->sprite_height>>!!plane; i++)
|
yading@10
|
5427 memset(f->data[plane] + i * f->linesize[plane],
|
yading@10
|
5428 plane ? 128 : 0, f->linesize[plane]);
|
yading@10
|
5429 }
|
yading@10
|
5430
|
yading@10
|
5431 #endif
|
yading@10
|
5432
|
yading@10
|
5433 av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
|
yading@10
|
5434 {
|
yading@10
|
5435 MpegEncContext *s = &v->s;
|
yading@10
|
5436 int i;
|
yading@10
|
5437
|
yading@10
|
5438 /* Allocate mb bitplanes */
|
yading@10
|
5439 v->mv_type_mb_plane = av_malloc (s->mb_stride * s->mb_height);
|
yading@10
|
5440 v->direct_mb_plane = av_malloc (s->mb_stride * s->mb_height);
|
yading@10
|
5441 v->forward_mb_plane = av_malloc (s->mb_stride * s->mb_height);
|
yading@10
|
5442 v->fieldtx_plane = av_mallocz(s->mb_stride * s->mb_height);
|
yading@10
|
5443 v->acpred_plane = av_malloc (s->mb_stride * s->mb_height);
|
yading@10
|
5444 v->over_flags_plane = av_malloc (s->mb_stride * s->mb_height);
|
yading@10
|
5445
|
yading@10
|
5446 v->n_allocated_blks = s->mb_width + 2;
|
yading@10
|
5447 v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
|
yading@10
|
5448 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
|
yading@10
|
5449 v->cbp = v->cbp_base + s->mb_stride;
|
yading@10
|
5450 v->ttblk_base = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
|
yading@10
|
5451 v->ttblk = v->ttblk_base + s->mb_stride;
|
yading@10
|
5452 v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
|
yading@10
|
5453 v->is_intra = v->is_intra_base + s->mb_stride;
|
yading@10
|
5454 v->luma_mv_base = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
|
yading@10
|
5455 v->luma_mv = v->luma_mv_base + s->mb_stride;
|
yading@10
|
5456
|
yading@10
|
5457 /* allocate block type info in that way so it could be used with s->block_index[] */
|
yading@10
|
5458 v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
|
yading@10
|
5459 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
|
yading@10
|
5460 v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
|
yading@10
|
5461 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
|
yading@10
|
5462
|
yading@10
|
5463 /* allocate memory to store block level MV info */
|
yading@10
|
5464 v->blk_mv_type_base = av_mallocz( s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
|
yading@10
|
5465 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
|
yading@10
|
5466 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
|
yading@10
|
5467 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
|
yading@10
|
5468 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
|
yading@10
|
5469 v->mv_f_last_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
|
yading@10
|
5470 v->mv_f_last[0] = v->mv_f_last_base + s->b8_stride + 1;
|
yading@10
|
5471 v->mv_f_last[1] = v->mv_f_last[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
|
yading@10
|
5472 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
|
yading@10
|
5473 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
|
yading@10
|
5474 v->mv_f_next[1] = v->mv_f_next[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
|
yading@10
|
5475
|
yading@10
|
5476 /* Init coded blocks info */
|
yading@10
|
5477 if (v->profile == PROFILE_ADVANCED) {
|
yading@10
|
5478 // if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
|
yading@10
|
5479 // return -1;
|
yading@10
|
5480 // if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
|
yading@10
|
5481 // return -1;
|
yading@10
|
5482 }
|
yading@10
|
5483
|
yading@10
|
5484 ff_intrax8_common_init(&v->x8,s);
|
yading@10
|
5485
|
yading@10
|
5486 if (s->avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || s->avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
|
yading@10
|
5487 for (i = 0; i < 4; i++)
|
yading@10
|
5488 if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width))) return -1;
|
yading@10
|
5489 }
|
yading@10
|
5490
|
yading@10
|
5491 if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane ||
|
yading@10
|
5492 !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base ||
|
yading@10
|
5493 !v->mb_type_base)
|
yading@10
|
5494 return -1;
|
yading@10
|
5495
|
yading@10
|
5496 return 0;
|
yading@10
|
5497 }
|
yading@10
|
5498
|
yading@10
|
5499 av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
|
yading@10
|
5500 {
|
yading@10
|
5501 int i;
|
yading@10
|
5502 for (i = 0; i < 64; i++) {
|
yading@10
|
5503 #define transpose(x) ((x >> 3) | ((x & 7) << 3))
|
yading@10
|
5504 v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
|
yading@10
|
5505 v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
|
yading@10
|
5506 v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
|
yading@10
|
5507 v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
|
yading@10
|
5508 v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
|
yading@10
|
5509 }
|
yading@10
|
5510 v->left_blk_sh = 0;
|
yading@10
|
5511 v->top_blk_sh = 3;
|
yading@10
|
5512 }
|
yading@10
|
5513
|
yading@10
|
5514 /** Initialize a VC1/WMV3 decoder
|
yading@10
|
5515 * @todo TODO: Handle VC-1 IDUs (Transport level?)
|
yading@10
|
5516 * @todo TODO: Decypher remaining bits in extra_data
|
yading@10
|
5517 */
|
yading@10
|
5518 static av_cold int vc1_decode_init(AVCodecContext *avctx)
|
yading@10
|
5519 {
|
yading@10
|
5520 VC1Context *v = avctx->priv_data;
|
yading@10
|
5521 MpegEncContext *s = &v->s;
|
yading@10
|
5522 GetBitContext gb;
|
yading@10
|
5523
|
yading@10
|
5524 /* save the container output size for WMImage */
|
yading@10
|
5525 v->output_width = avctx->width;
|
yading@10
|
5526 v->output_height = avctx->height;
|
yading@10
|
5527
|
yading@10
|
5528 if (!avctx->extradata_size || !avctx->extradata)
|
yading@10
|
5529 return -1;
|
yading@10
|
5530 if (!(avctx->flags & CODEC_FLAG_GRAY))
|
yading@10
|
5531 avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
|
yading@10
|
5532 else
|
yading@10
|
5533 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
|
yading@10
|
5534 avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
|
yading@10
|
5535 v->s.avctx = avctx;
|
yading@10
|
5536 avctx->flags |= CODEC_FLAG_EMU_EDGE;
|
yading@10
|
5537 v->s.flags |= CODEC_FLAG_EMU_EDGE;
|
yading@10
|
5538
|
yading@10
|
5539 if (ff_vc1_init_common(v) < 0)
|
yading@10
|
5540 return -1;
|
yading@10
|
5541 // ensure static VLC tables are initialized
|
yading@10
|
5542 if (ff_msmpeg4_decode_init(avctx) < 0)
|
yading@10
|
5543 return -1;
|
yading@10
|
5544 if (ff_vc1_decode_init_alloc_tables(v) < 0)
|
yading@10
|
5545 return -1;
|
yading@10
|
5546 // Hack to ensure the above functions will be called
|
yading@10
|
5547 // again once we know all necessary settings.
|
yading@10
|
5548 // That this is necessary might indicate a bug.
|
yading@10
|
5549 ff_vc1_decode_end(avctx);
|
yading@10
|
5550
|
yading@10
|
5551 ff_h264chroma_init(&v->h264chroma, 8);
|
yading@10
|
5552 ff_vc1dsp_init(&v->vc1dsp);
|
yading@10
|
5553
|
yading@10
|
5554 if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
|
yading@10
|
5555 int count = 0;
|
yading@10
|
5556
|
yading@10
|
5557 // looks like WMV3 has a sequence header stored in the extradata
|
yading@10
|
5558 // advanced sequence header may be before the first frame
|
yading@10
|
5559 // the last byte of the extradata is a version number, 1 for the
|
yading@10
|
5560 // samples we can decode
|
yading@10
|
5561
|
yading@10
|
5562 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
|
yading@10
|
5563
|
yading@10
|
5564 if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0)
|
yading@10
|
5565 return -1;
|
yading@10
|
5566
|
yading@10
|
5567 count = avctx->extradata_size*8 - get_bits_count(&gb);
|
yading@10
|
5568 if (count > 0) {
|
yading@10
|
5569 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
|
yading@10
|
5570 count, get_bits(&gb, count));
|
yading@10
|
5571 } else if (count < 0) {
|
yading@10
|
5572 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
|
yading@10
|
5573 }
|
yading@10
|
5574 } else { // VC1/WVC1/WVP2
|
yading@10
|
5575 const uint8_t *start = avctx->extradata;
|
yading@10
|
5576 uint8_t *end = avctx->extradata + avctx->extradata_size;
|
yading@10
|
5577 const uint8_t *next;
|
yading@10
|
5578 int size, buf2_size;
|
yading@10
|
5579 uint8_t *buf2 = NULL;
|
yading@10
|
5580 int seq_initialized = 0, ep_initialized = 0;
|
yading@10
|
5581
|
yading@10
|
5582 if (avctx->extradata_size < 16) {
|
yading@10
|
5583 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
|
yading@10
|
5584 return -1;
|
yading@10
|
5585 }
|
yading@10
|
5586
|
yading@10
|
5587 buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@10
|
5588 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
|
yading@10
|
5589 next = start;
|
yading@10
|
5590 for (; next < end; start = next) {
|
yading@10
|
5591 next = find_next_marker(start + 4, end);
|
yading@10
|
5592 size = next - start - 4;
|
yading@10
|
5593 if (size <= 0)
|
yading@10
|
5594 continue;
|
yading@10
|
5595 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
|
yading@10
|
5596 init_get_bits(&gb, buf2, buf2_size * 8);
|
yading@10
|
5597 switch (AV_RB32(start)) {
|
yading@10
|
5598 case VC1_CODE_SEQHDR:
|
yading@10
|
5599 if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0) {
|
yading@10
|
5600 av_free(buf2);
|
yading@10
|
5601 return -1;
|
yading@10
|
5602 }
|
yading@10
|
5603 seq_initialized = 1;
|
yading@10
|
5604 break;
|
yading@10
|
5605 case VC1_CODE_ENTRYPOINT:
|
yading@10
|
5606 if (ff_vc1_decode_entry_point(avctx, v, &gb) < 0) {
|
yading@10
|
5607 av_free(buf2);
|
yading@10
|
5608 return -1;
|
yading@10
|
5609 }
|
yading@10
|
5610 ep_initialized = 1;
|
yading@10
|
5611 break;
|
yading@10
|
5612 }
|
yading@10
|
5613 }
|
yading@10
|
5614 av_free(buf2);
|
yading@10
|
5615 if (!seq_initialized || !ep_initialized) {
|
yading@10
|
5616 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
|
yading@10
|
5617 return -1;
|
yading@10
|
5618 }
|
yading@10
|
5619 v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
|
yading@10
|
5620 }
|
yading@10
|
5621
|
yading@10
|
5622 avctx->profile = v->profile;
|
yading@10
|
5623 if (v->profile == PROFILE_ADVANCED)
|
yading@10
|
5624 avctx->level = v->level;
|
yading@10
|
5625
|
yading@10
|
5626 avctx->has_b_frames = !!avctx->max_b_frames;
|
yading@10
|
5627
|
yading@10
|
5628 s->mb_width = (avctx->coded_width + 15) >> 4;
|
yading@10
|
5629 s->mb_height = (avctx->coded_height + 15) >> 4;
|
yading@10
|
5630
|
yading@10
|
5631 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
|
yading@10
|
5632 ff_vc1_init_transposed_scantables(v);
|
yading@10
|
5633 } else {
|
yading@10
|
5634 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
|
yading@10
|
5635 v->left_blk_sh = 3;
|
yading@10
|
5636 v->top_blk_sh = 0;
|
yading@10
|
5637 }
|
yading@10
|
5638
|
yading@10
|
5639 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
|
yading@10
|
5640 v->sprite_width = avctx->coded_width;
|
yading@10
|
5641 v->sprite_height = avctx->coded_height;
|
yading@10
|
5642
|
yading@10
|
5643 avctx->coded_width = avctx->width = v->output_width;
|
yading@10
|
5644 avctx->coded_height = avctx->height = v->output_height;
|
yading@10
|
5645
|
yading@10
|
5646 // prevent 16.16 overflows
|
yading@10
|
5647 if (v->sprite_width > 1 << 14 ||
|
yading@10
|
5648 v->sprite_height > 1 << 14 ||
|
yading@10
|
5649 v->output_width > 1 << 14 ||
|
yading@10
|
5650 v->output_height > 1 << 14) return -1;
|
yading@10
|
5651
|
yading@10
|
5652 if ((v->sprite_width&1) || (v->sprite_height&1)) {
|
yading@10
|
5653 avpriv_request_sample(avctx, "odd sprites support");
|
yading@10
|
5654 return AVERROR_PATCHWELCOME;
|
yading@10
|
5655 }
|
yading@10
|
5656 }
|
yading@10
|
5657 return 0;
|
yading@10
|
5658 }
|
yading@10
|
5659
|
yading@10
|
5660 /** Close a VC1/WMV3 decoder
|
yading@10
|
5661 * @warning Initial try at using MpegEncContext stuff
|
yading@10
|
5662 */
|
yading@10
|
5663 av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
|
yading@10
|
5664 {
|
yading@10
|
5665 VC1Context *v = avctx->priv_data;
|
yading@10
|
5666 int i;
|
yading@10
|
5667
|
yading@10
|
5668 av_frame_unref(&v->sprite_output_frame);
|
yading@10
|
5669
|
yading@10
|
5670 for (i = 0; i < 4; i++)
|
yading@10
|
5671 av_freep(&v->sr_rows[i >> 1][i & 1]);
|
yading@10
|
5672 av_freep(&v->hrd_rate);
|
yading@10
|
5673 av_freep(&v->hrd_buffer);
|
yading@10
|
5674 ff_MPV_common_end(&v->s);
|
yading@10
|
5675 av_freep(&v->mv_type_mb_plane);
|
yading@10
|
5676 av_freep(&v->direct_mb_plane);
|
yading@10
|
5677 av_freep(&v->forward_mb_plane);
|
yading@10
|
5678 av_freep(&v->fieldtx_plane);
|
yading@10
|
5679 av_freep(&v->acpred_plane);
|
yading@10
|
5680 av_freep(&v->over_flags_plane);
|
yading@10
|
5681 av_freep(&v->mb_type_base);
|
yading@10
|
5682 av_freep(&v->blk_mv_type_base);
|
yading@10
|
5683 av_freep(&v->mv_f_base);
|
yading@10
|
5684 av_freep(&v->mv_f_last_base);
|
yading@10
|
5685 av_freep(&v->mv_f_next_base);
|
yading@10
|
5686 av_freep(&v->block);
|
yading@10
|
5687 av_freep(&v->cbp_base);
|
yading@10
|
5688 av_freep(&v->ttblk_base);
|
yading@10
|
5689 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
|
yading@10
|
5690 av_freep(&v->luma_mv_base);
|
yading@10
|
5691 ff_intrax8_common_end(&v->x8);
|
yading@10
|
5692 return 0;
|
yading@10
|
5693 }
|
yading@10
|
5694
|
yading@10
|
5695
|
yading@10
|
5696 /** Decode a VC1/WMV3 frame
|
yading@10
|
5697 * @todo TODO: Handle VC-1 IDUs (Transport level?)
|
yading@10
|
5698 */
|
yading@10
|
5699 static int vc1_decode_frame(AVCodecContext *avctx, void *data,
|
yading@10
|
5700 int *got_frame, AVPacket *avpkt)
|
yading@10
|
5701 {
|
yading@10
|
5702 const uint8_t *buf = avpkt->data;
|
yading@10
|
5703 int buf_size = avpkt->size, n_slices = 0, i, ret;
|
yading@10
|
5704 VC1Context *v = avctx->priv_data;
|
yading@10
|
5705 MpegEncContext *s = &v->s;
|
yading@10
|
5706 AVFrame *pict = data;
|
yading@10
|
5707 uint8_t *buf2 = NULL;
|
yading@10
|
5708 const uint8_t *buf_start = buf, *buf_start_second_field = NULL;
|
yading@10
|
5709 int mb_height, n_slices1=-1;
|
yading@10
|
5710 struct {
|
yading@10
|
5711 uint8_t *buf;
|
yading@10
|
5712 GetBitContext gb;
|
yading@10
|
5713 int mby_start;
|
yading@10
|
5714 } *slices = NULL, *tmp;
|
yading@10
|
5715
|
yading@10
|
5716 v->second_field = 0;
|
yading@10
|
5717
|
yading@10
|
5718 if(s->flags & CODEC_FLAG_LOW_DELAY)
|
yading@10
|
5719 s->low_delay = 1;
|
yading@10
|
5720
|
yading@10
|
5721 /* no supplementary picture */
|
yading@10
|
5722 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
|
yading@10
|
5723 /* special case for last picture */
|
yading@10
|
5724 if (s->low_delay == 0 && s->next_picture_ptr) {
|
yading@10
|
5725 if ((ret = av_frame_ref(pict, &s->next_picture_ptr->f)) < 0)
|
yading@10
|
5726 return ret;
|
yading@10
|
5727 s->next_picture_ptr = NULL;
|
yading@10
|
5728
|
yading@10
|
5729 *got_frame = 1;
|
yading@10
|
5730 }
|
yading@10
|
5731
|
yading@10
|
5732 return buf_size;
|
yading@10
|
5733 }
|
yading@10
|
5734
|
yading@10
|
5735 if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
|
yading@10
|
5736 if (v->profile < PROFILE_ADVANCED)
|
yading@10
|
5737 avctx->pix_fmt = AV_PIX_FMT_VDPAU_WMV3;
|
yading@10
|
5738 else
|
yading@10
|
5739 avctx->pix_fmt = AV_PIX_FMT_VDPAU_VC1;
|
yading@10
|
5740 }
|
yading@10
|
5741
|
yading@10
|
5742 //for advanced profile we may need to parse and unescape data
|
yading@10
|
5743 if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
|
yading@10
|
5744 int buf_size2 = 0;
|
yading@10
|
5745 buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@10
|
5746
|
yading@10
|
5747 if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
|
yading@10
|
5748 const uint8_t *start, *end, *next;
|
yading@10
|
5749 int size;
|
yading@10
|
5750
|
yading@10
|
5751 next = buf;
|
yading@10
|
5752 for (start = buf, end = buf + buf_size; next < end; start = next) {
|
yading@10
|
5753 next = find_next_marker(start + 4, end);
|
yading@10
|
5754 size = next - start - 4;
|
yading@10
|
5755 if (size <= 0) continue;
|
yading@10
|
5756 switch (AV_RB32(start)) {
|
yading@10
|
5757 case VC1_CODE_FRAME:
|
yading@10
|
5758 if (avctx->hwaccel ||
|
yading@10
|
5759 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
|
yading@10
|
5760 buf_start = start;
|
yading@10
|
5761 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
|
yading@10
|
5762 break;
|
yading@10
|
5763 case VC1_CODE_FIELD: {
|
yading@10
|
5764 int buf_size3;
|
yading@10
|
5765 if (avctx->hwaccel ||
|
yading@10
|
5766 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
|
yading@10
|
5767 buf_start_second_field = start;
|
yading@10
|
5768 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
|
yading@10
|
5769 if (!tmp)
|
yading@10
|
5770 goto err;
|
yading@10
|
5771 slices = tmp;
|
yading@10
|
5772 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@10
|
5773 if (!slices[n_slices].buf)
|
yading@10
|
5774 goto err;
|
yading@10
|
5775 buf_size3 = vc1_unescape_buffer(start + 4, size,
|
yading@10
|
5776 slices[n_slices].buf);
|
yading@10
|
5777 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
|
yading@10
|
5778 buf_size3 << 3);
|
yading@10
|
5779 /* assuming that the field marker is at the exact middle,
|
yading@10
|
5780 hope it's correct */
|
yading@10
|
5781 slices[n_slices].mby_start = s->mb_height >> 1;
|
yading@10
|
5782 n_slices1 = n_slices - 1; // index of the last slice of the first field
|
yading@10
|
5783 n_slices++;
|
yading@10
|
5784 break;
|
yading@10
|
5785 }
|
yading@10
|
5786 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
|
yading@10
|
5787 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
|
yading@10
|
5788 init_get_bits(&s->gb, buf2, buf_size2 * 8);
|
yading@10
|
5789 ff_vc1_decode_entry_point(avctx, v, &s->gb);
|
yading@10
|
5790 break;
|
yading@10
|
5791 case VC1_CODE_SLICE: {
|
yading@10
|
5792 int buf_size3;
|
yading@10
|
5793 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
|
yading@10
|
5794 if (!tmp)
|
yading@10
|
5795 goto err;
|
yading@10
|
5796 slices = tmp;
|
yading@10
|
5797 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@10
|
5798 if (!slices[n_slices].buf)
|
yading@10
|
5799 goto err;
|
yading@10
|
5800 buf_size3 = vc1_unescape_buffer(start + 4, size,
|
yading@10
|
5801 slices[n_slices].buf);
|
yading@10
|
5802 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
|
yading@10
|
5803 buf_size3 << 3);
|
yading@10
|
5804 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
|
yading@10
|
5805 n_slices++;
|
yading@10
|
5806 break;
|
yading@10
|
5807 }
|
yading@10
|
5808 }
|
yading@10
|
5809 }
|
yading@10
|
5810 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
|
yading@10
|
5811 const uint8_t *divider;
|
yading@10
|
5812 int buf_size3;
|
yading@10
|
5813
|
yading@10
|
5814 divider = find_next_marker(buf, buf + buf_size);
|
yading@10
|
5815 if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
|
yading@10
|
5816 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
|
yading@10
|
5817 goto err;
|
yading@10
|
5818 } else { // found field marker, unescape second field
|
yading@10
|
5819 if (avctx->hwaccel ||
|
yading@10
|
5820 s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
|
yading@10
|
5821 buf_start_second_field = divider;
|
yading@10
|
5822 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
|
yading@10
|
5823 if (!tmp)
|
yading@10
|
5824 goto err;
|
yading@10
|
5825 slices = tmp;
|
yading@10
|
5826 slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
yading@10
|
5827 if (!slices[n_slices].buf)
|
yading@10
|
5828 goto err;
|
yading@10
|
5829 buf_size3 = vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
|
yading@10
|
5830 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
|
yading@10
|
5831 buf_size3 << 3);
|
yading@10
|
5832 slices[n_slices].mby_start = s->mb_height >> 1;
|
yading@10
|
5833 n_slices1 = n_slices - 1;
|
yading@10
|
5834 n_slices++;
|
yading@10
|
5835 }
|
yading@10
|
5836 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
|
yading@10
|
5837 } else {
|
yading@10
|
5838 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
|
yading@10
|
5839 }
|
yading@10
|
5840 init_get_bits(&s->gb, buf2, buf_size2*8);
|
yading@10
|
5841 } else
|
yading@10
|
5842 init_get_bits(&s->gb, buf, buf_size*8);
|
yading@10
|
5843
|
yading@10
|
5844 if (v->res_sprite) {
|
yading@10
|
5845 v->new_sprite = !get_bits1(&s->gb);
|
yading@10
|
5846 v->two_sprites = get_bits1(&s->gb);
|
yading@10
|
5847 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
|
yading@10
|
5848 we're using the sprite compositor. These are intentionally kept separate
|
yading@10
|
5849 so you can get the raw sprites by using the wmv3 decoder for WMVP or
|
yading@10
|
5850 the vc1 one for WVP2 */
|
yading@10
|
5851 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
|
yading@10
|
5852 if (v->new_sprite) {
|
yading@10
|
5853 // switch AVCodecContext parameters to those of the sprites
|
yading@10
|
5854 avctx->width = avctx->coded_width = v->sprite_width;
|
yading@10
|
5855 avctx->height = avctx->coded_height = v->sprite_height;
|
yading@10
|
5856 } else {
|
yading@10
|
5857 goto image;
|
yading@10
|
5858 }
|
yading@10
|
5859 }
|
yading@10
|
5860 }
|
yading@10
|
5861
|
yading@10
|
5862 if (s->context_initialized &&
|
yading@10
|
5863 (s->width != avctx->coded_width ||
|
yading@10
|
5864 s->height != avctx->coded_height)) {
|
yading@10
|
5865 ff_vc1_decode_end(avctx);
|
yading@10
|
5866 }
|
yading@10
|
5867
|
yading@10
|
5868 if (!s->context_initialized) {
|
yading@10
|
5869 if (ff_msmpeg4_decode_init(avctx) < 0 || ff_vc1_decode_init_alloc_tables(v) < 0)
|
yading@10
|
5870 goto err;
|
yading@10
|
5871
|
yading@10
|
5872 s->low_delay = !avctx->has_b_frames || v->res_sprite;
|
yading@10
|
5873
|
yading@10
|
5874 if (v->profile == PROFILE_ADVANCED) {
|
yading@10
|
5875 if(avctx->coded_width<=1 || avctx->coded_height<=1)
|
yading@10
|
5876 goto err;
|
yading@10
|
5877 s->h_edge_pos = avctx->coded_width;
|
yading@10
|
5878 s->v_edge_pos = avctx->coded_height;
|
yading@10
|
5879 }
|
yading@10
|
5880 }
|
yading@10
|
5881
|
yading@10
|
5882 /* We need to set current_picture_ptr before reading the header,
|
yading@10
|
5883 * otherwise we cannot store anything in there. */
|
yading@10
|
5884 if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
|
yading@10
|
5885 int i = ff_find_unused_picture(s, 0);
|
yading@10
|
5886 if (i < 0)
|
yading@10
|
5887 goto err;
|
yading@10
|
5888 s->current_picture_ptr = &s->picture[i];
|
yading@10
|
5889 }
|
yading@10
|
5890
|
yading@10
|
5891 // do parse frame header
|
yading@10
|
5892 v->pic_header_flag = 0;
|
yading@10
|
5893 v->first_pic_header_flag = 1;
|
yading@10
|
5894 if (v->profile < PROFILE_ADVANCED) {
|
yading@10
|
5895 if (ff_vc1_parse_frame_header(v, &s->gb) < 0) {
|
yading@10
|
5896 goto err;
|
yading@10
|
5897 }
|
yading@10
|
5898 } else {
|
yading@10
|
5899 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
|
yading@10
|
5900 goto err;
|
yading@10
|
5901 }
|
yading@10
|
5902 }
|
yading@10
|
5903 v->first_pic_header_flag = 0;
|
yading@10
|
5904
|
yading@10
|
5905 if (avctx->debug & FF_DEBUG_PICT_INFO)
|
yading@10
|
5906 av_log(v->s.avctx, AV_LOG_DEBUG, "pict_type: %c\n", av_get_picture_type_char(s->pict_type));
|
yading@10
|
5907
|
yading@10
|
5908 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
|
yading@10
|
5909 && s->pict_type != AV_PICTURE_TYPE_I) {
|
yading@10
|
5910 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
|
yading@10
|
5911 goto err;
|
yading@10
|
5912 }
|
yading@10
|
5913
|
yading@10
|
5914 if ((s->mb_height >> v->field_mode) == 0) {
|
yading@10
|
5915 av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
|
yading@10
|
5916 goto err;
|
yading@10
|
5917 }
|
yading@10
|
5918
|
yading@10
|
5919 // process pulldown flags
|
yading@10
|
5920 s->current_picture_ptr->f.repeat_pict = 0;
|
yading@10
|
5921 // Pulldown flags are only valid when 'broadcast' has been set.
|
yading@10
|
5922 // So ticks_per_frame will be 2
|
yading@10
|
5923 if (v->rff) {
|
yading@10
|
5924 // repeat field
|
yading@10
|
5925 s->current_picture_ptr->f.repeat_pict = 1;
|
yading@10
|
5926 } else if (v->rptfrm) {
|
yading@10
|
5927 // repeat frames
|
yading@10
|
5928 s->current_picture_ptr->f.repeat_pict = v->rptfrm * 2;
|
yading@10
|
5929 }
|
yading@10
|
5930
|
yading@10
|
5931 // for skipping the frame
|
yading@10
|
5932 s->current_picture.f.pict_type = s->pict_type;
|
yading@10
|
5933 s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
|
yading@10
|
5934
|
yading@10
|
5935 /* skip B-frames if we don't have reference frames */
|
yading@10
|
5936 if (s->last_picture_ptr == NULL && (s->pict_type == AV_PICTURE_TYPE_B || s->droppable)) {
|
yading@10
|
5937 goto err;
|
yading@10
|
5938 }
|
yading@10
|
5939 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
|
yading@10
|
5940 (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
|
yading@10
|
5941 avctx->skip_frame >= AVDISCARD_ALL) {
|
yading@10
|
5942 goto end;
|
yading@10
|
5943 }
|
yading@10
|
5944
|
yading@10
|
5945 if (s->next_p_frame_damaged) {
|
yading@10
|
5946 if (s->pict_type == AV_PICTURE_TYPE_B)
|
yading@10
|
5947 goto end;
|
yading@10
|
5948 else
|
yading@10
|
5949 s->next_p_frame_damaged = 0;
|
yading@10
|
5950 }
|
yading@10
|
5951
|
yading@10
|
5952 if (ff_MPV_frame_start(s, avctx) < 0) {
|
yading@10
|
5953 goto err;
|
yading@10
|
5954 }
|
yading@10
|
5955
|
yading@10
|
5956 v->s.current_picture_ptr->f.interlaced_frame = (v->fcm != PROGRESSIVE);
|
yading@10
|
5957 v->s.current_picture_ptr->f.top_field_first = v->tff;
|
yading@10
|
5958
|
yading@10
|
5959 s->me.qpel_put = s->dsp.put_qpel_pixels_tab;
|
yading@10
|
5960 s->me.qpel_avg = s->dsp.avg_qpel_pixels_tab;
|
yading@10
|
5961
|
yading@10
|
5962 if ((CONFIG_VC1_VDPAU_DECODER)
|
yading@10
|
5963 &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
|
yading@10
|
5964 ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
|
yading@10
|
5965 else if (avctx->hwaccel) {
|
yading@10
|
5966 if (v->field_mode && buf_start_second_field) {
|
yading@10
|
5967 // decode first field
|
yading@10
|
5968 s->picture_structure = PICT_BOTTOM_FIELD - v->tff;
|
yading@10
|
5969 if (avctx->hwaccel->start_frame(avctx, buf_start, buf_start_second_field - buf_start) < 0)
|
yading@10
|
5970 goto err;
|
yading@10
|
5971 if (avctx->hwaccel->decode_slice(avctx, buf_start, buf_start_second_field - buf_start) < 0)
|
yading@10
|
5972 goto err;
|
yading@10
|
5973 if (avctx->hwaccel->end_frame(avctx) < 0)
|
yading@10
|
5974 goto err;
|
yading@10
|
5975
|
yading@10
|
5976 // decode second field
|
yading@10
|
5977 s->gb = slices[n_slices1 + 1].gb;
|
yading@10
|
5978 s->picture_structure = PICT_TOP_FIELD + v->tff;
|
yading@10
|
5979 v->second_field = 1;
|
yading@10
|
5980 v->pic_header_flag = 0;
|
yading@10
|
5981 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
|
yading@10
|
5982 av_log(avctx, AV_LOG_ERROR, "parsing header for second field failed");
|
yading@10
|
5983 goto err;
|
yading@10
|
5984 }
|
yading@10
|
5985 v->s.current_picture_ptr->f.pict_type = v->s.pict_type;
|
yading@10
|
5986
|
yading@10
|
5987 if (avctx->hwaccel->start_frame(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
|
yading@10
|
5988 goto err;
|
yading@10
|
5989 if (avctx->hwaccel->decode_slice(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field) < 0)
|
yading@10
|
5990 goto err;
|
yading@10
|
5991 if (avctx->hwaccel->end_frame(avctx) < 0)
|
yading@10
|
5992 goto err;
|
yading@10
|
5993 } else {
|
yading@10
|
5994 s->picture_structure = PICT_FRAME;
|
yading@10
|
5995 if (avctx->hwaccel->start_frame(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
|
yading@10
|
5996 goto err;
|
yading@10
|
5997 if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
|
yading@10
|
5998 goto err;
|
yading@10
|
5999 if (avctx->hwaccel->end_frame(avctx) < 0)
|
yading@10
|
6000 goto err;
|
yading@10
|
6001 }
|
yading@10
|
6002 } else {
|
yading@10
|
6003 int header_ret = 0;
|
yading@10
|
6004
|
yading@10
|
6005
|
yading@10
|
6006 ff_mpeg_er_frame_start(s);
|
yading@10
|
6007
|
yading@10
|
6008 v->bits = buf_size * 8;
|
yading@10
|
6009 v->end_mb_x = s->mb_width;
|
yading@10
|
6010 if (v->field_mode) {
|
yading@10
|
6011 uint8_t *tmp[2];
|
yading@10
|
6012 s->current_picture.f.linesize[0] <<= 1;
|
yading@10
|
6013 s->current_picture.f.linesize[1] <<= 1;
|
yading@10
|
6014 s->current_picture.f.linesize[2] <<= 1;
|
yading@10
|
6015 s->linesize <<= 1;
|
yading@10
|
6016 s->uvlinesize <<= 1;
|
yading@10
|
6017 tmp[0] = v->mv_f_last[0];
|
yading@10
|
6018 tmp[1] = v->mv_f_last[1];
|
yading@10
|
6019 v->mv_f_last[0] = v->mv_f_next[0];
|
yading@10
|
6020 v->mv_f_last[1] = v->mv_f_next[1];
|
yading@10
|
6021 v->mv_f_next[0] = v->mv_f[0];
|
yading@10
|
6022 v->mv_f_next[1] = v->mv_f[1];
|
yading@10
|
6023 v->mv_f[0] = tmp[0];
|
yading@10
|
6024 v->mv_f[1] = tmp[1];
|
yading@10
|
6025 }
|
yading@10
|
6026 mb_height = s->mb_height >> v->field_mode;
|
yading@10
|
6027 for (i = 0; i <= n_slices; i++) {
|
yading@10
|
6028 if (i > 0 && slices[i - 1].mby_start >= mb_height) {
|
yading@10
|
6029 if (v->field_mode <= 0) {
|
yading@10
|
6030 av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
|
yading@10
|
6031 "picture boundary (%d >= %d)\n", i,
|
yading@10
|
6032 slices[i - 1].mby_start, mb_height);
|
yading@10
|
6033 continue;
|
yading@10
|
6034 }
|
yading@10
|
6035 v->second_field = 1;
|
yading@10
|
6036 v->blocks_off = s->b8_stride * (s->mb_height&~1);
|
yading@10
|
6037 v->mb_off = s->mb_stride * s->mb_height >> 1;
|
yading@10
|
6038 } else {
|
yading@10
|
6039 v->second_field = 0;
|
yading@10
|
6040 v->blocks_off = 0;
|
yading@10
|
6041 v->mb_off = 0;
|
yading@10
|
6042 }
|
yading@10
|
6043 if (i) {
|
yading@10
|
6044 v->pic_header_flag = 0;
|
yading@10
|
6045 if (v->field_mode && i == n_slices1 + 2) {
|
yading@10
|
6046 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
|
yading@10
|
6047 av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
|
yading@10
|
6048 continue;
|
yading@10
|
6049 }
|
yading@10
|
6050 } else if (get_bits1(&s->gb)) {
|
yading@10
|
6051 v->pic_header_flag = 1;
|
yading@10
|
6052 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
|
yading@10
|
6053 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
|
yading@10
|
6054 continue;
|
yading@10
|
6055 }
|
yading@10
|
6056 }
|
yading@10
|
6057 }
|
yading@10
|
6058 if (header_ret < 0)
|
yading@10
|
6059 continue;
|
yading@10
|
6060 s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
|
yading@10
|
6061 if (!v->field_mode || v->second_field)
|
yading@10
|
6062 s->end_mb_y = (i == n_slices ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
|
yading@10
|
6063 else {
|
yading@10
|
6064 if (i >= n_slices) {
|
yading@10
|
6065 av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
|
yading@10
|
6066 continue;
|
yading@10
|
6067 }
|
yading@10
|
6068 s->end_mb_y = (i <= n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
|
yading@10
|
6069 }
|
yading@10
|
6070 if (s->end_mb_y <= s->start_mb_y) {
|
yading@10
|
6071 av_log(v->s.avctx, AV_LOG_ERROR, "end mb y %d %d invalid\n", s->end_mb_y, s->start_mb_y);
|
yading@10
|
6072 continue;
|
yading@10
|
6073 }
|
yading@10
|
6074 if (!v->p_frame_skipped && s->pict_type != AV_PICTURE_TYPE_I && !v->cbpcy_vlc) {
|
yading@10
|
6075 av_log(v->s.avctx, AV_LOG_ERROR, "missing cbpcy_vlc\n");
|
yading@10
|
6076 continue;
|
yading@10
|
6077 }
|
yading@10
|
6078 ff_vc1_decode_blocks(v);
|
yading@10
|
6079 if (i != n_slices)
|
yading@10
|
6080 s->gb = slices[i].gb;
|
yading@10
|
6081 }
|
yading@10
|
6082 if (v->field_mode) {
|
yading@10
|
6083 v->second_field = 0;
|
yading@10
|
6084 if (s->pict_type == AV_PICTURE_TYPE_B) {
|
yading@10
|
6085 memcpy(v->mv_f_base, v->mv_f_next_base,
|
yading@10
|
6086 2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
|
yading@10
|
6087 }
|
yading@10
|
6088 s->current_picture.f.linesize[0] >>= 1;
|
yading@10
|
6089 s->current_picture.f.linesize[1] >>= 1;
|
yading@10
|
6090 s->current_picture.f.linesize[2] >>= 1;
|
yading@10
|
6091 s->linesize >>= 1;
|
yading@10
|
6092 s->uvlinesize >>= 1;
|
yading@10
|
6093 }
|
yading@10
|
6094 av_dlog(s->avctx, "Consumed %i/%i bits\n",
|
yading@10
|
6095 get_bits_count(&s->gb), s->gb.size_in_bits);
|
yading@10
|
6096 // if (get_bits_count(&s->gb) > buf_size * 8)
|
yading@10
|
6097 // return -1;
|
yading@10
|
6098 if(s->er.error_occurred && s->pict_type == AV_PICTURE_TYPE_B)
|
yading@10
|
6099 goto err;
|
yading@10
|
6100 if(!v->field_mode)
|
yading@10
|
6101 ff_er_frame_end(&s->er);
|
yading@10
|
6102 }
|
yading@10
|
6103
|
yading@10
|
6104 ff_MPV_frame_end(s);
|
yading@10
|
6105
|
yading@10
|
6106 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
|
yading@10
|
6107 image:
|
yading@10
|
6108 avctx->width = avctx->coded_width = v->output_width;
|
yading@10
|
6109 avctx->height = avctx->coded_height = v->output_height;
|
yading@10
|
6110 if (avctx->skip_frame >= AVDISCARD_NONREF)
|
yading@10
|
6111 goto end;
|
yading@10
|
6112 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
|
yading@10
|
6113 if (vc1_decode_sprites(v, &s->gb))
|
yading@10
|
6114 goto err;
|
yading@10
|
6115 #endif
|
yading@10
|
6116 if ((ret = av_frame_ref(pict, &v->sprite_output_frame)) < 0)
|
yading@10
|
6117 goto err;
|
yading@10
|
6118 *got_frame = 1;
|
yading@10
|
6119 } else {
|
yading@10
|
6120 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
|
yading@10
|
6121 if ((ret = av_frame_ref(pict, &s->current_picture_ptr->f)) < 0)
|
yading@10
|
6122 goto err;
|
yading@10
|
6123 ff_print_debug_info(s, s->current_picture_ptr, pict);
|
yading@10
|
6124 } else if (s->last_picture_ptr != NULL) {
|
yading@10
|
6125 if ((ret = av_frame_ref(pict, &s->last_picture_ptr->f)) < 0)
|
yading@10
|
6126 goto err;
|
yading@10
|
6127 ff_print_debug_info(s, s->last_picture_ptr, pict);
|
yading@10
|
6128 }
|
yading@10
|
6129 if (s->last_picture_ptr || s->low_delay) {
|
yading@10
|
6130 *got_frame = 1;
|
yading@10
|
6131 }
|
yading@10
|
6132 }
|
yading@10
|
6133
|
yading@10
|
6134 end:
|
yading@10
|
6135 av_free(buf2);
|
yading@10
|
6136 for (i = 0; i < n_slices; i++)
|
yading@10
|
6137 av_free(slices[i].buf);
|
yading@10
|
6138 av_free(slices);
|
yading@10
|
6139 return buf_size;
|
yading@10
|
6140
|
yading@10
|
6141 err:
|
yading@10
|
6142 av_free(buf2);
|
yading@10
|
6143 for (i = 0; i < n_slices; i++)
|
yading@10
|
6144 av_free(slices[i].buf);
|
yading@10
|
6145 av_free(slices);
|
yading@10
|
6146 return -1;
|
yading@10
|
6147 }
|
yading@10
|
6148
|
yading@10
|
6149
|
yading@10
|
6150 static const AVProfile profiles[] = {
|
yading@10
|
6151 { FF_PROFILE_VC1_SIMPLE, "Simple" },
|
yading@10
|
6152 { FF_PROFILE_VC1_MAIN, "Main" },
|
yading@10
|
6153 { FF_PROFILE_VC1_COMPLEX, "Complex" },
|
yading@10
|
6154 { FF_PROFILE_VC1_ADVANCED, "Advanced" },
|
yading@10
|
6155 { FF_PROFILE_UNKNOWN },
|
yading@10
|
6156 };
|
yading@10
|
6157
|
yading@10
|
6158 static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
|
yading@10
|
6159 #if CONFIG_DXVA2
|
yading@10
|
6160 AV_PIX_FMT_DXVA2_VLD,
|
yading@10
|
6161 #endif
|
yading@10
|
6162 #if CONFIG_VAAPI
|
yading@10
|
6163 AV_PIX_FMT_VAAPI_VLD,
|
yading@10
|
6164 #endif
|
yading@10
|
6165 #if CONFIG_VDPAU
|
yading@10
|
6166 AV_PIX_FMT_VDPAU,
|
yading@10
|
6167 #endif
|
yading@10
|
6168 AV_PIX_FMT_YUV420P,
|
yading@10
|
6169 AV_PIX_FMT_NONE
|
yading@10
|
6170 };
|
yading@10
|
6171
|
yading@10
|
6172 AVCodec ff_vc1_decoder = {
|
yading@10
|
6173 .name = "vc1",
|
yading@10
|
6174 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
6175 .id = AV_CODEC_ID_VC1,
|
yading@10
|
6176 .priv_data_size = sizeof(VC1Context),
|
yading@10
|
6177 .init = vc1_decode_init,
|
yading@10
|
6178 .close = ff_vc1_decode_end,
|
yading@10
|
6179 .decode = vc1_decode_frame,
|
yading@10
|
6180 .flush = ff_mpeg_flush,
|
yading@10
|
6181 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
|
yading@10
|
6182 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
|
yading@10
|
6183 .pix_fmts = vc1_hwaccel_pixfmt_list_420,
|
yading@10
|
6184 .profiles = NULL_IF_CONFIG_SMALL(profiles)
|
yading@10
|
6185 };
|
yading@10
|
6186
|
yading@10
|
6187 #if CONFIG_WMV3_DECODER
|
yading@10
|
6188 AVCodec ff_wmv3_decoder = {
|
yading@10
|
6189 .name = "wmv3",
|
yading@10
|
6190 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
6191 .id = AV_CODEC_ID_WMV3,
|
yading@10
|
6192 .priv_data_size = sizeof(VC1Context),
|
yading@10
|
6193 .init = vc1_decode_init,
|
yading@10
|
6194 .close = ff_vc1_decode_end,
|
yading@10
|
6195 .decode = vc1_decode_frame,
|
yading@10
|
6196 .flush = ff_mpeg_flush,
|
yading@10
|
6197 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
|
yading@10
|
6198 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
|
yading@10
|
6199 .pix_fmts = vc1_hwaccel_pixfmt_list_420,
|
yading@10
|
6200 .profiles = NULL_IF_CONFIG_SMALL(profiles)
|
yading@10
|
6201 };
|
yading@10
|
6202 #endif
|
yading@10
|
6203
|
yading@10
|
6204 #if CONFIG_WMV3_VDPAU_DECODER
|
yading@10
|
6205 AVCodec ff_wmv3_vdpau_decoder = {
|
yading@10
|
6206 .name = "wmv3_vdpau",
|
yading@10
|
6207 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
6208 .id = AV_CODEC_ID_WMV3,
|
yading@10
|
6209 .priv_data_size = sizeof(VC1Context),
|
yading@10
|
6210 .init = vc1_decode_init,
|
yading@10
|
6211 .close = ff_vc1_decode_end,
|
yading@10
|
6212 .decode = vc1_decode_frame,
|
yading@10
|
6213 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
|
yading@10
|
6214 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
|
yading@10
|
6215 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_WMV3, AV_PIX_FMT_NONE },
|
yading@10
|
6216 .profiles = NULL_IF_CONFIG_SMALL(profiles)
|
yading@10
|
6217 };
|
yading@10
|
6218 #endif
|
yading@10
|
6219
|
yading@10
|
6220 #if CONFIG_VC1_VDPAU_DECODER
|
yading@10
|
6221 AVCodec ff_vc1_vdpau_decoder = {
|
yading@10
|
6222 .name = "vc1_vdpau",
|
yading@10
|
6223 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
6224 .id = AV_CODEC_ID_VC1,
|
yading@10
|
6225 .priv_data_size = sizeof(VC1Context),
|
yading@10
|
6226 .init = vc1_decode_init,
|
yading@10
|
6227 .close = ff_vc1_decode_end,
|
yading@10
|
6228 .decode = vc1_decode_frame,
|
yading@10
|
6229 .capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
|
yading@10
|
6230 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
|
yading@10
|
6231 .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_VDPAU_VC1, AV_PIX_FMT_NONE },
|
yading@10
|
6232 .profiles = NULL_IF_CONFIG_SMALL(profiles)
|
yading@10
|
6233 };
|
yading@10
|
6234 #endif
|
yading@10
|
6235
|
yading@10
|
6236 #if CONFIG_WMV3IMAGE_DECODER
|
yading@10
|
6237 AVCodec ff_wmv3image_decoder = {
|
yading@10
|
6238 .name = "wmv3image",
|
yading@10
|
6239 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
6240 .id = AV_CODEC_ID_WMV3IMAGE,
|
yading@10
|
6241 .priv_data_size = sizeof(VC1Context),
|
yading@10
|
6242 .init = vc1_decode_init,
|
yading@10
|
6243 .close = ff_vc1_decode_end,
|
yading@10
|
6244 .decode = vc1_decode_frame,
|
yading@10
|
6245 .capabilities = CODEC_CAP_DR1,
|
yading@10
|
6246 .flush = vc1_sprite_flush,
|
yading@10
|
6247 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
|
yading@10
|
6248 .pix_fmts = ff_pixfmt_list_420
|
yading@10
|
6249 };
|
yading@10
|
6250 #endif
|
yading@10
|
6251
|
yading@10
|
6252 #if CONFIG_VC1IMAGE_DECODER
|
yading@10
|
6253 AVCodec ff_vc1image_decoder = {
|
yading@10
|
6254 .name = "vc1image",
|
yading@10
|
6255 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
6256 .id = AV_CODEC_ID_VC1IMAGE,
|
yading@10
|
6257 .priv_data_size = sizeof(VC1Context),
|
yading@10
|
6258 .init = vc1_decode_init,
|
yading@10
|
6259 .close = ff_vc1_decode_end,
|
yading@10
|
6260 .decode = vc1_decode_frame,
|
yading@10
|
6261 .capabilities = CODEC_CAP_DR1,
|
yading@10
|
6262 .flush = vc1_sprite_flush,
|
yading@10
|
6263 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
|
yading@10
|
6264 .pix_fmts = ff_pixfmt_list_420
|
yading@10
|
6265 };
|
yading@10
|
6266 #endif
|