| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * VC-1 and WMV3 decoder | ||
| 3 | * Copyright (c) 2011 Mashiat Sarker Shakkhar | ||
| 4 | * Copyright (c) 2006-2007 Konstantin Shishkov | ||
| 5 | * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer | ||
| 6 | * | ||
| 7 | * This file is part of FFmpeg. | ||
| 8 | * | ||
| 9 | * FFmpeg is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU Lesser General Public | ||
| 11 | * License as published by the Free Software Foundation; either | ||
| 12 | * version 2.1 of the License, or (at your option) any later version. | ||
| 13 | * | ||
| 14 | * FFmpeg is distributed in the hope that it will be useful, | ||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 17 | * Lesser General Public License for more details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU Lesser General Public | ||
| 20 | * License along with FFmpeg; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 22 | */ | ||
| 23 | |||
| 24 | /** | ||
| 25 | * @file | ||
| 26 | * VC-1 and WMV3 block decoding routines | ||
| 27 | */ | ||
| 28 | |||
| 29 | #include "avcodec.h" | ||
| 30 | #include "h264chroma.h" | ||
| 31 | #include "mathops.h" | ||
| 32 | #include "mpegvideo.h" | ||
| 33 | #include "vc1.h" | ||
| 34 | |||
| 35 | ✗ | static av_always_inline void vc1_scale_luma(uint8_t *srcY, | |
| 36 | int k, int linesize) | ||
| 37 | { | ||
| 38 | int i, j; | ||
| 39 | ✗ | for (j = 0; j < k; j++) { | |
| 40 | ✗ | for (i = 0; i < k; i++) | |
| 41 | ✗ | srcY[i] = ((srcY[i] - 128) >> 1) + 128; | |
| 42 | ✗ | srcY += linesize; | |
| 43 | } | ||
| 44 | ✗ | } | |
| 45 | |||
| 46 | ✗ | static av_always_inline void vc1_scale_chroma(uint8_t *srcU, uint8_t *srcV, | |
| 47 | int k, int uvlinesize) | ||
| 48 | { | ||
| 49 | int i, j; | ||
| 50 | ✗ | for (j = 0; j < k; j++) { | |
| 51 | ✗ | for (i = 0; i < k; i++) { | |
| 52 | ✗ | srcU[i] = ((srcU[i] - 128) >> 1) + 128; | |
| 53 | ✗ | srcV[i] = ((srcV[i] - 128) >> 1) + 128; | |
| 54 | } | ||
| 55 | ✗ | srcU += uvlinesize; | |
| 56 | ✗ | srcV += uvlinesize; | |
| 57 | } | ||
| 58 | ✗ | } | |
| 59 | |||
| 60 | 3813 | static av_always_inline void vc1_lut_scale_luma(uint8_t *srcY, | |
| 61 | const uint8_t *lut1, const uint8_t *lut2, | ||
| 62 | int k, int linesize) | ||
| 63 | { | ||
| 64 | int i, j; | ||
| 65 | |||
| 66 |
1/2✓ Branch 0 taken 37708 times.
✗ Branch 1 not taken.
|
37708 | for (j = 0; j < k; j += 2) { |
| 67 |
2/2✓ Branch 0 taken 708856 times.
✓ Branch 1 taken 37708 times.
|
746564 | for (i = 0; i < k; i++) |
| 68 | 708856 | srcY[i] = lut1[srcY[i]]; | |
| 69 | 37708 | srcY += linesize; | |
| 70 | |||
| 71 |
2/2✓ Branch 0 taken 3813 times.
✓ Branch 1 taken 33895 times.
|
37708 | if (j + 1 == k) |
| 72 | 3813 | break; | |
| 73 | |||
| 74 |
2/2✓ Branch 0 taken 637253 times.
✓ Branch 1 taken 33895 times.
|
671148 | for (i = 0; i < k; i++) |
| 75 | 637253 | srcY[i] = lut2[srcY[i]]; | |
| 76 | 33895 | srcY += linesize; | |
| 77 | } | ||
| 78 | 3813 | } | |
| 79 | |||
| 80 | 3813 | static av_always_inline void vc1_lut_scale_chroma(uint8_t *srcU, uint8_t *srcV, | |
| 81 | const uint8_t *lut1, const uint8_t *lut2, | ||
| 82 | int k, int uvlinesize) | ||
| 83 | { | ||
| 84 | int i, j; | ||
| 85 | |||
| 86 |
1/2✓ Branch 0 taken 19065 times.
✗ Branch 1 not taken.
|
19065 | for (j = 0; j < k; j += 2) { |
| 87 |
2/2✓ Branch 0 taken 171585 times.
✓ Branch 1 taken 19065 times.
|
190650 | for (i = 0; i < k; i++) { |
| 88 | 171585 | srcU[i] = lut1[srcU[i]]; | |
| 89 | 171585 | srcV[i] = lut1[srcV[i]]; | |
| 90 | } | ||
| 91 | 19065 | srcU += uvlinesize; | |
| 92 | 19065 | srcV += uvlinesize; | |
| 93 | |||
| 94 |
2/2✓ Branch 0 taken 3813 times.
✓ Branch 1 taken 15252 times.
|
19065 | if (j + 1 == k) |
| 95 | 3813 | break; | |
| 96 | |||
| 97 |
2/2✓ Branch 0 taken 137268 times.
✓ Branch 1 taken 15252 times.
|
152520 | for (i = 0; i < k; i++) { |
| 98 | 137268 | srcU[i] = lut2[srcU[i]]; | |
| 99 | 137268 | srcV[i] = lut2[srcV[i]]; | |
| 100 | } | ||
| 101 | 15252 | srcU += uvlinesize; | |
| 102 | 15252 | srcV += uvlinesize; | |
| 103 | } | ||
| 104 | 3813 | } | |
| 105 | |||
| 106 | static const uint8_t popcount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; | ||
| 107 | |||
| 108 | 23544 | static av_always_inline int get_luma_mv(VC1Context *v, int dir, int16_t *tx, int16_t *ty) | |
| 109 | { | ||
| 110 | 23544 | MpegEncContext *s = &v->s; | |
| 111 | 23544 | int idx = v->mv_f[dir][s->block_index[0] + v->blocks_off] | | |
| 112 | 23544 | (v->mv_f[dir][s->block_index[1] + v->blocks_off] << 1) | | |
| 113 | 23544 | (v->mv_f[dir][s->block_index[2] + v->blocks_off] << 2) | | |
| 114 | 23544 | (v->mv_f[dir][s->block_index[3] + v->blocks_off] << 3); | |
| 115 | static const uint8_t index2[16] = { 0, 0, 0, 0x23, 0, 0x13, 0x03, 0, 0, 0x12, 0x02, 0, 0x01, 0, 0, 0 }; | ||
| 116 | 23544 | int opp_count = popcount4[idx]; | |
| 117 | |||
| 118 |
4/5✓ Branch 0 taken 16547 times.
✓ Branch 1 taken 2829 times.
✓ Branch 2 taken 2560 times.
✓ Branch 3 taken 1608 times.
✗ Branch 4 not taken.
|
23544 | switch (opp_count) { |
| 119 | 16547 | case 0: | |
| 120 | case 4: | ||
| 121 | 16547 | *tx = median4(s->mv[dir][0][0], s->mv[dir][1][0], s->mv[dir][2][0], s->mv[dir][3][0]); | |
| 122 | 16547 | *ty = median4(s->mv[dir][0][1], s->mv[dir][1][1], s->mv[dir][2][1], s->mv[dir][3][1]); | |
| 123 | 16547 | break; | |
| 124 | 2829 | case 1: | |
| 125 |
4/4✓ Branch 0 taken 2240 times.
✓ Branch 1 taken 589 times.
✓ Branch 2 taken 1624 times.
✓ Branch 3 taken 1205 times.
|
2829 | *tx = mid_pred(s->mv[dir][idx < 2][0], s->mv[dir][1 + (idx < 4)][0], s->mv[dir][2 + (idx < 8)][0]); |
| 126 |
4/4✓ Branch 0 taken 2240 times.
✓ Branch 1 taken 589 times.
✓ Branch 2 taken 1624 times.
✓ Branch 3 taken 1205 times.
|
2829 | *ty = mid_pred(s->mv[dir][idx < 2][1], s->mv[dir][1 + (idx < 4)][1], s->mv[dir][2 + (idx < 8)][1]); |
| 127 | 2829 | break; | |
| 128 | 2560 | case 3: | |
| 129 |
4/4✓ Branch 0 taken 1985 times.
✓ Branch 1 taken 575 times.
✓ Branch 2 taken 1438 times.
✓ Branch 3 taken 1122 times.
|
2560 | *tx = mid_pred(s->mv[dir][idx > 0xd][0], s->mv[dir][1 + (idx > 0xb)][0], s->mv[dir][2 + (idx > 0x7)][0]); |
| 130 |
4/4✓ Branch 0 taken 1985 times.
✓ Branch 1 taken 575 times.
✓ Branch 2 taken 1438 times.
✓ Branch 3 taken 1122 times.
|
2560 | *ty = mid_pred(s->mv[dir][idx > 0xd][1], s->mv[dir][1 + (idx > 0xb)][1], s->mv[dir][2 + (idx > 0x7)][1]); |
| 131 | 2560 | break; | |
| 132 | 1608 | case 2: | |
| 133 | 1608 | *tx = (s->mv[dir][index2[idx] >> 4][0] + s->mv[dir][index2[idx] & 0xf][0]) / 2; | |
| 134 | 1608 | *ty = (s->mv[dir][index2[idx] >> 4][1] + s->mv[dir][index2[idx] & 0xf][1]) / 2; | |
| 135 | 1608 | break; | |
| 136 | } | ||
| 137 | 23544 | return opp_count; | |
| 138 | } | ||
| 139 | |||
| 140 | 26576 | static av_always_inline int get_chroma_mv(VC1Context *v, int dir, int16_t *tx, int16_t *ty) | |
| 141 | { | ||
| 142 | 26576 | MpegEncContext *s = &v->s; | |
| 143 | 79728 | int idx = !v->mb_type[s->block_index[0]] | | |
| 144 |
2/2✓ Branch 0 taken 23921 times.
✓ Branch 1 taken 2655 times.
|
26576 | (!v->mb_type[s->block_index[1]] << 1) | |
| 145 |
2/2✓ Branch 0 taken 23906 times.
✓ Branch 1 taken 2670 times.
|
26576 | (!v->mb_type[s->block_index[2]] << 2) | |
| 146 |
2/2✓ Branch 0 taken 23887 times.
✓ Branch 1 taken 2689 times.
|
26576 | (!v->mb_type[s->block_index[3]] << 3); |
| 147 | static const uint8_t index2[16] = { 0, 0, 0, 0x01, 0, 0x02, 0x12, 0, 0, 0x03, 0x13, 0, 0x23, 0, 0, 0 }; | ||
| 148 | 26576 | int valid_count = popcount4[idx]; | |
| 149 | |||
| 150 |
4/4✓ Branch 0 taken 20627 times.
✓ Branch 1 taken 3043 times.
✓ Branch 2 taken 1688 times.
✓ Branch 3 taken 1218 times.
|
26576 | switch (valid_count) { |
| 151 | 20627 | case 4: | |
| 152 | 20627 | *tx = median4(s->mv[dir][0][0], s->mv[dir][1][0], s->mv[dir][2][0], s->mv[dir][3][0]); | |
| 153 | 20627 | *ty = median4(s->mv[dir][0][1], s->mv[dir][1][1], s->mv[dir][2][1], s->mv[dir][3][1]); | |
| 154 | 20627 | break; | |
| 155 | 3043 | case 3: | |
| 156 |
4/4✓ Branch 0 taken 2246 times.
✓ Branch 1 taken 797 times.
✓ Branch 2 taken 1460 times.
✓ Branch 3 taken 1583 times.
|
3043 | *tx = mid_pred(s->mv[dir][idx > 0xd][0], s->mv[dir][1 + (idx > 0xb)][0], s->mv[dir][2 + (idx > 0x7)][0]); |
| 157 |
4/4✓ Branch 0 taken 2246 times.
✓ Branch 1 taken 797 times.
✓ Branch 2 taken 1460 times.
✓ Branch 3 taken 1583 times.
|
3043 | *ty = mid_pred(s->mv[dir][idx > 0xd][1], s->mv[dir][1 + (idx > 0xb)][1], s->mv[dir][2 + (idx > 0x7)][1]); |
| 158 | 3043 | break; | |
| 159 | 1688 | case 2: | |
| 160 | 1688 | *tx = (s->mv[dir][index2[idx] >> 4][0] + s->mv[dir][index2[idx] & 0xf][0]) / 2; | |
| 161 | 1688 | *ty = (s->mv[dir][index2[idx] >> 4][1] + s->mv[dir][index2[idx] & 0xf][1]) / 2; | |
| 162 | 1688 | break; | |
| 163 | 1218 | default: | |
| 164 | 1218 | return 0; | |
| 165 | } | ||
| 166 | 25358 | return valid_count; | |
| 167 | } | ||
| 168 | |||
| 169 | /** Do motion compensation over 1 macroblock | ||
| 170 | * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c | ||
| 171 | */ | ||
| 172 | 207678 | void ff_vc1_mc_1mv(VC1Context *v, int dir) | |
| 173 | { | ||
| 174 | 207678 | MpegEncContext *s = &v->s; | |
| 175 | 207678 | H264ChromaContext *h264chroma = &v->h264chroma; | |
| 176 | uint8_t *srcY, *srcU, *srcV; | ||
| 177 | int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; | ||
| 178 | 207678 | int v_edge_pos = s->v_edge_pos >> v->field_mode; | |
| 179 | int i; | ||
| 180 | const uint8_t (*luty)[256], (*lutuv)[256]; | ||
| 181 | int use_ic; | ||
| 182 | int interlace; | ||
| 183 | int linesize, uvlinesize; | ||
| 184 | |||
| 185 |
2/2✓ Branch 0 taken 62711 times.
✓ Branch 1 taken 144967 times.
|
207678 | if ((!v->field_mode || |
| 186 |
4/4✓ Branch 0 taken 15788 times.
✓ Branch 1 taken 46923 times.
✓ Branch 2 taken 5911 times.
✓ Branch 3 taken 9877 times.
|
62711 | (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) && |
| 187 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 150878 times.
|
150878 | !v->s.last_pic.data[0]) |
| 188 | ✗ | return; | |
| 189 | |||
| 190 | 207678 | linesize = s->cur_pic.ptr->f->linesize[0]; | |
| 191 | 207678 | uvlinesize = s->cur_pic.ptr->f->linesize[1]; | |
| 192 | |||
| 193 | 207678 | mx = s->mv[dir][0][0]; | |
| 194 | 207678 | my = s->mv[dir][0][1]; | |
| 195 | |||
| 196 | // store motion vectors for further use in B-frames | ||
| 197 |
2/2✓ Branch 0 taken 129731 times.
✓ Branch 1 taken 77947 times.
|
207678 | if (s->pict_type == AV_PICTURE_TYPE_P) { |
| 198 |
2/2✓ Branch 0 taken 518924 times.
✓ Branch 1 taken 129731 times.
|
648655 | for (i = 0; i < 4; i++) { |
| 199 | 518924 | s->cur_pic.motion_val[1][s->block_index[i] + v->blocks_off][0] = mx; | |
| 200 | 518924 | s->cur_pic.motion_val[1][s->block_index[i] + v->blocks_off][1] = my; | |
| 201 | } | ||
| 202 | } | ||
| 203 | |||
| 204 | 207678 | uvmx = (mx + ((mx & 3) == 3)) >> 1; | |
| 205 | 207678 | uvmy = (my + ((my & 3) == 3)) >> 1; | |
| 206 | 207678 | v->luma_mv[s->mb_x][0] = uvmx; | |
| 207 | 207678 | v->luma_mv[s->mb_x][1] = uvmy; | |
| 208 | |||
| 209 |
2/2✓ Branch 0 taken 62711 times.
✓ Branch 1 taken 144967 times.
|
207678 | if (v->field_mode && |
| 210 |
2/2✓ Branch 0 taken 36191 times.
✓ Branch 1 taken 26520 times.
|
62711 | v->cur_field_type != v->ref_field_type[dir]) { |
| 211 | 36191 | my = my - 2 + 4 * v->cur_field_type; | |
| 212 | 36191 | uvmy = uvmy - 2 + 4 * v->cur_field_type; | |
| 213 | } | ||
| 214 | |||
| 215 | // fastuvmc shall be ignored for interlaced frame picture | ||
| 216 |
3/4✓ Branch 0 taken 37054 times.
✓ Branch 1 taken 170624 times.
✓ Branch 2 taken 37054 times.
✗ Branch 3 not taken.
|
207678 | if (v->fastuvmc && (v->fcm != ILACE_FRAME)) { |
| 217 |
2/2✓ Branch 0 taken 16361 times.
✓ Branch 1 taken 20693 times.
|
37054 | uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1)); |
| 218 |
2/2✓ Branch 0 taken 11726 times.
✓ Branch 1 taken 25328 times.
|
37054 | uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1)); |
| 219 | } | ||
| 220 |
2/2✓ Branch 0 taken 181247 times.
✓ Branch 1 taken 26431 times.
|
207678 | if (!dir) { |
| 221 |
6/6✓ Branch 0 taken 48786 times.
✓ Branch 1 taken 132461 times.
✓ Branch 2 taken 32469 times.
✓ Branch 3 taken 16317 times.
✓ Branch 4 taken 24516 times.
✓ Branch 5 taken 7953 times.
|
181247 | if (v->field_mode && (v->cur_field_type != v->ref_field_type[dir]) && v->second_field) { |
| 222 | 24516 | srcY = s->cur_pic.data[0]; | |
| 223 | 24516 | srcU = s->cur_pic.data[1]; | |
| 224 | 24516 | srcV = s->cur_pic.data[2]; | |
| 225 | 24516 | luty = v->curr_luty; | |
| 226 | 24516 | lutuv = v->curr_lutuv; | |
| 227 | 24516 | use_ic = *v->curr_use_ic; | |
| 228 | 24516 | interlace = 1; | |
| 229 | } else { | ||
| 230 | 156731 | srcY = s->last_pic.data[0]; | |
| 231 | 156731 | srcU = s->last_pic.data[1]; | |
| 232 | 156731 | srcV = s->last_pic.data[2]; | |
| 233 | 156731 | luty = v->last_luty; | |
| 234 | 156731 | lutuv = v->last_lutuv; | |
| 235 | 156731 | use_ic = v->last_use_ic; | |
| 236 | 156731 | interlace = v->last_interlaced; | |
| 237 | } | ||
| 238 | } else { | ||
| 239 | 26431 | srcY = s->next_pic.data[0]; | |
| 240 | 26431 | srcU = s->next_pic.data[1]; | |
| 241 | 26431 | srcV = s->next_pic.data[2]; | |
| 242 | 26431 | luty = v->next_luty; | |
| 243 | 26431 | lutuv = v->next_lutuv; | |
| 244 | 26431 | use_ic = v->next_use_ic; | |
| 245 | 26431 | interlace = v->next_interlaced; | |
| 246 | } | ||
| 247 | |||
| 248 |
2/4✓ Branch 0 taken 207678 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 207678 times.
|
207678 | if (!srcY || !srcU) { |
| 249 | ✗ | av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n"); | |
| 250 | ✗ | return; | |
| 251 | } | ||
| 252 | |||
| 253 | 207678 | src_x = s->mb_x * 16 + (mx >> 2); | |
| 254 | 207678 | src_y = s->mb_y * 16 + (my >> 2); | |
| 255 | 207678 | uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
| 256 | 207678 | uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
| 257 | |||
| 258 |
2/2✓ Branch 0 taken 88639 times.
✓ Branch 1 taken 119039 times.
|
207678 | if (v->profile != PROFILE_ADVANCED) { |
| 259 | 88639 | src_x = av_clip( src_x, -16, s->mb_width * 16); | |
| 260 | 88639 | src_y = av_clip( src_y, -16, s->mb_height * 16); | |
| 261 | 88639 | uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); | |
| 262 | 88639 | uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); | |
| 263 | } else { | ||
| 264 | 119039 | src_x = av_clip( src_x, -17, s->avctx->coded_width); | |
| 265 | 119039 | uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); | |
| 266 |
2/2✓ Branch 0 taken 23152 times.
✓ Branch 1 taken 95887 times.
|
119039 | if (v->fcm == ILACE_FRAME) { |
| 267 | 23152 | src_y = av_clip(src_y, -18 + (src_y & 1), s->avctx->coded_height + (src_y & 1)); | |
| 268 | 23152 | uvsrc_y = av_clip(uvsrc_y, -8 + (uvsrc_y & 1), (s->avctx->coded_height >> 1) + (uvsrc_y & 1)); | |
| 269 | } else { | ||
| 270 | 95887 | src_y = av_clip(src_y, -18, s->avctx->coded_height + 1); | |
| 271 | 95887 | uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); | |
| 272 | } | ||
| 273 | } | ||
| 274 | |||
| 275 | 207678 | srcY += src_y * s->linesize + src_x; | |
| 276 | 207678 | srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 277 | 207678 | srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 278 | |||
| 279 |
4/4✓ Branch 0 taken 62711 times.
✓ Branch 1 taken 144967 times.
✓ Branch 2 taken 15788 times.
✓ Branch 3 taken 46923 times.
|
207678 | if (v->field_mode && v->ref_field_type[dir]) { |
| 280 | 15788 | srcY += linesize; | |
| 281 | 15788 | srcU += uvlinesize; | |
| 282 | 15788 | srcV += uvlinesize; | |
| 283 | } | ||
| 284 | |||
| 285 | /* for grayscale we should not try to read from unknown area */ | ||
| 286 | if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) { | ||
| 287 | srcU = s->sc.edge_emu_buffer + 18 * s->linesize; | ||
| 288 | srcV = s->sc.edge_emu_buffer + 18 * s->linesize; | ||
| 289 | } | ||
| 290 | |||
| 291 |
3/4✓ Branch 0 taken 207678 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 203865 times.
✓ Branch 3 taken 3813 times.
|
207678 | if (v->rangeredfrm || use_ic |
| 292 |
2/4✓ Branch 0 taken 203865 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 203865 times.
✗ Branch 3 not taken.
|
203865 | || s->h_edge_pos < 22 || v_edge_pos < 22 |
| 293 |
2/2✓ Branch 0 taken 197274 times.
✓ Branch 1 taken 6591 times.
|
203865 | || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel * 3 |
| 294 |
2/2✓ Branch 0 taken 14192 times.
✓ Branch 1 taken 183082 times.
|
197274 | || (unsigned)(src_y - 1) > v_edge_pos - (my&3) - 16 - 3) { |
| 295 | 24596 | uint8_t *ubuf = s->sc.edge_emu_buffer + 19 * s->linesize; | |
| 296 | 24596 | uint8_t *vbuf = ubuf + 9 * s->uvlinesize; | |
| 297 | 24596 | const int k = 17 + s->mspel * 2; | |
| 298 | |||
| 299 | 24596 | srcY -= s->mspel * (1 + s->linesize); | |
| 300 |
2/2✓ Branch 0 taken 6950 times.
✓ Branch 1 taken 17646 times.
|
24596 | if (interlace) { |
| 301 | 5419 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 302 | srcY, | ||
| 303 | 6950 | linesize << 1, | |
| 304 | 6950 | linesize << 1, | |
| 305 | k, | ||
| 306 | 1531 | v->field_mode ? k : k + 1 >> 1, | |
| 307 | 6950 | src_x - s->mspel, | |
| 308 | 6950 | src_y - s->mspel >> !v->field_mode, | |
| 309 | s->h_edge_pos, | ||
| 310 |
2/2✓ Branch 0 taken 1531 times.
✓ Branch 1 taken 5419 times.
|
6950 | s->v_edge_pos >> 1); |
| 311 |
2/2✓ Branch 0 taken 1531 times.
✓ Branch 1 taken 5419 times.
|
6950 | if (!v->field_mode) |
| 312 | 1531 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + linesize, | |
| 313 | 1531 | srcY + linesize, | |
| 314 | 1531 | linesize << 1, | |
| 315 | 1531 | linesize << 1, | |
| 316 | k, | ||
| 317 | k >> 1, | ||
| 318 | 1531 | src_x - s->mspel, | |
| 319 | 1531 | src_y - s->mspel + 1 >> 1, | |
| 320 | s->h_edge_pos, | ||
| 321 | 1531 | s->v_edge_pos >> 1); | |
| 322 | } else | ||
| 323 | 17646 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 324 | srcY, | ||
| 325 | linesize, | ||
| 326 | linesize, | ||
| 327 | k, | ||
| 328 | ✗ | v->field_mode ? (k << 1) - 1 : k, | |
| 329 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17646 times.
|
17646 | src_x - s->mspel, |
| 330 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17646 times.
|
17646 | v->field_mode ? 2 * (src_y - s->mspel) + v->ref_field_type[dir] : |
| 331 | 17646 | src_y - s->mspel, | |
| 332 | s->h_edge_pos, | ||
| 333 | s->v_edge_pos); | ||
| 334 | 24596 | srcY = s->sc.edge_emu_buffer; | |
| 335 |
2/2✓ Branch 0 taken 6950 times.
✓ Branch 1 taken 17646 times.
|
24596 | if (interlace) { |
| 336 | 6950 | s->vdsp.emulated_edge_mc(ubuf, | |
| 337 | srcU, | ||
| 338 | 6950 | uvlinesize << 1, | |
| 339 | 6950 | uvlinesize << 1, | |
| 340 | 9, | ||
| 341 | 6950 | v->field_mode ? 9 : 5, | |
| 342 | uvsrc_x, | ||
| 343 | 6950 | uvsrc_y >> !v->field_mode, | |
| 344 | 6950 | s->h_edge_pos >> 1, | |
| 345 |
2/2✓ Branch 0 taken 5419 times.
✓ Branch 1 taken 1531 times.
|
6950 | s->v_edge_pos >> 2); |
| 346 | 6950 | s->vdsp.emulated_edge_mc(vbuf, | |
| 347 | srcV, | ||
| 348 | 6950 | uvlinesize << 1, | |
| 349 | 6950 | uvlinesize << 1, | |
| 350 | 9, | ||
| 351 | 6950 | v->field_mode ? 9 : 5, | |
| 352 | uvsrc_x, | ||
| 353 | 6950 | uvsrc_y >> !v->field_mode, | |
| 354 | 6950 | s->h_edge_pos >> 1, | |
| 355 |
2/2✓ Branch 0 taken 5419 times.
✓ Branch 1 taken 1531 times.
|
6950 | s->v_edge_pos >> 2); |
| 356 |
2/2✓ Branch 0 taken 1531 times.
✓ Branch 1 taken 5419 times.
|
6950 | if (!v->field_mode) { |
| 357 | 1531 | s->vdsp.emulated_edge_mc(ubuf + uvlinesize, | |
| 358 | 1531 | srcU + uvlinesize, | |
| 359 | 1531 | uvlinesize << 1, | |
| 360 | 1531 | uvlinesize << 1, | |
| 361 | 9, | ||
| 362 | 4, | ||
| 363 | uvsrc_x, | ||
| 364 | 1531 | uvsrc_y + 1 >> 1, | |
| 365 | 1531 | s->h_edge_pos >> 1, | |
| 366 | 1531 | s->v_edge_pos >> 2); | |
| 367 | 1531 | s->vdsp.emulated_edge_mc(vbuf + uvlinesize, | |
| 368 | 1531 | srcV + uvlinesize, | |
| 369 | 1531 | uvlinesize << 1, | |
| 370 | 1531 | uvlinesize << 1, | |
| 371 | 9, | ||
| 372 | 4, | ||
| 373 | uvsrc_x, | ||
| 374 | 1531 | uvsrc_y + 1 >> 1, | |
| 375 | 1531 | s->h_edge_pos >> 1, | |
| 376 | 1531 | s->v_edge_pos >> 2); | |
| 377 | } | ||
| 378 | } else { | ||
| 379 | 35292 | s->vdsp.emulated_edge_mc(ubuf, | |
| 380 | srcU, | ||
| 381 | uvlinesize, | ||
| 382 | uvlinesize, | ||
| 383 | 9, | ||
| 384 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17646 times.
|
17646 | v->field_mode ? 17 : 9, |
| 385 | uvsrc_x, | ||
| 386 | ✗ | v->field_mode ? 2 * uvsrc_y + v->ref_field_type[dir] : uvsrc_y, | |
| 387 | 17646 | s->h_edge_pos >> 1, | |
| 388 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17646 times.
|
17646 | s->v_edge_pos >> 1); |
| 389 | 35292 | s->vdsp.emulated_edge_mc(vbuf, | |
| 390 | srcV, | ||
| 391 | uvlinesize, | ||
| 392 | uvlinesize, | ||
| 393 | 9, | ||
| 394 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17646 times.
|
17646 | v->field_mode ? 17 : 9, |
| 395 | uvsrc_x, | ||
| 396 | ✗ | v->field_mode ? 2 * uvsrc_y + v->ref_field_type[dir] : uvsrc_y, | |
| 397 | 17646 | s->h_edge_pos >> 1, | |
| 398 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 17646 times.
|
17646 | s->v_edge_pos >> 1); |
| 399 | } | ||
| 400 | 24596 | srcU = ubuf; | |
| 401 | 24596 | srcV = vbuf; | |
| 402 | /* if we deal with range reduction we need to scale source blocks */ | ||
| 403 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 24596 times.
|
24596 | if (v->rangeredfrm) { |
| 404 | ✗ | vc1_scale_luma(srcY, k, s->linesize); | |
| 405 | ✗ | vc1_scale_chroma(srcU, srcV, 9, s->uvlinesize); | |
| 406 | } | ||
| 407 | /* if we deal with intensity compensation we need to scale source blocks */ | ||
| 408 |
2/2✓ Branch 0 taken 3813 times.
✓ Branch 1 taken 20783 times.
|
24596 | if (use_ic) { |
| 409 | 7626 | vc1_lut_scale_luma(srcY, | |
| 410 | 3813 | luty[v->field_mode ? v->ref_field_type[dir] : ((0 + src_y - s->mspel) & 1)], | |
| 411 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3813 times.
|
3813 | luty[v->field_mode ? v->ref_field_type[dir] : ((1 + src_y - s->mspel) & 1)], |
| 412 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3813 times.
|
3813 | k, s->linesize); |
| 413 | 7626 | vc1_lut_scale_chroma(srcU, srcV, | |
| 414 | 3813 | lutuv[v->field_mode ? v->ref_field_type[dir] : ((0 + uvsrc_y) & 1)], | |
| 415 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3813 times.
|
3813 | lutuv[v->field_mode ? v->ref_field_type[dir] : ((1 + uvsrc_y) & 1)], |
| 416 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3813 times.
|
3813 | 9, s->uvlinesize); |
| 417 | } | ||
| 418 | 24596 | srcY += s->mspel * (1 + s->linesize); | |
| 419 | } | ||
| 420 | |||
| 421 |
2/2✓ Branch 0 taken 124256 times.
✓ Branch 1 taken 83422 times.
|
207678 | if (s->mspel) { |
| 422 | 124256 | dxy = ((my & 3) << 2) | (mx & 3); | |
| 423 | 124256 | v->vc1dsp.put_vc1_mspel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, v->rnd); | |
| 424 | } else { // hpel mc - always used for luma | ||
| 425 | 83422 | dxy = (my & 2) | ((mx & 2) >> 1); | |
| 426 |
2/2✓ Branch 0 taken 34949 times.
✓ Branch 1 taken 48473 times.
|
83422 | if (!v->rnd) |
| 427 | 34949 | s->hdsp.put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
| 428 | else | ||
| 429 | 48473 | s->hdsp.put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
| 430 | } | ||
| 431 | |||
| 432 | if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) | ||
| 433 | return; | ||
| 434 | /* Chroma MC always uses qpel bilinear */ | ||
| 435 | 207678 | uvmx = (uvmx & 3) << 1; | |
| 436 | 207678 | uvmy = (uvmy & 3) << 1; | |
| 437 |
2/2✓ Branch 0 taken 105062 times.
✓ Branch 1 taken 102616 times.
|
207678 | if (!v->rnd) { |
| 438 | 105062 | h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 439 | 105062 | h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 440 | } else { | ||
| 441 | 102616 | v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 442 | 102616 | v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 443 | } | ||
| 444 |
2/2✓ Branch 0 taken 62711 times.
✓ Branch 1 taken 144967 times.
|
207678 | if (v->field_mode) { |
| 445 | 62711 | v->mv_f[dir][s->block_index[4] + v->mb_off] = v->cur_field_type != v->ref_field_type[dir]; | |
| 446 | 62711 | v->mv_f[dir][s->block_index[5] + v->mb_off] = v->cur_field_type != v->ref_field_type[dir]; | |
| 447 | } | ||
| 448 | } | ||
| 449 | |||
| 450 | /** Do motion compensation for 4-MV macroblock - luminance block | ||
| 451 | */ | ||
| 452 | 278096 | void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) | |
| 453 | { | ||
| 454 | 278096 | MpegEncContext *s = &v->s; | |
| 455 | uint8_t *srcY; | ||
| 456 | int dxy, mx, my, src_x, src_y; | ||
| 457 | int off; | ||
| 458 |
2/2✓ Branch 0 taken 116452 times.
✓ Branch 1 taken 161644 times.
|
278096 | int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0; |
| 459 | 278096 | int v_edge_pos = s->v_edge_pos >> v->field_mode; | |
| 460 | const uint8_t (*luty)[256]; | ||
| 461 | int use_ic; | ||
| 462 | int interlace; | ||
| 463 | int linesize; | ||
| 464 | |||
| 465 |
2/2✓ Branch 0 taken 65904 times.
✓ Branch 1 taken 212192 times.
|
278096 | if ((!v->field_mode || |
| 466 |
4/4✓ Branch 0 taken 24818 times.
✓ Branch 1 taken 41086 times.
✓ Branch 2 taken 12642 times.
✓ Branch 3 taken 12176 times.
|
65904 | (v->ref_field_type[dir] == 1 && v->cur_field_type == 1)) && |
| 467 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 224834 times.
|
224834 | !v->s.last_pic.data[0]) |
| 468 | ✗ | return; | |
| 469 | |||
| 470 | 278096 | linesize = s->cur_pic.ptr->f->linesize[0]; | |
| 471 | |||
| 472 | 278096 | mx = s->mv[dir][n][0]; | |
| 473 | 278096 | my = s->mv[dir][n][1]; | |
| 474 | |||
| 475 |
2/2✓ Branch 0 taken 221322 times.
✓ Branch 1 taken 56774 times.
|
278096 | if (!dir) { |
| 476 |
6/6✓ Branch 0 taken 47840 times.
✓ Branch 1 taken 173482 times.
✓ Branch 2 taken 27394 times.
✓ Branch 3 taken 20446 times.
✓ Branch 4 taken 19053 times.
✓ Branch 5 taken 8341 times.
|
221322 | if (v->field_mode && (v->cur_field_type != v->ref_field_type[dir]) && v->second_field) { |
| 477 | 19053 | srcY = s->cur_pic.data[0]; | |
| 478 | 19053 | luty = v->curr_luty; | |
| 479 | 19053 | use_ic = *v->curr_use_ic; | |
| 480 | 19053 | interlace = 1; | |
| 481 | } else { | ||
| 482 | 202269 | srcY = s->last_pic.data[0]; | |
| 483 | 202269 | luty = v->last_luty; | |
| 484 | 202269 | use_ic = v->last_use_ic; | |
| 485 | 202269 | interlace = v->last_interlaced; | |
| 486 | } | ||
| 487 | } else { | ||
| 488 | 56774 | srcY = s->next_pic.data[0]; | |
| 489 | 56774 | luty = v->next_luty; | |
| 490 | 56774 | use_ic = v->next_use_ic; | |
| 491 | 56774 | interlace = v->next_interlaced; | |
| 492 | } | ||
| 493 | |||
| 494 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 278096 times.
|
278096 | if (!srcY) { |
| 495 | ✗ | av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n"); | |
| 496 | ✗ | return; | |
| 497 | } | ||
| 498 | |||
| 499 |
2/2✓ Branch 0 taken 65904 times.
✓ Branch 1 taken 212192 times.
|
278096 | if (v->field_mode) { |
| 500 |
2/2✓ Branch 0 taken 33310 times.
✓ Branch 1 taken 32594 times.
|
65904 | if (v->cur_field_type != v->ref_field_type[dir]) |
| 501 | 33310 | my = my - 2 + 4 * v->cur_field_type; | |
| 502 | } | ||
| 503 | |||
| 504 |
6/6✓ Branch 0 taken 150352 times.
✓ Branch 1 taken 127744 times.
✓ Branch 2 taken 37540 times.
✓ Branch 3 taken 112812 times.
✓ Branch 4 taken 7068 times.
✓ Branch 5 taken 30472 times.
|
278096 | if (s->pict_type == AV_PICTURE_TYPE_P && n == 3 && v->field_mode) { |
| 505 | 7068 | int opp_count = get_luma_mv(v, 0, | |
| 506 | 7068 | &s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][0], | |
| 507 | 7068 | &s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][1]); | |
| 508 | 7068 | int k, f = opp_count > 2; | |
| 509 |
2/2✓ Branch 0 taken 28272 times.
✓ Branch 1 taken 7068 times.
|
35340 | for (k = 0; k < 4; k++) |
| 510 | 28272 | v->mv_f[1][s->block_index[k] + v->blocks_off] = f; | |
| 511 | } | ||
| 512 | |||
| 513 |
2/2✓ Branch 0 taken 116452 times.
✓ Branch 1 taken 161644 times.
|
278096 | if (v->fcm == ILACE_FRAME) { // not sure if needed for other types of picture |
| 514 | int qx, qy; | ||
| 515 | 116452 | int width = s->avctx->coded_width; | |
| 516 | 116452 | int height = s->avctx->coded_height >> 1; | |
| 517 |
2/2✓ Branch 0 taken 26340 times.
✓ Branch 1 taken 90112 times.
|
116452 | if (s->pict_type == AV_PICTURE_TYPE_P) { |
| 518 | 26340 | s->cur_pic.motion_val[1][s->block_index[n] + v->blocks_off][0] = mx; | |
| 519 | 26340 | s->cur_pic.motion_val[1][s->block_index[n] + v->blocks_off][1] = my; | |
| 520 | } | ||
| 521 | 116452 | qx = (s->mb_x * 16) + (mx >> 2); | |
| 522 | 116452 | qy = (s->mb_y * 8) + (my >> 3); | |
| 523 | |||
| 524 |
2/2✓ Branch 0 taken 244 times.
✓ Branch 1 taken 116208 times.
|
116452 | if (qx < -17) |
| 525 | 244 | mx -= 4 * (qx + 17); | |
| 526 |
2/2✓ Branch 0 taken 704 times.
✓ Branch 1 taken 115504 times.
|
116208 | else if (qx > width) |
| 527 | 704 | mx -= 4 * (qx - width); | |
| 528 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 116432 times.
|
116452 | if (qy < -18) |
| 529 | 20 | my -= 8 * (qy + 18); | |
| 530 |
2/2✓ Branch 0 taken 443 times.
✓ Branch 1 taken 115989 times.
|
116432 | else if (qy > height + 1) |
| 531 | 443 | my -= 8 * (qy - height - 1); | |
| 532 | } | ||
| 533 | |||
| 534 |
4/4✓ Branch 0 taken 116452 times.
✓ Branch 1 taken 161644 times.
✓ Branch 2 taken 113636 times.
✓ Branch 3 taken 2816 times.
|
278096 | if ((v->fcm == ILACE_FRAME) && fieldmv) |
| 535 |
2/2✓ Branch 0 taken 56818 times.
✓ Branch 1 taken 56818 times.
|
113636 | off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8; |
| 536 | else | ||
| 537 | 164460 | off = s->linesize * 4 * (n & 2) + (n & 1) * 8; | |
| 538 | |||
| 539 | 278096 | src_x = s->mb_x * 16 + (n & 1) * 8 + (mx >> 2); | |
| 540 |
2/2✓ Branch 0 taken 164460 times.
✓ Branch 1 taken 113636 times.
|
278096 | if (!fieldmv) |
| 541 | 164460 | src_y = s->mb_y * 16 + (n & 2) * 4 + (my >> 2); | |
| 542 | else | ||
| 543 | 113636 | src_y = s->mb_y * 16 + ((n > 1) ? 1 : 0) + (my >> 2); | |
| 544 | |||
| 545 |
2/2✓ Branch 0 taken 19626 times.
✓ Branch 1 taken 258470 times.
|
278096 | if (v->profile != PROFILE_ADVANCED) { |
| 546 | 19626 | src_x = av_clip(src_x, -16, s->mb_width * 16); | |
| 547 | 19626 | src_y = av_clip(src_y, -16, s->mb_height * 16); | |
| 548 | } else { | ||
| 549 | 258470 | src_x = av_clip(src_x, -17, s->avctx->coded_width); | |
| 550 |
2/2✓ Branch 0 taken 116452 times.
✓ Branch 1 taken 142018 times.
|
258470 | if (v->fcm == ILACE_FRAME) |
| 551 | 116452 | src_y = av_clip(src_y, -18 + (src_y & 1), s->avctx->coded_height + (src_y & 1)); | |
| 552 | else | ||
| 553 | 142018 | src_y = av_clip(src_y, -18, s->avctx->coded_height + 1); | |
| 554 | } | ||
| 555 | |||
| 556 | 278096 | srcY += src_y * s->linesize + src_x; | |
| 557 |
4/4✓ Branch 0 taken 65904 times.
✓ Branch 1 taken 212192 times.
✓ Branch 2 taken 24818 times.
✓ Branch 3 taken 41086 times.
|
278096 | if (v->field_mode && v->ref_field_type[dir]) |
| 558 | 24818 | srcY += linesize; | |
| 559 | |||
| 560 |
2/4✓ Branch 0 taken 278096 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 278096 times.
✗ Branch 3 not taken.
|
278096 | if (v->rangeredfrm || use_ic |
| 561 |
2/4✓ Branch 0 taken 278096 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 278096 times.
✗ Branch 3 not taken.
|
278096 | || s->h_edge_pos < 13 || v_edge_pos < 23 |
| 562 |
2/2✓ Branch 0 taken 271625 times.
✓ Branch 1 taken 6471 times.
|
278096 | || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2 |
| 563 |
2/2✓ Branch 0 taken 10387 times.
✓ Branch 1 taken 261238 times.
|
271625 | || (unsigned)(src_y - (s->mspel << fieldmv)) > v_edge_pos - (my & 3) - ((8 + s->mspel * 2) << fieldmv)) { |
| 564 | 16858 | const int k = 9 + s->mspel * 2; | |
| 565 | |||
| 566 | 16858 | srcY -= s->mspel * (1 + (s->linesize << fieldmv)); | |
| 567 | /* check emulate edge stride and offset */ | ||
| 568 |
2/2✓ Branch 0 taken 11658 times.
✓ Branch 1 taken 5200 times.
|
16858 | if (interlace) { |
| 569 | 5736 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 570 | srcY, | ||
| 571 | 11658 | linesize << 1, | |
| 572 | 11658 | linesize << 1, | |
| 573 | k, | ||
| 574 | 5922 | v->field_mode ? k : (k << fieldmv) + 1 >> 1, | |
| 575 | 11658 | src_x - s->mspel, | |
| 576 | 11658 | src_y - (s->mspel << fieldmv) >> !v->field_mode, | |
| 577 | s->h_edge_pos, | ||
| 578 |
2/2✓ Branch 0 taken 5922 times.
✓ Branch 1 taken 5736 times.
|
11658 | s->v_edge_pos >> 1); |
| 579 |
4/4✓ Branch 0 taken 5922 times.
✓ Branch 1 taken 5736 times.
✓ Branch 2 taken 114 times.
✓ Branch 3 taken 5808 times.
|
11658 | if (!v->field_mode && !fieldmv) |
| 580 | 114 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + linesize, | |
| 581 | 114 | srcY + linesize, | |
| 582 | 114 | linesize << 1, | |
| 583 | 114 | linesize << 1, | |
| 584 | k, | ||
| 585 | k >> 1, | ||
| 586 | 114 | src_x - s->mspel, | |
| 587 | 114 | src_y - s->mspel + 1 >> 1, | |
| 588 | s->h_edge_pos, | ||
| 589 | 114 | s->v_edge_pos >> 1); | |
| 590 | } else | ||
| 591 | 5200 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 592 | srcY, | ||
| 593 | linesize, | ||
| 594 | linesize, | ||
| 595 | k, | ||
| 596 | ✗ | v->field_mode ? (k << 1) - 1 : k << fieldmv, | |
| 597 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5200 times.
|
5200 | src_x - s->mspel, |
| 598 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5200 times.
|
5200 | v->field_mode ? 2 * (src_y - s->mspel) + v->ref_field_type[dir] : |
| 599 | 5200 | src_y - (s->mspel << fieldmv), | |
| 600 | s->h_edge_pos, | ||
| 601 | s->v_edge_pos); | ||
| 602 | 16858 | srcY = s->sc.edge_emu_buffer; | |
| 603 | /* if we deal with range reduction we need to scale source blocks */ | ||
| 604 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16858 times.
|
16858 | if (v->rangeredfrm) { |
| 605 | ✗ | vc1_scale_luma(srcY, k, s->linesize << fieldmv); | |
| 606 | } | ||
| 607 | /* if we deal with intensity compensation we need to scale source blocks */ | ||
| 608 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 16858 times.
|
16858 | if (use_ic) { |
| 609 | ✗ | vc1_lut_scale_luma(srcY, | |
| 610 | ✗ | luty[v->field_mode ? v->ref_field_type[dir] : (((0<<fieldmv)+src_y - (s->mspel << fieldmv)) & 1)], | |
| 611 | ✗ | luty[v->field_mode ? v->ref_field_type[dir] : (((1<<fieldmv)+src_y - (s->mspel << fieldmv)) & 1)], | |
| 612 | ✗ | k, s->linesize << fieldmv); | |
| 613 | } | ||
| 614 | 16858 | srcY += s->mspel * (1 + (s->linesize << fieldmv)); | |
| 615 | } | ||
| 616 | |||
| 617 |
1/2✓ Branch 0 taken 278096 times.
✗ Branch 1 not taken.
|
278096 | if (s->mspel) { |
| 618 | 278096 | dxy = ((my & 3) << 2) | (mx & 3); | |
| 619 |
2/2✓ Branch 0 taken 20328 times.
✓ Branch 1 taken 257768 times.
|
278096 | if (avg) |
| 620 | 20328 | v->vc1dsp.avg_vc1_mspel_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd); | |
| 621 | else | ||
| 622 | 257768 | v->vc1dsp.put_vc1_mspel_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize << fieldmv, v->rnd); | |
| 623 | } else { // hpel mc - always used for luma | ||
| 624 | ✗ | dxy = (my & 2) | ((mx & 2) >> 1); | |
| 625 | ✗ | if (!v->rnd) | |
| 626 | ✗ | s->hdsp.put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); | |
| 627 | else | ||
| 628 | ✗ | s->hdsp.put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); | |
| 629 | } | ||
| 630 | } | ||
| 631 | |||
| 632 | /** Do motion compensation for 4-MV macroblock - both chroma blocks | ||
| 633 | */ | ||
| 634 | 43052 | void ff_vc1_mc_4mv_chroma(VC1Context *v, int dir) | |
| 635 | { | ||
| 636 | 43052 | MpegEncContext *s = &v->s; | |
| 637 | 43052 | H264ChromaContext *h264chroma = &v->h264chroma; | |
| 638 | uint8_t *srcU, *srcV; | ||
| 639 | int uvmx, uvmy, uvsrc_x, uvsrc_y; | ||
| 640 | int16_t tx, ty; | ||
| 641 | int chroma_ref_type; | ||
| 642 | 43052 | int v_edge_pos = s->v_edge_pos >> v->field_mode; | |
| 643 | const uint8_t (*lutuv)[256]; | ||
| 644 | int use_ic; | ||
| 645 | int interlace; | ||
| 646 | int uvlinesize; | ||
| 647 | |||
| 648 |
3/4✓ Branch 0 taken 26576 times.
✓ Branch 1 taken 16476 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 26576 times.
|
43052 | if (!v->field_mode && !v->s.last_pic.data[0]) |
| 649 | 1218 | return; | |
| 650 | if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) | ||
| 651 | return; | ||
| 652 | |||
| 653 | /* calculate chroma MV vector from four luma MVs */ | ||
| 654 |
3/4✓ Branch 0 taken 16476 times.
✓ Branch 1 taken 26576 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16476 times.
|
43052 | if (!v->field_mode || !v->numref) { |
| 655 | 26576 | int valid_count = get_chroma_mv(v, dir, &tx, &ty); | |
| 656 |
2/2✓ Branch 0 taken 1218 times.
✓ Branch 1 taken 25358 times.
|
26576 | if (!valid_count) { |
| 657 | 1218 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0; | |
| 658 | 1218 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0; | |
| 659 | 1218 | v->luma_mv[s->mb_x][0] = v->luma_mv[s->mb_x][1] = 0; | |
| 660 | 1218 | return; //no need to do MC for intra blocks | |
| 661 | } | ||
| 662 | 25358 | chroma_ref_type = v->ref_field_type[dir]; | |
| 663 | } else { | ||
| 664 | 16476 | int opp_count = get_luma_mv(v, dir, &tx, &ty); | |
| 665 | 16476 | chroma_ref_type = v->cur_field_type ^ (opp_count > 2); | |
| 666 | } | ||
| 667 |
7/8✓ Branch 0 taken 16476 times.
✓ Branch 1 taken 25358 times.
✓ Branch 2 taken 6083 times.
✓ Branch 3 taken 10393 times.
✓ Branch 4 taken 3408 times.
✓ Branch 5 taken 2675 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3408 times.
|
41834 | if (v->field_mode && chroma_ref_type == 1 && v->cur_field_type == 1 && !v->s.last_pic.data[0]) |
| 668 | ✗ | return; | |
| 669 | 41834 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][0] = tx; | |
| 670 | 41834 | s->cur_pic.motion_val[1][s->block_index[0] + v->blocks_off][1] = ty; | |
| 671 | |||
| 672 | 41834 | uvlinesize = s->cur_pic.ptr->f->linesize[1]; | |
| 673 | |||
| 674 | 41834 | uvmx = (tx + ((tx & 3) == 3)) >> 1; | |
| 675 | 41834 | uvmy = (ty + ((ty & 3) == 3)) >> 1; | |
| 676 | |||
| 677 | 41834 | v->luma_mv[s->mb_x][0] = uvmx; | |
| 678 | 41834 | v->luma_mv[s->mb_x][1] = uvmy; | |
| 679 | |||
| 680 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 41834 times.
|
41834 | if (v->fastuvmc) { |
| 681 | ✗ | uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1)); | |
| 682 | ✗ | uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1)); | |
| 683 | } | ||
| 684 | // Field conversion bias | ||
| 685 |
2/2✓ Branch 0 taken 7711 times.
✓ Branch 1 taken 34123 times.
|
41834 | if (v->cur_field_type != chroma_ref_type) |
| 686 | 7711 | uvmy += 2 - 4 * chroma_ref_type; | |
| 687 | |||
| 688 | 41834 | uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
| 689 | 41834 | uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
| 690 | |||
| 691 |
2/2✓ Branch 0 taken 5416 times.
✓ Branch 1 taken 36418 times.
|
41834 | if (v->profile != PROFILE_ADVANCED) { |
| 692 | 5416 | uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); | |
| 693 | 5416 | uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); | |
| 694 | } else { | ||
| 695 | 36418 | uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); | |
| 696 | 36418 | uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); | |
| 697 | } | ||
| 698 | |||
| 699 |
2/2✓ Branch 0 taken 37318 times.
✓ Branch 1 taken 4516 times.
|
41834 | if (!dir) { |
| 700 |
6/6✓ Branch 0 taken 11960 times.
✓ Branch 1 taken 25358 times.
✓ Branch 2 taken 6433 times.
✓ Branch 3 taken 5527 times.
✓ Branch 4 taken 4584 times.
✓ Branch 5 taken 1849 times.
|
37318 | if (v->field_mode && (v->cur_field_type != chroma_ref_type) && v->second_field) { |
| 701 | 4584 | srcU = s->cur_pic.data[1]; | |
| 702 | 4584 | srcV = s->cur_pic.data[2]; | |
| 703 | 4584 | lutuv = v->curr_lutuv; | |
| 704 | 4584 | use_ic = *v->curr_use_ic; | |
| 705 | 4584 | interlace = 1; | |
| 706 | } else { | ||
| 707 | 32734 | srcU = s->last_pic.data[1]; | |
| 708 | 32734 | srcV = s->last_pic.data[2]; | |
| 709 | 32734 | lutuv = v->last_lutuv; | |
| 710 | 32734 | use_ic = v->last_use_ic; | |
| 711 | 32734 | interlace = v->last_interlaced; | |
| 712 | } | ||
| 713 | } else { | ||
| 714 | 4516 | srcU = s->next_pic.data[1]; | |
| 715 | 4516 | srcV = s->next_pic.data[2]; | |
| 716 | 4516 | lutuv = v->next_lutuv; | |
| 717 | 4516 | use_ic = v->next_use_ic; | |
| 718 | 4516 | interlace = v->next_interlaced; | |
| 719 | } | ||
| 720 | |||
| 721 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 41834 times.
|
41834 | if (!srcU) { |
| 722 | ✗ | av_log(v->s.avctx, AV_LOG_ERROR, "Referenced frame missing.\n"); | |
| 723 | ✗ | return; | |
| 724 | } | ||
| 725 | |||
| 726 | 41834 | srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 727 | 41834 | srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 728 | |||
| 729 |
2/2✓ Branch 0 taken 16476 times.
✓ Branch 1 taken 25358 times.
|
41834 | if (v->field_mode) { |
| 730 |
2/2✓ Branch 0 taken 6083 times.
✓ Branch 1 taken 10393 times.
|
16476 | if (chroma_ref_type) { |
| 731 | 6083 | srcU += uvlinesize; | |
| 732 | 6083 | srcV += uvlinesize; | |
| 733 | } | ||
| 734 | } | ||
| 735 | |||
| 736 |
2/4✓ Branch 0 taken 41834 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 41834 times.
✗ Branch 3 not taken.
|
41834 | if (v->rangeredfrm || use_ic |
| 737 |
2/4✓ Branch 0 taken 41834 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 41834 times.
✗ Branch 3 not taken.
|
41834 | || s->h_edge_pos < 18 || v_edge_pos < 18 |
| 738 |
2/2✓ Branch 0 taken 40719 times.
✓ Branch 1 taken 1115 times.
|
41834 | || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9 |
| 739 |
2/2✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 38667 times.
|
40719 | || (unsigned)uvsrc_y > (v_edge_pos >> 1) - 9) { |
| 740 |
2/2✓ Branch 0 taken 1640 times.
✓ Branch 1 taken 1527 times.
|
3167 | if (interlace) { |
| 741 | 1640 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 742 | srcU, | ||
| 743 | 1640 | uvlinesize << 1, | |
| 744 | 1640 | uvlinesize << 1, | |
| 745 | 9, | ||
| 746 | 1640 | v->field_mode ? 9 : 5, | |
| 747 | uvsrc_x, | ||
| 748 | 1640 | uvsrc_y >> !v->field_mode, | |
| 749 | 1640 | s->h_edge_pos >> 1, | |
| 750 |
1/2✓ Branch 0 taken 1640 times.
✗ Branch 1 not taken.
|
1640 | s->v_edge_pos >> 2); |
| 751 | 1640 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, | |
| 752 | srcV, | ||
| 753 | 1640 | uvlinesize << 1, | |
| 754 | 1640 | uvlinesize << 1, | |
| 755 | 9, | ||
| 756 | 1640 | v->field_mode ? 9 : 5, | |
| 757 | uvsrc_x, | ||
| 758 | 1640 | uvsrc_y >> !v->field_mode, | |
| 759 | 1640 | s->h_edge_pos >> 1, | |
| 760 |
1/2✓ Branch 0 taken 1640 times.
✗ Branch 1 not taken.
|
1640 | s->v_edge_pos >> 2); |
| 761 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1640 times.
|
1640 | if (!v->field_mode) { |
| 762 | ✗ | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + uvlinesize, | |
| 763 | ✗ | srcU + uvlinesize, | |
| 764 | ✗ | uvlinesize << 1, | |
| 765 | ✗ | uvlinesize << 1, | |
| 766 | 9, | ||
| 767 | 4, | ||
| 768 | uvsrc_x, | ||
| 769 | ✗ | uvsrc_y + 1 >> 1, | |
| 770 | ✗ | s->h_edge_pos >> 1, | |
| 771 | ✗ | s->v_edge_pos >> 2); | |
| 772 | ✗ | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16 + uvlinesize, | |
| 773 | ✗ | srcV + uvlinesize, | |
| 774 | ✗ | uvlinesize << 1, | |
| 775 | ✗ | uvlinesize << 1, | |
| 776 | 9, | ||
| 777 | 4, | ||
| 778 | uvsrc_x, | ||
| 779 | ✗ | uvsrc_y + 1 >> 1, | |
| 780 | ✗ | s->h_edge_pos >> 1, | |
| 781 | ✗ | s->v_edge_pos >> 2); | |
| 782 | } | ||
| 783 | } else { | ||
| 784 | 3054 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 785 | srcU, | ||
| 786 | uvlinesize, | ||
| 787 | uvlinesize, | ||
| 788 | 9, | ||
| 789 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1527 times.
|
1527 | v->field_mode ? 17 : 9, |
| 790 | uvsrc_x, | ||
| 791 | ✗ | v->field_mode ? 2 * uvsrc_y + chroma_ref_type : uvsrc_y, | |
| 792 | 1527 | s->h_edge_pos >> 1, | |
| 793 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1527 times.
|
1527 | s->v_edge_pos >> 1); |
| 794 | 3054 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, | |
| 795 | srcV, | ||
| 796 | uvlinesize, | ||
| 797 | uvlinesize, | ||
| 798 | 9, | ||
| 799 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1527 times.
|
1527 | v->field_mode ? 17 : 9, |
| 800 | uvsrc_x, | ||
| 801 | ✗ | v->field_mode ? 2 * uvsrc_y + chroma_ref_type : uvsrc_y, | |
| 802 | 1527 | s->h_edge_pos >> 1, | |
| 803 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1527 times.
|
1527 | s->v_edge_pos >> 1); |
| 804 | } | ||
| 805 | 3167 | srcU = s->sc.edge_emu_buffer; | |
| 806 | 3167 | srcV = s->sc.edge_emu_buffer + 16; | |
| 807 | |||
| 808 | /* if we deal with range reduction we need to scale source blocks */ | ||
| 809 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3167 times.
|
3167 | if (v->rangeredfrm) { |
| 810 | ✗ | vc1_scale_chroma(srcU, srcV, 9, s->uvlinesize); | |
| 811 | } | ||
| 812 | /* if we deal with intensity compensation we need to scale source blocks */ | ||
| 813 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3167 times.
|
3167 | if (use_ic) { |
| 814 | ✗ | vc1_lut_scale_chroma(srcU, srcV, | |
| 815 | ✗ | lutuv[v->field_mode ? chroma_ref_type : ((0 + uvsrc_y) & 1)], | |
| 816 | ✗ | lutuv[v->field_mode ? chroma_ref_type : ((1 + uvsrc_y) & 1)], | |
| 817 | ✗ | 9, s->uvlinesize); | |
| 818 | } | ||
| 819 | } | ||
| 820 | |||
| 821 | /* Chroma MC always uses qpel bilinear */ | ||
| 822 | 41834 | uvmx = (uvmx & 3) << 1; | |
| 823 | 41834 | uvmy = (uvmy & 3) << 1; | |
| 824 |
2/2✓ Branch 0 taken 22434 times.
✓ Branch 1 taken 19400 times.
|
41834 | if (!v->rnd) { |
| 825 | 22434 | h264chroma->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 826 | 22434 | h264chroma->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 827 | } else { | ||
| 828 | 19400 | v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 829 | 19400 | v->vc1dsp.put_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 830 | } | ||
| 831 |
2/2✓ Branch 0 taken 16476 times.
✓ Branch 1 taken 25358 times.
|
41834 | if (v->field_mode) { |
| 832 | 16476 | v->mv_f[dir][s->block_index[4] + v->mb_off] = v->cur_field_type != chroma_ref_type; | |
| 833 | 16476 | v->mv_f[dir][s->block_index[5] + v->mb_off] = v->cur_field_type != chroma_ref_type; | |
| 834 | } | ||
| 835 | } | ||
| 836 | |||
| 837 | /** Do motion compensation for 4-MV interlaced frame chroma macroblock (both U and V) | ||
| 838 | */ | ||
| 839 | 29113 | void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg) | |
| 840 | { | ||
| 841 | 29113 | MpegEncContext *s = &v->s; | |
| 842 | 29113 | H264ChromaContext *h264chroma = &v->h264chroma; | |
| 843 | uint8_t *srcU, *srcV; | ||
| 844 | int uvsrc_x, uvsrc_y; | ||
| 845 | int uvmx_field[4], uvmy_field[4]; | ||
| 846 | int i, off, tx, ty; | ||
| 847 | 29113 | int fieldmv = v->blk_mv_type[s->block_index[0]]; | |
| 848 | static const uint8_t s_rndtblfield[16] = { 0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12 }; | ||
| 849 |
2/2✓ Branch 0 taken 28409 times.
✓ Branch 1 taken 704 times.
|
29113 | int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks |
| 850 | 29113 | int v_edge_pos = s->v_edge_pos >> 1; | |
| 851 | int use_ic; | ||
| 852 | int interlace; | ||
| 853 | int uvlinesize; | ||
| 854 | const uint8_t (*lutuv)[256]; | ||
| 855 | |||
| 856 | if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) | ||
| 857 | ✗ | return; | |
| 858 | |||
| 859 | 29113 | uvlinesize = s->cur_pic.ptr->f->linesize[1]; | |
| 860 | |||
| 861 |
2/2✓ Branch 0 taken 116452 times.
✓ Branch 1 taken 29113 times.
|
145565 | for (i = 0; i < 4; i++) { |
| 862 |
2/2✓ Branch 0 taken 58226 times.
✓ Branch 1 taken 58226 times.
|
116452 | int d = i < 2 ? dir: dir2; |
| 863 | 116452 | tx = s->mv[d][i][0]; | |
| 864 | 116452 | uvmx_field[i] = (tx + ((tx & 3) == 3)) >> 1; | |
| 865 | 116452 | ty = s->mv[d][i][1]; | |
| 866 |
2/2✓ Branch 0 taken 113636 times.
✓ Branch 1 taken 2816 times.
|
116452 | if (fieldmv) |
| 867 | 113636 | uvmy_field[i] = (ty >> 4) * 8 + s_rndtblfield[ty & 0xF]; | |
| 868 | else | ||
| 869 | 2816 | uvmy_field[i] = (ty + ((ty & 3) == 3)) >> 1; | |
| 870 | } | ||
| 871 | |||
| 872 |
2/2✓ Branch 0 taken 116452 times.
✓ Branch 1 taken 29113 times.
|
145565 | for (i = 0; i < 4; i++) { |
| 873 |
2/2✓ Branch 0 taken 58226 times.
✓ Branch 1 taken 58226 times.
|
116452 | off = (i & 1) * 4 + ((i & 2) ? v_dist * s->uvlinesize : 0); |
| 874 | 116452 | uvsrc_x = s->mb_x * 8 + (i & 1) * 4 + (uvmx_field[i] >> 2); | |
| 875 |
2/2✓ Branch 0 taken 58226 times.
✓ Branch 1 taken 58226 times.
|
116452 | uvsrc_y = s->mb_y * 8 + ((i & 2) ? v_dist : 0) + (uvmy_field[i] >> 2); |
| 876 | // FIXME: implement proper pull-back (see vc1cropmv.c, vc1CROPMV_ChromaPullBack()) | ||
| 877 | 116452 | uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); | |
| 878 |
1/2✓ Branch 0 taken 116452 times.
✗ Branch 1 not taken.
|
116452 | if (v->fcm == ILACE_FRAME) |
| 879 | 116452 | uvsrc_y = av_clip(uvsrc_y, -8 + (uvsrc_y & 1), (s->avctx->coded_height >> 1) + (uvsrc_y & 1)); | |
| 880 | else | ||
| 881 | ✗ | uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); | |
| 882 |
4/4✓ Branch 0 taken 58226 times.
✓ Branch 1 taken 58226 times.
✓ Branch 2 taken 38710 times.
✓ Branch 3 taken 77742 times.
|
116452 | if (i < 2 ? dir : dir2) { |
| 883 | 38710 | srcU = s->next_pic.data[1]; | |
| 884 | 38710 | srcV = s->next_pic.data[2]; | |
| 885 | 38710 | lutuv = v->next_lutuv; | |
| 886 | 38710 | use_ic = v->next_use_ic; | |
| 887 | 38710 | interlace = v->next_interlaced; | |
| 888 | } else { | ||
| 889 | 77742 | srcU = s->last_pic.data[1]; | |
| 890 | 77742 | srcV = s->last_pic.data[2]; | |
| 891 | 77742 | lutuv = v->last_lutuv; | |
| 892 | 77742 | use_ic = v->last_use_ic; | |
| 893 | 77742 | interlace = v->last_interlaced; | |
| 894 | } | ||
| 895 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 116452 times.
|
116452 | if (!srcU) |
| 896 | ✗ | return; | |
| 897 | 116452 | srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 898 | 116452 | srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 899 | 116452 | uvmx_field[i] = (uvmx_field[i] & 3) << 1; | |
| 900 | 116452 | uvmy_field[i] = (uvmy_field[i] & 3) << 1; | |
| 901 | |||
| 902 |
1/2✓ Branch 0 taken 116452 times.
✗ Branch 1 not taken.
|
116452 | if (use_ic |
| 903 |
2/4✓ Branch 0 taken 116452 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 116452 times.
✗ Branch 3 not taken.
|
116452 | || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv) |
| 904 |
2/2✓ Branch 0 taken 113912 times.
✓ Branch 1 taken 2540 times.
|
116452 | || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5 |
| 905 |
2/2✓ Branch 0 taken 2887 times.
✓ Branch 1 taken 111025 times.
|
113912 | || (unsigned)uvsrc_y > v_edge_pos - (5 << fieldmv)) { |
| 906 |
1/2✓ Branch 0 taken 5427 times.
✗ Branch 1 not taken.
|
5427 | if (interlace) { |
| 907 | 5427 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 908 | srcU, | ||
| 909 | 5427 | uvlinesize << 1, | |
| 910 | 5427 | uvlinesize << 1, | |
| 911 | 5, | ||
| 912 | 5427 | (5 << fieldmv) + 1 >> 1, | |
| 913 | uvsrc_x, | ||
| 914 | uvsrc_y >> 1, | ||
| 915 | 5427 | s->h_edge_pos >> 1, | |
| 916 | 5427 | s->v_edge_pos >> 2); | |
| 917 | 5427 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, | |
| 918 | srcV, | ||
| 919 | 5427 | uvlinesize << 1, | |
| 920 | 5427 | uvlinesize << 1, | |
| 921 | 5, | ||
| 922 | 5427 | (5 << fieldmv) + 1 >> 1, | |
| 923 | uvsrc_x, | ||
| 924 | uvsrc_y >> 1, | ||
| 925 | 5427 | s->h_edge_pos >> 1, | |
| 926 | 5427 | s->v_edge_pos >> 2); | |
| 927 |
2/2✓ Branch 0 taken 108 times.
✓ Branch 1 taken 5319 times.
|
5427 | if (!fieldmv) { |
| 928 | 108 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + uvlinesize, | |
| 929 | 108 | srcU + uvlinesize, | |
| 930 | 108 | uvlinesize << 1, | |
| 931 | 108 | uvlinesize << 1, | |
| 932 | 5, | ||
| 933 | 2, | ||
| 934 | uvsrc_x, | ||
| 935 | 108 | uvsrc_y + 1 >> 1, | |
| 936 | 108 | s->h_edge_pos >> 1, | |
| 937 | 108 | s->v_edge_pos >> 2); | |
| 938 | 108 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16 + uvlinesize, | |
| 939 | 108 | srcV + uvlinesize, | |
| 940 | 108 | uvlinesize << 1, | |
| 941 | 108 | uvlinesize << 1, | |
| 942 | 5, | ||
| 943 | 2, | ||
| 944 | uvsrc_x, | ||
| 945 | 108 | uvsrc_y + 1 >> 1, | |
| 946 | 108 | s->h_edge_pos >> 1, | |
| 947 | 108 | s->v_edge_pos >> 2); | |
| 948 | } | ||
| 949 | } else { | ||
| 950 | ✗ | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 951 | srcU, | ||
| 952 | uvlinesize, | ||
| 953 | uvlinesize, | ||
| 954 | 5, | ||
| 955 | 5 << fieldmv, | ||
| 956 | uvsrc_x, | ||
| 957 | uvsrc_y, | ||
| 958 | ✗ | s->h_edge_pos >> 1, | |
| 959 | ✗ | s->v_edge_pos >> 1); | |
| 960 | ✗ | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + 16, | |
| 961 | srcV, | ||
| 962 | uvlinesize, | ||
| 963 | uvlinesize, | ||
| 964 | 5, | ||
| 965 | 5 << fieldmv, | ||
| 966 | uvsrc_x, | ||
| 967 | uvsrc_y, | ||
| 968 | ✗ | s->h_edge_pos >> 1, | |
| 969 | ✗ | s->v_edge_pos >> 1); | |
| 970 | } | ||
| 971 | 5427 | srcU = s->sc.edge_emu_buffer; | |
| 972 | 5427 | srcV = s->sc.edge_emu_buffer + 16; | |
| 973 | |||
| 974 | /* if we deal with intensity compensation we need to scale source blocks */ | ||
| 975 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5427 times.
|
5427 | if (use_ic) { |
| 976 | ✗ | vc1_lut_scale_chroma(srcU, srcV, | |
| 977 | ✗ | lutuv[(uvsrc_y + (0 << fieldmv)) & 1], | |
| 978 | ✗ | lutuv[(uvsrc_y + (1 << fieldmv)) & 1], | |
| 979 | ✗ | 5, s->uvlinesize << fieldmv); | |
| 980 | } | ||
| 981 | } | ||
| 982 |
2/2✓ Branch 0 taken 20328 times.
✓ Branch 1 taken 96124 times.
|
116452 | if (avg) { |
| 983 |
2/2✓ Branch 0 taken 10832 times.
✓ Branch 1 taken 9496 times.
|
20328 | if (!v->rnd) { |
| 984 | 10832 | h264chroma->avg_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]); | |
| 985 | 10832 | h264chroma->avg_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]); | |
| 986 | } else { | ||
| 987 | 9496 | v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]); | |
| 988 | 9496 | v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]); | |
| 989 | } | ||
| 990 | } else { | ||
| 991 |
2/2✓ Branch 0 taken 53028 times.
✓ Branch 1 taken 43096 times.
|
96124 | if (!v->rnd) { |
| 992 | 53028 | h264chroma->put_h264_chroma_pixels_tab[1](s->dest[1] + off, srcU, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]); | |
| 993 | 53028 | h264chroma->put_h264_chroma_pixels_tab[1](s->dest[2] + off, srcV, s->uvlinesize << fieldmv, 4, uvmx_field[i], uvmy_field[i]); | |
| 994 | } else { | ||
| 995 | 43096 | 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]); | |
| 996 | 43096 | 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]); | |
| 997 | } | ||
| 998 | } | ||
| 999 | } | ||
| 1000 | } | ||
| 1001 | |||
| 1002 | /** Motion compensation for direct or interpolated blocks in B-frames | ||
| 1003 | */ | ||
| 1004 | 28266 | void ff_vc1_interp_mc(VC1Context *v) | |
| 1005 | { | ||
| 1006 | 28266 | MpegEncContext *s = &v->s; | |
| 1007 | 28266 | H264ChromaContext *h264chroma = &v->h264chroma; | |
| 1008 | uint8_t *srcY, *srcU, *srcV; | ||
| 1009 | int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; | ||
| 1010 | 28266 | int v_edge_pos = s->v_edge_pos >> v->field_mode; | |
| 1011 | 28266 | int use_ic = v->next_use_ic; | |
| 1012 | 28266 | int interlace = v->next_interlaced; | |
| 1013 | int linesize, uvlinesize; | ||
| 1014 | |||
| 1015 |
3/4✓ Branch 0 taken 15610 times.
✓ Branch 1 taken 12656 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 15610 times.
|
28266 | if (!v->field_mode && !v->s.next_pic.data[0]) |
| 1016 | ✗ | return; | |
| 1017 | |||
| 1018 | 28266 | linesize = s->cur_pic.ptr->f->linesize[0]; | |
| 1019 | 28266 | uvlinesize = s->cur_pic.ptr->f->linesize[1]; | |
| 1020 | |||
| 1021 | 28266 | mx = s->mv[1][0][0]; | |
| 1022 | 28266 | my = s->mv[1][0][1]; | |
| 1023 | 28266 | uvmx = (mx + ((mx & 3) == 3)) >> 1; | |
| 1024 | 28266 | uvmy = (my + ((my & 3) == 3)) >> 1; | |
| 1025 |
4/4✓ Branch 0 taken 12656 times.
✓ Branch 1 taken 15610 times.
✓ Branch 2 taken 5223 times.
✓ Branch 3 taken 7433 times.
|
28266 | if (v->field_mode && v->cur_field_type != v->ref_field_type[1]) { |
| 1026 | 5223 | my = my - 2 + 4 * v->cur_field_type; | |
| 1027 | 5223 | uvmy = uvmy - 2 + 4 * v->cur_field_type; | |
| 1028 | } | ||
| 1029 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 28266 times.
|
28266 | if (v->fastuvmc) { |
| 1030 | ✗ | uvmx = uvmx + ((uvmx < 0) ? -(uvmx & 1) : (uvmx & 1)); | |
| 1031 | ✗ | uvmy = uvmy + ((uvmy < 0) ? -(uvmy & 1) : (uvmy & 1)); | |
| 1032 | } | ||
| 1033 | 28266 | srcY = s->next_pic.data[0]; | |
| 1034 | 28266 | srcU = s->next_pic.data[1]; | |
| 1035 | 28266 | srcV = s->next_pic.data[2]; | |
| 1036 | |||
| 1037 | 28266 | src_x = s->mb_x * 16 + (mx >> 2); | |
| 1038 | 28266 | src_y = s->mb_y * 16 + (my >> 2); | |
| 1039 | 28266 | uvsrc_x = s->mb_x * 8 + (uvmx >> 2); | |
| 1040 | 28266 | uvsrc_y = s->mb_y * 8 + (uvmy >> 2); | |
| 1041 | |||
| 1042 |
2/2✓ Branch 0 taken 5166 times.
✓ Branch 1 taken 23100 times.
|
28266 | if (v->profile != PROFILE_ADVANCED) { |
| 1043 | 5166 | src_x = av_clip( src_x, -16, s->mb_width * 16); | |
| 1044 | 5166 | src_y = av_clip( src_y, -16, s->mb_height * 16); | |
| 1045 | 5166 | uvsrc_x = av_clip(uvsrc_x, -8, s->mb_width * 8); | |
| 1046 | 5166 | uvsrc_y = av_clip(uvsrc_y, -8, s->mb_height * 8); | |
| 1047 | } else { | ||
| 1048 | 23100 | src_x = av_clip( src_x, -17, s->avctx->coded_width); | |
| 1049 | 23100 | uvsrc_x = av_clip(uvsrc_x, -8, s->avctx->coded_width >> 1); | |
| 1050 |
2/2✓ Branch 0 taken 6884 times.
✓ Branch 1 taken 16216 times.
|
23100 | if (v->fcm == ILACE_FRAME) { |
| 1051 | 6884 | src_y = av_clip(src_y, -18 + (src_y & 1), s->avctx->coded_height + (src_y & 1)); | |
| 1052 | 6884 | uvsrc_y = av_clip(uvsrc_y, -8 + (uvsrc_y & 1), (s->avctx->coded_height >> 1) + (uvsrc_y & 1)); | |
| 1053 | } else { | ||
| 1054 | 16216 | src_y = av_clip(src_y, -18, s->avctx->coded_height + 1); | |
| 1055 | 16216 | uvsrc_y = av_clip(uvsrc_y, -8, s->avctx->coded_height >> 1); | |
| 1056 | } | ||
| 1057 | } | ||
| 1058 | |||
| 1059 | 28266 | srcY += src_y * s->linesize + src_x; | |
| 1060 | 28266 | srcU += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 1061 | 28266 | srcV += uvsrc_y * s->uvlinesize + uvsrc_x; | |
| 1062 | |||
| 1063 |
4/4✓ Branch 0 taken 12656 times.
✓ Branch 1 taken 15610 times.
✓ Branch 2 taken 4716 times.
✓ Branch 3 taken 7940 times.
|
28266 | if (v->field_mode && v->ref_field_type[1]) { |
| 1064 | 4716 | srcY += linesize; | |
| 1065 | 4716 | srcU += uvlinesize; | |
| 1066 | 4716 | srcV += uvlinesize; | |
| 1067 | } | ||
| 1068 | |||
| 1069 | /* for grayscale we should not try to read from unknown area */ | ||
| 1070 | if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) { | ||
| 1071 | srcU = s->sc.edge_emu_buffer + 18 * s->linesize; | ||
| 1072 | srcV = s->sc.edge_emu_buffer + 18 * s->linesize; | ||
| 1073 | } | ||
| 1074 | |||
| 1075 |
4/8✓ Branch 0 taken 28266 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 28266 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 28266 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 28266 times.
✗ Branch 7 not taken.
|
28266 | if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22 || use_ic |
| 1076 |
2/2✓ Branch 0 taken 27224 times.
✓ Branch 1 taken 1042 times.
|
28266 | || (unsigned)(src_x - 1) > s->h_edge_pos - (mx & 3) - 16 - 3 |
| 1077 |
2/2✓ Branch 0 taken 2434 times.
✓ Branch 1 taken 24790 times.
|
27224 | || (unsigned)(src_y - 1) > v_edge_pos - (my & 3) - 16 - 3) { |
| 1078 | 3476 | uint8_t *ubuf = s->sc.edge_emu_buffer + 19 * s->linesize; | |
| 1079 | 3476 | uint8_t *vbuf = ubuf + 9 * s->uvlinesize; | |
| 1080 | 3476 | const int k = 17 + s->mspel * 2; | |
| 1081 | |||
| 1082 | 3476 | srcY -= s->mspel * (1 + s->linesize); | |
| 1083 |
2/2✓ Branch 0 taken 2034 times.
✓ Branch 1 taken 1442 times.
|
3476 | if (interlace) { |
| 1084 | 1601 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 1085 | srcY, | ||
| 1086 | 2034 | linesize << 1, | |
| 1087 | 2034 | linesize << 1, | |
| 1088 | k, | ||
| 1089 | 433 | v->field_mode ? k : (k + 1 >> 1), | |
| 1090 | 2034 | src_x - s->mspel, | |
| 1091 | 2034 | src_y - s->mspel >> !v->field_mode, | |
| 1092 | s->h_edge_pos, | ||
| 1093 |
2/2✓ Branch 0 taken 433 times.
✓ Branch 1 taken 1601 times.
|
2034 | s->v_edge_pos >> 1); |
| 1094 |
2/2✓ Branch 0 taken 433 times.
✓ Branch 1 taken 1601 times.
|
2034 | if (!v->field_mode) |
| 1095 | 433 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer + linesize, | |
| 1096 | 433 | srcY + linesize, | |
| 1097 | 433 | linesize << 1, | |
| 1098 | 433 | linesize << 1, | |
| 1099 | k, | ||
| 1100 | k >> 1, | ||
| 1101 | 433 | src_x - s->mspel, | |
| 1102 | 433 | src_y - s->mspel + 1 >> 1, | |
| 1103 | s->h_edge_pos, | ||
| 1104 | 433 | s->v_edge_pos >> 1); | |
| 1105 | } else | ||
| 1106 | 1442 | s->vdsp.emulated_edge_mc(s->sc.edge_emu_buffer, | |
| 1107 | srcY, | ||
| 1108 | linesize, | ||
| 1109 | linesize, | ||
| 1110 | k, | ||
| 1111 | ✗ | v->field_mode ? (k << 1) - 1 : k, | |
| 1112 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1442 times.
|
1442 | src_x - s->mspel, |
| 1113 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1442 times.
|
1442 | v->field_mode ? 2 * (src_y - s->mspel) + v->ref_field_type[1] : |
| 1114 | 1442 | src_y - s->mspel, | |
| 1115 | s->h_edge_pos, | ||
| 1116 | s->v_edge_pos); | ||
| 1117 | 3476 | srcY = s->sc.edge_emu_buffer; | |
| 1118 |
2/2✓ Branch 0 taken 2034 times.
✓ Branch 1 taken 1442 times.
|
3476 | if (interlace) { |
| 1119 | 2034 | s->vdsp.emulated_edge_mc(ubuf, | |
| 1120 | srcU, | ||
| 1121 | 2034 | uvlinesize << 1, | |
| 1122 | 2034 | uvlinesize << 1, | |
| 1123 | 9, | ||
| 1124 | 2034 | v->field_mode ? 9 : 5, | |
| 1125 | uvsrc_x, | ||
| 1126 | 2034 | uvsrc_y >> !v->field_mode, | |
| 1127 | 2034 | s->h_edge_pos >> 1, | |
| 1128 |
2/2✓ Branch 0 taken 1601 times.
✓ Branch 1 taken 433 times.
|
2034 | s->v_edge_pos >> 2); |
| 1129 | 2034 | s->vdsp.emulated_edge_mc(vbuf, | |
| 1130 | srcV, | ||
| 1131 | 2034 | uvlinesize << 1, | |
| 1132 | 2034 | uvlinesize << 1, | |
| 1133 | 9, | ||
| 1134 | 2034 | v->field_mode ? 9 : 5, | |
| 1135 | uvsrc_x, | ||
| 1136 | 2034 | uvsrc_y >> !v->field_mode, | |
| 1137 | 2034 | s->h_edge_pos >> 1, | |
| 1138 |
2/2✓ Branch 0 taken 1601 times.
✓ Branch 1 taken 433 times.
|
2034 | s->v_edge_pos >> 2); |
| 1139 |
2/2✓ Branch 0 taken 433 times.
✓ Branch 1 taken 1601 times.
|
2034 | if (!v->field_mode) { |
| 1140 | 433 | s->vdsp.emulated_edge_mc(ubuf + uvlinesize, | |
| 1141 | 433 | srcU + uvlinesize, | |
| 1142 | 433 | uvlinesize << 1, | |
| 1143 | 433 | uvlinesize << 1, | |
| 1144 | 9, | ||
| 1145 | 4, | ||
| 1146 | uvsrc_x, | ||
| 1147 | 433 | uvsrc_y + 1 >> 1, | |
| 1148 | 433 | s->h_edge_pos >> 1, | |
| 1149 | 433 | s->v_edge_pos >> 2); | |
| 1150 | 433 | s->vdsp.emulated_edge_mc(vbuf + uvlinesize, | |
| 1151 | 433 | srcV + uvlinesize, | |
| 1152 | 433 | uvlinesize << 1, | |
| 1153 | 433 | uvlinesize << 1, | |
| 1154 | 9, | ||
| 1155 | 4, | ||
| 1156 | uvsrc_x, | ||
| 1157 | 433 | uvsrc_y + 1 >> 1, | |
| 1158 | 433 | s->h_edge_pos >> 1, | |
| 1159 | 433 | s->v_edge_pos >> 2); | |
| 1160 | } | ||
| 1161 | } else { | ||
| 1162 | 2884 | s->vdsp.emulated_edge_mc(ubuf, | |
| 1163 | srcU, | ||
| 1164 | uvlinesize, | ||
| 1165 | uvlinesize, | ||
| 1166 | 9, | ||
| 1167 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1442 times.
|
1442 | v->field_mode ? 17 : 9, |
| 1168 | uvsrc_x, | ||
| 1169 | ✗ | v->field_mode ? 2 * uvsrc_y + v->ref_field_type[1] : uvsrc_y, | |
| 1170 | 1442 | s->h_edge_pos >> 1, | |
| 1171 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1442 times.
|
1442 | s->v_edge_pos >> 1); |
| 1172 | 2884 | s->vdsp.emulated_edge_mc(vbuf, | |
| 1173 | srcV, | ||
| 1174 | uvlinesize, | ||
| 1175 | uvlinesize, | ||
| 1176 | 9, | ||
| 1177 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1442 times.
|
1442 | v->field_mode ? 17 : 9, |
| 1178 | uvsrc_x, | ||
| 1179 | ✗ | v->field_mode ? 2 * uvsrc_y + v->ref_field_type[1] : uvsrc_y, | |
| 1180 | 1442 | s->h_edge_pos >> 1, | |
| 1181 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1442 times.
|
1442 | s->v_edge_pos >> 1); |
| 1182 | } | ||
| 1183 | 3476 | srcU = ubuf; | |
| 1184 | 3476 | srcV = vbuf; | |
| 1185 | /* if we deal with range reduction we need to scale source blocks */ | ||
| 1186 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3476 times.
|
3476 | if (v->rangeredfrm) { |
| 1187 | ✗ | vc1_scale_luma(srcY, k, s->linesize); | |
| 1188 | ✗ | vc1_scale_chroma(srcU, srcV, 9, s->uvlinesize); | |
| 1189 | } | ||
| 1190 | |||
| 1191 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3476 times.
|
3476 | if (use_ic) { |
| 1192 | ✗ | const uint8_t (*luty )[256] = v->next_luty; | |
| 1193 | ✗ | const uint8_t (*lutuv)[256] = v->next_lutuv; | |
| 1194 | ✗ | vc1_lut_scale_luma(srcY, | |
| 1195 | ✗ | luty[v->field_mode ? v->ref_field_type[1] : ((0+src_y - s->mspel) & 1)], | |
| 1196 | ✗ | luty[v->field_mode ? v->ref_field_type[1] : ((1+src_y - s->mspel) & 1)], | |
| 1197 | ✗ | k, s->linesize); | |
| 1198 | ✗ | vc1_lut_scale_chroma(srcU, srcV, | |
| 1199 | ✗ | lutuv[v->field_mode ? v->ref_field_type[1] : ((0+uvsrc_y) & 1)], | |
| 1200 | ✗ | lutuv[v->field_mode ? v->ref_field_type[1] : ((1+uvsrc_y) & 1)], | |
| 1201 | ✗ | 9, s->uvlinesize); | |
| 1202 | } | ||
| 1203 | 3476 | srcY += s->mspel * (1 + s->linesize); | |
| 1204 | } | ||
| 1205 | |||
| 1206 |
2/2✓ Branch 0 taken 21617 times.
✓ Branch 1 taken 6649 times.
|
28266 | if (s->mspel) { |
| 1207 | 21617 | dxy = ((my & 3) << 2) | (mx & 3); | |
| 1208 | 21617 | v->vc1dsp.avg_vc1_mspel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, v->rnd); | |
| 1209 | } else { // hpel mc | ||
| 1210 | 6649 | dxy = (my & 2) | ((mx & 2) >> 1); | |
| 1211 | |||
| 1212 |
2/2✓ Branch 0 taken 3673 times.
✓ Branch 1 taken 2976 times.
|
6649 | if (!v->rnd) |
| 1213 | 3673 | s->hdsp.avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); | |
| 1214 | else | ||
| 1215 | 2976 | s->hdsp.avg_no_rnd_pixels_tab[dxy](s->dest[0], srcY, s->linesize, 16); | |
| 1216 | } | ||
| 1217 | |||
| 1218 | if (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY) | ||
| 1219 | return; | ||
| 1220 | /* Chroma MC always uses qpel bilinear */ | ||
| 1221 | 28266 | uvmx = (uvmx & 3) << 1; | |
| 1222 | 28266 | uvmy = (uvmy & 3) << 1; | |
| 1223 |
2/2✓ Branch 0 taken 17299 times.
✓ Branch 1 taken 10967 times.
|
28266 | if (!v->rnd) { |
| 1224 | 17299 | h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 1225 | 17299 | h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 1226 | } else { | ||
| 1227 | 10967 | v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); | |
| 1228 | 10967 | v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); | |
| 1229 | } | ||
| 1230 | } | ||
| 1231 |