34 int motion_x,
int motion_y,
int motion_scale,
39 mb->motion_x = motion_x;
40 mb->motion_y = motion_y;
41 mb->motion_scale = motion_scale;
44 mb->src_x = dst_x + motion_x / motion_scale;
45 mb->src_y = dst_y + motion_y / motion_scale;
46 mb->source = direction ? 1 : -1;
53 int y,
int h,
int picture_structure,
57 int vshift =
desc->log2_chroma_h;
58 const int field_pic = picture_structure !=
PICT_FRAME;
91 offset[2]= (y >> vshift) *
src->linesize[1];
99 y, picture_structure,
h);
104 uint32_t *mbtype_table, int8_t *
qscale_table, int16_t (*motion_val[2])[2],
106 int mb_width,
int mb_height,
int mb_stride,
int quarter_sample)
109 const int shift = 1 + quarter_sample;
110 const int scale = 1 <<
shift;
112 const int mv_stride = (mb_width << mv_sample_log2) +
114 int mb_x, mb_y, mbcount = 0;
122 for (mb_y = 0; mb_y < mb_height; mb_y++) {
123 for (mb_x = 0; mb_x < mb_width; mb_x++) {
124 int i, direction, mb_type = mbtype_table[mb_x + mb_y * mb_stride];
125 for (direction = 0; direction < 2; direction++) {
129 for (
i = 0;
i < 4;
i++) {
130 int sx = mb_x * 16 + 4 + 8 * (
i & 1);
131 int sy = mb_y * 16 + 4 + 8 * (
i >> 1);
132 int xy = (mb_x * 2 + (
i & 1) +
133 (mb_y * 2 + (
i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
134 int mx = motion_val[direction][xy][0];
135 int my = motion_val[direction][xy][1];
136 mbcount +=
add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
139 for (
i = 0;
i < 2;
i++) {
140 int sx = mb_x * 16 + 8;
141 int sy = mb_y * 16 + 4 + 8 *
i;
142 int xy = (mb_x * 2 + (mb_y * 2 +
i) * mv_stride) << (mv_sample_log2 - 1);
143 int mx = motion_val[direction][xy][0];
144 int my = motion_val[direction][xy][1];
149 mbcount +=
add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
152 for (
i = 0;
i < 2;
i++) {
153 int sx = mb_x * 16 + 4 + 8 *
i;
154 int sy = mb_y * 16 + 8;
155 int xy = (mb_x * 2 +
i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
156 int mx = motion_val[direction][xy][0];
157 int my = motion_val[direction][xy][1];
162 mbcount +=
add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
165 int sx = mb_x * 16 + 8;
166 int sy = mb_y * 16 + 8;
167 int xy = (mb_x + mb_y * mv_stride) << mv_sample_log2;
168 int mx = motion_val[direction][xy][0];
169 int my = motion_val[direction][xy][1];
170 mbcount +=
add_mb(mvs + mbcount, mb_type, sx, sy, mx, my, scale, direction);
192 if (avctx->
hwaccel || !mbtype_table)
201 for (y = 0; y < mb_height; y++) {
202 for (x = 0; x < mb_width; x++) {
204 int count = mbskip_table ? mbskip_table[x + y * mb_stride] : 0;
214 int mb_type = mbtype_table[x + y * mb_stride];
267 if ((avctx->
debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
271 int h_chroma_shift, v_chroma_shift, block_height;
273 const int mv_stride = (mb_width << mv_sample_log2) +
286 block_height = 16 >> v_chroma_shift;
288 for (mb_y = 0; mb_y < mb_height; mb_y++) {
290 for (mb_x = 0; mb_x < mb_width; mb_x++) {
291 const int mb_index = mb_x + mb_y * mb_stride;
292 if ((avctx->
debug & FF_DEBUG_VIS_QP)) {
294 0x0101010101010101ULL;
296 for (y = 0; y < block_height; y++) {
297 *(uint64_t *)(pict->
data[1] + 8 * mb_x +
298 (block_height * mb_y + y) *
300 *(uint64_t *)(pict->
data[2] + 8 * mb_x +
301 (block_height * mb_y + y) *
305 if ((avctx->
debug & FF_DEBUG_VIS_MB_TYPE) &&
307 int mb_type = mbtype_table[mb_index];
310 #define COLOR(theta, r) \
311 u = (int)(128 + r * cos(theta * M_PI / 180)); \
312 v = (int)(128 + r * sin(theta * M_PI / 180));
329 }
else if (
IS_GMC(mb_type)) {
342 u *= 0x0101010101010101ULL;
343 v *= 0x0101010101010101ULL;
344 for (y = 0; y < block_height; y++) {
345 *(uint64_t *)(pict->
data[1] + 8 * mb_x +
346 (block_height * mb_y + y) * pict->
linesize[1]) =
u;
347 *(uint64_t *)(pict->
data[2] + 8 * mb_x +
348 (block_height * mb_y + y) * pict->
linesize[2]) = v;
353 *(uint64_t *)(pict->
data[0] + 16 * mb_x + 0 +
354 (16 * mb_y + 8) * pict->
linesize[0]) ^= 0x8080808080808080ULL;
355 *(uint64_t *)(pict->
data[0] + 16 * mb_x + 8 +
356 (16 * mb_y + 8) * pict->
linesize[0]) ^= 0x8080808080808080ULL;
359 for (y = 0; y < 16; y++)
360 pict->
data[0][16 * mb_x + 8 + (16 * mb_y + y) *
363 if (
IS_8X8(mb_type) && mv_sample_log2 >= 2) {
364 int dm = 1 << (mv_sample_log2 - 2);
365 for (
i = 0;
i < 4;
i++) {
366 int sx = mb_x * 16 + 8 * (
i & 1);
367 int sy = mb_y * 16 + 8 * (
i >> 1);
368 int xy = (mb_x * 2 + (
i & 1) +
369 (mb_y * 2 + (
i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
372 if (
mv[0] !=
mv[dm] ||
373 mv[dm * mv_stride] !=
mv[dm * (mv_stride + 1)])
374 for (y = 0; y < 8; y++)
375 pict->
data[0][sx + 4 + (sy + y) * pict->
linesize[0]] ^= 0x80;
376 if (
mv[0] !=
mv[dm * mv_stride] ||
mv[dm] !=
mv[dm * (mv_stride + 1)])
377 *(uint64_t *)(pict->
data[0] + sx + (sy + 4) *
378 pict->
linesize[0]) ^= 0x8080808080808080ULL;
388 mbskip_table[mb_index] = 0;