00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
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 
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     
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             
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             
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             
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             
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             
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             
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             
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     
00190     v->pq      = -1;
00191     v->mvrange = 0; 
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 }; 
00217 
00218  
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     
00229 
00230 
00231 
00232 
00233 
00234 
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     
00331 
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     
00404 
00405 
00406 
00407 
00408 
00409 
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     
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     
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) { 
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     
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         
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         
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 { 
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     
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) {  
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         
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         
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         
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 { 
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     
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; 
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     
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         
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         
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     
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; 
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         
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             
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 , 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 , 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 )
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 , 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 ,
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 ,
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     
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) { 
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         
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     
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         
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)) {     
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     
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) { 
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; 
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) { 
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     
01765     if (s->mb_x || (n == 1) || (n == 3)) {
01766         if ((v->blk_mv_type[xy]) 
01767             || (!v->blk_mv_type[xy] && !v->blk_mv_type[xy - 1])) { 
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 { 
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     
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     
01849     if (!s->mb_x && !(n == 1 || n == 3)) {
01850         A[0] = A[1] = 0;
01851     }
01852     
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                 
01893 
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     
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) { 
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) { 
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     
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         
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 { 
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     
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     
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         
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) { 
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) { 
02221             px = C[0];
02222             py = C[1];
02223         } else {
02224             px = py = 0;
02225         }
02226         
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         
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         
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) { 
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) { 
02300             px = C[0];
02301             py = C[1];
02302         } else {
02303             px = py = 0;
02304         }
02305         
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         
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         
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) { 
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 { 
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     
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     
02455 
02456 
02457     c = dc_val[ - 1];
02458     b = dc_val[ - 1 - wrap];
02459     a = dc_val[ - wrap];
02460 
02461     if (pq < 9 || !overlap) {
02462         
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         
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; 
02478     } else {
02479         pred     = a;
02480         *dir_ptr = 0; 
02481     }
02482 
02483     
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     
02513 
02514 
02515     c = dc_val[ - 1];
02516     b = dc_val[ - 1 - wrap];
02517     a = dc_val[ - wrap];
02518     
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; 
02545         } else {
02546             pred     = a;
02547             *dir_ptr = 0; 
02548         }
02549     } else if (a_avail) {
02550         pred     = a;
02551         *dir_ptr = 0; 
02552     } else if (c_avail) {
02553         pred     = c;
02554         *dir_ptr = 1; 
02555     } else {
02556         pred     = 0;
02557         *dir_ptr = 1; 
02558     }
02559 
02560     
02561     *dc_val_ptr = &dc_val[0];
02562     return pred;
02563 }
02564  
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     
02582 
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     
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) { 
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 { 
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; 
02681     int i;
02682     int16_t *dc_val;
02683     int16_t *ac_val, *ac_val2;
02684     int dcdiff;
02685 
02686     
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 ) {
02698             
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     
02713     dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
02714     *dc_val = dcdiff;
02715 
02716     
02717     if (n < 4) {
02718         block[0] = dcdiff * s->y_dc_scale;
02719     } else {
02720         block[0] = dcdiff * s->c_dc_scale;
02721     }
02722     
02723     if (!coded) {
02724         goto not_coded;
02725     }
02726 
02727     
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) 
02749             ac_val -= 16;
02750         else 
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         
02762         if (s->ac_pred) {
02763             if (dc_pred_dir) { 
02764                 for (k = 1; k < 8; k++)
02765                     block[k << v->left_blk_sh] += ac_val[k];
02766             } else { 
02767                 for (k = 1; k < 8; k++)
02768                     block[k << v->top_blk_sh] += ac_val[k + 8];
02769             }
02770         }
02771         
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         
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) { 
02798             ac_val -= 16;
02799             if (s->ac_pred)
02800                 memcpy(ac_val2, ac_val, 8 * 2);
02801         } else { 
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         
02808         if (s->ac_pred) {
02809             if (dc_pred_dir) { 
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 { 
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; 
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     
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 ) {
02866             
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     
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     
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     
02892     i = 1;
02893 
02894     
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) 
02903         ac_val -= 16;
02904     else 
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) 
02929                     zz_table = v->zz_8x8[2];
02930                 else 
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         
02949         if (use_pred) {
02950             
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) { 
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 { 
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) { 
02964                     for (k = 1; k < 8; k++)
02965                         block[k << v->left_blk_sh] += ac_val[k];
02966                 } else { 
02967                     for (k = 1; k < 8; k++)
02968                         block[k << v->top_blk_sh] += ac_val[k + 8];
02969                 }
02970             }
02971         }
02972         
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         
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 { 
02988         int k;
02989 
02990         memset(ac_val2, 0, 16 * 2);
02991         if (dc_pred_dir) { 
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 { 
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         
03014         if (use_pred) {
03015             if (dc_pred_dir) { 
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 { 
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; 
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     
03063     mquant = (mquant < 1) ? 0 : ((mquant > 31) ? 31 : mquant);
03064 
03065     
03066     s->y_dc_scale = s->y_dc_scale_table[mquant];
03067     s->c_dc_scale = s->c_dc_scale_table[mquant];
03068 
03069     
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 ) {
03081             
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     
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     
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     
03108     i = 1;
03109 
03110     
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) 
03120         ac_val -= 16;
03121     else 
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) 
03149                         block[v->zz_8x8[2][i++]] = value;
03150                     else 
03151                         block[v->zz_8x8[3][i++]] = value;
03152                 } else {
03153                     block[v->zzi_8x8[i++]] = value;
03154                 }
03155             }
03156         }
03157 
03158         
03159         if (use_pred) {
03160             
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) { 
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 { 
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) { 
03174                     for (k = 1; k < 8; k++)
03175                         block[k << v->left_blk_sh] += ac_val[k];
03176                 } else { 
03177                     for (k = 1; k < 8; k++)
03178                         block[k << v->top_blk_sh] += ac_val[k + 8];
03179                 }
03180             }
03181         }
03182         
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         
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 { 
03198         int k;
03199 
03200         memset(ac_val2, 0, 16 * 2);
03201         if (dc_pred_dir) { 
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 { 
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         
03224         if (use_pred) {
03225             if (dc_pred_dir) { 
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 { 
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; 
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     
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  
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; 
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     
03544 
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; 
03568     int mqdiff, mquant; 
03569     int ttmb = v->ttfrm; 
03570 
03571     int mb_has_coeffs = 1; 
03572     int dmv_x, dmv_y; 
03573     int index, index1; 
03574     int val, sign; 
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; 
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) { 
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             
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                     
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 { 
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 { 
03676         if (!skipped ) {
03677             int intra_count = 0, coded_inter = 0;
03678             int is_intra[6], is_coded[6];
03679             
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             
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             
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                     
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 { 
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 
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; 
03807     int mqdiff, mquant; 
03808     int ttmb = v->ttfrm; 
03809 
03810     int mb_has_coeffs = 1; 
03811     int dmv_x, dmv_y; 
03812     int val; 
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; 
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); 
03829         else
03830             idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); 
03831         switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) {
03832         
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) { 
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             
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                 
03903             }
03904 
03905         } else { 
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             
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();  
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 { 
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; 
04015     int mqdiff, mquant; 
04016     int ttmb = v->ttfrm; 
04017 
04018     int mb_has_coeffs = 1; 
04019     int dmv_x, dmv_y; 
04020     int val; 
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; 
04028 
04029     idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
04030     if (idx_mbmode <= 1) { 
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         
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             
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) { 
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 { 
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; 
04137     int mqdiff, mquant; 
04138     int ttmb = v->ttfrm; 
04139     int mb_has_coeffs = 0; 
04140     int index, index1; 
04141     int val, sign; 
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; 
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             
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                     
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             
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; 
04289     int mqdiff, mquant; 
04290     int ttmb = v->ttfrm; 
04291     int mb_has_coeffs = 0; 
04292     int val; 
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; 
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) { 
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         
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             
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) { 
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 { 
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     
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     
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     
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             
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     
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     
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             
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             
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                 
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     
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     
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                 
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     
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                 
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             
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     
05161 
05162 
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     
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     
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     
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     
05217     if (v->profile == PROFILE_ADVANCED) {
05218 
05219 
05220 
05221 
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     
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         
05277         
05278         
05279         
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 { 
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); 
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         
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); 
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     
05445     if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
05446         
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     
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))) { 
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                     
05498 
05499                     slices[n_slices].mby_start = s->mb_height >> 1;
05500                     n_slices1 = n_slices - 1; 
05501                     n_slices++;
05502                     
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: 
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)) { 
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 { 
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->gb);
05552         
05553 
05554 
05555 
05556         if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
05557             if (v->new_sprite) {
05558                 
05559                 avctx->width  = avctx->coded_width  = v->sprite_width;
05560                 avctx->height = avctx->coded_height = v->sprite_height;
05561             } else {
05562                 goto image;
05563             }
05564         }
05565     }
05566 
05567     if (s->context_initialized &&
05568         (s->width  != avctx->coded_width ||
05569          s->height != avctx->coded_height)) {
05570         vc1_decode_end(avctx);
05571     }
05572 
05573     if (!s->context_initialized) {
05574         if (ff_msmpeg4_decode_init(avctx) < 0 || vc1_decode_init_alloc_tables(v) < 0)
05575             return -1;
05576 
05577         s->low_delay = !avctx->has_b_frames || v->res_sprite;
05578 
05579         if (v->profile == PROFILE_ADVANCED) {
05580             s->h_edge_pos = avctx->coded_width;
05581             s->v_edge_pos = avctx->coded_height;
05582         }
05583     }
05584 
05585     
05586 
05587     if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) {
05588         int i = ff_find_unused_picture(s, 0);
05589         s->current_picture_ptr = &s->picture[i];
05590     }
05591 
05592     
05593     v->pic_header_flag = 0;
05594     if (v->profile < PROFILE_ADVANCED) {
05595         if (vc1_parse_frame_header(v, &s->gb) == -1) {
05596             goto err;
05597         }
05598     } else {
05599         if (vc1_parse_frame_header_adv(v, &s->gb) == -1) {
05600             goto err;
05601         }
05602     }
05603 
05604     if ((avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE)
05605         && s->pict_type != AV_PICTURE_TYPE_I) {
05606         av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
05607         goto err;
05608     }
05609 
05610     
05611     s->current_picture_ptr->f.repeat_pict = 0;
05612     
05613     
05614     if (v->rff) {
05615         
05616         s->current_picture_ptr->f.repeat_pict = 1;
05617     } else if (v->rptfrm) {
05618         
05619         s->current_picture_ptr->f.repeat_pict = v->rptfrm * 2;
05620     }
05621 
05622     
05623     s->current_picture.f.pict_type = s->pict_type;
05624     s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
05625 
05626     
05627     if (s->last_picture_ptr == NULL && (s->pict_type == AV_PICTURE_TYPE_B || s->dropable)) {
05628         goto err;
05629     }
05630     if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
05631         (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
05632          avctx->skip_frame >= AVDISCARD_ALL) {
05633         goto end;
05634     }
05635 
05636     if (s->next_p_frame_damaged) {
05637         if (s->pict_type == AV_PICTURE_TYPE_B)
05638             goto end;
05639         else
05640             s->next_p_frame_damaged = 0;
05641     }
05642 
05643     if (MPV_frame_start(s, avctx) < 0) {
05644         goto err;
05645     }
05646 
05647     s->me.qpel_put = s->dsp.put_qpel_pixels_tab;
05648     s->me.qpel_avg = s->dsp.avg_qpel_pixels_tab;
05649 
05650     if ((CONFIG_VC1_VDPAU_DECODER)
05651         &&s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
05652         ff_vdpau_vc1_decode_picture(s, buf_start, (buf + buf_size) - buf_start);
05653     else if (avctx->hwaccel) {
05654         if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0)
05655             goto err;
05656         if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
05657             goto err;
05658         if (avctx->hwaccel->end_frame(avctx) < 0)
05659             goto err;
05660     } else {
05661         ff_er_frame_start(s);
05662 
05663         v->bits = buf_size * 8;
05664         if (v->field_mode) {
05665             uint8_t *tmp[2];
05666             s->current_picture.f.linesize[0] <<= 1;
05667             s->current_picture.f.linesize[1] <<= 1;
05668             s->current_picture.f.linesize[2] <<= 1;
05669             s->linesize                      <<= 1;
05670             s->uvlinesize                    <<= 1;
05671             tmp[0]          = v->mv_f_last[0];
05672             tmp[1]          = v->mv_f_last[1];
05673             v->mv_f_last[0] = v->mv_f_next[0];
05674             v->mv_f_last[1] = v->mv_f_next[1];
05675             v->mv_f_next[0] = v->mv_f[0];
05676             v->mv_f_next[1] = v->mv_f[1];
05677             v->mv_f[0] = tmp[0];
05678             v->mv_f[1] = tmp[1];
05679         }
05680         mb_height = s->mb_height >> v->field_mode;
05681         for (i = 0; i <= n_slices; i++) {
05682             if (i > 0 &&  slices[i - 1].mby_start >= mb_height) {
05683                 v->second_field = 1;
05684                 v->blocks_off   = s->mb_width  * s->mb_height << 1;
05685                 v->mb_off       = s->mb_stride * s->mb_height >> 1;
05686             } else {
05687                 v->second_field = 0;
05688                 v->blocks_off   = 0;
05689                 v->mb_off       = 0;
05690             }
05691             if (i) {
05692                 v->pic_header_flag = 0;
05693                 if (v->field_mode && i == n_slices1 + 2)
05694                     vc1_parse_frame_header_adv(v, &s->gb);
05695                 else if (get_bits1(&s->gb)) {
05696                     v->pic_header_flag = 1;
05697                     vc1_parse_frame_header_adv(v, &s->gb);
05698                 }
05699             }
05700             s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
05701             if (!v->field_mode || v->second_field)
05702                 s->end_mb_y = (i == n_slices     ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
05703             else
05704                 s->end_mb_y = (i == n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
05705             vc1_decode_blocks(v);
05706             if (i != n_slices)
05707                 s->gb = slices[i].gb;
05708         }
05709         if (v->field_mode) {
05710             av_free(buf_field2);
05711             v->second_field = 0;
05712         }
05713         if (v->field_mode) {
05714             if (s->pict_type == AV_PICTURE_TYPE_B) {
05715                 memcpy(v->mv_f_base, v->mv_f_next_base,
05716                        2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
05717             }
05718             s->current_picture.f.linesize[0] >>= 1;
05719             s->current_picture.f.linesize[1] >>= 1;
05720             s->current_picture.f.linesize[2] >>= 1;
05721             s->linesize                      >>= 1;
05722             s->uvlinesize                    >>= 1;
05723         }
05724 
05725 
05726 
05727         if(s->error_occurred && s->pict_type == AV_PICTURE_TYPE_B)
05728             goto err;
05729         ff_er_frame_end(s);
05730     }
05731 
05732     MPV_frame_end(s);
05733 
05734     if (avctx->codec_id == CODEC_ID_WMV3IMAGE || avctx->codec_id == CODEC_ID_VC1IMAGE) {
05735 image:
05736         avctx->width  = avctx->coded_width  = v->output_width;
05737         avctx->height = avctx->coded_height = v->output_height;
05738         if (avctx->skip_frame >= AVDISCARD_NONREF)
05739             goto end;
05740 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
05741         if (vc1_decode_sprites(v, &s->gb))
05742             goto err;
05743 #endif
05744         *pict      = v->sprite_output_frame;
05745         *data_size = sizeof(AVFrame);
05746     } else {
05747         if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
05748             *pict = *(AVFrame*)s->current_picture_ptr;
05749         } else if (s->last_picture_ptr != NULL) {
05750             *pict = *(AVFrame*)s->last_picture_ptr;
05751         }
05752         if (s->last_picture_ptr || s->low_delay) {
05753             *data_size = sizeof(AVFrame);
05754             ff_print_debug_info(s, pict);
05755         }
05756     }
05757 
05758 end:
05759     av_free(buf2);
05760     for (i = 0; i < n_slices; i++)
05761         av_free(slices[i].buf);
05762     av_free(slices);
05763     return buf_size;
05764 
05765 err:
05766     av_free(buf2);
05767     for (i = 0; i < n_slices; i++)
05768         av_free(slices[i].buf);
05769     av_free(slices);
05770     av_free(buf_field2);
05771     return -1;
05772 }
05773 
05774 
05775 static const AVProfile profiles[] = {
05776     { FF_PROFILE_VC1_SIMPLE,   "Simple"   },
05777     { FF_PROFILE_VC1_MAIN,     "Main"     },
05778     { FF_PROFILE_VC1_COMPLEX,  "Complex"  },
05779     { FF_PROFILE_VC1_ADVANCED, "Advanced" },
05780     { FF_PROFILE_UNKNOWN },
05781 };
05782 
05783 AVCodec ff_vc1_decoder = {
05784     .name           = "vc1",
05785     .type           = AVMEDIA_TYPE_VIDEO,
05786     .id             = CODEC_ID_VC1,
05787     .priv_data_size = sizeof(VC1Context),
05788     .init           = vc1_decode_init,
05789     .close          = vc1_decode_end,
05790     .decode         = vc1_decode_frame,
05791     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
05792     .long_name      = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
05793     .pix_fmts       = ff_hwaccel_pixfmt_list_420,
05794     .profiles       = NULL_IF_CONFIG_SMALL(profiles)
05795 };
05796 
05797 #if CONFIG_WMV3_DECODER
05798 AVCodec ff_wmv3_decoder = {
05799     .name           = "wmv3",
05800     .type           = AVMEDIA_TYPE_VIDEO,
05801     .id             = CODEC_ID_WMV3,
05802     .priv_data_size = sizeof(VC1Context),
05803     .init           = vc1_decode_init,
05804     .close          = vc1_decode_end,
05805     .decode         = vc1_decode_frame,
05806     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
05807     .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
05808     .pix_fmts       = ff_hwaccel_pixfmt_list_420,
05809     .profiles       = NULL_IF_CONFIG_SMALL(profiles)
05810 };
05811 #endif
05812 
05813 #if CONFIG_WMV3_VDPAU_DECODER
05814 AVCodec ff_wmv3_vdpau_decoder = {
05815     .name           = "wmv3_vdpau",
05816     .type           = AVMEDIA_TYPE_VIDEO,
05817     .id             = CODEC_ID_WMV3,
05818     .priv_data_size = sizeof(VC1Context),
05819     .init           = vc1_decode_init,
05820     .close          = vc1_decode_end,
05821     .decode         = vc1_decode_frame,
05822     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
05823     .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9 VDPAU"),
05824     .pix_fmts       = (const enum PixelFormat[]){PIX_FMT_VDPAU_WMV3, PIX_FMT_NONE},
05825     .profiles       = NULL_IF_CONFIG_SMALL(profiles)
05826 };
05827 #endif
05828 
05829 #if CONFIG_VC1_VDPAU_DECODER
05830 AVCodec ff_vc1_vdpau_decoder = {
05831     .name           = "vc1_vdpau",
05832     .type           = AVMEDIA_TYPE_VIDEO,
05833     .id             = CODEC_ID_VC1,
05834     .priv_data_size = sizeof(VC1Context),
05835     .init           = vc1_decode_init,
05836     .close          = vc1_decode_end,
05837     .decode         = vc1_decode_frame,
05838     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU,
05839     .long_name      = NULL_IF_CONFIG_SMALL("SMPTE VC-1 VDPAU"),
05840     .pix_fmts       = (const enum PixelFormat[]){PIX_FMT_VDPAU_VC1, PIX_FMT_NONE},
05841     .profiles       = NULL_IF_CONFIG_SMALL(profiles)
05842 };
05843 #endif
05844 
05845 #if CONFIG_WMV3IMAGE_DECODER
05846 AVCodec ff_wmv3image_decoder = {
05847     .name           = "wmv3image",
05848     .type           = AVMEDIA_TYPE_VIDEO,
05849     .id             = CODEC_ID_WMV3IMAGE,
05850     .priv_data_size = sizeof(VC1Context),
05851     .init           = vc1_decode_init,
05852     .close          = vc1_decode_end,
05853     .decode         = vc1_decode_frame,
05854     .capabilities   = CODEC_CAP_DR1,
05855     .flush          = vc1_sprite_flush,
05856     .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
05857     .pix_fmts       = ff_pixfmt_list_420
05858 };
05859 #endif
05860 
05861 #if CONFIG_VC1IMAGE_DECODER
05862 AVCodec ff_vc1image_decoder = {
05863     .name           = "vc1image",
05864     .type           = AVMEDIA_TYPE_VIDEO,
05865     .id             = CODEC_ID_VC1IMAGE,
05866     .priv_data_size = sizeof(VC1Context),
05867     .init           = vc1_decode_init,
05868     .close          = vc1_decode_end,
05869     .decode         = vc1_decode_frame,
05870     .capabilities   = CODEC_CAP_DR1,
05871     .flush          = vc1_sprite_flush,
05872     .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
05873     .pix_fmts       = ff_pixfmt_list_420
05874 };
05875 #endif