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