• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

libavcodec/vc1dec.c

Go to the documentation of this file.
00001 /*
00002  * VC-1 and WMV3 decoder
00003  * Copyright (c) 2011 Mashiat Sarker Shakkhar
00004  * Copyright (c) 2006-2007 Konstantin Shishkov
00005  * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
00006  *
00007  * This file is part of FFmpeg.
00008  *
00009  * FFmpeg is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU Lesser General Public
00011  * License as published by the Free Software Foundation; either
00012  * version 2.1 of the License, or (at your option) any later version.
00013  *
00014  * FFmpeg is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017  * Lesser General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with FFmpeg; if not, write to the Free Software
00021  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00022  */
00023 
00029 #include "internal.h"
00030 #include "dsputil.h"
00031 #include "avcodec.h"
00032 #include "mpegvideo.h"
00033 #include "h263.h"
00034 #include "vc1.h"
00035 #include "vc1data.h"
00036 #include "vc1acdata.h"
00037 #include "msmpeg4data.h"
00038 #include "unary.h"
00039 #include "simple_idct.h"
00040 #include "mathops.h"
00041 #include "vdpau_internal.h"
00042 
00043 #undef NDEBUG
00044 #include <assert.h>
00045 
00046 #define MB_INTRA_VLC_BITS 9
00047 #define DC_VLC_BITS 9
00048 #define AC_VLC_BITS 9
00049 
00050 
00051 static const uint16_t vlc_offs[] = {
00052         0,   520,   552,   616,  1128,  1160,  1224,  1740,  1772,  1836,  1900,  2436,
00053      2986,  3050,  3610,  4154,  4218,  4746,  5326,  5390,  5902,  6554,  7658,  8342,
00054      9304,  9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522,
00055     20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980,
00056     27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866,
00057     29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186,
00058     31714, 31746, 31778, 32306, 32340, 32372
00059 };
00060 
00061 // offset tables for interlaced picture MVDATA decoding
00062 static const int offset_table1[9] = {  0,  1,  2,  4,  8, 16, 32,  64, 128 };
00063 static const int offset_table2[9] = {  0,  1,  3,  7, 15, 31, 63, 127, 255 };
00064 
00070 static int vc1_init_common(VC1Context *v)
00071 {
00072     static int done = 0;
00073     int i = 0;
00074     static VLC_TYPE vlc_table[32372][2];
00075 
00076     v->hrd_rate = v->hrd_buffer = NULL;
00077 
00078     /* VLC tables */
00079     if (!done) {
00080         INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
00081                         ff_vc1_bfraction_bits, 1, 1,
00082                         ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS);
00083         INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
00084                         ff_vc1_norm2_bits, 1, 1,
00085                         ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS);
00086         INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
00087                         ff_vc1_norm6_bits, 1, 1,
00088                         ff_vc1_norm6_codes, 2, 2, 556);
00089         INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
00090                         ff_vc1_imode_bits, 1, 1,
00091                         ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS);
00092         for (i = 0; i < 3; i++) {
00093             ff_vc1_ttmb_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 0]];
00094             ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0];
00095             init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
00096                      ff_vc1_ttmb_bits[i], 1, 1,
00097                      ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
00098             ff_vc1_ttblk_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 1]];
00099             ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1];
00100             init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
00101                      ff_vc1_ttblk_bits[i], 1, 1,
00102                      ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
00103             ff_vc1_subblkpat_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 2]];
00104             ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2];
00105             init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
00106                      ff_vc1_subblkpat_bits[i], 1, 1,
00107                      ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
00108         }
00109         for (i = 0; i < 4; i++) {
00110             ff_vc1_4mv_block_pattern_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 9]];
00111             ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9];
00112             init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
00113                      ff_vc1_4mv_block_pattern_bits[i], 1, 1,
00114                      ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
00115             ff_vc1_cbpcy_p_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 10]];
00116             ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10];
00117             init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
00118                      ff_vc1_cbpcy_p_bits[i], 1, 1,
00119                      ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
00120             ff_vc1_mv_diff_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 11]];
00121             ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11];
00122             init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
00123                      ff_vc1_mv_diff_bits[i], 1, 1,
00124                      ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
00125         }
00126         for (i = 0; i < 8; i++) {
00127             ff_vc1_ac_coeff_table[i].table           = &vlc_table[vlc_offs[i * 2 + 21]];
00128             ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21];
00129             init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
00130                      &vc1_ac_tables[i][0][1], 8, 4,
00131                      &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC);
00132             /* initialize interlaced MVDATA tables (2-Ref) */
00133             ff_vc1_2ref_mvdata_vlc[i].table           = &vlc_table[vlc_offs[i * 2 + 22]];
00134             ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22];
00135             init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126,
00136                      ff_vc1_2ref_mvdata_bits[i], 1, 1,
00137                      ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
00138         }
00139         for (i = 0; i < 4; i++) {
00140             /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
00141             ff_vc1_intfr_4mv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 37]];
00142             ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37];
00143             init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
00144                      ff_vc1_intfr_4mv_mbmode_bits[i], 1, 1,
00145                      ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
00146             /* initialize NON-4MV MBMODE VLC tables for the same */
00147             ff_vc1_intfr_non4mv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 38]];
00148             ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38];
00149             init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
00150                      ff_vc1_intfr_non4mv_mbmode_bits[i], 1, 1,
00151                      ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
00152             /* initialize interlaced MVDATA tables (1-Ref) */
00153             ff_vc1_1ref_mvdata_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 39]];
00154             ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39];
00155             init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72,
00156                      ff_vc1_1ref_mvdata_bits[i], 1, 1,
00157                      ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
00158         }
00159         for (i = 0; i < 4; i++) {
00160             /* Initialize 2MV Block pattern VLC tables */
00161             ff_vc1_2mv_block_pattern_vlc[i].table           = &vlc_table[vlc_offs[i + 49]];
00162             ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49];
00163             init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
00164                      ff_vc1_2mv_block_pattern_bits[i], 1, 1,
00165                      ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
00166         }
00167         for (i = 0; i < 8; i++) {
00168             /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
00169             ff_vc1_icbpcy_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 53]];
00170             ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53];
00171             init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63,
00172                      ff_vc1_icbpcy_p_bits[i], 1, 1,
00173                      ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
00174             /* Initialize interlaced field picture MBMODE VLC tables */
00175             ff_vc1_if_mmv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 54]];
00176             ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54];
00177             init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8,
00178                      ff_vc1_if_mmv_mbmode_bits[i], 1, 1,
00179                      ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
00180             ff_vc1_if_1mv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 55]];
00181             ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55];
00182             init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6,
00183                      ff_vc1_if_1mv_mbmode_bits[i], 1, 1,
00184                      ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
00185         }
00186         done = 1;
00187     }
00188 
00189     /* Other defaults */
00190     v->pq      = -1;
00191     v->mvrange = 0; /* 7.1.1.18, p80 */
00192 
00193     return 0;
00194 }
00195 
00196 /***********************************************************************/
00207 enum Imode {
00208     IMODE_RAW,
00209     IMODE_NORM2,
00210     IMODE_DIFF2,
00211     IMODE_NORM6,
00212     IMODE_DIFF6,
00213     IMODE_ROWSKIP,
00214     IMODE_COLSKIP
00215 }; //imode defines
00217 
00218  //Bitplane group
00220 
00221 static void vc1_put_signed_blocks_clamped(VC1Context *v)
00222 {
00223     MpegEncContext *s = &v->s;
00224     int topleft_mb_pos, top_mb_pos;
00225     int stride_y, fieldtx;
00226     int v_dist;
00227 
00228     /* The put pixels loop is always one MB row behind the decoding loop,
00229      * because we can only put pixels when overlap filtering is done, and
00230      * for filtering of the bottom edge of a MB, we need the next MB row
00231      * present as well.
00232      * Within the row, the put pixels loop is also one MB col behind the
00233      * decoding loop. The reason for this is again, because for filtering
00234      * of the right MB edge, we need the next MB present. */
00235     if (!s->first_slice_line) {
00236         if (s->mb_x) {
00237             topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1;
00238             fieldtx        = v->fieldtx_plane[topleft_mb_pos];
00239             stride_y       = s->linesize << fieldtx;
00240             v_dist         = (16 - fieldtx) >> (fieldtx == 0);
00241             s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
00242                                              s->dest[0] - 16 * s->linesize - 16,
00243                                              stride_y);
00244             s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][1],
00245                                              s->dest[0] - 16 * s->linesize - 8,
00246                                              stride_y);
00247             s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][2],
00248                                              s->dest[0] - v_dist * s->linesize - 16,
00249                                              stride_y);
00250             s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][3],
00251                                              s->dest[0] - v_dist * s->linesize - 8,
00252                                              stride_y);
00253             s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][4],
00254                                              s->dest[1] - 8 * s->uvlinesize - 8,
00255                                              s->uvlinesize);
00256             s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][5],
00257                                              s->dest[2] - 8 * s->uvlinesize - 8,
00258                                              s->uvlinesize);
00259         }
00260         if (s->mb_x == s->mb_width - 1) {
00261             top_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x;
00262             fieldtx    = v->fieldtx_plane[top_mb_pos];
00263             stride_y   = s->linesize << fieldtx;
00264             v_dist     = fieldtx ? 15 : 8;
00265             s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][0],
00266                                              s->dest[0] - 16 * s->linesize,
00267                                              stride_y);
00268             s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][1],
00269                                              s->dest[0] - 16 * s->linesize + 8,
00270                                              stride_y);
00271             s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][2],
00272                                              s->dest[0] - v_dist * s->linesize,
00273                                              stride_y);
00274             s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][3],
00275                                              s->dest[0] - v_dist * s->linesize + 8,
00276                                              stride_y);
00277             s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][4],
00278                                              s->dest[1] - 8 * s->uvlinesize,
00279                                              s->uvlinesize);
00280             s->dsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][5],
00281                                              s->dest[2] - 8 * s->uvlinesize,
00282                                              s->uvlinesize);
00283         }
00284     }
00285 
00286 #define inc_blk_idx(idx) do { \
00287         idx++; \
00288         if (idx >= v->n_allocated_blks) \
00289             idx = 0; \
00290     } while (0)
00291 
00292     inc_blk_idx(v->topleft_blk_idx);
00293     inc_blk_idx(v->top_blk_idx);
00294     inc_blk_idx(v->left_blk_idx);
00295     inc_blk_idx(v->cur_blk_idx);
00296 }
00297 
00298 static void vc1_loop_filter_iblk(VC1Context *v, int pq)
00299 {
00300     MpegEncContext *s = &v->s;
00301     int j;
00302     if (!s->first_slice_line) {
00303         v->vc1dsp.vc1_v_loop_filter16(s->dest[0], s->linesize, pq);
00304         if (s->mb_x)
00305             v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
00306         v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
00307         for (j = 0; j < 2; j++) {
00308             v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1], s->uvlinesize, pq);
00309             if (s->mb_x)
00310                 v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
00311         }
00312     }
00313     v->vc1dsp.vc1_v_loop_filter16(s->dest[0] + 8 * s->linesize, s->linesize, pq);
00314 
00315     if (s->mb_y == s->end_mb_y - 1) {
00316         if (s->mb_x) {
00317             v->vc1dsp.vc1_h_loop_filter16(s->dest[0], s->linesize, pq);
00318             v->vc1dsp.vc1_h_loop_filter8(s->dest[1], s->uvlinesize, pq);
00319             v->vc1dsp.vc1_h_loop_filter8(s->dest[2], s->uvlinesize, pq);
00320         }
00321         v->vc1dsp.vc1_h_loop_filter16(s->dest[0] + 8, s->linesize, pq);
00322     }
00323 }
00324 
00325 static void vc1_loop_filter_iblk_delayed(VC1Context *v, int pq)
00326 {
00327     MpegEncContext *s = &v->s;
00328     int j;
00329 
00330     /* The loopfilter runs 1 row and 1 column behind the overlap filter, which
00331      * means it runs two rows/cols behind the decoding loop. */
00332     if (!s->first_slice_line) {
00333         if (s->mb_x) {
00334             if (s->mb_y >= s->start_mb_y + 2) {
00335                 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
00336 
00337                 if (s->mb_x >= 2)
00338                     v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 16, s->linesize, pq);
00339                 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize - 8, s->linesize, pq);
00340                 for (j = 0; j < 2; j++) {
00341                     v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
00342                     if (s->mb_x >= 2) {
00343                         v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize - 8, s->uvlinesize, pq);
00344                     }
00345                 }
00346             }
00347             v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize - 16, s->linesize, pq);
00348         }
00349 
00350         if (s->mb_x == s->mb_width - 1) {
00351             if (s->mb_y >= s->start_mb_y + 2) {
00352                 v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
00353 
00354                 if (s->mb_x)
00355                     v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize, s->linesize, pq);
00356                 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 32 * s->linesize + 8, s->linesize, pq);
00357                 for (j = 0; j < 2; j++) {
00358                     v->vc1dsp.vc1_v_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
00359                     if (s->mb_x >= 2) {
00360                         v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 16 * s->uvlinesize, s->uvlinesize, pq);
00361                     }
00362                 }
00363             }
00364             v->vc1dsp.vc1_v_loop_filter16(s->dest[0] - 8 * s->linesize, s->linesize, pq);
00365         }
00366 
00367         if (s->mb_y == s->end_mb_y) {
00368             if (s->mb_x) {
00369                 if (s->mb_x >= 2)
00370                     v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 16, s->linesize, pq);
00371                 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize - 8, s->linesize, pq);
00372                 if (s->mb_x >= 2) {
00373                     for (j = 0; j < 2; j++) {
00374                         v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize - 8, s->uvlinesize, pq);
00375                     }
00376                 }
00377             }
00378 
00379             if (s->mb_x == s->mb_width - 1) {
00380                 if (s->mb_x)
00381                     v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize, s->linesize, pq);
00382                 v->vc1dsp.vc1_h_loop_filter16(s->dest[0] - 16 * s->linesize + 8, s->linesize, pq);
00383                 if (s->mb_x) {
00384                     for (j = 0; j < 2; j++) {
00385                         v->vc1dsp.vc1_h_loop_filter8(s->dest[j + 1] - 8 * s->uvlinesize, s->uvlinesize, pq);
00386                     }
00387                 }
00388             }
00389         }
00390     }
00391 }
00392 
00393 static void vc1_smooth_overlap_filter_iblk(VC1Context *v)
00394 {
00395     MpegEncContext *s = &v->s;
00396     int mb_pos;
00397 
00398     if (v->condover == CONDOVER_NONE)
00399         return;
00400 
00401     mb_pos = s->mb_x + s->mb_y * s->mb_stride;
00402 
00403     /* Within a MB, the horizontal overlap always runs before the vertical.
00404      * To accomplish that, we run the H on left and internal borders of the
00405      * currently decoded MB. Then, we wait for the next overlap iteration
00406      * to do H overlap on the right edge of this MB, before moving over and
00407      * running the V overlap. Therefore, the V overlap makes us trail by one
00408      * MB col and the H overlap filter makes us trail by one MB row. This
00409      * is reflected in the time at which we run the put_pixels loop. */
00410     if (v->condover == CONDOVER_ALL || v->pq >= 9 || v->over_flags_plane[mb_pos]) {
00411         if (s->mb_x && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
00412                         v->over_flags_plane[mb_pos - 1])) {
00413             v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][1],
00414                                       v->block[v->cur_blk_idx][0]);
00415             v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][3],
00416                                       v->block[v->cur_blk_idx][2]);
00417             if (!(s->flags & CODEC_FLAG_GRAY)) {
00418                 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][4],
00419                                           v->block[v->cur_blk_idx][4]);
00420                 v->vc1dsp.vc1_h_s_overlap(v->block[v->left_blk_idx][5],
00421                                           v->block[v->cur_blk_idx][5]);
00422             }
00423         }
00424         v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][0],
00425                                   v->block[v->cur_blk_idx][1]);
00426         v->vc1dsp.vc1_h_s_overlap(v->block[v->cur_blk_idx][2],
00427                                   v->block[v->cur_blk_idx][3]);
00428 
00429         if (s->mb_x == s->mb_width - 1) {
00430             if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
00431                                          v->over_flags_plane[mb_pos - s->mb_stride])) {
00432                 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][2],
00433                                           v->block[v->cur_blk_idx][0]);
00434                 v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][3],
00435                                           v->block[v->cur_blk_idx][1]);
00436                 if (!(s->flags & CODEC_FLAG_GRAY)) {
00437                     v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][4],
00438                                               v->block[v->cur_blk_idx][4]);
00439                     v->vc1dsp.vc1_v_s_overlap(v->block[v->top_blk_idx][5],
00440                                               v->block[v->cur_blk_idx][5]);
00441                 }
00442             }
00443             v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][0],
00444                                       v->block[v->cur_blk_idx][2]);
00445             v->vc1dsp.vc1_v_s_overlap(v->block[v->cur_blk_idx][1],
00446                                       v->block[v->cur_blk_idx][3]);
00447         }
00448     }
00449     if (s->mb_x && (v->condover == CONDOVER_ALL || v->over_flags_plane[mb_pos - 1])) {
00450         if (!s->first_slice_line && (v->condover == CONDOVER_ALL || v->pq >= 9 ||
00451                                      v->over_flags_plane[mb_pos - s->mb_stride - 1])) {
00452             v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][2],
00453                                       v->block[v->left_blk_idx][0]);
00454             v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][3],
00455                                       v->block[v->left_blk_idx][1]);
00456             if (!(s->flags & CODEC_FLAG_GRAY)) {
00457                 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][4],
00458                                           v->block[v->left_blk_idx][4]);
00459                 v->vc1dsp.vc1_v_s_overlap(v->block[v->topleft_blk_idx][5],
00460                                           v->block[v->left_blk_idx][5]);
00461             }
00462         }
00463         v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][0],
00464                                   v->block[v->left_blk_idx][2]);
00465         v->vc1dsp.vc1_v_s_overlap(v->block[v->left_blk_idx][1],
00466                                   v->block[v->left_blk_idx][3]);
00467     }
00468 }
00469 
00473 static void vc1_mc_1mv(VC1Context *v, int dir)
00474 {
00475     MpegEncContext *s = &v->s;
00476     DSPContext *dsp   = &v->s.dsp;
00477     uint8_t *srcY, *srcU, *srcV;
00478     int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
00479     int off, off_uv;
00480     int v_edge_pos = s->v_edge_pos >> v->field_mode;
00481     if (!v->field_mode && !v->s.last_picture.f.data[0])
00482         return;
00483 
00484     mx = s->mv[dir][0][0];
00485     my = s->mv[dir][0][1];
00486 
00487     // store motion vectors for further use in B frames
00488     if (s->pict_type == AV_PICTURE_TYPE_P) {
00489         s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = mx;
00490         s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = my;
00491     }
00492 
00493     uvmx = (mx + ((mx & 3) == 3)) >> 1;
00494     uvmy = (my + ((my & 3) == 3)) >> 1;
00495     v->luma_mv[s->mb_x][0] = uvmx;
00496     v->luma_mv[s->mb_x][1] = uvmy;
00497 
00498     if (v->field_mode &&
00499         v->cur_field_type != v->ref_field_type[dir]) {
00500         my   = my   - 2 + 4 * v->cur_field_type;
00501         uvmy = uvmy - 2 + 4 * v->cur_field_type;
00502     }
00503 
00504     // fastuvmc shall be ignored for interlaced frame picture
00505     if (v->fastuvmc && (v->fcm != ILACE_FRAME)) {
00506         uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
00507         uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
00508     }
00509     if (v->field_mode) { // interlaced field picture
00510         if (!dir) {
00511             if ((v->cur_field_type != v->ref_field_type[dir]) && v->cur_field_type) {
00512                 srcY = s->current_picture.f.data[0];
00513                 srcU = s->current_picture.f.data[1];
00514                 srcV = s->current_picture.f.data[2];
00515             } else {
00516                 srcY = s->last_picture.f.data[0];
00517                 srcU = s->last_picture.f.data[1];
00518                 srcV = s->last_picture.f.data[2];
00519             }
00520         } else {
00521             srcY = s->next_picture.f.data[0];
00522             srcU = s->next_picture.f.data[1];
00523             srcV = s->next_picture.f.data[2];
00524         }
00525     } else {
00526         if (!dir) {
00527             srcY = s->last_picture.f.data[0];
00528             srcU = s->last_picture.f.data[1];
00529             srcV = s->last_picture.f.data[2];
00530         } else {
00531             srcY = s->next_picture.f.data[0];
00532             srcU = s->next_picture.f.data[1];
00533             srcV = s->next_picture.f.data[2];
00534         }
00535     }
00536 
00537     src_x   = s->mb_x * 16 + (mx   >> 2);
00538     src_y   = s->mb_y * 16 + (my   >> 2);
00539     uvsrc_x = s->mb_x *  8 + (uvmx >> 2);
00540     uvsrc_y = s->mb_y *  8 + (uvmy >> 2);
00541 
00542     if (v->profile != PROFILE_ADVANCED) {
00543         src_x   = av_clip(  src_x, -16, s->mb_width  * 16);
00544         src_y   = av_clip(  src_y, -16, s->mb_height * 16);
00545         uvsrc_x = av_clip(uvsrc_x,  -8, s->mb_width  *  8);
00546         uvsrc_y = av_clip(uvsrc_y,  -8, s->mb_height *  8);
00547     } else {
00548         src_x   = av_clip(  src_x, -17, s->avctx->coded_width);
00549         src_y   = av_clip(  src_y, -18, s->avctx->coded_height + 1);
00550         uvsrc_x = av_clip(uvsrc_x,  -8, s->avctx->coded_width  >> 1);
00551         uvsrc_y = av_clip(uvsrc_y,  -8, s->avctx->coded_height >> 1);
00552     }
00553 
00554     srcY += src_y   * s->linesize   + src_x;
00555     srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
00556     srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
00557 
00558     if (v->field_mode && v->ref_field_type[dir]) {
00559         srcY += s->current_picture_ptr->f.linesize[0];
00560         srcU += s->current_picture_ptr->f.linesize[1];
00561         srcV += s->current_picture_ptr->f.linesize[2];
00562     }
00563 
00564     /* for grayscale we should not try to read from unknown area */
00565     if (s->flags & CODEC_FLAG_GRAY) {
00566         srcU = s->edge_emu_buffer + 18 * s->linesize;
00567         srcV = s->edge_emu_buffer + 18 * s->linesize;
00568     }
00569 
00570     if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
00571         || s->h_edge_pos < 22 || v_edge_pos < 22
00572         || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3
00573         || (unsigned)(src_y - s->mspel) > v_edge_pos    - (my&3) - 16 - s->mspel * 3) {
00574         uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
00575 
00576         srcY -= s->mspel * (1 + s->linesize);
00577         s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
00578                                 17 + s->mspel * 2, 17 + s->mspel * 2,
00579                                 src_x - s->mspel, src_y - s->mspel,
00580                                 s->h_edge_pos, v_edge_pos);
00581         srcY = s->edge_emu_buffer;
00582         s->dsp.emulated_edge_mc(uvbuf     , srcU, s->uvlinesize, 8 + 1, 8 + 1,
00583                                 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
00584         s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
00585                                 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
00586         srcU = uvbuf;
00587         srcV = uvbuf + 16;
00588         /* if we deal with range reduction we need to scale source blocks */
00589         if (v->rangeredfrm) {
00590             int i, j;
00591             uint8_t *src, *src2;
00592 
00593             src = srcY;
00594             for (j = 0; j < 17 + s->mspel * 2; j++) {
00595                 for (i = 0; i < 17 + s->mspel * 2; i++)
00596                     src[i] = ((src[i] - 128) >> 1) + 128;
00597                 src += s->linesize;
00598             }
00599             src  = srcU;
00600             src2 = srcV;
00601             for (j = 0; j < 9; j++) {
00602                 for (i = 0; i < 9; i++) {
00603                     src[i]  = ((src[i]  - 128) >> 1) + 128;
00604                     src2[i] = ((src2[i] - 128) >> 1) + 128;
00605                 }
00606                 src  += s->uvlinesize;
00607                 src2 += s->uvlinesize;
00608             }
00609         }
00610         /* if we deal with intensity compensation we need to scale source blocks */
00611         if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
00612             int i, j;
00613             uint8_t *src, *src2;
00614 
00615             src = srcY;
00616             for (j = 0; j < 17 + s->mspel * 2; j++) {
00617                 for (i = 0; i < 17 + s->mspel * 2; i++)
00618                     src[i] = v->luty[src[i]];
00619                 src += s->linesize;
00620             }
00621             src  = srcU;
00622             src2 = srcV;
00623             for (j = 0; j < 9; j++) {
00624                 for (i = 0; i < 9; i++) {
00625                     src[i]  = v->lutuv[src[i]];
00626                     src2[i] = v->lutuv[src2[i]];
00627                 }
00628                 src  += s->uvlinesize;
00629                 src2 += s->uvlinesize;
00630             }
00631         }
00632         srcY += s->mspel * (1 + s->linesize);
00633     }
00634 
00635     if (v->field_mode && v->cur_field_type) {
00636         off    = s->current_picture_ptr->f.linesize[0];
00637         off_uv = s->current_picture_ptr->f.linesize[1];
00638     } else {
00639         off    = 0;
00640         off_uv = 0;
00641     }
00642     if (s->mspel) {
00643         dxy = ((my & 3) << 2) | (mx & 3);
00644         v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off    , srcY    , s->linesize, v->rnd);
00645         v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
00646         srcY += s->linesize * 8;
00647         v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize    , srcY    , s->linesize, v->rnd);
00648         v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
00649     } else { // hpel mc - always used for luma
00650         dxy = (my & 2) | ((mx & 2) >> 1);
00651         if (!v->rnd)
00652             dsp->put_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
00653         else
00654             dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
00655     }
00656 
00657     if (s->flags & CODEC_FLAG_GRAY) return;
00658     /* Chroma MC always uses qpel bilinear */
00659     uvmx = (uvmx & 3) << 1;
00660     uvmy = (uvmy & 3) << 1;
00661     if (!v->rnd) {
00662         dsp->put_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
00663         dsp->put_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
00664     } else {
00665         v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
00666         v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
00667     }
00668 }
00669 
00670 static inline int median4(int a, int b, int c, int d)
00671 {
00672     if (a < b) {
00673         if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
00674         else       return (FFMIN(b, c) + FFMAX(a, d)) / 2;
00675     } else {
00676         if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
00677         else       return (FFMIN(a, c) + FFMAX(b, d)) / 2;
00678     }
00679 }
00680 
00683 static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
00684 {
00685     MpegEncContext *s = &v->s;
00686     DSPContext *dsp = &v->s.dsp;
00687     uint8_t *srcY;
00688     int dxy, mx, my, src_x, src_y;
00689     int off;
00690     int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0;
00691     int v_edge_pos = s->v_edge_pos >> v->field_mode;
00692 
00693     if (!v->field_mode && !v->s.last_picture.f.data[0])
00694         return;
00695 
00696     mx = s->mv[dir][n][0];
00697     my = s->mv[dir][n][1];
00698 
00699     if (!dir) {
00700         if (v->field_mode) {
00701             if ((v->cur_field_type != v->ref_field_type[dir]) && v->cur_field_type)
00702                 srcY = s->current_picture.f.data[0];
00703             else
00704                 srcY = s->last_picture.f.data[0];
00705         } else
00706             srcY = s->last_picture.f.data[0];
00707     } else
00708         srcY = s->next_picture.f.data[0];
00709 
00710     if (v->field_mode) {
00711         if (v->cur_field_type != v->ref_field_type[dir])
00712             my = my - 2 + 4 * v->cur_field_type;
00713     }
00714 
00715     if (s->pict_type == AV_PICTURE_TYPE_P && n == 3 && v->field_mode) {
00716         int same_count = 0, opp_count = 0, k;
00717         int chosen_mv[2][4][2], f;
00718         int tx, ty;
00719         for (k = 0; k < 4; k++) {
00720             f = v->mv_f[0][s->block_index[k] + v->blocks_off];
00721             chosen_mv[f][f ? opp_count : same_count][0] = s->mv[0][k][0];
00722             chosen_mv[f][f ? opp_count : same_count][1] = s->mv[0][k][1];
00723             opp_count  += f;
00724             same_count += 1 - f;
00725         }
00726         f = opp_count > same_count;
00727         switch (f ? opp_count : same_count) {
00728         case 4:
00729             tx = median4(chosen_mv[f][0][0], chosen_mv[f][1][0],
00730                          chosen_mv[f][2][0], chosen_mv[f][3][0]);
00731             ty = median4(chosen_mv[f][0][1], chosen_mv[f][1][1],
00732                          chosen_mv[f][2][1], chosen_mv[f][3][1]);
00733             break;
00734         case 3:
00735             tx = mid_pred(chosen_mv[f][0][0], chosen_mv[f][1][0], chosen_mv[f][2][0]);
00736             ty = mid_pred(chosen_mv[f][0][1], chosen_mv[f][1][1], chosen_mv[f][2][1]);
00737             break;
00738         case 2:
00739             tx = (chosen_mv[f][0][0] + chosen_mv[f][1][0]) / 2;
00740             ty = (chosen_mv[f][0][1] + chosen_mv[f][1][1]) / 2;
00741             break;
00742         }
00743         s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
00744         s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
00745         for (k = 0; k < 4; k++)
00746             v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
00747     }
00748 
00749     if (v->fcm == ILACE_FRAME) {  // not sure if needed for other types of picture
00750         int qx, qy;
00751         int width  = s->avctx->coded_width;
00752         int height = s->avctx->coded_height >> 1;
00753         qx = (s->mb_x * 16) + (mx >> 2);
00754         qy = (s->mb_y *  8) + (my >> 3);
00755 
00756         if (qx < -17)
00757             mx -= 4 * (qx + 17);
00758         else if (qx > width)
00759             mx -= 4 * (qx - width);
00760         if (qy < -18)
00761             my -= 8 * (qy + 18);
00762         else if (qy > height + 1)
00763             my -= 8 * (qy - height - 1);
00764     }
00765 
00766     if ((v->fcm == ILACE_FRAME) && fieldmv)
00767         off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
00768     else
00769         off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
00770     if (v->field_mode && v->cur_field_type)
00771         off += s->current_picture_ptr->f.linesize[0];
00772 
00773     src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2);
00774     if (!fieldmv)
00775         src_y = s->mb_y * 16 + (n & 2) * 4 + (my >> 2);
00776     else
00777         src_y = s->mb_y * 16 + ((n > 1) ? 1 : 0) + (my >> 2);
00778 
00779     if (v->profile != PROFILE_ADVANCED) {
00780         src_x = av_clip(src_x, -16, s->mb_width  * 16);
00781         src_y = av_clip(src_y, -16, s->mb_height * 16);
00782     } else {
00783         src_x = av_clip(src_x, -17, s->avctx->coded_width);
00784         if (v->fcm == ILACE_FRAME) {
00785             if (src_y & 1)
00786                 src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
00787             else
00788                 src_y = av_clip(src_y, -18, s->avctx->coded_height);
00789         } else {
00790             src_y = av_clip(src_y, -18, s->avctx->coded_height + 1);
00791         }
00792     }
00793 
00794     srcY += src_y * s->linesize + src_x;
00795     if (v->field_mode && v->ref_field_type[dir])
00796         srcY += s->current_picture_ptr->f.linesize[0];
00797 
00798     if (fieldmv && !(src_y & 1))
00799         v_edge_pos--;
00800     if (fieldmv && (src_y & 1) && src_y < 4)
00801         src_y--;
00802     if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
00803         || s->h_edge_pos < 13 || v_edge_pos < 23
00804         || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2
00805         || (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) {
00806         srcY -= s->mspel * (1 + (s->linesize << fieldmv));
00807         /* check emulate edge stride and offset */
00808         s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
00809                                 9 + s->mspel * 2, (9 + s->mspel * 2) << fieldmv,
00810                                 src_x - s->mspel, src_y - (s->mspel << fieldmv),
00811                                 s->h_edge_pos, v_edge_pos);
00812         srcY = s->edge_emu_buffer;
00813         /* if we deal with range reduction we need to scale source blocks */
00814         if (v->rangeredfrm) {
00815             int i, j;
00816             uint8_t *src;
00817 
00818             src = srcY;
00819             for (j = 0; j < 9 + s->mspel * 2; j++) {
00820                 for (i = 0; i < 9 + s->mspel * 2; i++)
00821                     src[i] = ((src[i] - 128) >> 1) + 128;
00822                 src += s->linesize << fieldmv;
00823             }
00824         }
00825         /* if we deal with intensity compensation we need to scale source blocks */
00826         if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
00827             int i, j;
00828             uint8_t *src;
00829 
00830             src = srcY;
00831             for (j = 0; j < 9 + s->mspel * 2; j++) {
00832                 for (i = 0; i < 9 + s->mspel * 2; i++)
00833                     src[i] = v->luty[src[i]];
00834                 src += s->linesize << fieldmv;
00835             }
00836         }
00837         srcY += s->mspel * (1 + (s->linesize << fieldmv));
00838     }
00839 
00840     if (s->mspel) {
00841         dxy = ((my & 3) << 2) | (mx & 3);
00842         v->vc1dsp.put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd);
00843     } else { // hpel mc - always used for luma
00844         dxy = (my & 2) | ((mx & 2) >> 1);
00845         if (!v->rnd)
00846             dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
00847         else
00848             dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
00849     }
00850 }
00851 
00852 static av_always_inline int get_chroma_mv(int *mvx, int *mvy, int *a, int flag, int *tx, int *ty)
00853 {
00854     int idx, i;
00855     static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
00856 
00857     idx =  ((a[3] != flag) << 3)
00858          | ((a[2] != flag) << 2)
00859          | ((a[1] != flag) << 1)
00860          |  (a[0] != flag);
00861     if (!idx) {
00862         *tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
00863         *ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
00864         return 4;
00865     } else if (count[idx] == 1) {
00866         switch (idx) {
00867         case 0x1:
00868             *tx = mid_pred(mvx[1], mvx[2], mvx[3]);
00869             *ty = mid_pred(mvy[1], mvy[2], mvy[3]);
00870             return 3;
00871         case 0x2:
00872             *tx = mid_pred(mvx[0], mvx[2], mvx[3]);
00873             *ty = mid_pred(mvy[0], mvy[2], mvy[3]);
00874             return 3;
00875         case 0x4:
00876             *tx = mid_pred(mvx[0], mvx[1], mvx[3]);
00877             *ty = mid_pred(mvy[0], mvy[1], mvy[3]);
00878             return 3;
00879         case 0x8:
00880             *tx = mid_pred(mvx[0], mvx[1], mvx[2]);
00881             *ty = mid_pred(mvy[0], mvy[1], mvy[2]);
00882             return 3;
00883         }
00884     } else if (count[idx] == 2) {
00885         int t1 = 0, t2 = 0;
00886         for (i = 0; i < 3; i++)
00887             if (!a[i]) {
00888                 t1 = i;
00889                 break;
00890             }
00891         for (i = t1 + 1; i < 4; i++)
00892             if (!a[i]) {
00893                 t2 = i;
00894                 break;
00895             }
00896         *tx = (mvx[t1] + mvx[t2]) / 2;
00897         *ty = (mvy[t1] + mvy[t2]) / 2;
00898         return 2;
00899     } else {
00900         return 0;
00901     }
00902     return -1;
00903 }
00904 
00907 static void vc1_mc_4mv_chroma(VC1Context *v, int dir)
00908 {
00909     MpegEncContext *s = &v->s;
00910     DSPContext *dsp   = &v->s.dsp;
00911     uint8_t *srcU, *srcV;
00912     int uvmx, uvmy, uvsrc_x, uvsrc_y;
00913     int k, tx = 0, ty = 0;
00914     int mvx[4], mvy[4], intra[4], mv_f[4];
00915     int valid_count;
00916     int chroma_ref_type = v->cur_field_type, off = 0;
00917     int v_edge_pos = s->v_edge_pos >> v->field_mode;
00918 
00919     if (!v->field_mode && !v->s.last_picture.f.data[0])
00920         return;
00921     if (s->flags & CODEC_FLAG_GRAY)
00922         return;
00923 
00924     for (k = 0; k < 4; k++) {
00925         mvx[k] = s->mv[dir][k][0];
00926         mvy[k] = s->mv[dir][k][1];
00927         intra[k] = v->mb_type[0][s->block_index[k]];
00928         if (v->field_mode)
00929             mv_f[k] = v->mv_f[dir][s->block_index[k] + v->blocks_off];
00930     }
00931 
00932     /* calculate chroma MV vector from four luma MVs */
00933     if (!v->field_mode || (v->field_mode && !v->numref)) {
00934         valid_count = get_chroma_mv(mvx, mvy, intra, 0, &tx, &ty);
00935         if (!valid_count) {
00936             s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
00937             s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
00938             v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
00939             return; //no need to do MC for intra blocks
00940         }
00941     } else {
00942         int dominant = 0;
00943         if (mv_f[0] + mv_f[1] + mv_f[2] + mv_f[3] > 2)
00944             dominant = 1;
00945         valid_count = get_chroma_mv(mvx, mvy, mv_f, dominant, &tx, &ty);
00946         if (dominant)
00947             chroma_ref_type = !v->cur_field_type;
00948     }
00949     s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx;
00950     s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty;
00951     uvmx = (tx + ((tx & 3) == 3)) >> 1;
00952     uvmy = (ty + ((ty & 3) == 3)) >> 1;
00953 
00954     v->luma_mv[s->mb_x][0] = uvmx;
00955     v->luma_mv[s->mb_x][1] = uvmy;
00956 
00957     if (v->fastuvmc) {
00958         uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
00959         uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
00960     }
00961     // Field conversion bias
00962     if (v->cur_field_type != chroma_ref_type)
00963         uvmy += 2 - 4 * chroma_ref_type;
00964 
00965     uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
00966     uvsrc_y = s->mb_y * 8 + (uvmy >> 2);
00967 
00968     if (v->profile != PROFILE_ADVANCED) {
00969         uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width  * 8);
00970         uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8);
00971     } else {
00972         uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width  >> 1);
00973         uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
00974     }
00975 
00976     if (!dir) {
00977         if (v->field_mode) {
00978             if ((v->cur_field_type != chroma_ref_type) && v->cur_field_type) {
00979                 srcU = s->current_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
00980                 srcV = s->current_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
00981             } else {
00982                 srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
00983                 srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
00984             }
00985         } else {
00986             srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
00987             srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
00988         }
00989     } else {
00990         srcU = s->next_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
00991         srcV = s->next_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
00992     }
00993 
00994     if (v->field_mode) {
00995         if (chroma_ref_type) {
00996             srcU += s->current_picture_ptr->f.linesize[1];
00997             srcV += s->current_picture_ptr->f.linesize[2];
00998         }
00999         off = v->cur_field_type ? s->current_picture_ptr->f.linesize[1] : 0;
01000     }
01001 
01002     if (v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
01003         || s->h_edge_pos < 18 || v_edge_pos < 18
01004         || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
01005         || (unsigned)uvsrc_y > (v_edge_pos    >> 1) - 9) {
01006         s->dsp.emulated_edge_mc(s->edge_emu_buffer     , srcU, s->uvlinesize,
01007                                 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
01008                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
01009         s->dsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
01010                                 8 + 1, 8 + 1, uvsrc_x, uvsrc_y,
01011                                 s->h_edge_pos >> 1, v_edge_pos >> 1);
01012         srcU = s->edge_emu_buffer;
01013         srcV = s->edge_emu_buffer + 16;
01014 
01015         /* if we deal with range reduction we need to scale source blocks */
01016         if (v->rangeredfrm) {
01017             int i, j;
01018             uint8_t *src, *src2;
01019 
01020             src  = srcU;
01021             src2 = srcV;
01022             for (j = 0; j < 9; j++) {
01023                 for (i = 0; i < 9; i++) {
01024                     src[i]  = ((src[i]  - 128) >> 1) + 128;
01025                     src2[i] = ((src2[i] - 128) >> 1) + 128;
01026                 }
01027                 src  += s->uvlinesize;
01028                 src2 += s->uvlinesize;
01029             }
01030         }
01031         /* if we deal with intensity compensation we need to scale source blocks */
01032         if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
01033             int i, j;
01034             uint8_t *src, *src2;
01035 
01036             src  = srcU;
01037             src2 = srcV;
01038             for (j = 0; j < 9; j++) {
01039                 for (i = 0; i < 9; i++) {
01040                     src[i]  = v->lutuv[src[i]];
01041                     src2[i] = v->lutuv[src2[i]];
01042                 }
01043                 src  += s->uvlinesize;
01044                 src2 += s->uvlinesize;
01045             }
01046         }
01047     }
01048 
01049     /* Chroma MC always uses qpel bilinear */
01050     uvmx = (uvmx & 3) << 1;
01051     uvmy = (uvmy & 3) << 1;
01052     if (!v->rnd) {
01053         dsp->put_h264_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
01054         dsp->put_h264_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
01055     } else {
01056         v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off, srcU, s->uvlinesize, 8, uvmx, uvmy);
01057         v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off, srcV, s->uvlinesize, 8, uvmx, uvmy);
01058     }
01059 }
01060 
01063 static void vc1_mc_4mv_chroma4(VC1Context *v)
01064 {
01065     MpegEncContext *s = &v->s;
01066     DSPContext *dsp = &v->s.dsp;
01067     uint8_t *srcU, *srcV;
01068     int uvsrc_x, uvsrc_y;
01069     int uvmx_field[4], uvmy_field[4];
01070     int i, off, tx, ty;
01071     int fieldmv = v->blk_mv_type[s->block_index[0]];
01072     static const int s_rndtblfield[16] = { 0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12 };
01073     int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks
01074     int v_edge_pos = s->v_edge_pos >> 1;
01075 
01076     if (!v->s.last_picture.f.data[0])
01077         return;
01078     if (s->flags & CODEC_FLAG_GRAY)
01079         return;
01080 
01081     for (i = 0; i < 4; i++) {
01082         tx = s->mv[0][i][0];
01083         uvmx_field[i] = (tx + ((tx & 3) == 3)) >> 1;
01084         ty = s->mv[0][i][1];
01085         if (fieldmv)
01086             uvmy_field[i] = (ty >> 4) * 8 + s_rndtblfield[ty & 0xF];
01087         else
01088             uvmy_field[i] = (ty + ((ty & 3) == 3)) >> 1;
01089     }
01090 
01091     for (i = 0; i < 4; i++) {
01092         off = (i & 1) * 4 + ((i & 2) ? v_dist * s->uvlinesize : 0);
01093         uvsrc_x = s->mb_x * 8 +  (i & 1) * 4           + (uvmx_field[i] >> 2);
01094         uvsrc_y = s->mb_y * 8 + ((i & 2) ? v_dist : 0) + (uvmy_field[i] >> 2);
01095         // FIXME: implement proper pull-back (see vc1cropmv.c, vc1CROPMV_ChromaPullBack())
01096         uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width  >> 1);
01097         uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1);
01098         srcU = s->last_picture.f.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
01099         srcV = s->last_picture.f.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
01100         uvmx_field[i] = (uvmx_field[i] & 3) << 1;
01101         uvmy_field[i] = (uvmy_field[i] & 3) << 1;
01102 
01103         if (fieldmv && !(uvsrc_y & 1))
01104             v_edge_pos--;
01105         if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2)
01106             uvsrc_y--;
01107         if ((v->mv_mode == MV_PMODE_INTENSITY_COMP)
01108             || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv)
01109             || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5
01110             || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) {
01111             s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcU, s->uvlinesize,
01112                                     5, (5 << fieldmv), uvsrc_x, uvsrc_y,
01113                                     s->h_edge_pos >> 1, v_edge_pos);
01114             s->dsp.emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize,
01115                                     5, (5 << fieldmv), uvsrc_x, uvsrc_y,
01116                                     s->h_edge_pos >> 1, v_edge_pos);
01117             srcU = s->edge_emu_buffer;
01118             srcV = s->edge_emu_buffer + 16;
01119 
01120             /* if we deal with intensity compensation we need to scale source blocks */
01121             if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
01122                 int i, j;
01123                 uint8_t *src, *src2;
01124 
01125                 src  = srcU;
01126                 src2 = srcV;
01127                 for (j = 0; j < 5; j++) {
01128                     for (i = 0; i < 5; i++) {
01129                         src[i]  = v->lutuv[src[i]];
01130                         src2[i] = v->lutuv[src2[i]];
01131                     }
01132                     src  += s->uvlinesize << 1;
01133                     src2 += s->uvlinesize << 1;
01134                 }
01135             }
01136         }
01137         if (!v->rnd) {
01138             dsp->put_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
01139             dsp->put_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]);
01140         } else {
01141             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]);
01142             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]);
01143         }
01144     }
01145 }
01146 
01147 /***********************************************************************/
01158 #define GET_MQUANT()                                           \
01159     if (v->dquantfrm) {                                        \
01160         int edges = 0;                                         \
01161         if (v->dqprofile == DQPROFILE_ALL_MBS) {               \
01162             if (v->dqbilevel) {                                \
01163                 mquant = (get_bits1(gb)) ? v->altpq : v->pq;   \
01164             } else {                                           \
01165                 mqdiff = get_bits(gb, 3);                      \
01166                 if (mqdiff != 7)                               \
01167                     mquant = v->pq + mqdiff;                   \
01168                 else                                           \
01169                     mquant = get_bits(gb, 5);                  \
01170             }                                                  \
01171         }                                                      \
01172         if (v->dqprofile == DQPROFILE_SINGLE_EDGE)             \
01173             edges = 1 << v->dqsbedge;                          \
01174         else if (v->dqprofile == DQPROFILE_DOUBLE_EDGES)       \
01175             edges = (3 << v->dqsbedge) % 15;                   \
01176         else if (v->dqprofile == DQPROFILE_FOUR_EDGES)         \
01177             edges = 15;                                        \
01178         if ((edges&1) && !s->mb_x)                             \
01179             mquant = v->altpq;                                 \
01180         if ((edges&2) && s->first_slice_line)                  \
01181             mquant = v->altpq;                                 \
01182         if ((edges&4) && s->mb_x == (s->mb_width - 1))         \
01183             mquant = v->altpq;                                 \
01184         if ((edges&8) && s->mb_y == (s->mb_height - 1))        \
01185             mquant = v->altpq;                                 \
01186     }
01187 
01195 #define GET_MVDATA(_dmv_x, _dmv_y)                                      \
01196     index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table, \
01197                          VC1_MV_DIFF_VLC_BITS, 2);                      \
01198     if (index > 36) {                                                   \
01199         mb_has_coeffs = 1;                                              \
01200         index -= 37;                                                    \
01201     } else                                                              \
01202         mb_has_coeffs = 0;                                              \
01203     s->mb_intra = 0;                                                    \
01204     if (!index) {                                                       \
01205         _dmv_x = _dmv_y = 0;                                            \
01206     } else if (index == 35) {                                           \
01207         _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample);          \
01208         _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample);          \
01209     } else if (index == 36) {                                           \
01210         _dmv_x = 0;                                                     \
01211         _dmv_y = 0;                                                     \
01212         s->mb_intra = 1;                                                \
01213     } else {                                                            \
01214         index1 = index % 6;                                             \
01215         if (!s->quarter_sample && index1 == 5) val = 1;                 \
01216         else                                   val = 0;                 \
01217         if (size_table[index1] - val > 0)                               \
01218             val = get_bits(gb, size_table[index1] - val);               \
01219         else                                   val = 0;                 \
01220         sign = 0 - (val&1);                                             \
01221         _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign;     \
01222                                                                         \
01223         index1 = index / 6;                                             \
01224         if (!s->quarter_sample && index1 == 5) val = 1;                 \
01225         else                                   val = 0;                 \
01226         if (size_table[index1] - val > 0)                               \
01227             val = get_bits(gb, size_table[index1] - val);               \
01228         else                                   val = 0;                 \
01229         sign = 0 - (val & 1);                                           \
01230         _dmv_y = (sign ^ ((val >> 1) + offset_table[index1])) - sign;   \
01231     }
01232 
01233 static av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x,
01234                                                    int *dmv_y, int *pred_flag)
01235 {
01236     int index, index1;
01237     int extend_x = 0, extend_y = 0;
01238     GetBitContext *gb = &v->s.gb;
01239     int bits, esc;
01240     int val, sign;
01241     const int* offs_tab;
01242 
01243     if (v->numref) {
01244         bits = VC1_2REF_MVDATA_VLC_BITS;
01245         esc  = 125;
01246     } else {
01247         bits = VC1_1REF_MVDATA_VLC_BITS;
01248         esc  = 71;
01249     }
01250     switch (v->dmvrange) {
01251     case 1:
01252         extend_x = 1;
01253         break;
01254     case 2:
01255         extend_y = 1;
01256         break;
01257     case 3:
01258         extend_x = extend_y = 1;
01259         break;
01260     }
01261     index = get_vlc2(gb, v->imv_vlc->table, bits, 3);
01262     if (index == esc) {
01263         *dmv_x = get_bits(gb, v->k_x);
01264         *dmv_y = get_bits(gb, v->k_y);
01265         if (v->numref) {
01266             *pred_flag = *dmv_y & 1;
01267             *dmv_y     = (*dmv_y + *pred_flag) >> 1;
01268         }
01269     }
01270     else {
01271         if (extend_x)
01272             offs_tab = offset_table2;
01273         else
01274             offs_tab = offset_table1;
01275         index1 = (index + 1) % 9;
01276         if (index1 != 0) {
01277             val    = get_bits(gb, index1 + extend_x);
01278             sign   = 0 -(val & 1);
01279             *dmv_x = (sign ^ ((val >> 1) + offs_tab[index1])) - sign;
01280         } else
01281             *dmv_x = 0;
01282         if (extend_y)
01283             offs_tab = offset_table2;
01284         else
01285             offs_tab = offset_table1;
01286         index1 = (index + 1) / 9;
01287         if (index1 > v->numref) {
01288             val    = get_bits(gb, (index1 + (extend_y << v->numref)) >> v->numref);
01289             sign   = 0 - (val & 1);
01290             *dmv_y = (sign ^ ((val >> 1) + offs_tab[index1 >> v->numref])) - sign;
01291         } else
01292             *dmv_y = 0;
01293         if (v->numref)
01294             *pred_flag = index1 & 1;
01295     }
01296 }
01297 
01298 static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int dir)
01299 {
01300     int scaledvalue, refdist;
01301     int scalesame1, scalesame2;
01302     int scalezone1_x, zone1offset_x;
01303     int table_index = dir ^ v->second_field;
01304 
01305     if (v->s.pict_type != AV_PICTURE_TYPE_B)
01306         refdist = v->refdist;
01307     else
01308         refdist = dir ? v->brfd : v->frfd;
01309     if (refdist > 3)
01310         refdist = 3;
01311     scalesame1    = vc1_field_mvpred_scales[table_index][1][refdist];
01312     scalesame2    = vc1_field_mvpred_scales[table_index][2][refdist];
01313     scalezone1_x  = vc1_field_mvpred_scales[table_index][3][refdist];
01314     zone1offset_x = vc1_field_mvpred_scales[table_index][5][refdist];
01315 
01316     if (FFABS(n) > 255)
01317         scaledvalue = n;
01318     else {
01319         if (FFABS(n) < scalezone1_x)
01320             scaledvalue = (n * scalesame1) >> 8;
01321         else {
01322             if (n < 0)
01323                 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_x;
01324             else
01325                 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_x;
01326         }
01327     }
01328     return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
01329 }
01330 
01331 static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, int dir)
01332 {
01333     int scaledvalue, refdist;
01334     int scalesame1, scalesame2;
01335     int scalezone1_y, zone1offset_y;
01336     int table_index = dir ^ v->second_field;
01337 
01338     if (v->s.pict_type != AV_PICTURE_TYPE_B)
01339         refdist = v->refdist;
01340     else
01341         refdist = dir ? v->brfd : v->frfd;
01342     if (refdist > 3)
01343         refdist = 3;
01344     scalesame1    = vc1_field_mvpred_scales[table_index][1][refdist];
01345     scalesame2    = vc1_field_mvpred_scales[table_index][2][refdist];
01346     scalezone1_y  = vc1_field_mvpred_scales[table_index][4][refdist];
01347     zone1offset_y = vc1_field_mvpred_scales[table_index][6][refdist];
01348 
01349     if (FFABS(n) > 63)
01350         scaledvalue = n;
01351     else {
01352         if (FFABS(n) < scalezone1_y)
01353             scaledvalue = (n * scalesame1) >> 8;
01354         else {
01355             if (n < 0)
01356                 scaledvalue = ((n * scalesame2) >> 8) - zone1offset_y;
01357             else
01358                 scaledvalue = ((n * scalesame2) >> 8) + zone1offset_y;
01359         }
01360     }
01361 
01362     if (v->cur_field_type && !v->ref_field_type[dir])
01363         return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
01364     else
01365         return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
01366 }
01367 
01368 static av_always_inline int scaleforopp_x(VC1Context *v, int n /* MV */)
01369 {
01370     int scalezone1_x, zone1offset_x;
01371     int scaleopp1, scaleopp2, brfd;
01372     int scaledvalue;
01373 
01374     brfd = FFMIN(v->brfd, 3);
01375     scalezone1_x  = vc1_b_field_mvpred_scales[3][brfd];
01376     zone1offset_x = vc1_b_field_mvpred_scales[5][brfd];
01377     scaleopp1     = vc1_b_field_mvpred_scales[1][brfd];
01378     scaleopp2     = vc1_b_field_mvpred_scales[2][brfd];
01379 
01380     if (FFABS(n) > 255)
01381         scaledvalue = n;
01382     else {
01383         if (FFABS(n) < scalezone1_x)
01384             scaledvalue = (n * scaleopp1) >> 8;
01385         else {
01386             if (n < 0)
01387                 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_x;
01388             else
01389                 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_x;
01390         }
01391     }
01392     return av_clip(scaledvalue, -v->range_x, v->range_x - 1);
01393 }
01394 
01395 static av_always_inline int scaleforopp_y(VC1Context *v, int n /* MV */, int dir)
01396 {
01397     int scalezone1_y, zone1offset_y;
01398     int scaleopp1, scaleopp2, brfd;
01399     int scaledvalue;
01400 
01401     brfd = FFMIN(v->brfd, 3);
01402     scalezone1_y  = vc1_b_field_mvpred_scales[4][brfd];
01403     zone1offset_y = vc1_b_field_mvpred_scales[6][brfd];
01404     scaleopp1     = vc1_b_field_mvpred_scales[1][brfd];
01405     scaleopp2     = vc1_b_field_mvpred_scales[2][brfd];
01406 
01407     if (FFABS(n) > 63)
01408         scaledvalue = n;
01409     else {
01410         if (FFABS(n) < scalezone1_y)
01411             scaledvalue = (n * scaleopp1) >> 8;
01412         else {
01413             if (n < 0)
01414                 scaledvalue = ((n * scaleopp2) >> 8) - zone1offset_y;
01415             else
01416                 scaledvalue = ((n * scaleopp2) >> 8) + zone1offset_y;
01417         }
01418     }
01419     if (v->cur_field_type && !v->ref_field_type[dir]) {
01420         return av_clip(scaledvalue, -v->range_y / 2 + 1, v->range_y / 2);
01421     } else {
01422         return av_clip(scaledvalue, -v->range_y / 2, v->range_y / 2 - 1);
01423     }
01424 }
01425 
01426 static av_always_inline int scaleforsame(VC1Context *v, int i, int n /* MV */,
01427                                          int dim, int dir)
01428 {
01429     int brfd, scalesame;
01430     int hpel = 1 - v->s.quarter_sample;
01431 
01432     n >>= hpel;
01433     if (v->s.pict_type != AV_PICTURE_TYPE_B || v->second_field || !dir) {
01434         if (dim)
01435             n = scaleforsame_y(v, i, n, dir) << hpel;
01436         else
01437             n = scaleforsame_x(v, n, dir) << hpel;
01438         return n;
01439     }
01440     brfd      = FFMIN(v->brfd, 3);
01441     scalesame = vc1_b_field_mvpred_scales[0][brfd];
01442 
01443     n = (n * scalesame >> 8) << hpel;
01444     return n;
01445 }
01446 
01447 static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */,
01448                                         int dim, int dir)
01449 {
01450     int refdist, scaleopp;
01451     int hpel = 1 - v->s.quarter_sample;
01452 
01453     n >>= hpel;
01454     if (v->s.pict_type == AV_PICTURE_TYPE_B && !v->second_field && dir == 1) {
01455         if (dim)
01456             n = scaleforopp_y(v, n, dir) << hpel;
01457         else
01458             n = scaleforopp_x(v, n) << hpel;
01459         return n;
01460     }
01461     if (v->s.pict_type != AV_PICTURE_TYPE_B)
01462         refdist = FFMIN(v->refdist, 3);
01463     else
01464         refdist = dir ? v->brfd : v->frfd;
01465     scaleopp = vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist];
01466 
01467     n = (n * scaleopp >> 8) << hpel;
01468     return n;
01469 }
01470 
01473 static inline void vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y,
01474                                int mv1, int r_x, int r_y, uint8_t* is_intra,
01475                                int pred_flag, int dir)
01476 {
01477     MpegEncContext *s = &v->s;
01478     int xy, wrap, off = 0;
01479     int16_t *A, *B, *C;
01480     int px, py;
01481     int sum;
01482     int mixedmv_pic, num_samefield = 0, num_oppfield = 0;
01483     int opposit, a_f, b_f, c_f;
01484     int16_t field_predA[2];
01485     int16_t field_predB[2];
01486     int16_t field_predC[2];
01487     int a_valid, b_valid, c_valid;
01488     int hybridmv_thresh, y_bias = 0;
01489 
01490     if (v->mv_mode == MV_PMODE_MIXED_MV ||
01491         ((v->mv_mode == MV_PMODE_INTENSITY_COMP) && (v->mv_mode2 == MV_PMODE_MIXED_MV)))
01492         mixedmv_pic = 1;
01493     else
01494         mixedmv_pic = 0;
01495     /* scale MV difference to be quad-pel */
01496     dmv_x <<= 1 - s->quarter_sample;
01497     dmv_y <<= 1 - s->quarter_sample;
01498 
01499     wrap = s->b8_stride;
01500     xy   = s->block_index[n];
01501 
01502     if (s->mb_intra) {
01503         s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy + v->blocks_off][0] = 0;
01504         s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy + v->blocks_off][1] = 0;
01505         s->current_picture.f.motion_val[1][xy + v->blocks_off][0] = 0;
01506         s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = 0;
01507         if (mv1) { /* duplicate motion data for 1-MV block */
01508             s->current_picture.f.motion_val[0][xy + 1 + v->blocks_off][0]        = 0;
01509             s->current_picture.f.motion_val[0][xy + 1 + v->blocks_off][1]        = 0;
01510             s->current_picture.f.motion_val[0][xy + wrap + v->blocks_off][0]     = 0;
01511             s->current_picture.f.motion_val[0][xy + wrap + v->blocks_off][1]     = 0;
01512             s->current_picture.f.motion_val[0][xy + wrap + 1 + v->blocks_off][0] = 0;
01513             s->current_picture.f.motion_val[0][xy + wrap + 1 + v->blocks_off][1] = 0;
01514             v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
01515             s->current_picture.f.motion_val[1][xy + 1 + v->blocks_off][0]        = 0;
01516             s->current_picture.f.motion_val[1][xy + 1 + v->blocks_off][1]        = 0;
01517             s->current_picture.f.motion_val[1][xy + wrap][0]                     = 0;
01518             s->current_picture.f.motion_val[1][xy + wrap + v->blocks_off][1]     = 0;
01519             s->current_picture.f.motion_val[1][xy + wrap + 1 + v->blocks_off][0] = 0;
01520             s->current_picture.f.motion_val[1][xy + wrap + 1 + v->blocks_off][1] = 0;
01521         }
01522         return;
01523     }
01524 
01525     C = s->current_picture.f.motion_val[dir][xy -    1 + v->blocks_off];
01526     A = s->current_picture.f.motion_val[dir][xy - wrap + v->blocks_off];
01527     if (mv1) {
01528         if (v->field_mode && mixedmv_pic)
01529             off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
01530         else
01531             off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
01532     } else {
01533         //in 4-MV mode different blocks have different B predictor position
01534         switch (n) {
01535         case 0:
01536             off = (s->mb_x > 0) ? -1 : 1;
01537             break;
01538         case 1:
01539             off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
01540             break;
01541         case 2:
01542             off = 1;
01543             break;
01544         case 3:
01545             off = -1;
01546         }
01547     }
01548     B = s->current_picture.f.motion_val[dir][xy - wrap + off + v->blocks_off];
01549 
01550     a_valid = !s->first_slice_line || (n == 2 || n == 3);
01551     b_valid = a_valid && (s->mb_width > 1);
01552     c_valid = s->mb_x || (n == 1 || n == 3);
01553     if (v->field_mode) {
01554         a_valid = a_valid && !is_intra[xy - wrap];
01555         b_valid = b_valid && !is_intra[xy - wrap + off];
01556         c_valid = c_valid && !is_intra[xy - 1];
01557     }
01558 
01559     if (a_valid) {
01560         a_f = v->mv_f[dir][xy - wrap + v->blocks_off];
01561         num_oppfield  += a_f;
01562         num_samefield += 1 - a_f;
01563         field_predA[0] = A[0];
01564         field_predA[1] = A[1];
01565     } else {
01566         field_predA[0] = field_predA[1] = 0;
01567         a_f = 0;
01568     }
01569     if (b_valid) {
01570         b_f = v->mv_f[dir][xy - wrap + off + v->blocks_off];
01571         num_oppfield  += b_f;
01572         num_samefield += 1 - b_f;
01573         field_predB[0] = B[0];
01574         field_predB[1] = B[1];
01575     } else {
01576         field_predB[0] = field_predB[1] = 0;
01577         b_f = 0;
01578     }
01579     if (c_valid) {
01580         c_f = v->mv_f[dir][xy - 1 + v->blocks_off];
01581         num_oppfield  += c_f;
01582         num_samefield += 1 - c_f;
01583         field_predC[0] = C[0];
01584         field_predC[1] = C[1];
01585     } else {
01586         field_predC[0] = field_predC[1] = 0;
01587         c_f = 0;
01588     }
01589 
01590     if (v->field_mode) {
01591         if (num_samefield <= num_oppfield)
01592             opposit = 1 - pred_flag;
01593         else
01594             opposit = pred_flag;
01595     } else
01596         opposit = 0;
01597     if (opposit) {
01598         if (a_valid && !a_f) {
01599             field_predA[0] = scaleforopp(v, field_predA[0], 0, dir);
01600             field_predA[1] = scaleforopp(v, field_predA[1], 1, dir);
01601         }
01602         if (b_valid && !b_f) {
01603             field_predB[0] = scaleforopp(v, field_predB[0], 0, dir);
01604             field_predB[1] = scaleforopp(v, field_predB[1], 1, dir);
01605         }
01606         if (c_valid && !c_f) {
01607             field_predC[0] = scaleforopp(v, field_predC[0], 0, dir);
01608             field_predC[1] = scaleforopp(v, field_predC[1], 1, dir);
01609         }
01610         v->mv_f[dir][xy + v->blocks_off] = 1;
01611         v->ref_field_type[dir] = !v->cur_field_type;
01612     } else {
01613         if (a_valid && a_f) {
01614             field_predA[0] = scaleforsame(v, n, field_predA[0], 0, dir);
01615             field_predA[1] = scaleforsame(v, n, field_predA[1], 1, dir);
01616         }
01617         if (b_valid && b_f) {
01618             field_predB[0] = scaleforsame(v, n, field_predB[0], 0, dir);
01619             field_predB[1] = scaleforsame(v, n, field_predB[1], 1, dir);
01620         }
01621         if (c_valid && c_f) {
01622             field_predC[0] = scaleforsame(v, n, field_predC[0], 0, dir);
01623             field_predC[1] = scaleforsame(v, n, field_predC[1], 1, dir);
01624         }
01625         v->mv_f[dir][xy + v->blocks_off] = 0;
01626         v->ref_field_type[dir] = v->cur_field_type;
01627     }
01628 
01629     if (a_valid) {
01630         px = field_predA[0];
01631         py = field_predA[1];
01632     } else if (c_valid) {
01633         px = field_predC[0];
01634         py = field_predC[1];
01635     } else if (b_valid) {
01636         px = field_predB[0];
01637         py = field_predB[1];
01638     } else {
01639         px = 0;
01640         py = 0;
01641     }
01642 
01643     if (num_samefield + num_oppfield > 1) {
01644         px = mid_pred(field_predA[0], field_predB[0], field_predC[0]);
01645         py = mid_pred(field_predA[1], field_predB[1], field_predC[1]);
01646     }
01647 
01648     /* Pullback MV as specified in 8.3.5.3.4 */
01649     if (!v->field_mode) {
01650         int qx, qy, X, Y;
01651         qx = (s->mb_x << 6) + ((n == 1 || n == 3) ? 32 : 0);
01652         qy = (s->mb_y << 6) + ((n == 2 || n == 3) ? 32 : 0);
01653         X  = (s->mb_width  << 6) - 4;
01654         Y  = (s->mb_height << 6) - 4;
01655         if (mv1) {
01656             if (qx + px < -60) px = -60 - qx;
01657             if (qy + py < -60) py = -60 - qy;
01658         } else {
01659             if (qx + px < -28) px = -28 - qx;
01660             if (qy + py < -28) py = -28 - qy;
01661         }
01662         if (qx + px > X) px = X - qx;
01663         if (qy + py > Y) py = Y - qy;
01664     }
01665 
01666     if (!v->field_mode || s->pict_type != AV_PICTURE_TYPE_B) {
01667         /* Calculate hybrid prediction as specified in 8.3.5.3.5 (also 10.3.5.4.3.5) */
01668         hybridmv_thresh = 32;
01669         if (a_valid && c_valid) {
01670             if (is_intra[xy - wrap])
01671                 sum = FFABS(px) + FFABS(py);
01672             else
01673                 sum = FFABS(px - field_predA[0]) + FFABS(py - field_predA[1]);
01674             if (sum > hybridmv_thresh) {
01675                 if (get_bits1(&s->gb)) {     // read HYBRIDPRED bit
01676                     px = field_predA[0];
01677                     py = field_predA[1];
01678                 } else {
01679                     px = field_predC[0];
01680                     py = field_predC[1];
01681                 }
01682             } else {
01683                 if (is_intra[xy - 1])
01684                     sum = FFABS(px) + FFABS(py);
01685                 else
01686                     sum = FFABS(px - field_predC[0]) + FFABS(py - field_predC[1]);
01687                 if (sum > hybridmv_thresh) {
01688                     if (get_bits1(&s->gb)) {
01689                         px = field_predA[0];
01690                         py = field_predA[1];
01691                     } else {
01692                         px = field_predC[0];
01693                         py = field_predC[1];
01694                     }
01695                 }
01696             }
01697         }
01698     }
01699 
01700     if (v->field_mode && !s->quarter_sample) {
01701         r_x <<= 1;
01702         r_y <<= 1;
01703     }
01704     if (v->field_mode && v->numref)
01705         r_y >>= 1;
01706     if (v->field_mode && v->cur_field_type && v->ref_field_type[dir] == 0)
01707         y_bias = 1;
01708     /* store MV using signed modulus of MV range defined in 4.11 */
01709     s->mv[dir][n][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
01710     s->mv[dir][n][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1] = ((py + dmv_y + r_y - y_bias) & ((r_y << 1) - 1)) - r_y + y_bias;
01711     if (mv1) { /* duplicate motion data for 1-MV block */
01712         s->current_picture.f.motion_val[dir][xy +    1 +     v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
01713         s->current_picture.f.motion_val[dir][xy +    1 +     v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
01714         s->current_picture.f.motion_val[dir][xy + wrap +     v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
01715         s->current_picture.f.motion_val[dir][xy + wrap +     v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
01716         s->current_picture.f.motion_val[dir][xy + wrap + 1 + v->blocks_off][0] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][0];
01717         s->current_picture.f.motion_val[dir][xy + wrap + 1 + v->blocks_off][1] = s->current_picture.f.motion_val[dir][xy + v->blocks_off][1];
01718         v->mv_f[dir][xy +    1 + v->blocks_off] = v->mv_f[dir][xy +            v->blocks_off];
01719         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];
01720     }
01721 }
01722 
01725 static inline void vc1_pred_mv_intfr(VC1Context *v, int n, int dmv_x, int dmv_y,
01726                                      int mvn, int r_x, int r_y, uint8_t* is_intra)
01727 {
01728     MpegEncContext *s = &v->s;
01729     int xy, wrap, off = 0;
01730     int A[2], B[2], C[2];
01731     int px, py;
01732     int a_valid = 0, b_valid = 0, c_valid = 0;
01733     int field_a, field_b, field_c; // 0: same, 1: opposit
01734     int total_valid, num_samefield, num_oppfield;
01735     int pos_c, pos_b, n_adj;
01736 
01737     wrap = s->b8_stride;
01738     xy = s->block_index[n];
01739 
01740     if (s->mb_intra) {
01741         s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = 0;
01742         s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = 0;
01743         s->current_picture.f.motion_val[1][xy][0] = 0;
01744         s->current_picture.f.motion_val[1][xy][1] = 0;
01745         if (mvn == 1) { /* duplicate motion data for 1-MV block */
01746             s->current_picture.f.motion_val[0][xy + 1][0]        = 0;
01747             s->current_picture.f.motion_val[0][xy + 1][1]        = 0;
01748             s->current_picture.f.motion_val[0][xy + wrap][0]     = 0;
01749             s->current_picture.f.motion_val[0][xy + wrap][1]     = 0;
01750             s->current_picture.f.motion_val[0][xy + wrap + 1][0] = 0;
01751             s->current_picture.f.motion_val[0][xy + wrap + 1][1] = 0;
01752             v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0;
01753             s->current_picture.f.motion_val[1][xy + 1][0]        = 0;
01754             s->current_picture.f.motion_val[1][xy + 1][1]        = 0;
01755             s->current_picture.f.motion_val[1][xy + wrap][0]     = 0;
01756             s->current_picture.f.motion_val[1][xy + wrap][1]     = 0;
01757             s->current_picture.f.motion_val[1][xy + wrap + 1][0] = 0;
01758             s->current_picture.f.motion_val[1][xy + wrap + 1][1] = 0;
01759         }
01760         return;
01761     }
01762 
01763     off = ((n == 0) || (n == 1)) ? 1 : -1;
01764     /* predict A */
01765     if (s->mb_x || (n == 1) || (n == 3)) {
01766         if ((v->blk_mv_type[xy]) // current block (MB) has a field MV
01767             || (!v->blk_mv_type[xy] && !v->blk_mv_type[xy - 1])) { // or both have frame MV
01768             A[0] = s->current_picture.f.motion_val[0][xy - 1][0];
01769             A[1] = s->current_picture.f.motion_val[0][xy - 1][1];
01770             a_valid = 1;
01771         } else { // current block has frame mv and cand. has field MV (so average)
01772             A[0] = (s->current_picture.f.motion_val[0][xy - 1][0]
01773                     + s->current_picture.f.motion_val[0][xy - 1 + off * wrap][0] + 1) >> 1;
01774             A[1] = (s->current_picture.f.motion_val[0][xy - 1][1]
01775                     + s->current_picture.f.motion_val[0][xy - 1 + off * wrap][1] + 1) >> 1;
01776             a_valid = 1;
01777         }
01778         if (!(n & 1) && v->is_intra[s->mb_x - 1]) {
01779             a_valid = 0;
01780             A[0] = A[1] = 0;
01781         }
01782     } else
01783         A[0] = A[1] = 0;
01784     /* Predict B and C */
01785     B[0] = B[1] = C[0] = C[1] = 0;
01786     if (n == 0 || n == 1 || v->blk_mv_type[xy]) {
01787         if (!s->first_slice_line) {
01788             if (!v->is_intra[s->mb_x - s->mb_stride]) {
01789                 b_valid = 1;
01790                 n_adj   = n | 2;
01791                 pos_b   = s->block_index[n_adj] - 2 * wrap;
01792                 if (v->blk_mv_type[pos_b] && v->blk_mv_type[xy]) {
01793                     n_adj = (n & 2) | (n & 1);
01794                 }
01795                 B[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap][0];
01796                 B[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap][1];
01797                 if (v->blk_mv_type[pos_b] && !v->blk_mv_type[xy]) {
01798                     B[0] = (B[0] + s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap][0] + 1) >> 1;
01799                     B[1] = (B[1] + s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap][1] + 1) >> 1;
01800                 }
01801             }
01802             if (s->mb_width > 1) {
01803                 if (!v->is_intra[s->mb_x - s->mb_stride + 1]) {
01804                     c_valid = 1;
01805                     n_adj   = 2;
01806                     pos_c   = s->block_index[2] - 2 * wrap + 2;
01807                     if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
01808                         n_adj = n & 2;
01809                     }
01810                     C[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap + 2][0];
01811                     C[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap + 2][1];
01812                     if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
01813                         C[0] = (1 + C[0] + (s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap + 2][0])) >> 1;
01814                         C[1] = (1 + C[1] + (s->current_picture.f.motion_val[0][s->block_index[n_adj ^ 2] - 2 * wrap + 2][1])) >> 1;
01815                     }
01816                     if (s->mb_x == s->mb_width - 1) {
01817                         if (!v->is_intra[s->mb_x - s->mb_stride - 1]) {
01818                             c_valid = 1;
01819                             n_adj   = 3;
01820                             pos_c   = s->block_index[3] - 2 * wrap - 2;
01821                             if (v->blk_mv_type[pos_c] && v->blk_mv_type[xy]) {
01822                                 n_adj = n | 1;
01823                             }
01824                             C[0] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap - 2][0];
01825                             C[1] = s->current_picture.f.motion_val[0][s->block_index[n_adj] - 2 * wrap - 2][1];
01826                             if (v->blk_mv_type[pos_c] && !v->blk_mv_type[xy]) {
01827                                 C[0] = (1 + C[0] + s->current_picture.f.motion_val[0][s->block_index[1] - 2 * wrap - 2][0]) >> 1;
01828                                 C[1] = (1 + C[1] + s->current_picture.f.motion_val[0][s->block_index[1] - 2 * wrap - 2][1]) >> 1;
01829                             }
01830                         } else
01831                             c_valid = 0;
01832                     }
01833                 }
01834             }
01835         }
01836     } else {
01837         pos_b   = s->block_index[1];
01838         b_valid = 1;
01839         B[0]    = s->current_picture.f.motion_val[0][pos_b][0];
01840         B[1]    = s->current_picture.f.motion_val[0][pos_b][1];
01841         pos_c   = s->block_index[0];
01842         c_valid = 1;
01843         C[0]    = s->current_picture.f.motion_val[0][pos_c][0];
01844         C[1]    = s->current_picture.f.motion_val[0][pos_c][1];
01845     }
01846 
01847     total_valid = a_valid + b_valid + c_valid;
01848     // check if predictor A is out of bounds
01849     if (!s->mb_x && !(n == 1 || n == 3)) {
01850         A[0] = A[1] = 0;
01851     }
01852     // check if predictor B is out of bounds
01853     if ((s->first_slice_line && v->blk_mv_type[xy]) || (s->first_slice_line && !(n & 2))) {
01854         B[0] = B[1] = C[0] = C[1] = 0;
01855     }
01856     if (!v->blk_mv_type[xy]) {
01857         if (s->mb_width == 1) {
01858             px = B[0];
01859             py = B[1];
01860         } else {
01861             if (total_valid >= 2) {
01862                 px = mid_pred(A[0], B[0], C[0]);
01863                 py = mid_pred(A[1], B[1], C[1]);
01864             } else if (total_valid) {
01865                 if (a_valid) { px = A[0]; py = A[1]; }
01866                 if (b_valid) { px = B[0]; py = B[1]; }
01867                 if (c_valid) { px = C[0]; py = C[1]; }
01868             } else
01869                 px = py = 0;
01870         }
01871     } else {
01872         if (a_valid)
01873             field_a = (A[1] & 4) ? 1 : 0;
01874         else
01875             field_a = 0;
01876         if (b_valid)
01877             field_b = (B[1] & 4) ? 1 : 0;
01878         else
01879             field_b = 0;
01880         if (c_valid)
01881             field_c = (C[1] & 4) ? 1 : 0;
01882         else
01883             field_c = 0;
01884 
01885         num_oppfield  = field_a + field_b + field_c;
01886         num_samefield = total_valid - num_oppfield;
01887         if (total_valid == 3) {
01888             if ((num_samefield == 3) || (num_oppfield == 3)) {
01889                 px = mid_pred(A[0], B[0], C[0]);
01890                 py = mid_pred(A[1], B[1], C[1]);
01891             } else if (num_samefield >= num_oppfield) {
01892                 /* take one MV from same field set depending on priority
01893                 the check for B may not be necessary */
01894                 px = !field_a ? A[0] : B[0];
01895                 py = !field_a ? A[1] : B[1];
01896             } else {
01897                 px =  field_a ? A[0] : B[0];
01898                 py =  field_a ? A[1] : B[1];
01899             }
01900         } else if (total_valid == 2) {
01901             if (num_samefield >= num_oppfield) {
01902                 if (!field_a && a_valid) {
01903                     px = A[0];
01904                     py = A[1];
01905                 } else if (!field_b && b_valid) {
01906                     px = B[0];
01907                     py = B[1];
01908                 } else if (c_valid) {
01909                     px = C[0];
01910                     py = C[1];
01911                 } else px = py = 0;
01912             } else {
01913                 if (field_a && a_valid) {
01914                     px = A[0];
01915                     py = A[1];
01916                 } else if (field_b && b_valid) {
01917                     px = B[0];
01918                     py = B[1];
01919                 } else if (c_valid) {
01920                     px = C[0];
01921                     py = C[1];
01922                 }
01923             }
01924         } else if (total_valid == 1) {
01925             px = (a_valid) ? A[0] : ((b_valid) ? B[0] : C[0]);
01926             py = (a_valid) ? A[1] : ((b_valid) ? B[1] : C[1]);
01927         } else
01928             px = py = 0;
01929     }
01930 
01931     /* store MV using signed modulus of MV range defined in 4.11 */
01932     s->mv[0][n][0] = s->current_picture.f.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
01933     s->mv[0][n][1] = s->current_picture.f.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
01934     if (mvn == 1) { /* duplicate motion data for 1-MV block */
01935         s->current_picture.f.motion_val[0][xy +    1    ][0] = s->current_picture.f.motion_val[0][xy][0];
01936         s->current_picture.f.motion_val[0][xy +    1    ][1] = s->current_picture.f.motion_val[0][xy][1];
01937         s->current_picture.f.motion_val[0][xy + wrap    ][0] = s->current_picture.f.motion_val[0][xy][0];
01938         s->current_picture.f.motion_val[0][xy + wrap    ][1] = s->current_picture.f.motion_val[0][xy][1];
01939         s->current_picture.f.motion_val[0][xy + wrap + 1][0] = s->current_picture.f.motion_val[0][xy][0];
01940         s->current_picture.f.motion_val[0][xy + wrap + 1][1] = s->current_picture.f.motion_val[0][xy][1];
01941     } else if (mvn == 2) { /* duplicate motion data for 2-Field MV block */
01942         s->current_picture.f.motion_val[0][xy + 1][0] = s->current_picture.f.motion_val[0][xy][0];
01943         s->current_picture.f.motion_val[0][xy + 1][1] = s->current_picture.f.motion_val[0][xy][1];
01944         s->mv[0][n + 1][0] = s->mv[0][n][0];
01945         s->mv[0][n + 1][1] = s->mv[0][n][1];
01946     }
01947 }
01948 
01951 static void vc1_interp_mc(VC1Context *v)
01952 {
01953     MpegEncContext *s = &v->s;
01954     DSPContext *dsp = &v->s.dsp;
01955     uint8_t *srcY, *srcU, *srcV;
01956     int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
01957     int off, off_uv;
01958     int v_edge_pos = s->v_edge_pos >> v->field_mode;
01959 
01960     if (!v->field_mode && !v->s.next_picture.f.data[0])
01961         return;
01962 
01963     mx   = s->mv[1][0][0];
01964     my   = s->mv[1][0][1];
01965     uvmx = (mx + ((mx & 3) == 3)) >> 1;
01966     uvmy = (my + ((my & 3) == 3)) >> 1;
01967     if (v->field_mode) {
01968         if (v->cur_field_type != v->ref_field_type[1])
01969             my   = my   - 2 + 4 * v->cur_field_type;
01970             uvmy = uvmy - 2 + 4 * v->cur_field_type;
01971     }
01972     if (v->fastuvmc) {
01973         uvmx = uvmx + ((uvmx < 0) ? -(uvmx & 1) : (uvmx & 1));
01974         uvmy = uvmy + ((uvmy < 0) ? -(uvmy & 1) : (uvmy & 1));
01975     }
01976     srcY = s->next_picture.f.data[0];
01977     srcU = s->next_picture.f.data[1];
01978     srcV = s->next_picture.f.data[2];
01979 
01980     src_x   = s->mb_x * 16 + (mx   >> 2);
01981     src_y   = s->mb_y * 16 + (my   >> 2);
01982     uvsrc_x = s->mb_x *  8 + (uvmx >> 2);
01983     uvsrc_y = s->mb_y *  8 + (uvmy >> 2);
01984 
01985     if (v->profile != PROFILE_ADVANCED) {
01986         src_x   = av_clip(  src_x, -16, s->mb_width  * 16);
01987         src_y   = av_clip(  src_y, -16, s->mb_height * 16);
01988         uvsrc_x = av_clip(uvsrc_x,  -8, s->mb_width  *  8);
01989         uvsrc_y = av_clip(uvsrc_y,  -8, s->mb_height *  8);
01990     } else {
01991         src_x   = av_clip(  src_x, -17, s->avctx->coded_width);
01992         src_y   = av_clip(  src_y, -18, s->avctx->coded_height + 1);
01993         uvsrc_x = av_clip(uvsrc_x,  -8, s->avctx->coded_width  >> 1);
01994         uvsrc_y = av_clip(uvsrc_y,  -8, s->avctx->coded_height >> 1);
01995     }
01996 
01997     srcY += src_y   * s->linesize   + src_x;
01998     srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
01999     srcV += uvsrc_y * s->uvlinesize + uvsrc_x;
02000 
02001     if (v->field_mode && v->ref_field_type[1]) {
02002         srcY += s->current_picture_ptr->f.linesize[0];
02003         srcU += s->current_picture_ptr->f.linesize[1];
02004         srcV += s->current_picture_ptr->f.linesize[2];
02005     }
02006 
02007     /* for grayscale we should not try to read from unknown area */
02008     if (s->flags & CODEC_FLAG_GRAY) {
02009         srcU = s->edge_emu_buffer + 18 * s->linesize;
02010         srcV = s->edge_emu_buffer + 18 * s->linesize;
02011     }
02012 
02013     if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22
02014         || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 16 - s->mspel * 3
02015         || (unsigned)(src_y - s->mspel) > v_edge_pos    - (my & 3) - 16 - s->mspel * 3) {
02016         uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize;
02017 
02018         srcY -= s->mspel * (1 + s->linesize);
02019         s->dsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize,
02020                                 17 + s->mspel * 2, 17 + s->mspel * 2,
02021                                 src_x - s->mspel, src_y - s->mspel,
02022                                 s->h_edge_pos, v_edge_pos);
02023         srcY = s->edge_emu_buffer;
02024         s->dsp.emulated_edge_mc(uvbuf     , srcU, s->uvlinesize, 8 + 1, 8 + 1,
02025                                 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
02026         s->dsp.emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8 + 1, 8 + 1,
02027                                 uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, v_edge_pos >> 1);
02028         srcU = uvbuf;
02029         srcV = uvbuf + 16;
02030         /* if we deal with range reduction we need to scale source blocks */
02031         if (v->rangeredfrm) {
02032             int i, j;
02033             uint8_t *src, *src2;
02034 
02035             src = srcY;
02036             for (j = 0; j < 17 + s->mspel * 2; j++) {
02037                 for (i = 0; i < 17 + s->mspel * 2; i++)
02038                     src[i] = ((src[i] - 128) >> 1) + 128;
02039                 src += s->linesize;
02040             }
02041             src = srcU;
02042             src2 = srcV;
02043             for (j = 0; j < 9; j++) {
02044                 for (i = 0; i < 9; i++) {
02045                     src[i]  = ((src[i]  - 128) >> 1) + 128;
02046                     src2[i] = ((src2[i] - 128) >> 1) + 128;
02047                 }
02048                 src  += s->uvlinesize;
02049                 src2 += s->uvlinesize;
02050             }
02051         }
02052         srcY += s->mspel * (1 + s->linesize);
02053     }
02054 
02055     if (v->field_mode && v->cur_field_type) {
02056         off    = s->current_picture_ptr->f.linesize[0];
02057         off_uv = s->current_picture_ptr->f.linesize[1];
02058     } else {
02059         off    = 0;
02060         off_uv = 0;
02061     }
02062 
02063     if (s->mspel) {
02064         dxy = ((my & 3) << 2) | (mx & 3);
02065         v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off    , srcY    , s->linesize, v->rnd);
02066         v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8, srcY + 8, s->linesize, v->rnd);
02067         srcY += s->linesize * 8;
02068         v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize    , srcY    , s->linesize, v->rnd);
02069         v->vc1dsp.avg_vc1_mspel_pixels_tab[dxy](s->dest[0] + off + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
02070     } else { // hpel mc
02071         dxy = (my & 2) | ((mx & 2) >> 1);
02072 
02073         if (!v->rnd)
02074             dsp->avg_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
02075         else
02076             dsp->avg_no_rnd_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16);
02077     }
02078 
02079     if (s->flags & CODEC_FLAG_GRAY) return;
02080     /* Chroma MC always uses qpel blilinear */
02081     uvmx = (uvmx & 3) << 1;
02082     uvmy = (uvmy & 3) << 1;
02083     if (!v->rnd) {
02084         dsp->avg_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
02085         dsp->avg_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
02086     } else {
02087         v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy);
02088         v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy);
02089     }
02090 }
02091 
02092 static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
02093 {
02094     int n = bfrac;
02095 
02096 #if B_FRACTION_DEN==256
02097     if (inv)
02098         n -= 256;
02099     if (!qs)
02100         return 2 * ((value * n + 255) >> 9);
02101     return (value * n + 128) >> 8;
02102 #else
02103     if (inv)
02104         n -= B_FRACTION_DEN;
02105     if (!qs)
02106         return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
02107     return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
02108 #endif
02109 }
02110 
02111 static av_always_inline int scale_mv_intfi(int value, int bfrac, int inv,
02112                                            int qs, int qs_last)
02113 {
02114     int n = bfrac;
02115 
02116     if (inv)
02117         n -= 256;
02118     n <<= !qs_last;
02119     if (!qs)
02120         return (value * n + 255) >> 9;
02121     else
02122         return (value * n + 128) >> 8;
02123 }
02124 
02127 static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
02128                             int direct, int mode)
02129 {
02130     if (v->use_ic) {
02131         v->mv_mode2 = v->mv_mode;
02132         v->mv_mode  = MV_PMODE_INTENSITY_COMP;
02133     }
02134     if (direct) {
02135         vc1_mc_1mv(v, 0);
02136         vc1_interp_mc(v);
02137         if (v->use_ic)
02138             v->mv_mode = v->mv_mode2;
02139         return;
02140     }
02141     if (mode == BMV_TYPE_INTERPOLATED) {
02142         vc1_mc_1mv(v, 0);
02143         vc1_interp_mc(v);
02144         if (v->use_ic)
02145             v->mv_mode = v->mv_mode2;
02146         return;
02147     }
02148 
02149     if (v->use_ic && (mode == BMV_TYPE_BACKWARD))
02150         v->mv_mode = v->mv_mode2;
02151     vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
02152     if (v->use_ic)
02153         v->mv_mode = v->mv_mode2;
02154 }
02155 
02156 static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2],
02157                                  int direct, int mvtype)
02158 {
02159     MpegEncContext *s = &v->s;
02160     int xy, wrap, off = 0;
02161     int16_t *A, *B, *C;
02162     int px, py;
02163     int sum;
02164     int r_x, r_y;
02165     const uint8_t *is_intra = v->mb_type[0];
02166 
02167     r_x = v->range_x;
02168     r_y = v->range_y;
02169     /* scale MV difference to be quad-pel */
02170     dmv_x[0] <<= 1 - s->quarter_sample;
02171     dmv_y[0] <<= 1 - s->quarter_sample;
02172     dmv_x[1] <<= 1 - s->quarter_sample;
02173     dmv_y[1] <<= 1 - s->quarter_sample;
02174 
02175     wrap = s->b8_stride;
02176     xy = s->block_index[0];
02177 
02178     if (s->mb_intra) {
02179         s->current_picture.f.motion_val[0][xy + v->blocks_off][0] =
02180         s->current_picture.f.motion_val[0][xy + v->blocks_off][1] =
02181         s->current_picture.f.motion_val[1][xy + v->blocks_off][0] =
02182         s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = 0;
02183         return;
02184     }
02185     if (!v->field_mode) {
02186         s->mv[0][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
02187         s->mv[0][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
02188         s->mv[1][0][0] = scale_mv(s->next_picture.f.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
02189         s->mv[1][0][1] = scale_mv(s->next_picture.f.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
02190 
02191         /* Pullback predicted motion vectors as specified in 8.4.5.4 */
02192         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));
02193         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));
02194         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));
02195         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));
02196     }
02197     if (direct) {
02198         s->current_picture.f.motion_val[0][xy + v->blocks_off][0] = s->mv[0][0][0];
02199         s->current_picture.f.motion_val[0][xy + v->blocks_off][1] = s->mv[0][0][1];
02200         s->current_picture.f.motion_val[1][xy + v->blocks_off][0] = s->mv[1][0][0];
02201         s->current_picture.f.motion_val[1][xy + v->blocks_off][1] = s->mv[1][0][1];
02202         return;
02203     }
02204 
02205     if ((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
02206         C   = s->current_picture.f.motion_val[0][xy - 2];
02207         A   = s->current_picture.f.motion_val[0][xy - wrap * 2];
02208         off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
02209         B   = s->current_picture.f.motion_val[0][xy - wrap * 2 + off];
02210 
02211         if (!s->mb_x) C[0] = C[1] = 0;
02212         if (!s->first_slice_line) { // predictor A is not out of bounds
02213             if (s->mb_width == 1) {
02214                 px = A[0];
02215                 py = A[1];
02216             } else {
02217                 px = mid_pred(A[0], B[0], C[0]);
02218                 py = mid_pred(A[1], B[1], C[1]);
02219             }
02220         } else if (s->mb_x) { // predictor C is not out of bounds
02221             px = C[0];
02222             py = C[1];
02223         } else {
02224             px = py = 0;
02225         }
02226         /* Pullback MV as specified in 8.3.5.3.4 */
02227         {
02228             int qx, qy, X, Y;
02229             if (v->profile < PROFILE_ADVANCED) {
02230                 qx = (s->mb_x << 5);
02231                 qy = (s->mb_y << 5);
02232                 X  = (s->mb_width  << 5) - 4;
02233                 Y  = (s->mb_height << 5) - 4;
02234                 if (qx + px < -28) px = -28 - qx;
02235                 if (qy + py < -28) py = -28 - qy;
02236                 if (qx + px > X) px = X - qx;
02237                 if (qy + py > Y) py = Y - qy;
02238             } else {
02239                 qx = (s->mb_x << 6);
02240                 qy = (s->mb_y << 6);
02241                 X  = (s->mb_width  << 6) - 4;
02242                 Y  = (s->mb_height << 6) - 4;
02243                 if (qx + px < -60) px = -60 - qx;
02244                 if (qy + py < -60) py = -60 - qy;
02245                 if (qx + px > X) px = X - qx;
02246                 if (qy + py > Y) py = Y - qy;
02247             }
02248         }
02249         /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
02250         if (0 && !s->first_slice_line && s->mb_x) {
02251             if (is_intra[xy - wrap])
02252                 sum = FFABS(px) + FFABS(py);
02253             else
02254                 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
02255             if (sum > 32) {
02256                 if (get_bits1(&s->gb)) {
02257                     px = A[0];
02258                     py = A[1];
02259                 } else {
02260                     px = C[0];
02261                     py = C[1];
02262                 }
02263             } else {
02264                 if (is_intra[xy - 2])
02265                     sum = FFABS(px) + FFABS(py);
02266                 else
02267                     sum = FFABS(px - C[0]) + FFABS(py - C[1]);
02268                 if (sum > 32) {
02269                     if (get_bits1(&s->gb)) {
02270                         px = A[0];
02271                         py = A[1];
02272                     } else {
02273                         px = C[0];
02274                         py = C[1];
02275                     }
02276                 }
02277             }
02278         }
02279         /* store MV using signed modulus of MV range defined in 4.11 */
02280         s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
02281         s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
02282     }
02283     if ((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
02284         C   = s->current_picture.f.motion_val[1][xy - 2];
02285         A   = s->current_picture.f.motion_val[1][xy - wrap * 2];
02286         off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
02287         B   = s->current_picture.f.motion_val[1][xy - wrap * 2 + off];
02288 
02289         if (!s->mb_x)
02290             C[0] = C[1] = 0;
02291         if (!s->first_slice_line) { // predictor A is not out of bounds
02292             if (s->mb_width == 1) {
02293                 px = A[0];
02294                 py = A[1];
02295             } else {
02296                 px = mid_pred(A[0], B[0], C[0]);
02297                 py = mid_pred(A[1], B[1], C[1]);
02298             }
02299         } else if (s->mb_x) { // predictor C is not out of bounds
02300             px = C[0];
02301             py = C[1];
02302         } else {
02303             px = py = 0;
02304         }
02305         /* Pullback MV as specified in 8.3.5.3.4 */
02306         {
02307             int qx, qy, X, Y;
02308             if (v->profile < PROFILE_ADVANCED) {
02309                 qx = (s->mb_x << 5);
02310                 qy = (s->mb_y << 5);
02311                 X  = (s->mb_width  << 5) - 4;
02312                 Y  = (s->mb_height << 5) - 4;
02313                 if (qx + px < -28) px = -28 - qx;
02314                 if (qy + py < -28) py = -28 - qy;
02315                 if (qx + px > X) px = X - qx;
02316                 if (qy + py > Y) py = Y - qy;
02317             } else {
02318                 qx = (s->mb_x << 6);
02319                 qy = (s->mb_y << 6);
02320                 X  = (s->mb_width  << 6) - 4;
02321                 Y  = (s->mb_height << 6) - 4;
02322                 if (qx + px < -60) px = -60 - qx;
02323                 if (qy + py < -60) py = -60 - qy;
02324                 if (qx + px > X) px = X - qx;
02325                 if (qy + py > Y) py = Y - qy;
02326             }
02327         }
02328         /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
02329         if (0 && !s->first_slice_line && s->mb_x) {
02330             if (is_intra[xy - wrap])
02331                 sum = FFABS(px) + FFABS(py);
02332             else
02333                 sum = FFABS(px - A[0]) + FFABS(py - A[1]);
02334             if (sum > 32) {
02335                 if (get_bits1(&s->gb)) {
02336                     px = A[0];
02337                     py = A[1];
02338                 } else {
02339                     px = C[0];
02340                     py = C[1];
02341                 }
02342             } else {
02343                 if (is_intra[xy - 2])
02344                     sum = FFABS(px) + FFABS(py);
02345                 else
02346                     sum = FFABS(px - C[0]) + FFABS(py - C[1]);
02347                 if (sum > 32) {
02348                     if (get_bits1(&s->gb)) {
02349                         px = A[0];
02350                         py = A[1];
02351                     } else {
02352                         px = C[0];
02353                         py = C[1];
02354                     }
02355                 }
02356             }
02357         }
02358         /* store MV using signed modulus of MV range defined in 4.11 */
02359 
02360         s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
02361         s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
02362     }
02363     s->current_picture.f.motion_val[0][xy][0] = s->mv[0][0][0];
02364     s->current_picture.f.motion_val[0][xy][1] = s->mv[0][0][1];
02365     s->current_picture.f.motion_val[1][xy][0] = s->mv[1][0][0];
02366     s->current_picture.f.motion_val[1][xy][1] = s->mv[1][0][1];
02367 }
02368 
02369 static inline void vc1_pred_b_mv_intfi(VC1Context *v, int n, int *dmv_x, int *dmv_y, int mv1, int *pred_flag)
02370 {
02371     int dir = (v->bmvtype == BMV_TYPE_BACKWARD) ? 1 : 0;
02372     MpegEncContext *s = &v->s;
02373     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
02374 
02375     if (v->bmvtype == BMV_TYPE_DIRECT) {
02376         int total_opp, k, f;
02377         if (s->next_picture.f.mb_type[mb_pos + v->mb_off] != MB_TYPE_INTRA) {
02378             s->mv[0][0][0] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
02379                                             v->bfraction, 0, s->quarter_sample, v->qs_last);
02380             s->mv[0][0][1] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
02381                                             v->bfraction, 0, s->quarter_sample, v->qs_last);
02382             s->mv[1][0][0] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0],
02383                                             v->bfraction, 1, s->quarter_sample, v->qs_last);
02384             s->mv[1][0][1] = scale_mv_intfi(s->next_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1],
02385                                             v->bfraction, 1, s->quarter_sample, v->qs_last);
02386 
02387             total_opp = v->mv_f_next[0][s->block_index[0] + v->blocks_off]
02388                       + v->mv_f_next[0][s->block_index[1] + v->blocks_off]
02389                       + v->mv_f_next[0][s->block_index[2] + v->blocks_off]
02390                       + v->mv_f_next[0][s->block_index[3] + v->blocks_off];
02391             f = (total_opp > 2) ? 1 : 0;
02392         } else {
02393             s->mv[0][0][0] = s->mv[0][0][1] = 0;
02394             s->mv[1][0][0] = s->mv[1][0][1] = 0;
02395             f = 0;
02396         }
02397         v->ref_field_type[0] = v->ref_field_type[1] = v->cur_field_type ^ f;
02398         for (k = 0; k < 4; k++) {
02399             s->current_picture.f.motion_val[0][s->block_index[k] + v->blocks_off][0] = s->mv[0][0][0];
02400             s->current_picture.f.motion_val[0][s->block_index[k] + v->blocks_off][1] = s->mv[0][0][1];
02401             s->current_picture.f.motion_val[1][s->block_index[k] + v->blocks_off][0] = s->mv[1][0][0];
02402             s->current_picture.f.motion_val[1][s->block_index[k] + v->blocks_off][1] = s->mv[1][0][1];
02403             v->mv_f[0][s->block_index[k] + v->blocks_off] = f;
02404             v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
02405         }
02406         return;
02407     }
02408     if (v->bmvtype == BMV_TYPE_INTERPOLATED) {
02409         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);
02410         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);
02411         return;
02412     }
02413     if (dir) { // backward
02414         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);
02415         if (n == 3 || mv1) {
02416             vc1_pred_mv(v, 0, dmv_x[0], dmv_y[0],   1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
02417         }
02418     } else { // forward
02419         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);
02420         if (n == 3 || mv1) {
02421             vc1_pred_mv(v, 0, dmv_x[1], dmv_y[1],   1, v->range_x, v->range_y, v->mb_type[0], 0, 1);
02422         }
02423     }
02424 }
02425 
02435 static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
02436                                 int16_t **dc_val_ptr, int *dir_ptr)
02437 {
02438     int a, b, c, wrap, pred, scale;
02439     int16_t *dc_val;
02440     static const uint16_t dcpred[32] = {
02441         -1, 1024,  512,  341,  256,  205,  171,  146,  128,
02442              114,  102,   93,   85,   79,   73,   68,   64,
02443               60,   57,   54,   51,   49,   47,   45,   43,
02444               41,   39,   38,   37,   35,   34,   33
02445     };
02446 
02447     /* find prediction - wmv3_dc_scale always used here in fact */
02448     if (n < 4) scale = s->y_dc_scale;
02449     else       scale = s->c_dc_scale;
02450 
02451     wrap   = s->block_wrap[n];
02452     dc_val = s->dc_val[0] + s->block_index[n];
02453 
02454     /* B A
02455      * C X
02456      */
02457     c = dc_val[ - 1];
02458     b = dc_val[ - 1 - wrap];
02459     a = dc_val[ - wrap];
02460 
02461     if (pq < 9 || !overlap) {
02462         /* Set outer values */
02463         if (s->first_slice_line && (n != 2 && n != 3))
02464             b = a = dcpred[scale];
02465         if (s->mb_x == 0 && (n != 1 && n != 3))
02466             b = c = dcpred[scale];
02467     } else {
02468         /* Set outer values */
02469         if (s->first_slice_line && (n != 2 && n != 3))
02470             b = a = 0;
02471         if (s->mb_x == 0 && (n != 1 && n != 3))
02472             b = c = 0;
02473     }
02474 
02475     if (abs(a - b) <= abs(b - c)) {
02476         pred     = c;
02477         *dir_ptr = 1; // left
02478     } else {
02479         pred     = a;
02480         *dir_ptr = 0; // top
02481     }
02482 
02483     /* update predictor */
02484     *dc_val_ptr = &dc_val[0];
02485     return pred;
02486 }
02487 
02488 
02500 static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
02501                               int a_avail, int c_avail,
02502                               int16_t **dc_val_ptr, int *dir_ptr)
02503 {
02504     int a, b, c, wrap, pred;
02505     int16_t *dc_val;
02506     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
02507     int q1, q2 = 0;
02508 
02509     wrap = s->block_wrap[n];
02510     dc_val = s->dc_val[0] + s->block_index[n];
02511 
02512     /* B A
02513      * C X
02514      */
02515     c = dc_val[ - 1];
02516     b = dc_val[ - 1 - wrap];
02517     a = dc_val[ - wrap];
02518     /* scale predictors if needed */
02519     q1 = s->current_picture.f.qscale_table[mb_pos];
02520     if (c_avail && (n != 1 && n != 3)) {
02521         q2 = s->current_picture.f.qscale_table[mb_pos - 1];
02522         if (q2 && q2 != q1)
02523             c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
02524     }
02525     if (a_avail && (n != 2 && n != 3)) {
02526         q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
02527         if (q2 && q2 != q1)
02528             a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
02529     }
02530     if (a_avail && c_avail && (n != 3)) {
02531         int off = mb_pos;
02532         if (n != 1)
02533             off--;
02534         if (n != 2)
02535             off -= s->mb_stride;
02536         q2 = s->current_picture.f.qscale_table[off];
02537         if (q2 && q2 != q1)
02538             b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
02539     }
02540 
02541     if (a_avail && c_avail) {
02542         if (abs(a - b) <= abs(b - c)) {
02543             pred     = c;
02544             *dir_ptr = 1; // left
02545         } else {
02546             pred     = a;
02547             *dir_ptr = 0; // top
02548         }
02549     } else if (a_avail) {
02550         pred     = a;
02551         *dir_ptr = 0; // top
02552     } else if (c_avail) {
02553         pred     = c;
02554         *dir_ptr = 1; // left
02555     } else {
02556         pred     = 0;
02557         *dir_ptr = 1; // left
02558     }
02559 
02560     /* update predictor */
02561     *dc_val_ptr = &dc_val[0];
02562     return pred;
02563 }
02564  // Block group
02566 
02573 static inline int vc1_coded_block_pred(MpegEncContext * s, int n,
02574                                        uint8_t **coded_block_ptr)
02575 {
02576     int xy, wrap, pred, a, b, c;
02577 
02578     xy   = s->block_index[n];
02579     wrap = s->b8_stride;
02580 
02581     /* B C
02582      * A X
02583      */
02584     a = s->coded_block[xy - 1       ];
02585     b = s->coded_block[xy - 1 - wrap];
02586     c = s->coded_block[xy     - wrap];
02587 
02588     if (b == c) {
02589         pred = a;
02590     } else {
02591         pred = c;
02592     }
02593 
02594     /* store value */
02595     *coded_block_ptr = &s->coded_block[xy];
02596 
02597     return pred;
02598 }
02599 
02609 static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
02610                                 int *value, int codingset)
02611 {
02612     GetBitContext *gb = &v->s.gb;
02613     int index, escape, run = 0, level = 0, lst = 0;
02614 
02615     index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
02616     if (index != vc1_ac_sizes[codingset] - 1) {
02617         run   = vc1_index_decode_table[codingset][index][0];
02618         level = vc1_index_decode_table[codingset][index][1];
02619         lst   = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0;
02620         if (get_bits1(gb))
02621             level = -level;
02622     } else {
02623         escape = decode210(gb);
02624         if (escape != 2) {
02625             index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
02626             run   = vc1_index_decode_table[codingset][index][0];
02627             level = vc1_index_decode_table[codingset][index][1];
02628             lst   = index >= vc1_last_decode_table[codingset];
02629             if (escape == 0) {
02630                 if (lst)
02631                     level += vc1_last_delta_level_table[codingset][run];
02632                 else
02633                     level += vc1_delta_level_table[codingset][run];
02634             } else {
02635                 if (lst)
02636                     run += vc1_last_delta_run_table[codingset][level] + 1;
02637                 else
02638                     run += vc1_delta_run_table[codingset][level] + 1;
02639             }
02640             if (get_bits1(gb))
02641                 level = -level;
02642         } else {
02643             int sign;
02644             lst = get_bits1(gb);
02645             if (v->s.esc3_level_length == 0) {
02646                 if (v->pq < 8 || v->dquantfrm) { // table 59
02647                     v->s.esc3_level_length = get_bits(gb, 3);
02648                     if (!v->s.esc3_level_length)
02649                         v->s.esc3_level_length = get_bits(gb, 2) + 8;
02650                 } else { // table 60
02651                     v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
02652                 }
02653                 v->s.esc3_run_length = 3 + get_bits(gb, 2);
02654             }
02655             run   = get_bits(gb, v->s.esc3_run_length);
02656             sign  = get_bits1(gb);
02657             level = get_bits(gb, v->s.esc3_level_length);
02658             if (sign)
02659                 level = -level;
02660         }
02661     }
02662 
02663     *last  = lst;
02664     *skip  = run;
02665     *value = level;
02666 }
02667 
02675 static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n,
02676                               int coded, int codingset)
02677 {
02678     GetBitContext *gb = &v->s.gb;
02679     MpegEncContext *s = &v->s;
02680     int dc_pred_dir = 0; /* Direction of the DC prediction used */
02681     int i;
02682     int16_t *dc_val;
02683     int16_t *ac_val, *ac_val2;
02684     int dcdiff;
02685 
02686     /* Get DC differential */
02687     if (n < 4) {
02688         dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
02689     } else {
02690         dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
02691     }
02692     if (dcdiff < 0) {
02693         av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
02694         return -1;
02695     }
02696     if (dcdiff) {
02697         if (dcdiff == 119 /* ESC index value */) {
02698             /* TODO: Optimize */
02699             if (v->pq == 1)      dcdiff = get_bits(gb, 10);
02700             else if (v->pq == 2) dcdiff = get_bits(gb, 9);
02701             else                 dcdiff = get_bits(gb, 8);
02702         } else {
02703             if (v->pq == 1)
02704                 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
02705             else if (v->pq == 2)
02706                 dcdiff = (dcdiff << 1) + get_bits1(gb)   - 1;
02707         }
02708         if (get_bits1(gb))
02709             dcdiff = -dcdiff;
02710     }
02711 
02712     /* Prediction */
02713     dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
02714     *dc_val = dcdiff;
02715 
02716     /* Store the quantized DC coeff, used for prediction */
02717     if (n < 4) {
02718         block[0] = dcdiff * s->y_dc_scale;
02719     } else {
02720         block[0] = dcdiff * s->c_dc_scale;
02721     }
02722     /* Skip ? */
02723     if (!coded) {
02724         goto not_coded;
02725     }
02726 
02727     // AC Decoding
02728     i = 1;
02729 
02730     {
02731         int last = 0, skip, value;
02732         const uint8_t *zz_table;
02733         int scale;
02734         int k;
02735 
02736         scale = v->pq * 2 + v->halfpq;
02737 
02738         if (v->s.ac_pred) {
02739             if (!dc_pred_dir)
02740                 zz_table = v->zz_8x8[2];
02741             else
02742                 zz_table = v->zz_8x8[3];
02743         } else
02744             zz_table = v->zz_8x8[1];
02745 
02746         ac_val  = s->ac_val[0][0] + s->block_index[n] * 16;
02747         ac_val2 = ac_val;
02748         if (dc_pred_dir) // left
02749             ac_val -= 16;
02750         else // top
02751             ac_val -= 16 * s->block_wrap[n];
02752 
02753         while (!last) {
02754             vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
02755             i += skip;
02756             if (i > 63)
02757                 break;
02758             block[zz_table[i++]] = value;
02759         }
02760 
02761         /* apply AC prediction if needed */
02762         if (s->ac_pred) {
02763             if (dc_pred_dir) { // left
02764                 for (k = 1; k < 8; k++)
02765                     block[k << v->left_blk_sh] += ac_val[k];
02766             } else { // top
02767                 for (k = 1; k < 8; k++)
02768                     block[k << v->top_blk_sh] += ac_val[k + 8];
02769             }
02770         }
02771         /* save AC coeffs for further prediction */
02772         for (k = 1; k < 8; k++) {
02773             ac_val2[k]     = block[k << v->left_blk_sh];
02774             ac_val2[k + 8] = block[k << v->top_blk_sh];
02775         }
02776 
02777         /* scale AC coeffs */
02778         for (k = 1; k < 64; k++)
02779             if (block[k]) {
02780                 block[k] *= scale;
02781                 if (!v->pquantizer)
02782                     block[k] += (block[k] < 0) ? -v->pq : v->pq;
02783             }
02784 
02785         if (s->ac_pred) i = 63;
02786     }
02787 
02788 not_coded:
02789     if (!coded) {
02790         int k, scale;
02791         ac_val  = s->ac_val[0][0] + s->block_index[n] * 16;
02792         ac_val2 = ac_val;
02793 
02794         i = 0;
02795         scale = v->pq * 2 + v->halfpq;
02796         memset(ac_val2, 0, 16 * 2);
02797         if (dc_pred_dir) { // left
02798             ac_val -= 16;
02799             if (s->ac_pred)
02800                 memcpy(ac_val2, ac_val, 8 * 2);
02801         } else { // top
02802             ac_val -= 16 * s->block_wrap[n];
02803             if (s->ac_pred)
02804                 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
02805         }
02806 
02807         /* apply AC prediction if needed */
02808         if (s->ac_pred) {
02809             if (dc_pred_dir) { //left
02810                 for (k = 1; k < 8; k++) {
02811                     block[k << v->left_blk_sh] = ac_val[k] * scale;
02812                     if (!v->pquantizer && block[k << v->left_blk_sh])
02813                         block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq;
02814                 }
02815             } else { // top
02816                 for (k = 1; k < 8; k++) {
02817                     block[k << v->top_blk_sh] = ac_val[k + 8] * scale;
02818                     if (!v->pquantizer && block[k << v->top_blk_sh])
02819                         block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -v->pq : v->pq;
02820                 }
02821             }
02822             i = 63;
02823         }
02824     }
02825     s->block_last_index[n] = i;
02826 
02827     return 0;
02828 }
02829 
02838 static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
02839                                   int coded, int codingset, int mquant)
02840 {
02841     GetBitContext *gb = &v->s.gb;
02842     MpegEncContext *s = &v->s;
02843     int dc_pred_dir = 0; /* Direction of the DC prediction used */
02844     int i;
02845     int16_t *dc_val;
02846     int16_t *ac_val, *ac_val2;
02847     int dcdiff;
02848     int a_avail = v->a_avail, c_avail = v->c_avail;
02849     int use_pred = s->ac_pred;
02850     int scale;
02851     int q1, q2 = 0;
02852     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
02853 
02854     /* Get DC differential */
02855     if (n < 4) {
02856         dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
02857     } else {
02858         dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
02859     }
02860     if (dcdiff < 0) {
02861         av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
02862         return -1;
02863     }
02864     if (dcdiff) {
02865         if (dcdiff == 119 /* ESC index value */) {
02866             /* TODO: Optimize */
02867             if (mquant == 1)      dcdiff = get_bits(gb, 10);
02868             else if (mquant == 2) dcdiff = get_bits(gb, 9);
02869             else                  dcdiff = get_bits(gb, 8);
02870         } else {
02871             if (mquant == 1)
02872                 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
02873             else if (mquant == 2)
02874                 dcdiff = (dcdiff << 1) + get_bits1(gb)   - 1;
02875         }
02876         if (get_bits1(gb))
02877             dcdiff = -dcdiff;
02878     }
02879 
02880     /* Prediction */
02881     dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
02882     *dc_val = dcdiff;
02883 
02884     /* Store the quantized DC coeff, used for prediction */
02885     if (n < 4) {
02886         block[0] = dcdiff * s->y_dc_scale;
02887     } else {
02888         block[0] = dcdiff * s->c_dc_scale;
02889     }
02890 
02891     //AC Decoding
02892     i = 1;
02893 
02894     /* check if AC is needed at all */
02895     if (!a_avail && !c_avail)
02896         use_pred = 0;
02897     ac_val  = s->ac_val[0][0] + s->block_index[n] * 16;
02898     ac_val2 = ac_val;
02899 
02900     scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
02901 
02902     if (dc_pred_dir) // left
02903         ac_val -= 16;
02904     else // top
02905         ac_val -= 16 * s->block_wrap[n];
02906 
02907     q1 = s->current_picture.f.qscale_table[mb_pos];
02908     if ( dc_pred_dir && c_avail && mb_pos)
02909         q2 = s->current_picture.f.qscale_table[mb_pos - 1];
02910     if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
02911         q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
02912     if ( dc_pred_dir && n == 1)
02913         q2 = q1;
02914     if (!dc_pred_dir && n == 2)
02915         q2 = q1;
02916     if (n == 3)
02917         q2 = q1;
02918 
02919     if (coded) {
02920         int last = 0, skip, value;
02921         const uint8_t *zz_table;
02922         int k;
02923 
02924         if (v->s.ac_pred) {
02925             if (!use_pred && v->fcm == ILACE_FRAME) {
02926                 zz_table = v->zzi_8x8;
02927             } else {
02928                 if (!dc_pred_dir) // top
02929                     zz_table = v->zz_8x8[2];
02930                 else // left
02931                     zz_table = v->zz_8x8[3];
02932             }
02933         } else {
02934             if (v->fcm != ILACE_FRAME)
02935                 zz_table = v->zz_8x8[1];
02936             else
02937                 zz_table = v->zzi_8x8;
02938         }
02939 
02940         while (!last) {
02941             vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
02942             i += skip;
02943             if (i > 63)
02944                 break;
02945             block[zz_table[i++]] = value;
02946         }
02947 
02948         /* apply AC prediction if needed */
02949         if (use_pred) {
02950             /* scale predictors if needed*/
02951             if (q2 && q1 != q2) {
02952                 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
02953                 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
02954 
02955                 if (dc_pred_dir) { // left
02956                     for (k = 1; k < 8; k++)
02957                         block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
02958                 } else { // top
02959                     for (k = 1; k < 8; k++)
02960                         block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
02961                 }
02962             } else {
02963                 if (dc_pred_dir) { //left
02964                     for (k = 1; k < 8; k++)
02965                         block[k << v->left_blk_sh] += ac_val[k];
02966                 } else { //top
02967                     for (k = 1; k < 8; k++)
02968                         block[k << v->top_blk_sh] += ac_val[k + 8];
02969                 }
02970             }
02971         }
02972         /* save AC coeffs for further prediction */
02973         for (k = 1; k < 8; k++) {
02974             ac_val2[k    ] = block[k << v->left_blk_sh];
02975             ac_val2[k + 8] = block[k << v->top_blk_sh];
02976         }
02977 
02978         /* scale AC coeffs */
02979         for (k = 1; k < 64; k++)
02980             if (block[k]) {
02981                 block[k] *= scale;
02982                 if (!v->pquantizer)
02983                     block[k] += (block[k] < 0) ? -mquant : mquant;
02984             }
02985 
02986         if (use_pred) i = 63;
02987     } else { // no AC coeffs
02988         int k;
02989 
02990         memset(ac_val2, 0, 16 * 2);
02991         if (dc_pred_dir) { // left
02992             if (use_pred) {
02993                 memcpy(ac_val2, ac_val, 8 * 2);
02994                 if (q2 && q1 != q2) {
02995                     q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
02996                     q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
02997                     for (k = 1; k < 8; k++)
02998                         ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
02999                 }
03000             }
03001         } else { // top
03002             if (use_pred) {
03003                 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
03004                 if (q2 && q1 != q2) {
03005                     q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
03006                     q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
03007                     for (k = 1; k < 8; k++)
03008                         ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
03009                 }
03010             }
03011         }
03012 
03013         /* apply AC prediction if needed */
03014         if (use_pred) {
03015             if (dc_pred_dir) { // left
03016                 for (k = 1; k < 8; k++) {
03017                     block[k << v->left_blk_sh] = ac_val2[k] * scale;
03018                     if (!v->pquantizer && block[k << v->left_blk_sh])
03019                         block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
03020                 }
03021             } else { // top
03022                 for (k = 1; k < 8; k++) {
03023                     block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
03024                     if (!v->pquantizer && block[k << v->top_blk_sh])
03025                         block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
03026                 }
03027             }
03028             i = 63;
03029         }
03030     }
03031     s->block_last_index[n] = i;
03032 
03033     return 0;
03034 }
03035 
03044 static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
03045                                   int coded, int mquant, int codingset)
03046 {
03047     GetBitContext *gb = &v->s.gb;
03048     MpegEncContext *s = &v->s;
03049     int dc_pred_dir = 0; /* Direction of the DC prediction used */
03050     int i;
03051     int16_t *dc_val;
03052     int16_t *ac_val, *ac_val2;
03053     int dcdiff;
03054     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
03055     int a_avail = v->a_avail, c_avail = v->c_avail;
03056     int use_pred = s->ac_pred;
03057     int scale;
03058     int q1, q2 = 0;
03059 
03060     s->dsp.clear_block(block);
03061 
03062     /* XXX: Guard against dumb values of mquant */
03063     mquant = (mquant < 1) ? 0 : ((mquant > 31) ? 31 : mquant);
03064 
03065     /* Set DC scale - y and c use the same */
03066     s->y_dc_scale = s->y_dc_scale_table[mquant];
03067     s->c_dc_scale = s->c_dc_scale_table[mquant];
03068 
03069     /* Get DC differential */
03070     if (n < 4) {
03071         dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
03072     } else {
03073         dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
03074     }
03075     if (dcdiff < 0) {
03076         av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
03077         return -1;
03078     }
03079     if (dcdiff) {
03080         if (dcdiff == 119 /* ESC index value */) {
03081             /* TODO: Optimize */
03082             if (mquant == 1)      dcdiff = get_bits(gb, 10);
03083             else if (mquant == 2) dcdiff = get_bits(gb, 9);
03084             else                  dcdiff = get_bits(gb, 8);
03085         } else {
03086             if (mquant == 1)
03087                 dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3;
03088             else if (mquant == 2)
03089                 dcdiff = (dcdiff << 1) + get_bits1(gb)   - 1;
03090         }
03091         if (get_bits1(gb))
03092             dcdiff = -dcdiff;
03093     }
03094 
03095     /* Prediction */
03096     dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
03097     *dc_val = dcdiff;
03098 
03099     /* Store the quantized DC coeff, used for prediction */
03100 
03101     if (n < 4) {
03102         block[0] = dcdiff * s->y_dc_scale;
03103     } else {
03104         block[0] = dcdiff * s->c_dc_scale;
03105     }
03106 
03107     //AC Decoding
03108     i = 1;
03109 
03110     /* check if AC is needed at all and adjust direction if needed */
03111     if (!a_avail) dc_pred_dir = 1;
03112     if (!c_avail) dc_pred_dir = 0;
03113     if (!a_avail && !c_avail) use_pred = 0;
03114     ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
03115     ac_val2 = ac_val;
03116 
03117     scale = mquant * 2 + v->halfpq;
03118 
03119     if (dc_pred_dir) //left
03120         ac_val -= 16;
03121     else //top
03122         ac_val -= 16 * s->block_wrap[n];
03123 
03124     q1 = s->current_picture.f.qscale_table[mb_pos];
03125     if (dc_pred_dir && c_avail && mb_pos)
03126         q2 = s->current_picture.f.qscale_table[mb_pos - 1];
03127     if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
03128         q2 = s->current_picture.f.qscale_table[mb_pos - s->mb_stride];
03129     if ( dc_pred_dir && n == 1)
03130         q2 = q1;
03131     if (!dc_pred_dir && n == 2)
03132         q2 = q1;
03133     if (n == 3) q2 = q1;
03134 
03135     if (coded) {
03136         int last = 0, skip, value;
03137         int k;
03138 
03139         while (!last) {
03140             vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
03141             i += skip;
03142             if (i > 63)
03143                 break;
03144             if (v->fcm == PROGRESSIVE)
03145                 block[v->zz_8x8[0][i++]] = value;
03146             else {
03147                 if (use_pred && (v->fcm == ILACE_FRAME)) {
03148                     if (!dc_pred_dir) // top
03149                         block[v->zz_8x8[2][i++]] = value;
03150                     else // left
03151                         block[v->zz_8x8[3][i++]] = value;
03152                 } else {
03153                     block[v->zzi_8x8[i++]] = value;
03154                 }
03155             }
03156         }
03157 
03158         /* apply AC prediction if needed */
03159         if (use_pred) {
03160             /* scale predictors if needed*/
03161             if (q2 && q1 != q2) {
03162                 q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
03163                 q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
03164 
03165                 if (dc_pred_dir) { // left
03166                     for (k = 1; k < 8; k++)
03167                         block[k << v->left_blk_sh] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
03168                 } else { //top
03169                     for (k = 1; k < 8; k++)
03170                         block[k << v->top_blk_sh] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
03171                 }
03172             } else {
03173                 if (dc_pred_dir) { // left
03174                     for (k = 1; k < 8; k++)
03175                         block[k << v->left_blk_sh] += ac_val[k];
03176                 } else { // top
03177                     for (k = 1; k < 8; k++)
03178                         block[k << v->top_blk_sh] += ac_val[k + 8];
03179                 }
03180             }
03181         }
03182         /* save AC coeffs for further prediction */
03183         for (k = 1; k < 8; k++) {
03184             ac_val2[k    ] = block[k << v->left_blk_sh];
03185             ac_val2[k + 8] = block[k << v->top_blk_sh];
03186         }
03187 
03188         /* scale AC coeffs */
03189         for (k = 1; k < 64; k++)
03190             if (block[k]) {
03191                 block[k] *= scale;
03192                 if (!v->pquantizer)
03193                     block[k] += (block[k] < 0) ? -mquant : mquant;
03194             }
03195 
03196         if (use_pred) i = 63;
03197     } else { // no AC coeffs
03198         int k;
03199 
03200         memset(ac_val2, 0, 16 * 2);
03201         if (dc_pred_dir) { // left
03202             if (use_pred) {
03203                 memcpy(ac_val2, ac_val, 8 * 2);
03204                 if (q2 && q1 != q2) {
03205                     q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
03206                     q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
03207                     for (k = 1; k < 8; k++)
03208                         ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
03209                 }
03210             }
03211         } else { // top
03212             if (use_pred) {
03213                 memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
03214                 if (q2 && q1 != q2) {
03215                     q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
03216                     q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
03217                     for (k = 1; k < 8; k++)
03218                         ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
03219                 }
03220             }
03221         }
03222 
03223         /* apply AC prediction if needed */
03224         if (use_pred) {
03225             if (dc_pred_dir) { // left
03226                 for (k = 1; k < 8; k++) {
03227                     block[k << v->left_blk_sh] = ac_val2[k] * scale;
03228                     if (!v->pquantizer && block[k << v->left_blk_sh])
03229                         block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -mquant : mquant;
03230                 }
03231             } else { // top
03232                 for (k = 1; k < 8; k++) {
03233                     block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
03234                     if (!v->pquantizer && block[k << v->top_blk_sh])
03235                         block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -mquant : mquant;
03236                 }
03237             }
03238             i = 63;
03239         }
03240     }
03241     s->block_last_index[n] = i;
03242 
03243     return 0;
03244 }
03245 
03248 static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n,
03249                               int mquant, int ttmb, int first_block,
03250                               uint8_t *dst, int linesize, int skip_block,
03251                               int *ttmb_out)
03252 {
03253     MpegEncContext *s = &v->s;
03254     GetBitContext *gb = &s->gb;
03255     int i, j;
03256     int subblkpat = 0;
03257     int scale, off, idx, last, skip, value;
03258     int ttblk = ttmb & 7;
03259     int pat = 0;
03260 
03261     s->dsp.clear_block(block);
03262 
03263     if (ttmb == -1) {
03264         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)];
03265     }
03266     if (ttblk == TT_4X4) {
03267         subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
03268     }
03269     if ((ttblk != TT_8X8 && ttblk != TT_4X4)
03270         && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
03271             || (!v->res_rtm_flag && !first_block))) {
03272         subblkpat = decode012(gb);
03273         if (subblkpat)
03274             subblkpat ^= 3; // swap decoded pattern bits
03275         if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM)
03276             ttblk = TT_8X4;
03277         if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT)
03278             ttblk = TT_4X8;
03279     }
03280     scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
03281 
03282     // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
03283     if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
03284         subblkpat = 2 - (ttblk == TT_8X4_TOP);
03285         ttblk     = TT_8X4;
03286     }
03287     if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
03288         subblkpat = 2 - (ttblk == TT_4X8_LEFT);
03289         ttblk     = TT_4X8;
03290     }
03291     switch (ttblk) {
03292     case TT_8X8:
03293         pat  = 0xF;
03294         i    = 0;
03295         last = 0;
03296         while (!last) {
03297             vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
03298             i += skip;
03299             if (i > 63)
03300                 break;
03301             if (!v->fcm)
03302                 idx = v->zz_8x8[0][i++];
03303             else
03304                 idx = v->zzi_8x8[i++];
03305             block[idx] = value * scale;
03306             if (!v->pquantizer)
03307                 block[idx] += (block[idx] < 0) ? -mquant : mquant;
03308         }
03309         if (!skip_block) {
03310             if (i == 1)
03311                 v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
03312             else {
03313                 v->vc1dsp.vc1_inv_trans_8x8(block);
03314                 s->dsp.add_pixels_clamped(block, dst, linesize);
03315             }
03316         }
03317         break;
03318     case TT_4X4:
03319         pat = ~subblkpat & 0xF;
03320         for (j = 0; j < 4; j++) {
03321             last = subblkpat & (1 << (3 - j));
03322             i    = 0;
03323             off  = (j & 1) * 4 + (j & 2) * 16;
03324             while (!last) {
03325                 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
03326                 i += skip;
03327                 if (i > 15)
03328                     break;
03329                 if (!v->fcm)
03330                     idx = ff_vc1_simple_progressive_4x4_zz[i++];
03331                 else
03332                     idx = ff_vc1_adv_interlaced_4x4_zz[i++];
03333                 block[idx + off] = value * scale;
03334                 if (!v->pquantizer)
03335                     block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
03336             }
03337             if (!(subblkpat & (1 << (3 - j))) && !skip_block) {
03338                 if (i == 1)
03339                     v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
03340                 else
03341                     v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) *  2 * linesize, linesize, block + off);
03342             }
03343         }
03344         break;
03345     case TT_8X4:
03346         pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF;
03347         for (j = 0; j < 2; j++) {
03348             last = subblkpat & (1 << (1 - j));
03349             i    = 0;
03350             off  = j * 32;
03351             while (!last) {
03352                 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
03353                 i += skip;
03354                 if (i > 31)
03355                     break;
03356                 if (!v->fcm)
03357                     idx = v->zz_8x4[i++] + off;
03358                 else
03359                     idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off;
03360                 block[idx] = value * scale;
03361                 if (!v->pquantizer)
03362                     block[idx] += (block[idx] < 0) ? -mquant : mquant;
03363             }
03364             if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
03365                 if (i == 1)
03366                     v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off);
03367                 else
03368                     v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off);
03369             }
03370         }
03371         break;
03372     case TT_4X8:
03373         pat = ~(subblkpat * 5) & 0xF;
03374         for (j = 0; j < 2; j++) {
03375             last = subblkpat & (1 << (1 - j));
03376             i    = 0;
03377             off  = j * 4;
03378             while (!last) {
03379                 vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
03380                 i += skip;
03381                 if (i > 31)
03382                     break;
03383                 if (!v->fcm)
03384                     idx = v->zz_4x8[i++] + off;
03385                 else
03386                     idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off;
03387                 block[idx] = value * scale;
03388                 if (!v->pquantizer)
03389                     block[idx] += (block[idx] < 0) ? -mquant : mquant;
03390             }
03391             if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
03392                 if (i == 1)
03393                     v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off);
03394                 else
03395                     v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
03396             }
03397         }
03398         break;
03399     }
03400     if (ttmb_out)
03401         *ttmb_out |= ttblk << (n * 4);
03402     return pat;
03403 }
03404  // Macroblock group
03406 
03407 static const int size_table  [6] = { 0, 2, 3, 4,  5,  8 };
03408 static const int offset_table[6] = { 0, 1, 3, 7, 15, 31 };
03409 
03410 static av_always_inline void vc1_apply_p_v_loop_filter(VC1Context *v, int block_num)
03411 {
03412     MpegEncContext *s  = &v->s;
03413     int mb_cbp         = v->cbp[s->mb_x - s->mb_stride],
03414         block_cbp      = mb_cbp      >> (block_num * 4), bottom_cbp,
03415         mb_is_intra    = v->is_intra[s->mb_x - s->mb_stride],
03416         block_is_intra = mb_is_intra >> (block_num * 4), bottom_is_intra;
03417     int idx, linesize  = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
03418     uint8_t *dst;
03419 
03420     if (block_num > 3) {
03421         dst      = s->dest[block_num - 3];
03422     } else {
03423         dst      = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 8) * linesize;
03424     }
03425     if (s->mb_y != s->end_mb_y || block_num < 2) {
03426         int16_t (*mv)[2];
03427         int mv_stride;
03428 
03429         if (block_num > 3) {
03430             bottom_cbp      = v->cbp[s->mb_x]      >> (block_num * 4);
03431             bottom_is_intra = v->is_intra[s->mb_x] >> (block_num * 4);
03432             mv              = &v->luma_mv[s->mb_x - s->mb_stride];
03433             mv_stride       = s->mb_stride;
03434         } else {
03435             bottom_cbp      = (block_num < 2) ? (mb_cbp               >> ((block_num + 2) * 4))
03436                                               : (v->cbp[s->mb_x]      >> ((block_num - 2) * 4));
03437             bottom_is_intra = (block_num < 2) ? (mb_is_intra          >> ((block_num + 2) * 4))
03438                                               : (v->is_intra[s->mb_x] >> ((block_num - 2) * 4));
03439             mv_stride       = s->b8_stride;
03440             mv              = &s->current_picture.f.motion_val[0][s->block_index[block_num] - 2 * mv_stride];
03441         }
03442 
03443         if (bottom_is_intra & 1 || block_is_intra & 1 ||
03444             mv[0][0] != mv[mv_stride][0] || mv[0][1] != mv[mv_stride][1]) {
03445             v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
03446         } else {
03447             idx = ((bottom_cbp >> 2) | block_cbp) & 3;
03448             if (idx == 3) {
03449                 v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
03450             } else if (idx) {
03451                 if (idx == 1)
03452                     v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
03453                 else
03454                     v->vc1dsp.vc1_v_loop_filter4(dst,     linesize, v->pq);
03455             }
03456         }
03457     }
03458 
03459     dst -= 4 * linesize;
03460     ttblk = (v->ttblk[s->mb_x - s->mb_stride] >> (block_num * 4)) & 0xF;
03461     if (ttblk == TT_4X4 || ttblk == TT_8X4) {
03462         idx = (block_cbp | (block_cbp >> 2)) & 3;
03463         if (idx == 3) {
03464             v->vc1dsp.vc1_v_loop_filter8(dst, linesize, v->pq);
03465         } else if (idx) {
03466             if (idx == 1)
03467                 v->vc1dsp.vc1_v_loop_filter4(dst + 4, linesize, v->pq);
03468             else
03469                 v->vc1dsp.vc1_v_loop_filter4(dst,     linesize, v->pq);
03470         }
03471     }
03472 }
03473 
03474 static av_always_inline void vc1_apply_p_h_loop_filter(VC1Context *v, int block_num)
03475 {
03476     MpegEncContext *s  = &v->s;
03477     int mb_cbp         = v->cbp[s->mb_x - 1 - s->mb_stride],
03478         block_cbp      = mb_cbp      >> (block_num * 4), right_cbp,
03479         mb_is_intra    = v->is_intra[s->mb_x - 1 - s->mb_stride],
03480         block_is_intra = mb_is_intra >> (block_num * 4), right_is_intra;
03481     int idx, linesize  = block_num > 3 ? s->uvlinesize : s->linesize, ttblk;
03482     uint8_t *dst;
03483 
03484     if (block_num > 3) {
03485         dst = s->dest[block_num - 3] - 8 * linesize;
03486     } else {
03487         dst = s->dest[0] + (block_num & 1) * 8 + ((block_num & 2) * 4 - 16) * linesize - 8;
03488     }
03489 
03490     if (s->mb_x != s->mb_width || !(block_num & 5)) {
03491         int16_t (*mv)[2];
03492 
03493         if (block_num > 3) {
03494             right_cbp      = v->cbp[s->mb_x - s->mb_stride] >> (block_num * 4);
03495             right_is_intra = v->is_intra[s->mb_x - s->mb_stride] >> (block_num * 4);
03496             mv             = &v->luma_mv[s->mb_x - s->mb_stride - 1];
03497         } else {
03498             right_cbp      = (block_num & 1) ? (v->cbp[s->mb_x - s->mb_stride]      >> ((block_num - 1) * 4))
03499                                              : (mb_cbp                              >> ((block_num + 1) * 4));
03500             right_is_intra = (block_num & 1) ? (v->is_intra[s->mb_x - s->mb_stride] >> ((block_num - 1) * 4))
03501                                              : (mb_is_intra                         >> ((block_num + 1) * 4));
03502             mv             = &s->current_picture.f.motion_val[0][s->block_index[block_num] - s->b8_stride * 2 - 2];
03503         }
03504         if (block_is_intra & 1 || right_is_intra & 1 || mv[0][0] != mv[1][0] || mv[0][1] != mv[1][1]) {
03505             v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
03506         } else {
03507             idx = ((right_cbp >> 1) | block_cbp) & 5; // FIXME check
03508             if (idx == 5) {
03509                 v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
03510             } else if (idx) {
03511                 if (idx == 1)
03512                     v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize, linesize, v->pq);
03513                 else
03514                     v->vc1dsp.vc1_h_loop_filter4(dst,                linesize, v->pq);
03515             }
03516         }
03517     }
03518 
03519     dst -= 4;
03520     ttblk = (v->ttblk[s->mb_x - s->mb_stride - 1] >> (block_num * 4)) & 0xf;
03521     if (ttblk == TT_4X4 || ttblk == TT_4X8) {
03522         idx = (block_cbp | (block_cbp >> 1)) & 5;
03523         if (idx == 5) {
03524             v->vc1dsp.vc1_h_loop_filter8(dst, linesize, v->pq);
03525         } else if (idx) {
03526             if (idx == 1)
03527                 v->vc1dsp.vc1_h_loop_filter4(dst + linesize * 4, linesize, v->pq);
03528             else
03529                 v->vc1dsp.vc1_h_loop_filter4(dst,                linesize, v->pq);
03530         }
03531     }
03532 }
03533 
03534 static void vc1_apply_p_loop_filter(VC1Context *v)
03535 {
03536     MpegEncContext *s = &v->s;
03537     int i;
03538 
03539     for (i = 0; i < 6; i++) {
03540         vc1_apply_p_v_loop_filter(v, i);
03541     }
03542 
03543     /* V always preceedes H, therefore we run H one MB before V;
03544      * at the end of a row, we catch up to complete the row */
03545     if (s->mb_x) {
03546         for (i = 0; i < 6; i++) {
03547             vc1_apply_p_h_loop_filter(v, i);
03548         }
03549         if (s->mb_x == s->mb_width - 1) {
03550             s->mb_x++;
03551             ff_update_block_index(s);
03552             for (i = 0; i < 6; i++) {
03553                 vc1_apply_p_h_loop_filter(v, i);
03554             }
03555         }
03556     }
03557 }
03558 
03561 static int vc1_decode_p_mb(VC1Context *v)
03562 {
03563     MpegEncContext *s = &v->s;
03564     GetBitContext *gb = &s->gb;
03565     int i, j;
03566     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
03567     int cbp; /* cbp decoding stuff */
03568     int mqdiff, mquant; /* MB quantization */
03569     int ttmb = v->ttfrm; /* MB Transform type */
03570 
03571     int mb_has_coeffs = 1; /* last_flag */
03572     int dmv_x, dmv_y; /* Differential MV components */
03573     int index, index1; /* LUT indexes */
03574     int val, sign; /* temp values */
03575     int first_block = 1;
03576     int dst_idx, off;
03577     int skipped, fourmv;
03578     int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
03579 
03580     mquant = v->pq; /* Loosy initialization */
03581 
03582     if (v->mv_type_is_raw)
03583         fourmv = get_bits1(gb);
03584     else
03585         fourmv = v->mv_type_mb_plane[mb_pos];
03586     if (v->skip_is_raw)
03587         skipped = get_bits1(gb);
03588     else
03589         skipped = v->s.mbskip_table[mb_pos];
03590 
03591     if (!fourmv) { /* 1MV mode */
03592         if (!skipped) {
03593             GET_MVDATA(dmv_x, dmv_y);
03594 
03595             if (s->mb_intra) {
03596                 s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
03597                 s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
03598             }
03599             s->current_picture.f.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
03600             vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
03601 
03602             /* FIXME Set DC val for inter block ? */
03603             if (s->mb_intra && !mb_has_coeffs) {
03604                 GET_MQUANT();
03605                 s->ac_pred = get_bits1(gb);
03606                 cbp        = 0;
03607             } else if (mb_has_coeffs) {
03608                 if (s->mb_intra)
03609                     s->ac_pred = get_bits1(gb);
03610                 cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
03611                 GET_MQUANT();
03612             } else {
03613                 mquant = v->pq;
03614                 cbp    = 0;
03615             }
03616             s->current_picture.f.qscale_table[mb_pos] = mquant;
03617 
03618             if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
03619                 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
03620                                 VC1_TTMB_VLC_BITS, 2);
03621             if (!s->mb_intra) vc1_mc_1mv(v, 0);
03622             dst_idx = 0;
03623             for (i = 0; i < 6; i++) {
03624                 s->dc_val[0][s->block_index[i]] = 0;
03625                 dst_idx += i >> 2;
03626                 val = ((cbp >> (5 - i)) & 1);
03627                 off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
03628                 v->mb_type[0][s->block_index[i]] = s->mb_intra;
03629                 if (s->mb_intra) {
03630                     /* check if prediction blocks A and C are available */
03631                     v->a_avail = v->c_avail = 0;
03632                     if (i == 2 || i == 3 || !s->first_slice_line)
03633                         v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
03634                     if (i == 1 || i == 3 || s->mb_x)
03635                         v->c_avail = v->mb_type[0][s->block_index[i] - 1];
03636 
03637                     vc1_decode_intra_block(v, s->block[i], i, val, mquant,
03638                                            (i & 4) ? v->codingset2 : v->codingset);
03639                     if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
03640                         continue;
03641                     v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
03642                     if (v->rangeredfrm)
03643                         for (j = 0; j < 64; j++)
03644                             s->block[i][j] <<= 1;
03645                     s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
03646                     if (v->pq >= 9 && v->overlap) {
03647                         if (v->c_avail)
03648                             v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
03649                         if (v->a_avail)
03650                             v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
03651                     }
03652                     block_cbp   |= 0xF << (i << 2);
03653                     block_intra |= 1 << i;
03654                 } else if (val) {
03655                     pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block,
03656                                              s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize,
03657                                              (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
03658                     block_cbp |= pat << (i << 2);
03659                     if (!v->ttmbf && ttmb < 8)
03660                         ttmb = -1;
03661                     first_block = 0;
03662                 }
03663             }
03664         } else { // skipped
03665             s->mb_intra = 0;
03666             for (i = 0; i < 6; i++) {
03667                 v->mb_type[0][s->block_index[i]] = 0;
03668                 s->dc_val[0][s->block_index[i]]  = 0;
03669             }
03670             s->current_picture.f.mb_type[mb_pos]      = MB_TYPE_SKIP;
03671             s->current_picture.f.qscale_table[mb_pos] = 0;
03672             vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
03673             vc1_mc_1mv(v, 0);
03674         }
03675     } else { // 4MV mode
03676         if (!skipped /* unskipped MB */) {
03677             int intra_count = 0, coded_inter = 0;
03678             int is_intra[6], is_coded[6];
03679             /* Get CBPCY */
03680             cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
03681             for (i = 0; i < 6; i++) {
03682                 val = ((cbp >> (5 - i)) & 1);
03683                 s->dc_val[0][s->block_index[i]] = 0;
03684                 s->mb_intra                     = 0;
03685                 if (i < 4) {
03686                     dmv_x = dmv_y = 0;
03687                     s->mb_intra   = 0;
03688                     mb_has_coeffs = 0;
03689                     if (val) {
03690                         GET_MVDATA(dmv_x, dmv_y);
03691                     }
03692                     vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
03693                     if (!s->mb_intra)
03694                         vc1_mc_4mv_luma(v, i, 0);
03695                     intra_count += s->mb_intra;
03696                     is_intra[i]  = s->mb_intra;
03697                     is_coded[i]  = mb_has_coeffs;
03698                 }
03699                 if (i & 4) {
03700                     is_intra[i] = (intra_count >= 3);
03701                     is_coded[i] = val;
03702                 }
03703                 if (i == 4)
03704                     vc1_mc_4mv_chroma(v, 0);
03705                 v->mb_type[0][s->block_index[i]] = is_intra[i];
03706                 if (!coded_inter)
03707                     coded_inter = !is_intra[i] & is_coded[i];
03708             }
03709             // if there are no coded blocks then don't do anything more
03710             dst_idx = 0;
03711             if (!intra_count && !coded_inter)
03712                 goto end;
03713             GET_MQUANT();
03714             s->current_picture.f.qscale_table[mb_pos] = mquant;
03715             /* test if block is intra and has pred */
03716             {
03717                 int intrapred = 0;
03718                 for (i = 0; i < 6; i++)
03719                     if (is_intra[i]) {
03720                         if (((!s->first_slice_line || (i == 2 || i == 3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
03721                             || ((s->mb_x || (i == 1 || i == 3)) && v->mb_type[0][s->block_index[i] - 1])) {
03722                             intrapred = 1;
03723                             break;
03724                         }
03725                     }
03726                 if (intrapred)
03727                     s->ac_pred = get_bits1(gb);
03728                 else
03729                     s->ac_pred = 0;
03730             }
03731             if (!v->ttmbf && coded_inter)
03732                 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
03733             for (i = 0; i < 6; i++) {
03734                 dst_idx    += i >> 2;
03735                 off         = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
03736                 s->mb_intra = is_intra[i];
03737                 if (is_intra[i]) {
03738                     /* check if prediction blocks A and C are available */
03739                     v->a_avail = v->c_avail = 0;
03740                     if (i == 2 || i == 3 || !s->first_slice_line)
03741                         v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
03742                     if (i == 1 || i == 3 || s->mb_x)
03743                         v->c_avail = v->mb_type[0][s->block_index[i] - 1];
03744 
03745                     vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant,
03746                                            (i & 4) ? v->codingset2 : v->codingset);
03747                     if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
03748                         continue;
03749                     v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
03750                     if (v->rangeredfrm)
03751                         for (j = 0; j < 64; j++)
03752                             s->block[i][j] <<= 1;
03753                     s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off,
03754                                                      (i & 4) ? s->uvlinesize : s->linesize);
03755                     if (v->pq >= 9 && v->overlap) {
03756                         if (v->c_avail)
03757                             v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
03758                         if (v->a_avail)
03759                             v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
03760                     }
03761                     block_cbp   |= 0xF << (i << 2);
03762                     block_intra |= 1 << i;
03763                 } else if (is_coded[i]) {
03764                     pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
03765                                              first_block, s->dest[dst_idx] + off,
03766                                              (i & 4) ? s->uvlinesize : s->linesize,
03767                                              (i & 4) && (s->flags & CODEC_FLAG_GRAY),
03768                                              &block_tt);
03769                     block_cbp |= pat << (i << 2);
03770                     if (!v->ttmbf && ttmb < 8)
03771                         ttmb = -1;
03772                     first_block = 0;
03773                 }
03774             }
03775         } else { // skipped MB
03776             s->mb_intra                               = 0;
03777             s->current_picture.f.qscale_table[mb_pos] = 0;
03778             for (i = 0; i < 6; i++) {
03779                 v->mb_type[0][s->block_index[i]] = 0;
03780                 s->dc_val[0][s->block_index[i]]  = 0;
03781             }
03782             for (i = 0; i < 4; i++) {
03783                 vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
03784                 vc1_mc_4mv_luma(v, i, 0);
03785             }
03786             vc1_mc_4mv_chroma(v, 0);
03787             s->current_picture.f.qscale_table[mb_pos] = 0;
03788         }
03789     }
03790 end:
03791     v->cbp[s->mb_x]      = block_cbp;
03792     v->ttblk[s->mb_x]    = block_tt;
03793     v->is_intra[s->mb_x] = block_intra;
03794 
03795     return 0;
03796 }
03797 
03798 /* Decode one macroblock in an interlaced frame p picture */
03799 
03800 static int vc1_decode_p_mb_intfr(VC1Context *v)
03801 {
03802     MpegEncContext *s = &v->s;
03803     GetBitContext *gb = &s->gb;
03804     int i;
03805     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
03806     int cbp = 0; /* cbp decoding stuff */
03807     int mqdiff, mquant; /* MB quantization */
03808     int ttmb = v->ttfrm; /* MB Transform type */
03809 
03810     int mb_has_coeffs = 1; /* last_flag */
03811     int dmv_x, dmv_y; /* Differential MV components */
03812     int val; /* temp value */
03813     int first_block = 1;
03814     int dst_idx, off;
03815     int skipped, fourmv = 0, twomv = 0;
03816     int block_cbp = 0, pat, block_tt = 0;
03817     int idx_mbmode = 0, mvbp;
03818     int stride_y, fieldtx;
03819 
03820     mquant = v->pq; /* Loosy initialization */
03821 
03822     if (v->skip_is_raw)
03823         skipped = get_bits1(gb);
03824     else
03825         skipped = v->s.mbskip_table[mb_pos];
03826     if (!skipped) {
03827         if (v->fourmvswitch)
03828             idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done
03829         else
03830             idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line
03831         switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) {
03832         /* store the motion vector type in a flag (useful later) */
03833         case MV_PMODE_INTFR_4MV:
03834             fourmv = 1;
03835             v->blk_mv_type[s->block_index[0]] = 0;
03836             v->blk_mv_type[s->block_index[1]] = 0;
03837             v->blk_mv_type[s->block_index[2]] = 0;
03838             v->blk_mv_type[s->block_index[3]] = 0;
03839             break;
03840         case MV_PMODE_INTFR_4MV_FIELD:
03841             fourmv = 1;
03842             v->blk_mv_type[s->block_index[0]] = 1;
03843             v->blk_mv_type[s->block_index[1]] = 1;
03844             v->blk_mv_type[s->block_index[2]] = 1;
03845             v->blk_mv_type[s->block_index[3]] = 1;
03846             break;
03847         case MV_PMODE_INTFR_2MV_FIELD:
03848             twomv = 1;
03849             v->blk_mv_type[s->block_index[0]] = 1;
03850             v->blk_mv_type[s->block_index[1]] = 1;
03851             v->blk_mv_type[s->block_index[2]] = 1;
03852             v->blk_mv_type[s->block_index[3]] = 1;
03853             break;
03854         case MV_PMODE_INTFR_1MV:
03855             v->blk_mv_type[s->block_index[0]] = 0;
03856             v->blk_mv_type[s->block_index[1]] = 0;
03857             v->blk_mv_type[s->block_index[2]] = 0;
03858             v->blk_mv_type[s->block_index[3]] = 0;
03859             break;
03860         }
03861         if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
03862             s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
03863             s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
03864             s->current_picture.f.mb_type[mb_pos]                     = MB_TYPE_INTRA;
03865             s->mb_intra = v->is_intra[s->mb_x] = 1;
03866             for (i = 0; i < 6; i++)
03867                 v->mb_type[0][s->block_index[i]] = 1;
03868             fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
03869             mb_has_coeffs = get_bits1(gb);
03870             if (mb_has_coeffs)
03871                 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
03872             v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
03873             GET_MQUANT();
03874             s->current_picture.f.qscale_table[mb_pos] = mquant;
03875             /* Set DC scale - y and c use the same (not sure if necessary here) */
03876             s->y_dc_scale = s->y_dc_scale_table[mquant];
03877             s->c_dc_scale = s->c_dc_scale_table[mquant];
03878             dst_idx = 0;
03879             for (i = 0; i < 6; i++) {
03880                 s->dc_val[0][s->block_index[i]] = 0;
03881                 dst_idx += i >> 2;
03882                 val = ((cbp >> (5 - i)) & 1);
03883                 v->mb_type[0][s->block_index[i]] = s->mb_intra;
03884                 v->a_avail = v->c_avail = 0;
03885                 if (i == 2 || i == 3 || !s->first_slice_line)
03886                     v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
03887                 if (i == 1 || i == 3 || s->mb_x)
03888                     v->c_avail = v->mb_type[0][s->block_index[i] - 1];
03889 
03890                 vc1_decode_intra_block(v, s->block[i], i, val, mquant,
03891                                        (i & 4) ? v->codingset2 : v->codingset);
03892                 if ((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
03893                 v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
03894                 if (i < 4) {
03895                     stride_y = s->linesize << fieldtx;
03896                     off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
03897                 } else {
03898                     stride_y = s->uvlinesize;
03899                     off = 0;
03900                 }
03901                 s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, stride_y);
03902                 //TODO: loop filter
03903             }
03904 
03905         } else { // inter MB
03906             mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3];
03907             if (mb_has_coeffs)
03908                 cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
03909             if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
03910                 v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
03911             } else {
03912                 if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV)
03913                     || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) {
03914                     v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
03915                 }
03916             }
03917             s->mb_intra = v->is_intra[s->mb_x] = 0;
03918             for (i = 0; i < 6; i++)
03919                 v->mb_type[0][s->block_index[i]] = 0;
03920             fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1];
03921             /* for all motion vector read MVDATA and motion compensate each block */
03922             dst_idx = 0;
03923             if (fourmv) {
03924                 mvbp = v->fourmvbp;
03925                 for (i = 0; i < 6; i++) {
03926                     if (i < 4) {
03927                         dmv_x = dmv_y = 0;
03928                         val   = ((mvbp >> (3 - i)) & 1);
03929                         if (val) {
03930                             get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
03931                         }
03932                         vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
03933                         vc1_mc_4mv_luma(v, i, 0);
03934                     } else if (i == 4) {
03935                         vc1_mc_4mv_chroma4(v);
03936                     }
03937                 }
03938             } else if (twomv) {
03939                 mvbp  = v->twomvbp;
03940                 dmv_x = dmv_y = 0;
03941                 if (mvbp & 2) {
03942                     get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
03943                 }
03944                 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0]);
03945                 vc1_mc_4mv_luma(v, 0, 0);
03946                 vc1_mc_4mv_luma(v, 1, 0);
03947                 dmv_x = dmv_y = 0;
03948                 if (mvbp & 1) {
03949                     get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
03950                 }
03951                 vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, v->mb_type[0]);
03952                 vc1_mc_4mv_luma(v, 2, 0);
03953                 vc1_mc_4mv_luma(v, 3, 0);
03954                 vc1_mc_4mv_chroma4(v);
03955             } else {
03956                 mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2];
03957                 if (mvbp) {
03958                     get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
03959                 }
03960                 vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
03961                 vc1_mc_1mv(v, 0);
03962             }
03963             if (cbp)
03964                 GET_MQUANT();  // p. 227
03965             s->current_picture.f.qscale_table[mb_pos] = mquant;
03966             if (!v->ttmbf && cbp)
03967                 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
03968             for (i = 0; i < 6; i++) {
03969                 s->dc_val[0][s->block_index[i]] = 0;
03970                 dst_idx += i >> 2;
03971                 val = ((cbp >> (5 - i)) & 1);
03972                 if (!fieldtx)
03973                     off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
03974                 else
03975                     off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
03976                 if (val) {
03977                     pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
03978                                              first_block, s->dest[dst_idx] + off,
03979                                              (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
03980                                              (i & 4) && (s->flags & CODEC_FLAG_GRAY), &block_tt);
03981                     block_cbp |= pat << (i << 2);
03982                     if (!v->ttmbf && ttmb < 8)
03983                         ttmb = -1;
03984                     first_block = 0;
03985                 }
03986             }
03987         }
03988     } else { // skipped
03989         s->mb_intra = v->is_intra[s->mb_x] = 0;
03990         for (i = 0; i < 6; i++) {
03991             v->mb_type[0][s->block_index[i]] = 0;
03992             s->dc_val[0][s->block_index[i]] = 0;
03993         }
03994         s->current_picture.f.mb_type[mb_pos]      = MB_TYPE_SKIP;
03995         s->current_picture.f.qscale_table[mb_pos] = 0;
03996         v->blk_mv_type[s->block_index[0]] = 0;
03997         v->blk_mv_type[s->block_index[1]] = 0;
03998         v->blk_mv_type[s->block_index[2]] = 0;
03999         v->blk_mv_type[s->block_index[3]] = 0;
04000         vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
04001         vc1_mc_1mv(v, 0);
04002     }
04003     if (s->mb_x == s->mb_width - 1)
04004         memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0])*s->mb_stride);
04005     return 0;
04006 }
04007 
04008 static int vc1_decode_p_mb_intfi(VC1Context *v)
04009 {
04010     MpegEncContext *s = &v->s;
04011     GetBitContext *gb = &s->gb;
04012     int i;
04013     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
04014     int cbp = 0; /* cbp decoding stuff */
04015     int mqdiff, mquant; /* MB quantization */
04016     int ttmb = v->ttfrm; /* MB Transform type */
04017 
04018     int mb_has_coeffs = 1; /* last_flag */
04019     int dmv_x, dmv_y; /* Differential MV components */
04020     int val; /* temp values */
04021     int first_block = 1;
04022     int dst_idx, off;
04023     int pred_flag;
04024     int block_cbp = 0, pat, block_tt = 0;
04025     int idx_mbmode = 0;
04026 
04027     mquant = v->pq; /* Loosy initialization */
04028 
04029     idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
04030     if (idx_mbmode <= 1) { // intra MB
04031         s->mb_intra = v->is_intra[s->mb_x] = 1;
04032         s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
04033         s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
04034         s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
04035         GET_MQUANT();
04036         s->current_picture.f.qscale_table[mb_pos] = mquant;
04037         /* Set DC scale - y and c use the same (not sure if necessary here) */
04038         s->y_dc_scale = s->y_dc_scale_table[mquant];
04039         s->c_dc_scale = s->c_dc_scale_table[mquant];
04040         v->s.ac_pred  = v->acpred_plane[mb_pos] = get_bits1(gb);
04041         mb_has_coeffs = idx_mbmode & 1;
04042         if (mb_has_coeffs)
04043             cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
04044         dst_idx = 0;
04045         for (i = 0; i < 6; i++) {
04046             s->dc_val[0][s->block_index[i]]  = 0;
04047             v->mb_type[0][s->block_index[i]] = 1;
04048             dst_idx += i >> 2;
04049             val = ((cbp >> (5 - i)) & 1);
04050             v->a_avail = v->c_avail = 0;
04051             if (i == 2 || i == 3 || !s->first_slice_line)
04052                 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
04053             if (i == 1 || i == 3 || s->mb_x)
04054                 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
04055 
04056             vc1_decode_intra_block(v, s->block[i], i, val, mquant,
04057                                    (i & 4) ? v->codingset2 : v->codingset);
04058             if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
04059                 continue;
04060             v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
04061             off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
04062             off += v->cur_field_type ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
04063             s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
04064             // TODO: loop filter
04065         }
04066     } else {
04067         s->mb_intra = v->is_intra[s->mb_x] = 0;
04068         s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
04069         for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
04070         if (idx_mbmode <= 5) { // 1-MV
04071             dmv_x = dmv_y = 0;
04072             if (idx_mbmode & 1) {
04073                 get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
04074             }
04075             vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
04076             vc1_mc_1mv(v, 0);
04077             mb_has_coeffs = !(idx_mbmode & 2);
04078         } else { // 4-MV
04079             v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
04080             for (i = 0; i < 6; i++) {
04081                 if (i < 4) {
04082                     dmv_x = dmv_y = pred_flag = 0;
04083                     val   = ((v->fourmvbp >> (3 - i)) & 1);
04084                     if (val) {
04085                         get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
04086                     }
04087                     vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
04088                     vc1_mc_4mv_luma(v, i, 0);
04089                 } else if (i == 4)
04090                     vc1_mc_4mv_chroma(v, 0);
04091             }
04092             mb_has_coeffs = idx_mbmode & 1;
04093         }
04094         if (mb_has_coeffs)
04095             cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
04096         if (cbp) {
04097             GET_MQUANT();
04098         }
04099         s->current_picture.f.qscale_table[mb_pos] = mquant;
04100         if (!v->ttmbf && cbp) {
04101             ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
04102         }
04103         dst_idx = 0;
04104         for (i = 0; i < 6; i++) {
04105             s->dc_val[0][s->block_index[i]] = 0;
04106             dst_idx += i >> 2;
04107             val = ((cbp >> (5 - i)) & 1);
04108             off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
04109             if (v->cur_field_type)
04110                 off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
04111             if (val) {
04112                 pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
04113                                          first_block, s->dest[dst_idx] + off,
04114                                          (i & 4) ? s->uvlinesize : s->linesize,
04115                                          (i & 4) && (s->flags & CODEC_FLAG_GRAY),
04116                                          &block_tt);
04117                 block_cbp |= pat << (i << 2);
04118                 if (!v->ttmbf && ttmb < 8) ttmb = -1;
04119                 first_block = 0;
04120             }
04121         }
04122     }
04123     if (s->mb_x == s->mb_width - 1)
04124         memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
04125     return 0;
04126 }
04127 
04130 static void vc1_decode_b_mb(VC1Context *v)
04131 {
04132     MpegEncContext *s = &v->s;
04133     GetBitContext *gb = &s->gb;
04134     int i, j;
04135     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
04136     int cbp = 0; /* cbp decoding stuff */
04137     int mqdiff, mquant; /* MB quantization */
04138     int ttmb = v->ttfrm; /* MB Transform type */
04139     int mb_has_coeffs = 0; /* last_flag */
04140     int index, index1; /* LUT indexes */
04141     int val, sign; /* temp values */
04142     int first_block = 1;
04143     int dst_idx, off;
04144     int skipped, direct;
04145     int dmv_x[2], dmv_y[2];
04146     int bmvtype = BMV_TYPE_BACKWARD;
04147 
04148     mquant      = v->pq; /* Loosy initialization */
04149     s->mb_intra = 0;
04150 
04151     if (v->dmb_is_raw)
04152         direct = get_bits1(gb);
04153     else
04154         direct = v->direct_mb_plane[mb_pos];
04155     if (v->skip_is_raw)
04156         skipped = get_bits1(gb);
04157     else
04158         skipped = v->s.mbskip_table[mb_pos];
04159 
04160     dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
04161     for (i = 0; i < 6; i++) {
04162         v->mb_type[0][s->block_index[i]] = 0;
04163         s->dc_val[0][s->block_index[i]]  = 0;
04164     }
04165     s->current_picture.f.qscale_table[mb_pos] = 0;
04166 
04167     if (!direct) {
04168         if (!skipped) {
04169             GET_MVDATA(dmv_x[0], dmv_y[0]);
04170             dmv_x[1] = dmv_x[0];
04171             dmv_y[1] = dmv_y[0];
04172         }
04173         if (skipped || !s->mb_intra) {
04174             bmvtype = decode012(gb);
04175             switch (bmvtype) {
04176             case 0:
04177                 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
04178                 break;
04179             case 1:
04180                 bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
04181                 break;
04182             case 2:
04183                 bmvtype  = BMV_TYPE_INTERPOLATED;
04184                 dmv_x[0] = dmv_y[0] = 0;
04185             }
04186         }
04187     }
04188     for (i = 0; i < 6; i++)
04189         v->mb_type[0][s->block_index[i]] = s->mb_intra;
04190 
04191     if (skipped) {
04192         if (direct)
04193             bmvtype = BMV_TYPE_INTERPOLATED;
04194         vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
04195         vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
04196         return;
04197     }
04198     if (direct) {
04199         cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
04200         GET_MQUANT();
04201         s->mb_intra = 0;
04202         s->current_picture.f.qscale_table[mb_pos] = mquant;
04203         if (!v->ttmbf)
04204             ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
04205         dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
04206         vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
04207         vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
04208     } else {
04209         if (!mb_has_coeffs && !s->mb_intra) {
04210             /* no coded blocks - effectively skipped */
04211             vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
04212             vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
04213             return;
04214         }
04215         if (s->mb_intra && !mb_has_coeffs) {
04216             GET_MQUANT();
04217             s->current_picture.f.qscale_table[mb_pos] = mquant;
04218             s->ac_pred = get_bits1(gb);
04219             cbp = 0;
04220             vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
04221         } else {
04222             if (bmvtype == BMV_TYPE_INTERPOLATED) {
04223                 GET_MVDATA(dmv_x[0], dmv_y[0]);
04224                 if (!mb_has_coeffs) {
04225                     /* interpolated skipped block */
04226                     vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
04227                     vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
04228                     return;
04229                 }
04230             }
04231             vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
04232             if (!s->mb_intra) {
04233                 vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
04234             }
04235             if (s->mb_intra)
04236                 s->ac_pred = get_bits1(gb);
04237             cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
04238             GET_MQUANT();
04239             s->current_picture.f.qscale_table[mb_pos] = mquant;
04240             if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
04241                 ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
04242         }
04243     }
04244     dst_idx = 0;
04245     for (i = 0; i < 6; i++) {
04246         s->dc_val[0][s->block_index[i]] = 0;
04247         dst_idx += i >> 2;
04248         val = ((cbp >> (5 - i)) & 1);
04249         off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
04250         v->mb_type[0][s->block_index[i]] = s->mb_intra;
04251         if (s->mb_intra) {
04252             /* check if prediction blocks A and C are available */
04253             v->a_avail = v->c_avail = 0;
04254             if (i == 2 || i == 3 || !s->first_slice_line)
04255                 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
04256             if (i == 1 || i == 3 || s->mb_x)
04257                 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
04258 
04259             vc1_decode_intra_block(v, s->block[i], i, val, mquant,
04260                                    (i & 4) ? v->codingset2 : v->codingset);
04261             if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
04262                 continue;
04263             v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
04264             if (v->rangeredfrm)
04265                 for (j = 0; j < 64; j++)
04266                     s->block[i][j] <<= 1;
04267             s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize);
04268         } else if (val) {
04269             vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
04270                                first_block, s->dest[dst_idx] + off,
04271                                (i & 4) ? s->uvlinesize : s->linesize,
04272                                (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
04273             if (!v->ttmbf && ttmb < 8)
04274                 ttmb = -1;
04275             first_block = 0;
04276         }
04277     }
04278 }
04279 
04282 static void vc1_decode_b_mb_intfi(VC1Context *v)
04283 {
04284     MpegEncContext *s = &v->s;
04285     GetBitContext *gb = &s->gb;
04286     int i, j;
04287     int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
04288     int cbp = 0; /* cbp decoding stuff */
04289     int mqdiff, mquant; /* MB quantization */
04290     int ttmb = v->ttfrm; /* MB Transform type */
04291     int mb_has_coeffs = 0; /* last_flag */
04292     int val; /* temp value */
04293     int first_block = 1;
04294     int dst_idx, off;
04295     int fwd;
04296     int dmv_x[2], dmv_y[2], pred_flag[2];
04297     int bmvtype = BMV_TYPE_BACKWARD;
04298     int idx_mbmode, interpmvp;
04299 
04300     mquant      = v->pq; /* Loosy initialization */
04301     s->mb_intra = 0;
04302 
04303     idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
04304     if (idx_mbmode <= 1) { // intra MB
04305         s->mb_intra = v->is_intra[s->mb_x] = 1;
04306         s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
04307         s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
04308         s->current_picture.f.mb_type[mb_pos + v->mb_off]         = MB_TYPE_INTRA;
04309         GET_MQUANT();
04310         s->current_picture.f.qscale_table[mb_pos] = mquant;
04311         /* Set DC scale - y and c use the same (not sure if necessary here) */
04312         s->y_dc_scale = s->y_dc_scale_table[mquant];
04313         s->c_dc_scale = s->c_dc_scale_table[mquant];
04314         v->s.ac_pred  = v->acpred_plane[mb_pos] = get_bits1(gb);
04315         mb_has_coeffs = idx_mbmode & 1;
04316         if (mb_has_coeffs)
04317             cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
04318         dst_idx = 0;
04319         for (i = 0; i < 6; i++) {
04320             s->dc_val[0][s->block_index[i]] = 0;
04321             dst_idx += i >> 2;
04322             val = ((cbp >> (5 - i)) & 1);
04323             v->mb_type[0][s->block_index[i]] = s->mb_intra;
04324             v->a_avail                       = v->c_avail = 0;
04325             if (i == 2 || i == 3 || !s->first_slice_line)
04326                 v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
04327             if (i == 1 || i == 3 || s->mb_x)
04328                 v->c_avail = v->mb_type[0][s->block_index[i] - 1];
04329 
04330             vc1_decode_intra_block(v, s->block[i], i, val, mquant,
04331                                    (i & 4) ? v->codingset2 : v->codingset);
04332             if ((i>3) && (s->flags & CODEC_FLAG_GRAY))
04333                 continue;
04334             v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
04335             if (v->rangeredfrm)
04336                 for (j = 0; j < 64; j++)
04337                     s->block[i][j] <<= 1;
04338             off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
04339             off += v->cur_field_type ? ((i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0]) : 0;
04340             s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize);
04341             // TODO: yet to perform loop filter
04342         }
04343     } else {
04344         s->mb_intra = v->is_intra[s->mb_x] = 0;
04345         s->current_picture.f.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
04346         for (i = 0; i < 6; i++) v->mb_type[0][s->block_index[i]] = 0;
04347         if (v->fmb_is_raw)
04348             fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb);
04349         else
04350             fwd = v->forward_mb_plane[mb_pos];
04351         if (idx_mbmode <= 5) { // 1-MV
04352             dmv_x[0]     = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
04353             pred_flag[0] = pred_flag[1] = 0;
04354             if (fwd)
04355                 bmvtype = BMV_TYPE_FORWARD;
04356             else {
04357                 bmvtype = decode012(gb);
04358                 switch (bmvtype) {
04359                 case 0:
04360                     bmvtype = BMV_TYPE_BACKWARD;
04361                     break;
04362                 case 1:
04363                     bmvtype = BMV_TYPE_DIRECT;
04364                     break;
04365                 case 2:
04366                     bmvtype   = BMV_TYPE_INTERPOLATED;
04367                     interpmvp = get_bits1(gb);
04368                 }
04369             }
04370             v->bmvtype = bmvtype;
04371             if (bmvtype != BMV_TYPE_DIRECT && idx_mbmode & 1) {
04372                 get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
04373             }
04374             if (bmvtype == BMV_TYPE_INTERPOLATED && interpmvp) {
04375                 get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]);
04376             }
04377             if (bmvtype == BMV_TYPE_DIRECT) {
04378                 dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
04379                 dmv_x[1] = dmv_y[1] = pred_flag[0] = 0;
04380             }
04381             vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag);
04382             vc1_b_mc(v, dmv_x, dmv_y, (bmvtype == BMV_TYPE_DIRECT), bmvtype);
04383             mb_has_coeffs = !(idx_mbmode & 2);
04384         } else { // 4-MV
04385             if (fwd)
04386                 bmvtype = BMV_TYPE_FORWARD;
04387             v->bmvtype  = bmvtype;
04388             v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
04389             for (i = 0; i < 6; i++) {
04390                 if (i < 4) {
04391                     dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
04392                     dmv_x[1] = dmv_y[1] = pred_flag[1] = 0;
04393                     val = ((v->fourmvbp >> (3 - i)) & 1);
04394                     if (val) {
04395                         get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD],
04396                                                  &dmv_y[bmvtype == BMV_TYPE_BACKWARD],
04397                                              &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
04398                     }
04399                     vc1_pred_b_mv_intfi(v, i, dmv_x, dmv_y, 0, pred_flag);
04400                     vc1_mc_4mv_luma(v, i, bmvtype == BMV_TYPE_BACKWARD);
04401                 } else if (i == 4)
04402                     vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD);
04403             }
04404             mb_has_coeffs = idx_mbmode & 1;
04405         }
04406         if (mb_has_coeffs)
04407             cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
04408         if (cbp) {
04409             GET_MQUANT();
04410         }
04411         s->current_picture.f.qscale_table[mb_pos] = mquant;
04412         if (!v->ttmbf && cbp) {
04413             ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
04414         }
04415         dst_idx = 0;
04416         for (i = 0; i < 6; i++) {
04417             s->dc_val[0][s->block_index[i]] = 0;
04418             dst_idx += i >> 2;
04419             val = ((cbp >> (5 - i)) & 1);
04420             off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
04421             if (v->cur_field_type)
04422                 off += (i & 4) ? s->current_picture_ptr->f.linesize[1] : s->current_picture_ptr->f.linesize[0];
04423             if (val) {
04424                 vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
04425                                    first_block, s->dest[dst_idx] + off,
04426                                    (i & 4) ? s->uvlinesize : s->linesize,
04427                                    (i & 4) && (s->flags & CODEC_FLAG_GRAY), NULL);
04428                 if (!v->ttmbf && ttmb < 8)
04429                     ttmb = -1;
04430                 first_block = 0;
04431             }
04432         }
04433     }
04434 }
04435 
04438 static void vc1_decode_i_blocks(VC1Context *v)
04439 {
04440     int k, j;
04441     MpegEncContext *s = &v->s;
04442     int cbp, val;
04443     uint8_t *coded_val;
04444     int mb_pos;
04445 
04446     /* select codingmode used for VLC tables selection */
04447     switch (v->y_ac_table_index) {
04448     case 0:
04449         v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
04450         break;
04451     case 1:
04452         v->codingset = CS_HIGH_MOT_INTRA;
04453         break;
04454     case 2:
04455         v->codingset = CS_MID_RATE_INTRA;
04456         break;
04457     }
04458 
04459     switch (v->c_ac_table_index) {
04460     case 0:
04461         v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
04462         break;
04463     case 1:
04464         v->codingset2 = CS_HIGH_MOT_INTER;
04465         break;
04466     case 2:
04467         v->codingset2 = CS_MID_RATE_INTER;
04468         break;
04469     }
04470 
04471     /* Set DC scale - y and c use the same */
04472     s->y_dc_scale = s->y_dc_scale_table[v->pq];
04473     s->c_dc_scale = s->c_dc_scale_table[v->pq];
04474 
04475     //do frame decode
04476     s->mb_x = s->mb_y = 0;
04477     s->mb_intra         = 1;
04478     s->first_slice_line = 1;
04479     for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
04480         s->mb_x = 0;
04481         ff_init_block_index(s);
04482         for (; s->mb_x < s->mb_width; s->mb_x++) {
04483             uint8_t *dst[6];
04484             ff_update_block_index(s);
04485             dst[0] = s->dest[0];
04486             dst[1] = dst[0] + 8;
04487             dst[2] = s->dest[0] + s->linesize * 8;
04488             dst[3] = dst[2] + 8;
04489             dst[4] = s->dest[1];
04490             dst[5] = s->dest[2];
04491             s->dsp.clear_blocks(s->block[0]);
04492             mb_pos = s->mb_x + s->mb_y * s->mb_width;
04493             s->current_picture.f.mb_type[mb_pos]                     = MB_TYPE_INTRA;
04494             s->current_picture.f.qscale_table[mb_pos]                = v->pq;
04495             s->current_picture.f.motion_val[1][s->block_index[0]][0] = 0;
04496             s->current_picture.f.motion_val[1][s->block_index[0]][1] = 0;
04497 
04498             // do actual MB decoding and displaying
04499             cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
04500             v->s.ac_pred = get_bits1(&v->s.gb);
04501 
04502             for (k = 0; k < 6; k++) {
04503                 val = ((cbp >> (5 - k)) & 1);
04504 
04505                 if (k < 4) {
04506                     int pred   = vc1_coded_block_pred(&v->s, k, &coded_val);
04507                     val        = val ^ pred;
04508                     *coded_val = val;
04509                 }
04510                 cbp |= val << (5 - k);
04511 
04512                 vc1_decode_i_block(v, s->block[k], k, val, (k < 4) ? v->codingset : v->codingset2);
04513 
04514                 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
04515                     continue;
04516                 v->vc1dsp.vc1_inv_trans_8x8(s->block[k]);
04517                 if (v->pq >= 9 && v->overlap) {
04518                     if (v->rangeredfrm)
04519                         for (j = 0; j < 64; j++)
04520                             s->block[k][j] <<= 1;
04521                     s->dsp.put_signed_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
04522                 } else {
04523                     if (v->rangeredfrm)
04524                         for (j = 0; j < 64; j++)
04525                             s->block[k][j] = (s->block[k][j] - 64) << 1;
04526                     s->dsp.put_pixels_clamped(s->block[k], dst[k], k & 4 ? s->uvlinesize : s->linesize);
04527                 }
04528             }
04529 
04530             if (v->pq >= 9 && v->overlap) {
04531                 if (s->mb_x) {
04532                     v->vc1dsp.vc1_h_overlap(s->dest[0], s->linesize);
04533                     v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
04534                     if (!(s->flags & CODEC_FLAG_GRAY)) {
04535                         v->vc1dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
04536                         v->vc1dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
04537                     }
04538                 }
04539                 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
04540                 v->vc1dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
04541                 if (!s->first_slice_line) {
04542                     v->vc1dsp.vc1_v_overlap(s->dest[0], s->linesize);
04543                     v->vc1dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
04544                     if (!(s->flags & CODEC_FLAG_GRAY)) {
04545                         v->vc1dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
04546                         v->vc1dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
04547                     }
04548                 }
04549                 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
04550                 v->vc1dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
04551             }
04552             if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
04553 
04554             if (get_bits_count(&s->gb) > v->bits) {
04555                 ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
04556                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
04557                        get_bits_count(&s->gb), v->bits);
04558                 return;
04559             }
04560         }
04561         if (!v->s.loop_filter)
04562             ff_draw_horiz_band(s, s->mb_y * 16, 16);
04563         else if (s->mb_y)
04564             ff_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
04565 
04566         s->first_slice_line = 0;
04567     }
04568     if (v->s.loop_filter)
04569         ff_draw_horiz_band(s, (s->mb_height - 1) * 16, 16);
04570     ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
04571 }
04572 
04575 static void vc1_decode_i_blocks_adv(VC1Context *v)
04576 {
04577     int k;
04578     MpegEncContext *s = &v->s;
04579     int cbp, val;
04580     uint8_t *coded_val;
04581     int mb_pos;
04582     int mquant = v->pq;
04583     int mqdiff;
04584     GetBitContext *gb = &s->gb;
04585 
04586     /* select codingmode used for VLC tables selection */
04587     switch (v->y_ac_table_index) {
04588     case 0:
04589         v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
04590         break;
04591     case 1:
04592         v->codingset = CS_HIGH_MOT_INTRA;
04593         break;
04594     case 2:
04595         v->codingset = CS_MID_RATE_INTRA;
04596         break;
04597     }
04598 
04599     switch (v->c_ac_table_index) {
04600     case 0:
04601         v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
04602         break;
04603     case 1:
04604         v->codingset2 = CS_HIGH_MOT_INTER;
04605         break;
04606     case 2:
04607         v->codingset2 = CS_MID_RATE_INTER;
04608         break;
04609     }
04610 
04611     // do frame decode
04612     s->mb_x             = s->mb_y = 0;
04613     s->mb_intra         = 1;
04614     s->first_slice_line = 1;
04615     s->mb_y             = s->start_mb_y;
04616     if (s->start_mb_y) {
04617         s->mb_x = 0;
04618         ff_init_block_index(s);
04619         memset(&s->coded_block[s->block_index[0] - s->b8_stride], 0,
04620                (1 + s->b8_stride) * sizeof(*s->coded_block));
04621     }
04622     for (; s->mb_y < s->end_mb_y; s->mb_y++) {
04623         s->mb_x = 0;
04624         ff_init_block_index(s);
04625         for (;s->mb_x < s->mb_width; s->mb_x++) {
04626             DCTELEM (*block)[64] = v->block[v->cur_blk_idx];
04627             ff_update_block_index(s);
04628             s->dsp.clear_blocks(block[0]);
04629             mb_pos = s->mb_x + s->mb_y * s->mb_stride;
04630             s->current_picture.f.mb_type[mb_pos + v->mb_off]                         = MB_TYPE_INTRA;
04631             s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
04632             s->current_picture.f.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
04633 
04634             // do actual MB decoding and displaying
04635             if (v->fieldtx_is_raw)
04636                 v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb);
04637             cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
04638             if ( v->acpred_is_raw)
04639                 v->s.ac_pred = get_bits1(&v->s.gb);
04640             else
04641                 v->s.ac_pred = v->acpred_plane[mb_pos];
04642 
04643             if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
04644                 v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
04645 
04646             GET_MQUANT();
04647 
04648             s->current_picture.f.qscale_table[mb_pos] = mquant;
04649             /* Set DC scale - y and c use the same */
04650             s->y_dc_scale = s->y_dc_scale_table[mquant];
04651             s->c_dc_scale = s->c_dc_scale_table[mquant];
04652 
04653             for (k = 0; k < 6; k++) {
04654                 val = ((cbp >> (5 - k)) & 1);
04655 
04656                 if (k < 4) {
04657                     int pred   = vc1_coded_block_pred(&v->s, k, &coded_val);
04658                     val        = val ^ pred;
04659                     *coded_val = val;
04660                 }
04661                 cbp |= val << (5 - k);
04662 
04663                 v->a_avail = !s->first_slice_line || (k == 2 || k == 3);
04664                 v->c_avail = !!s->mb_x || (k == 1 || k == 3);
04665 
04666                 vc1_decode_i_block_adv(v, block[k], k, val,
04667                                        (k < 4) ? v->codingset : v->codingset2, mquant);
04668 
04669                 if (k > 3 && (s->flags & CODEC_FLAG_GRAY))
04670                     continue;
04671                 v->vc1dsp.vc1_inv_trans_8x8(block[k]);
04672             }
04673 
04674             vc1_smooth_overlap_filter_iblk(v);
04675             vc1_put_signed_blocks_clamped(v);
04676             if (v->s.loop_filter) vc1_loop_filter_iblk_delayed(v, v->pq);
04677 
04678             if (get_bits_count(&s->gb) > v->bits) {
04679                 // TODO: may need modification to handle slice coding
04680                 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
04681                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
04682                        get_bits_count(&s->gb), v->bits);
04683                 return;
04684             }
04685         }
04686         if (!v->s.loop_filter)
04687             ff_draw_horiz_band(s, s->mb_y * 16, 16);
04688         else if (s->mb_y)
04689             ff_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
04690         s->first_slice_line = 0;
04691     }
04692 
04693     /* raw bottom MB row */
04694     s->mb_x = 0;
04695     ff_init_block_index(s);
04696     for (;s->mb_x < s->mb_width; s->mb_x++) {
04697         ff_update_block_index(s);
04698         vc1_put_signed_blocks_clamped(v);
04699         if (v->s.loop_filter)
04700             vc1_loop_filter_iblk_delayed(v, v->pq);
04701     }
04702     if (v->s.loop_filter)
04703         ff_draw_horiz_band(s, (s->end_mb_y-1)*16, 16);
04704     ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
04705                     (s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END));
04706 }
04707 
04708 static void vc1_decode_p_blocks(VC1Context *v)
04709 {
04710     MpegEncContext *s = &v->s;
04711     int apply_loop_filter;
04712 
04713     /* select codingmode used for VLC tables selection */
04714     switch (v->c_ac_table_index) {
04715     case 0:
04716         v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
04717         break;
04718     case 1:
04719         v->codingset = CS_HIGH_MOT_INTRA;
04720         break;
04721     case 2:
04722         v->codingset = CS_MID_RATE_INTRA;
04723         break;
04724     }
04725 
04726     switch (v->c_ac_table_index) {
04727     case 0:
04728         v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
04729         break;
04730     case 1:
04731         v->codingset2 = CS_HIGH_MOT_INTER;
04732         break;
04733     case 2:
04734         v->codingset2 = CS_MID_RATE_INTER;
04735         break;
04736     }
04737 
04738     apply_loop_filter   = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
04739     s->first_slice_line = 1;
04740     memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
04741     for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
04742         s->mb_x = 0;
04743         ff_init_block_index(s);
04744         for (; s->mb_x < s->mb_width; s->mb_x++) {
04745             ff_update_block_index(s);
04746 
04747             if (v->fcm == ILACE_FIELD)
04748                 vc1_decode_p_mb_intfi(v);
04749             else if (v->fcm == ILACE_FRAME)
04750                 vc1_decode_p_mb_intfr(v);
04751             else vc1_decode_p_mb(v);
04752             if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == PROGRESSIVE)
04753                 vc1_apply_p_loop_filter(v);
04754             if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
04755                 // TODO: may need modification to handle slice coding
04756                 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
04757                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
04758                        get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
04759                 return;
04760             }
04761         }
04762         memmove(v->cbp_base,      v->cbp,      sizeof(v->cbp_base[0])      * s->mb_stride);
04763         memmove(v->ttblk_base,    v->ttblk,    sizeof(v->ttblk_base[0])    * s->mb_stride);
04764         memmove(v->is_intra_base, v->is_intra, sizeof(v->is_intra_base[0]) * s->mb_stride);
04765         memmove(v->luma_mv_base,  v->luma_mv,  sizeof(v->luma_mv_base[0])  * s->mb_stride);
04766         if (s->mb_y != s->start_mb_y) ff_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
04767         s->first_slice_line = 0;
04768     }
04769     if (apply_loop_filter) {
04770         s->mb_x = 0;
04771         ff_init_block_index(s);
04772         for (; s->mb_x < s->mb_width; s->mb_x++) {
04773             ff_update_block_index(s);
04774             vc1_apply_p_loop_filter(v);
04775         }
04776     }
04777     if (s->end_mb_y >= s->start_mb_y)
04778         ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
04779     ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
04780                     (s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END));
04781 }
04782 
04783 static void vc1_decode_b_blocks(VC1Context *v)
04784 {
04785     MpegEncContext *s = &v->s;
04786 
04787     /* select codingmode used for VLC tables selection */
04788     switch (v->c_ac_table_index) {
04789     case 0:
04790         v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
04791         break;
04792     case 1:
04793         v->codingset = CS_HIGH_MOT_INTRA;
04794         break;
04795     case 2:
04796         v->codingset = CS_MID_RATE_INTRA;
04797         break;
04798     }
04799 
04800     switch (v->c_ac_table_index) {
04801     case 0:
04802         v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
04803         break;
04804     case 1:
04805         v->codingset2 = CS_HIGH_MOT_INTER;
04806         break;
04807     case 2:
04808         v->codingset2 = CS_MID_RATE_INTER;
04809         break;
04810     }
04811 
04812     s->first_slice_line = 1;
04813     for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
04814         s->mb_x = 0;
04815         ff_init_block_index(s);
04816         for (; s->mb_x < s->mb_width; s->mb_x++) {
04817             ff_update_block_index(s);
04818 
04819             if (v->fcm == ILACE_FIELD)
04820                 vc1_decode_b_mb_intfi(v);
04821             else
04822                 vc1_decode_b_mb(v);
04823             if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
04824                 // TODO: may need modification to handle slice coding
04825                 ff_er_add_slice(s, 0, s->start_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR));
04826                 av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
04827                        get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y);
04828                 return;
04829             }
04830             if (v->s.loop_filter) vc1_loop_filter_iblk(v, v->pq);
04831         }
04832         if (!v->s.loop_filter)
04833             ff_draw_horiz_band(s, s->mb_y * 16, 16);
04834         else if (s->mb_y)
04835             ff_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
04836         s->first_slice_line = 0;
04837     }
04838     if (v->s.loop_filter)
04839         ff_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
04840     ff_er_add_slice(s, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
04841                     (s->end_mb_y << v->field_mode) - 1, (AC_END|DC_END|MV_END));
04842 }
04843 
04844 static void vc1_decode_skip_blocks(VC1Context *v)
04845 {
04846     MpegEncContext *s = &v->s;
04847 
04848     ff_er_add_slice(s, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, (AC_END|DC_END|MV_END));
04849     s->first_slice_line = 1;
04850     for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
04851         s->mb_x = 0;
04852         ff_init_block_index(s);
04853         ff_update_block_index(s);
04854         memcpy(s->dest[0], s->last_picture.f.data[0] + s->mb_y * 16 * s->linesize,   s->linesize   * 16);
04855         memcpy(s->dest[1], s->last_picture.f.data[1] + s->mb_y *  8 * s->uvlinesize, s->uvlinesize *  8);
04856         memcpy(s->dest[2], s->last_picture.f.data[2] + s->mb_y *  8 * s->uvlinesize, s->uvlinesize *  8);
04857         ff_draw_horiz_band(s, s->mb_y * 16, 16);
04858         s->first_slice_line = 0;
04859     }
04860     s->pict_type = AV_PICTURE_TYPE_P;
04861 }
04862 
04863 static void vc1_decode_blocks(VC1Context *v)
04864 {
04865 
04866     v->s.esc3_level_length = 0;
04867     if (v->x8_type) {
04868         ff_intrax8_decode_picture(&v->x8, 2*v->pq + v->halfpq, v->pq * !v->pquantizer);
04869     } else {
04870         v->cur_blk_idx     =  0;
04871         v->left_blk_idx    = -1;
04872         v->topleft_blk_idx =  1;
04873         v->top_blk_idx     =  2;
04874         switch (v->s.pict_type) {
04875         case AV_PICTURE_TYPE_I:
04876             if (v->profile == PROFILE_ADVANCED)
04877                 vc1_decode_i_blocks_adv(v);
04878             else
04879                 vc1_decode_i_blocks(v);
04880             break;
04881         case AV_PICTURE_TYPE_P:
04882             if (v->p_frame_skipped)
04883                 vc1_decode_skip_blocks(v);
04884             else
04885                 vc1_decode_p_blocks(v);
04886             break;
04887         case AV_PICTURE_TYPE_B:
04888             if (v->bi_type) {
04889                 if (v->profile == PROFILE_ADVANCED)
04890                     vc1_decode_i_blocks_adv(v);
04891                 else
04892                     vc1_decode_i_blocks(v);
04893             } else
04894                 vc1_decode_b_blocks(v);
04895             break;
04896         }
04897     }
04898 }
04899 
04900 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
04901 
04902 typedef struct {
04914     int coefs[2][7];
04915 
04916     int effect_type, effect_flag;
04917     int effect_pcount1, effect_pcount2;   
04918     int effect_params1[15], effect_params2[10]; 
04919 } SpriteData;
04920 
04921 static inline int get_fp_val(GetBitContext* gb)
04922 {
04923     return (get_bits_long(gb, 30) - (1 << 29)) << 1;
04924 }
04925 
04926 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
04927 {
04928     c[1] = c[3] = 0;
04929 
04930     switch (get_bits(gb, 2)) {
04931     case 0:
04932         c[0] = 1 << 16;
04933         c[2] = get_fp_val(gb);
04934         c[4] = 1 << 16;
04935         break;
04936     case 1:
04937         c[0] = c[4] = get_fp_val(gb);
04938         c[2] = get_fp_val(gb);
04939         break;
04940     case 2:
04941         c[0] = get_fp_val(gb);
04942         c[2] = get_fp_val(gb);
04943         c[4] = get_fp_val(gb);
04944         break;
04945     case 3:
04946         c[0] = get_fp_val(gb);
04947         c[1] = get_fp_val(gb);
04948         c[2] = get_fp_val(gb);
04949         c[3] = get_fp_val(gb);
04950         c[4] = get_fp_val(gb);
04951         break;
04952     }
04953     c[5] = get_fp_val(gb);
04954     if (get_bits1(gb))
04955         c[6] = get_fp_val(gb);
04956     else
04957         c[6] = 1 << 16;
04958 }
04959 
04960 static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
04961 {
04962     AVCodecContext *avctx = v->s.avctx;
04963     int sprite, i;
04964 
04965     for (sprite = 0; sprite <= v->two_sprites; sprite++) {
04966         vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
04967         if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
04968             av_log_ask_for_sample(avctx, "Rotation coefficients are not zero");
04969         av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
04970         for (i = 0; i < 7; i++)
04971             av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
04972                    sd->coefs[sprite][i] / (1<<16),
04973                    (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1 << 16));
04974         av_log(avctx, AV_LOG_DEBUG, "\n");
04975     }
04976 
04977     skip_bits(gb, 2);
04978     if (sd->effect_type = get_bits_long(gb, 30)) {
04979         switch (sd->effect_pcount1 = get_bits(gb, 4)) {
04980         case 7:
04981             vc1_sprite_parse_transform(gb, sd->effect_params1);
04982             break;
04983         case 14:
04984             vc1_sprite_parse_transform(gb, sd->effect_params1);
04985             vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
04986             break;
04987         default:
04988             for (i = 0; i < sd->effect_pcount1; i++)
04989                 sd->effect_params1[i] = get_fp_val(gb);
04990         }
04991         if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
04992             // effect 13 is simple alpha blending and matches the opacity above
04993             av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
04994             for (i = 0; i < sd->effect_pcount1; i++)
04995                 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
04996                        sd->effect_params1[i] / (1 << 16),
04997                        (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1 << 16));
04998             av_log(avctx, AV_LOG_DEBUG, "\n");
04999         }
05000 
05001         sd->effect_pcount2 = get_bits(gb, 16);
05002         if (sd->effect_pcount2 > 10) {
05003             av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
05004             return;
05005         } else if (sd->effect_pcount2) {
05006             i = -1;
05007             av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
05008             while (++i < sd->effect_pcount2) {
05009                 sd->effect_params2[i] = get_fp_val(gb);
05010                 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
05011                        sd->effect_params2[i] / (1 << 16),
05012                        (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1 << 16));
05013             }
05014             av_log(avctx, AV_LOG_DEBUG, "\n");
05015         }
05016     }
05017     if (sd->effect_flag = get_bits1(gb))
05018         av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
05019 
05020     if (get_bits_count(gb) >= gb->size_in_bits +
05021        (avctx->codec_id == CODEC_ID_WMV3IMAGE ? 64 : 0))
05022         av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
05023     if (get_bits_count(gb) < gb->size_in_bits - 8)
05024         av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
05025 }
05026 
05027 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
05028 {
05029     int i, plane, row, sprite;
05030     int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
05031     uint8_t* src_h[2][2];
05032     int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
05033     int ysub[2];
05034     MpegEncContext *s = &v->s;
05035 
05036     for (i = 0; i < 2; i++) {
05037         xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
05038         xadv[i] = sd->coefs[i][0];
05039         if (xadv[i] != 1<<16 || (v->sprite_width << 16) - (v->output_width << 16) - xoff[i])
05040             xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
05041 
05042         yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
05043         yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height << 16) - yoff[i]) / v->output_height);
05044     }
05045     alpha = av_clip(sd->coefs[1][6], 0, (1<<16) - 1);
05046 
05047     for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++) {
05048         int width = v->output_width>>!!plane;
05049 
05050         for (row = 0; row < v->output_height>>!!plane; row++) {
05051             uint8_t *dst = v->sprite_output_frame.data[plane] +
05052                            v->sprite_output_frame.linesize[plane] * row;
05053 
05054             for (sprite = 0; sprite <= v->two_sprites; sprite++) {
05055                 uint8_t *iplane = s->current_picture.f.data[plane];
05056                 int      iline  = s->current_picture.f.linesize[plane];
05057                 int      ycoord = yoff[sprite] + yadv[sprite] * row;
05058                 int      yline  = ycoord >> 16;
05059                 ysub[sprite] = ycoord & 0xFFFF;
05060                 if (sprite) {
05061                     iplane = s->last_picture.f.data[plane];
05062                     iline  = s->last_picture.f.linesize[plane];
05063                 }
05064                 if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
05065                         src_h[sprite][0] = iplane + (xoff[sprite] >> 16) +  yline      * iline;
05066                     if (ysub[sprite])
05067                         src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + (yline + 1) * iline;
05068                 } else {
05069                     if (sr_cache[sprite][0] != yline) {
05070                         if (sr_cache[sprite][1] == yline) {
05071                             FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
05072                             FFSWAP(int,        sr_cache[sprite][0],   sr_cache[sprite][1]);
05073                         } else {
05074                             v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
05075                             sr_cache[sprite][0] = yline;
05076                         }
05077                     }
05078                     if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
05079                         v->vc1dsp.sprite_h(v->sr_rows[sprite][1], iplane + (yline + 1) * iline, xoff[sprite], xadv[sprite], width);
05080                         sr_cache[sprite][1] = yline + 1;
05081                     }
05082                     src_h[sprite][0] = v->sr_rows[sprite][0];
05083                     src_h[sprite][1] = v->sr_rows[sprite][1];
05084                 }
05085             }
05086 
05087             if (!v->two_sprites) {
05088                 if (ysub[0]) {
05089                     v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
05090                 } else {
05091                     memcpy(dst, src_h[0][0], width);
05092                 }
05093             } else {
05094                 if (ysub[0] && ysub[1]) {
05095                     v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
05096                                                        src_h[1][0], src_h[1][1], ysub[1], alpha, width);
05097                 } else if (ysub[0]) {
05098                     v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
05099                                                        src_h[1][0], alpha, width);
05100                 } else if (ysub[1]) {
05101                     v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
05102                                                        src_h[0][0], (1<<16)-1-alpha, width);
05103                 } else {
05104                     v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
05105                 }
05106             }
05107         }
05108 
05109         if (!plane) {
05110             for (i = 0; i < 2; i++) {
05111                 xoff[i] >>= 1;
05112                 yoff[i] >>= 1;
05113             }
05114         }
05115 
05116     }
05117 }
05118 
05119 
05120 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
05121 {
05122     MpegEncContext *s     = &v->s;
05123     AVCodecContext *avctx = s->avctx;
05124     SpriteData sd;
05125 
05126     vc1_parse_sprites(v, gb, &sd);
05127 
05128     if (!s->current_picture.f.data[0]) {
05129         av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
05130         return -1;
05131     }
05132 
05133     if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f.data[0])) {
05134         av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
05135         v->two_sprites = 0;
05136     }
05137 
05138     if (v->sprite_output_frame.data[0])
05139         avctx->release_buffer(avctx, &v->sprite_output_frame);
05140 
05141     v->sprite_output_frame.buffer_hints = FF_BUFFER_HINTS_VALID;
05142     v->sprite_output_frame.reference = 0;
05143     if (avctx->get_buffer(avctx, &v->sprite_output_frame) < 0) {
05144         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
05145         return -1;
05146     }
05147 
05148     vc1_draw_sprites(v, &sd);
05149 
05150     return 0;
05151 }
05152 
05153 static void vc1_sprite_flush(AVCodecContext *avctx)
05154 {
05155     VC1Context *v     = avctx->priv_data;
05156     MpegEncContext *s = &v->s;
05157     AVFrame *f = &s->current_picture.f;
05158     int plane, i;
05159 
05160     /* Windows Media Image codecs have a convergence interval of two keyframes.
05161        Since we can't enforce it, clear to black the missing sprite. This is
05162        wrong but it looks better than doing nothing. */
05163 
05164     if (f->data[0])
05165         for (plane = 0; plane < (s->flags&CODEC_FLAG_GRAY ? 1 : 3); plane++)
05166             for (i = 0; i < v->sprite_height>>!!plane; i++)
05167                 memset(f->data[plane] + i * f->linesize[plane],
05168                        plane ? 128 : 0, f->linesize[plane]);
05169 }
05170 
05171 #endif
05172 
05173 static av_cold int vc1_decode_init_alloc_tables(VC1Context *v)
05174 {
05175     MpegEncContext *s = &v->s;
05176     int i;
05177 
05178     /* Allocate mb bitplanes */
05179     v->mv_type_mb_plane = av_malloc (s->mb_stride * s->mb_height);
05180     v->direct_mb_plane  = av_malloc (s->mb_stride * s->mb_height);
05181     v->forward_mb_plane = av_malloc (s->mb_stride * s->mb_height);
05182     v->fieldtx_plane    = av_mallocz(s->mb_stride * s->mb_height);
05183     v->acpred_plane     = av_malloc (s->mb_stride * s->mb_height);
05184     v->over_flags_plane = av_malloc (s->mb_stride * s->mb_height);
05185 
05186     v->n_allocated_blks = s->mb_width + 2;
05187     v->block            = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
05188     v->cbp_base         = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
05189     v->cbp              = v->cbp_base + s->mb_stride;
05190     v->ttblk_base       = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
05191     v->ttblk            = v->ttblk_base + s->mb_stride;
05192     v->is_intra_base    = av_mallocz(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
05193     v->is_intra         = v->is_intra_base + s->mb_stride;
05194     v->luma_mv_base     = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
05195     v->luma_mv          = v->luma_mv_base + s->mb_stride;
05196 
05197     /* allocate block type info in that way so it could be used with s->block_index[] */
05198     v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
05199     v->mb_type[0]   = v->mb_type_base + s->b8_stride + 1;
05200     v->mb_type[1]   = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
05201     v->mb_type[2]   = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);
05202 
05203     /* allocate memory to store block level MV info */
05204     v->blk_mv_type_base = av_mallocz(     s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
05205     v->blk_mv_type      = v->blk_mv_type_base + s->b8_stride + 1;
05206     v->mv_f_base        = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
05207     v->mv_f[0]          = v->mv_f_base + s->b8_stride + 1;
05208     v->mv_f[1]          = v->mv_f[0] + (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
05209     v->mv_f_last_base   = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
05210     v->mv_f_last[0]     = v->mv_f_last_base + s->b8_stride + 1;
05211     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);
05212     v->mv_f_next_base   = av_mallocz(2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
05213     v->mv_f_next[0]     = v->mv_f_next_base + s->b8_stride + 1;
05214     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);
05215 
05216     /* Init coded blocks info */
05217     if (v->profile == PROFILE_ADVANCED) {
05218 //        if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
05219 //            return -1;
05220 //        if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
05221 //            return -1;
05222     }
05223 
05224     ff_intrax8_common_init(&v->x8,s);
05225 
05226     if (s->avctx->codec_id == CODEC_ID_WMV3IMAGE || s->avctx->codec_id == CODEC_ID_VC1IMAGE) {
05227         for (i = 0; i < 4; i++)
05228             if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width))) return -1;
05229     }
05230 
05231     if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane ||
05232         !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base ||
05233         !v->mb_type_base)
05234             return -1;
05235 
05236     return 0;
05237 }
05238 
05243 static av_cold int vc1_decode_init(AVCodecContext *avctx)
05244 {
05245     VC1Context *v = avctx->priv_data;
05246     MpegEncContext *s = &v->s;
05247     GetBitContext gb;
05248     int i;
05249 
05250     /* save the container output size for WMImage */
05251     v->output_width  = avctx->width;
05252     v->output_height = avctx->height;
05253 
05254     if (!avctx->extradata_size || !avctx->extradata)
05255         return -1;
05256     if (!(avctx->flags & CODEC_FLAG_GRAY))
05257         avctx->pix_fmt = avctx->get_format(avctx, avctx->codec->pix_fmts);
05258     else
05259         avctx->pix_fmt = PIX_FMT_GRAY8;
05260     avctx->hwaccel = ff_find_hwaccel(avctx->codec->id, avctx->pix_fmt);
05261     v->s.avctx = avctx;
05262     avctx->flags |= CODEC_FLAG_EMU_EDGE;
05263     v->s.flags   |= CODEC_FLAG_EMU_EDGE;
05264 
05265     if (avctx->idct_algo == FF_IDCT_AUTO) {
05266         avctx->idct_algo = FF_IDCT_WMV2;
05267     }
05268 
05269     if (vc1_init_common(v) < 0)
05270         return -1;
05271     ff_vc1dsp_init(&v->vc1dsp);
05272 
05273     if (avctx->codec_id == CODEC_ID_WMV3 || avctx->codec_id == CODEC_ID_WMV3IMAGE) {
05274         int count = 0;
05275 
05276         // looks like WMV3 has a sequence header stored in the extradata
05277         // advanced sequence header may be before the first frame
05278         // the last byte of the extradata is a version number, 1 for the
05279         // samples we can decode
05280 
05281         init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
05282 
05283         if (vc1_decode_sequence_header(avctx, v, &gb) < 0)
05284           return -1;
05285 
05286         count = avctx->extradata_size*8 - get_bits_count(&gb);
05287         if (count > 0) {
05288             av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
05289                    count, get_bits(&gb, count));
05290         } else if (count < 0) {
05291             av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
05292         }
05293     } else { // VC1/WVC1/WVP2
05294         const uint8_t *start = avctx->extradata;
05295         uint8_t *end = avctx->extradata + avctx->extradata_size;
05296         const uint8_t *next;
05297         int size, buf2_size;
05298         uint8_t *buf2 = NULL;
05299         int seq_initialized = 0, ep_initialized = 0;
05300 
05301         if (avctx->extradata_size < 16) {
05302             av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
05303             return -1;
05304         }
05305 
05306         buf2  = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
05307         start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
05308         next  = start;
05309         for (; next < end; start = next) {
05310             next = find_next_marker(start + 4, end);
05311             size = next - start - 4;
05312             if (size <= 0)
05313                 continue;
05314             buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
05315             init_get_bits(&gb, buf2, buf2_size * 8);
05316             switch (AV_RB32(start)) {
05317             case VC1_CODE_SEQHDR:
05318                 if (vc1_decode_sequence_header(avctx, v, &gb) < 0) {
05319                     av_free(buf2);
05320                     return -1;
05321                 }
05322                 seq_initialized = 1;
05323                 break;
05324             case VC1_CODE_ENTRYPOINT:
05325                 if (vc1_decode_entry_point(avctx, v, &gb) < 0) {
05326                     av_free(buf2);
05327                     return -1;
05328                 }
05329                 ep_initialized = 1;
05330                 break;
05331             }
05332         }
05333         av_free(buf2);
05334         if (!seq_initialized || !ep_initialized) {
05335             av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
05336             return -1;
05337         }
05338         v->res_sprite = (avctx->codec_tag == MKTAG('W','V','P','2'));
05339     }
05340 
05341     avctx->profile = v->profile;
05342     if (v->profile == PROFILE_ADVANCED)
05343         avctx->level = v->level;
05344 
05345     avctx->has_b_frames = !!(avctx->max_b_frames);
05346 
05347     s->mb_width  = (avctx->coded_width  + 15) >> 4;
05348     s->mb_height = (avctx->coded_height + 15) >> 4;
05349 
05350     if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
05351         for (i = 0; i < 64; i++) {
05352 #define transpose(x) ((x >> 3) | ((x & 7) << 3))
05353             v->zz_8x8[0][i] = transpose(wmv1_scantable[0][i]);
05354             v->zz_8x8[1][i] = transpose(wmv1_scantable[1][i]);
05355             v->zz_8x8[2][i] = transpose(wmv1_scantable[2][i]);
05356             v->zz_8x8[3][i] = transpose(wmv1_scantable[3][i]);
05357             v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
05358         }
05359         v->left_blk_sh = 0;
05360         v->top_blk_sh  = 3;
05361     } else {
05362         memcpy(v->zz_8x8, wmv1_scantable, 4*64);
05363         v->left_blk_sh = 3;
05364         v->top_blk_sh  = 0;
05365     }
05366 
05367     if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
05368         v->sprite_width  = avctx->coded_width;
05369         v->sprite_height = avctx->coded_height;
05370 
05371         avctx->coded_width  = avctx->width  = v->output_width;
05372         avctx->coded_height = avctx->height = v->output_height;
05373 
05374         // prevent 16.16 overflows
05375         if (v->sprite_width  > 1 << 14 ||
05376             v->sprite_height > 1 << 14 ||
05377             v->output_width  > 1 << 14 ||
05378             v->output_height > 1 << 14) return -1;
05379     }
05380     return 0;
05381 }
05382 
05386 static av_cold int vc1_decode_end(AVCodecContext *avctx)
05387 {
05388     VC1Context *v = avctx->priv_data;
05389     int i;
05390 
05391     if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
05392         && v->sprite_output_frame.data[0])
05393         avctx->release_buffer(avctx, &v->sprite_output_frame);
05394     for (i = 0; i < 4; i++)
05395         av_freep(&v->sr_rows[i >> 1][i & 1]);
05396     av_freep(&v->hrd_rate);
05397     av_freep(&v->hrd_buffer);
05398     MPV_common_end(&v->s);
05399     av_freep(&v->mv_type_mb_plane);
05400     av_freep(&v->direct_mb_plane);
05401     av_freep(&v->forward_mb_plane);
05402     av_freep(&v->fieldtx_plane);
05403     av_freep(&v->acpred_plane);
05404     av_freep(&v->over_flags_plane);
05405     av_freep(&v->mb_type_base);
05406     av_freep(&v->blk_mv_type_base);
05407     av_freep(&v->mv_f_base);
05408     av_freep(&v->mv_f_last_base);
05409     av_freep(&v->mv_f_next_base);
05410     av_freep(&v->block);
05411     av_freep(&v->cbp_base);
05412     av_freep(&v->ttblk_base);
05413     av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
05414     av_freep(&v->luma_mv_base);
05415     ff_intrax8_common_end(&v->x8);
05416     return 0;
05417 }
05418 
05419 
05423 static int vc1_decode_frame(AVCodecContext *avctx, void *data,
05424                             int *data_size, AVPacket *avpkt)
05425 {
05426     const uint8_t *buf = avpkt->data;
05427     int buf_size = avpkt->size, n_slices = 0, i;
05428     VC1Context *v = avctx->priv_data;
05429     MpegEncContext *s = &v->s;
05430     AVFrame *pict = data;
05431     uint8_t *buf2 = NULL;
05432     uint8_t *buf_field2 = NULL;
05433     const uint8_t *buf_start = buf;
05434     int mb_height, n_slices1=-1;
05435     struct {
05436         uint8_t *buf;
05437         GetBitContext gb;
05438         int mby_start;
05439     } *slices = NULL;
05440 
05441     if(s->flags & CODEC_FLAG_LOW_DELAY)
05442         s->low_delay = 1;
05443 
05444     /* no supplementary picture */
05445     if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
05446         /* special case for last picture */
05447         if (s->low_delay == 0 && s->next_picture_ptr) {
05448             *pict = *(AVFrame*)s->next_picture_ptr;
05449             s->next_picture_ptr = NULL;
05450 
05451             *data_size = sizeof(AVFrame);
05452         }
05453 
05454         return 0;
05455     }
05456 
05457     if (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
05458         if (v->profile < PROFILE_ADVANCED)
05459             avctx->pix_fmt = PIX_FMT_VDPAU_WMV3;
05460         else
05461             avctx->pix_fmt = PIX_FMT_VDPAU_VC1;
05462     }
05463 
05464     //for advanced profile we may need to parse and unescape data
05465     if (avctx->codec_id == CODEC_ID_VC1 || avctx->codec_id == CODEC_ID_VC1IMAGE) {
05466         int buf_size2 = 0;
05467         buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
05468 
05469         if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
05470             const uint8_t *start, *end, *next;
05471             int size;
05472 
05473             next = buf;
05474             for (start = buf, end = buf + buf_size; next < end; start = next) {
05475                 next = find_next_marker(start + 4, end);
05476                 size = next - start - 4;
05477                 if (size <= 0) continue;
05478                 switch (AV_RB32(start)) {
05479                 case VC1_CODE_FRAME:
05480                     if (avctx->hwaccel ||
05481                         s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
05482                         buf_start = start;
05483                     buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
05484                     break;
05485                 case VC1_CODE_FIELD: {
05486                     int buf_size3;
05487                     slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
05488                     if (!slices)
05489                         goto err;
05490                     slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
05491                     if (!slices[n_slices].buf)
05492                         goto err;
05493                     buf_size3 = vc1_unescape_buffer(start + 4, size,
05494                                                     slices[n_slices].buf);
05495                     init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
05496                                   buf_size3 << 3);
05497                     /* assuming that the field marker is at the exact middle,
05498                        hope it's correct */
05499                     slices[n_slices].mby_start = s->mb_height >> 1;
05500                     n_slices1 = n_slices - 1; // index of the last slice of the first field
05501                     n_slices++;
05502                     // not necessary, ad hoc until I find a way to handle WVC1i
05503                     buf_field2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
05504                     vc1_unescape_buffer(start + 4, size, buf_field2);
05505                     break;
05506                 }
05507                 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
05508                     buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
05509                     init_get_bits(&s->gb, buf2, buf_size2 * 8);
05510                     vc1_decode_entry_point(avctx, v, &s->gb);
05511                     break;
05512                 case VC1_CODE_SLICE: {
05513                     int buf_size3;
05514                     slices = av_realloc(slices, sizeof(*slices) * (n_slices+1));
05515                     if (!slices)
05516                         goto err;
05517                     slices[n_slices].buf = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
05518                     if (!slices[n_slices].buf)
05519                         goto err;
05520                     buf_size3 = vc1_unescape_buffer(start + 4, size,
05521                                                     slices[n_slices].buf);
05522                     init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
05523                                   buf_size3 << 3);
05524                     slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
05525                     n_slices++;
05526                     break;
05527                 }
05528                 }
05529             }
05530         } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
05531             const uint8_t *divider;
05532 
05533             divider = find_next_marker(buf, buf + buf_size);
05534             if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
05535                 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
05536                 goto err;
05537             } else { // found field marker, unescape second field
05538                 buf_field2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
05539                 vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, buf_field2);
05540             }
05541             buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
05542         } else {
05543             buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
05544         }
05545         init_get_bits(&s->gb, buf2, buf_size2*8);
05546     } else
05547         init_get_bits(&s->gb, buf, buf_size*8);
05548 
05549     if (v->res_sprite) {
05550         v->new_sprite  = !get_bits1(&s->gb);
05551         v->two_sprites =  get_bits1(&s->