annotate ffmpeg/libavcodec/vc1dec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
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