| 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 loopfilter | ||
| 27 | */ | ||
| 28 | |||
| 29 | #include "avcodec.h" | ||
| 30 | #include "mpegvideo.h" | ||
| 31 | #include "vc1.h" | ||
| 32 | #include "vc1dsp.h" | ||
| 33 | |||
| 34 | 2688 | static av_always_inline void vc1_h_overlap_filter(VC1Context *v, int16_t (*left_block)[64], | |
| 35 | int16_t (*right_block)[64], int left_fieldtx, | ||
| 36 | int right_fieldtx, int block_num) | ||
| 37 | { | ||
| 38 |
5/6✓ Branch 0 taken 420 times.
✓ Branch 1 taken 504 times.
✓ Branch 2 taken 420 times.
✓ Branch 3 taken 504 times.
✓ Branch 4 taken 840 times.
✗ Branch 5 not taken.
|
2688 | switch (block_num) { |
| 39 | 420 | case 0: | |
| 40 |
4/8✓ Branch 0 taken 420 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 420 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 420 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 420 times.
|
420 | v->vc1dsp.vc1_h_s_overlap(left_block[2], |
| 41 | right_block[0], | ||
| 42 | ✗ | left_fieldtx ^ right_fieldtx ? 16 - 8 * left_fieldtx : 8, | |
| 43 | ✗ | left_fieldtx ^ right_fieldtx ? 16 - 8 * right_fieldtx : 8, | |
| 44 | left_fieldtx || right_fieldtx ? 0 : 1); | ||
| 45 | 420 | break; | |
| 46 | |||
| 47 | 504 | case 1: | |
| 48 | 504 | v->vc1dsp.vc1_h_s_overlap(right_block[0], | |
| 49 | 504 | right_block[2], | |
| 50 | 8, | ||
| 51 | 8, | ||
| 52 | right_fieldtx ? 0 : 1); | ||
| 53 | 504 | break; | |
| 54 | |||
| 55 | 420 | case 2: | |
| 56 |
6/12✓ Branch 0 taken 420 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 420 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 420 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 420 times.
✓ Branch 8 taken 420 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 420 times.
|
840 | v->vc1dsp.vc1_h_s_overlap(!left_fieldtx && right_fieldtx ? left_block[2] + 8 : left_block[3], |
| 57 | ✗ | left_fieldtx && !right_fieldtx ? right_block[0] + 8 : right_block[1], | |
| 58 | ✗ | left_fieldtx ^ right_fieldtx ? 16 - 8 * left_fieldtx : 8, | |
| 59 | ✗ | left_fieldtx ^ right_fieldtx ? 16 - 8 * right_fieldtx : 8, | |
| 60 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 420 times.
|
420 | left_fieldtx || right_fieldtx ? 2 : 1); |
| 61 | 420 | break; | |
| 62 | |||
| 63 | 504 | case 3: | |
| 64 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 504 times.
|
504 | v->vc1dsp.vc1_h_s_overlap(right_block[1], |
| 65 | 504 | right_block[3], | |
| 66 | 8, | ||
| 67 | 8, | ||
| 68 | right_fieldtx ? 2 : 1); | ||
| 69 | 504 | break; | |
| 70 | |||
| 71 | 840 | case 4: | |
| 72 | case 5: | ||
| 73 | 840 | v->vc1dsp.vc1_h_s_overlap(left_block[block_num], right_block[block_num], 8, 8, 1); | |
| 74 | 840 | break; | |
| 75 | } | ||
| 76 | 2688 | } | |
| 77 | |||
| 78 | 2456 | static av_always_inline void vc1_v_overlap_filter(VC1Context *v, int16_t (*top_block)[64], | |
| 79 | int16_t (*bottom_block)[64], int block_num) | ||
| 80 | { | ||
| 81 |
5/6✓ Branch 0 taken 362 times.
✓ Branch 1 taken 362 times.
✓ Branch 2 taken 504 times.
✓ Branch 3 taken 504 times.
✓ Branch 4 taken 724 times.
✗ Branch 5 not taken.
|
2456 | switch (block_num) { |
| 82 | 362 | case 0: | |
| 83 | 362 | v->vc1dsp.vc1_v_s_overlap(top_block[1], bottom_block[0]); | |
| 84 | 362 | break; | |
| 85 | |||
| 86 | 362 | case 1: | |
| 87 | 362 | v->vc1dsp.vc1_v_s_overlap(top_block[3], bottom_block[2]); | |
| 88 | 362 | break; | |
| 89 | |||
| 90 | 504 | case 2: | |
| 91 | 504 | v->vc1dsp.vc1_v_s_overlap(bottom_block[0], bottom_block[1]); | |
| 92 | 504 | break; | |
| 93 | |||
| 94 | 504 | case 3: | |
| 95 | 504 | v->vc1dsp.vc1_v_s_overlap(bottom_block[2], bottom_block[3]); | |
| 96 | 504 | break; | |
| 97 | |||
| 98 | 724 | case 4: | |
| 99 | case 5: | ||
| 100 | 724 | v->vc1dsp.vc1_v_s_overlap(top_block[block_num], bottom_block[block_num]); | |
| 101 | 724 | break; | |
| 102 | } | ||
| 103 | 2456 | } | |
| 104 | |||
| 105 | 798 | void ff_vc1_i_overlap_filter(VC1Context *v) | |
| 106 | { | ||
| 107 | 798 | MpegEncContext *s = &v->s; | |
| 108 | int16_t (*topleft_blk)[64], (*top_blk)[64], (*left_blk)[64], (*cur_blk)[64]; | ||
| 109 | 798 | int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; | |
| 110 | 798 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 111 | int i; | ||
| 112 | |||
| 113 | 798 | topleft_blk = v->block[v->topleft_blk_idx]; | |
| 114 | 798 | top_blk = v->block[v->top_blk_idx]; | |
| 115 | 798 | left_blk = v->block[v->left_blk_idx]; | |
| 116 | 798 | cur_blk = v->block[v->cur_blk_idx]; | |
| 117 | |||
| 118 | /* Within a MB, the horizontal overlap always runs before the vertical. | ||
| 119 | * To accomplish that, we run the H on the left and internal vertical | ||
| 120 | * borders of the currently decoded MB. Then, we wait for the next overlap | ||
| 121 | * iteration to do H overlap on the right edge of this MB, before moving | ||
| 122 | * over and running the V overlap on the top and internal horizontal | ||
| 123 | * borders. Therefore, the H overlap trails by one MB col and the | ||
| 124 | * V overlap trails by one MB row. This is reflected in the time at which | ||
| 125 | * we run the put_pixels loop, i.e. delayed by one row and one column. */ | ||
| 126 |
2/2✓ Branch 0 taken 4788 times.
✓ Branch 1 taken 798 times.
|
5586 | for (i = 0; i < block_count; i++) { |
| 127 |
4/4✓ Branch 0 taken 288 times.
✓ Branch 1 taken 4500 times.
✓ Branch 2 taken 192 times.
✓ Branch 3 taken 96 times.
|
4788 | if (s->mb_x == 0 && (i & 5) != 1) |
| 128 | 192 | continue; | |
| 129 | |||
| 130 |
2/4✓ Branch 0 taken 4596 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4596 times.
✗ Branch 3 not taken.
|
4596 | if (v->pq >= 9 || (v->profile == PROFILE_ADVANCED && |
| 131 |
1/2✓ Branch 0 taken 4596 times.
✗ Branch 1 not taken.
|
4596 | (v->condover == CONDOVER_ALL || |
| 132 |
2/2✓ Branch 0 taken 2896 times.
✓ Branch 1 taken 1700 times.
|
4596 | (v->over_flags_plane[mb_pos] && |
| 133 |
4/4✓ Branch 0 taken 1888 times.
✓ Branch 1 taken 1008 times.
✓ Branch 2 taken 1680 times.
✓ Branch 3 taken 208 times.
|
2896 | ((i & 5) == 1 || v->over_flags_plane[mb_pos - 1]))))) |
| 134 | 8064 | vc1_h_overlap_filter(v, | |
| 135 |
2/2✓ Branch 0 taken 2624 times.
✓ Branch 1 taken 64 times.
|
2688 | s->mb_x ? left_blk : cur_blk, cur_blk, |
| 136 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 2688 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2688 | v->fcm == ILACE_FRAME && s->mb_x && v->fieldtx_plane[mb_pos - 1], |
| 137 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2688 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
2688 | v->fcm == ILACE_FRAME && v->fieldtx_plane[mb_pos], |
| 138 | i); | ||
| 139 | } | ||
| 140 | |||
| 141 |
1/2✓ Branch 0 taken 798 times.
✗ Branch 1 not taken.
|
798 | if (v->fcm != ILACE_FRAME) |
| 142 |
2/2✓ Branch 0 taken 4788 times.
✓ Branch 1 taken 798 times.
|
5586 | for (i = 0; i < block_count; i++) { |
| 143 |
4/4✓ Branch 0 taken 372 times.
✓ Branch 1 taken 4416 times.
✓ Branch 2 taken 248 times.
✓ Branch 3 taken 124 times.
|
4788 | if (s->first_slice_line && !(i & 2)) |
| 144 | 248 | continue; | |
| 145 | |||
| 146 |
2/2✓ Branch 0 taken 4268 times.
✓ Branch 1 taken 272 times.
|
4540 | if (s->mb_x && |
| 147 |
2/4✓ Branch 0 taken 4268 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4268 times.
✗ Branch 3 not taken.
|
4268 | (v->pq >= 9 || (v->profile == PROFILE_ADVANCED && |
| 148 |
1/2✓ Branch 0 taken 4268 times.
✗ Branch 1 not taken.
|
4268 | (v->condover == CONDOVER_ALL || |
| 149 |
2/2✓ Branch 0 taken 2596 times.
✓ Branch 1 taken 1672 times.
|
4268 | (v->over_flags_plane[mb_pos - 1] && |
| 150 |
4/4✓ Branch 0 taken 1656 times.
✓ Branch 1 taken 940 times.
✓ Branch 2 taken 1344 times.
✓ Branch 3 taken 312 times.
|
2596 | ((i & 2) || v->over_flags_plane[mb_pos - 1 - s->mb_stride])))))) |
| 151 |
2/2✓ Branch 0 taken 112 times.
✓ Branch 1 taken 2172 times.
|
2284 | vc1_v_overlap_filter(v, s->first_slice_line ? left_blk : topleft_blk, left_blk, i); |
| 152 |
2/2✓ Branch 0 taken 272 times.
✓ Branch 1 taken 4268 times.
|
4540 | if (s->mb_x == s->mb_width - 1 && |
| 153 |
2/4✓ Branch 0 taken 272 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 272 times.
✗ Branch 3 not taken.
|
272 | (v->pq >= 9 || (v->profile == PROFILE_ADVANCED && |
| 154 |
1/2✓ Branch 0 taken 272 times.
✗ Branch 1 not taken.
|
272 | (v->condover == CONDOVER_ALL || |
| 155 |
2/2✓ Branch 0 taken 188 times.
✓ Branch 1 taken 84 times.
|
272 | (v->over_flags_plane[mb_pos] && |
| 156 |
4/4✓ Branch 0 taken 120 times.
✓ Branch 1 taken 68 times.
✓ Branch 2 taken 104 times.
✓ Branch 3 taken 16 times.
|
188 | ((i & 2) || v->over_flags_plane[mb_pos - s->mb_stride])))))) |
| 157 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 164 times.
|
172 | vc1_v_overlap_filter(v, s->first_slice_line ? cur_blk : top_blk, cur_blk, i); |
| 158 | } | ||
| 159 | 798 | } | |
| 160 | |||
| 161 | ✗ | void ff_vc1_p_overlap_filter(VC1Context *v) | |
| 162 | { | ||
| 163 | ✗ | MpegEncContext *s = &v->s; | |
| 164 | int16_t (*topleft_blk)[64], (*top_blk)[64], (*left_blk)[64], (*cur_blk)[64]; | ||
| 165 | ✗ | int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; | |
| 166 | ✗ | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 167 | int i; | ||
| 168 | |||
| 169 | ✗ | topleft_blk = v->block[v->topleft_blk_idx]; | |
| 170 | ✗ | top_blk = v->block[v->top_blk_idx]; | |
| 171 | ✗ | left_blk = v->block[v->left_blk_idx]; | |
| 172 | ✗ | cur_blk = v->block[v->cur_blk_idx]; | |
| 173 | |||
| 174 | ✗ | for (i = 0; i < block_count; i++) { | |
| 175 | ✗ | if (s->mb_x == 0 && (i & 5) != 1) | |
| 176 | ✗ | continue; | |
| 177 | |||
| 178 | ✗ | if (v->mb_type[s->block_index[i]] && v->mb_type[s->block_index[i] - 1]) | |
| 179 | ✗ | vc1_h_overlap_filter(v, | |
| 180 | ✗ | s->mb_x ? left_blk : cur_blk, cur_blk, | |
| 181 | ✗ | v->fcm == ILACE_FRAME && s->mb_x && v->fieldtx_plane[mb_pos - 1], | |
| 182 | ✗ | v->fcm == ILACE_FRAME && v->fieldtx_plane[mb_pos], | |
| 183 | i); | ||
| 184 | } | ||
| 185 | |||
| 186 | ✗ | if (v->fcm != ILACE_FRAME) | |
| 187 | ✗ | for (i = 0; i < block_count; i++) { | |
| 188 | ✗ | if (s->first_slice_line && !(i & 2)) | |
| 189 | ✗ | continue; | |
| 190 | |||
| 191 | ✗ | if (s->mb_x && v->mb_type[s->block_index[i] - 2 + (i > 3)] && | |
| 192 | ✗ | v->mb_type[s->block_index[i] - s->block_wrap[i] - 2 + (i > 3)]) | |
| 193 | ✗ | vc1_v_overlap_filter(v, s->first_slice_line ? left_blk : topleft_blk, left_blk, i); | |
| 194 | ✗ | if (s->mb_x == s->mb_width - 1) | |
| 195 | ✗ | if (v->mb_type[s->block_index[i]] && | |
| 196 | ✗ | v->mb_type[s->block_index[i] - s->block_wrap[i]]) | |
| 197 | ✗ | vc1_v_overlap_filter(v, s->first_slice_line ? cur_blk : top_blk, cur_blk, i); | |
| 198 | } | ||
| 199 | ✗ | } | |
| 200 | |||
| 201 | #define LEFT_EDGE (1 << 0) | ||
| 202 | #define RIGHT_EDGE (1 << 1) | ||
| 203 | #define TOP_EDGE (1 << 2) | ||
| 204 | #define BOTTOM_EDGE (1 << 3) | ||
| 205 | |||
| 206 | 257748 | static av_always_inline void vc1_i_h_loop_filter(VC1Context *v, uint8_t *dest, | |
| 207 | uint32_t flags, int block_num) | ||
| 208 | { | ||
| 209 | 257748 | MpegEncContext *s = &v->s; | |
| 210 | 257748 | int pq = v->pq; | |
| 211 | uint8_t *dst; | ||
| 212 | |||
| 213 |
2/2✓ Branch 0 taken 85916 times.
✓ Branch 1 taken 171832 times.
|
257748 | if (block_num & 2) |
| 214 | 85916 | return; | |
| 215 | |||
| 216 |
4/4✓ Branch 0 taken 6512 times.
✓ Branch 1 taken 165320 times.
✓ Branch 2 taken 1628 times.
✓ Branch 3 taken 4884 times.
|
171832 | if (!(flags & LEFT_EDGE) || (block_num & 5) == 1) { |
| 217 |
2/2✓ Branch 0 taken 82660 times.
✓ Branch 1 taken 84288 times.
|
166948 | if (block_num > 3) |
| 218 | 82660 | dst = dest; | |
| 219 | else | ||
| 220 | 84288 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 221 | |||
| 222 |
2/2✓ Branch 0 taken 64872 times.
✓ Branch 1 taken 102076 times.
|
166948 | if (v->fcm == ILACE_FRAME) |
| 223 |
2/2✓ Branch 0 taken 32368 times.
✓ Branch 1 taken 32504 times.
|
64872 | if (block_num > 3) { |
| 224 | 32368 | v->vc1dsp.vc1_h_loop_filter4(dst, 2 * s->uvlinesize, pq); | |
| 225 | 32368 | v->vc1dsp.vc1_h_loop_filter4(dst + s->uvlinesize, 2 * s->uvlinesize, pq); | |
| 226 | } else { | ||
| 227 | 32504 | v->vc1dsp.vc1_h_loop_filter8(dst, 2 * s->linesize, pq); | |
| 228 | 32504 | v->vc1dsp.vc1_h_loop_filter8(dst + s->linesize, 2 * s->linesize, pq); | |
| 229 | } | ||
| 230 | else | ||
| 231 |
2/2✓ Branch 0 taken 50292 times.
✓ Branch 1 taken 51784 times.
|
102076 | if (block_num > 3) |
| 232 | 50292 | v->vc1dsp.vc1_h_loop_filter8(dst, s->uvlinesize, pq); | |
| 233 | else | ||
| 234 | 51784 | v->vc1dsp.vc1_h_loop_filter16(dst, s->linesize, pq); | |
| 235 | } | ||
| 236 | } | ||
| 237 | |||
| 238 | 257748 | static av_always_inline void vc1_i_v_loop_filter(VC1Context *v, uint8_t *dest, | |
| 239 | uint32_t flags, uint8_t fieldtx, | ||
| 240 | int block_num) | ||
| 241 | { | ||
| 242 | 257748 | MpegEncContext *s = &v->s; | |
| 243 | 257748 | int pq = v->pq; | |
| 244 | uint8_t *dst; | ||
| 245 | |||
| 246 |
2/2✓ Branch 0 taken 85916 times.
✓ Branch 1 taken 171832 times.
|
257748 | if ((block_num & 5) == 1) |
| 247 | 85916 | return; | |
| 248 | |||
| 249 |
4/4✓ Branch 0 taken 12656 times.
✓ Branch 1 taken 159176 times.
✓ Branch 2 taken 3164 times.
✓ Branch 3 taken 9492 times.
|
171832 | if (!(flags & TOP_EDGE) || block_num & 2) { |
| 250 |
2/2✓ Branch 0 taken 79588 times.
✓ Branch 1 taken 82752 times.
|
162340 | if (block_num > 3) |
| 251 | 79588 | dst = dest; | |
| 252 | else | ||
| 253 | 82752 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 254 | |||
| 255 |
2/2✓ Branch 0 taken 64560 times.
✓ Branch 1 taken 97780 times.
|
162340 | if (v->fcm == ILACE_FRAME) { |
| 256 |
2/2✓ Branch 0 taken 32160 times.
✓ Branch 1 taken 32400 times.
|
64560 | if (block_num > 3) { |
| 257 | 32160 | v->vc1dsp.vc1_v_loop_filter8(dst, 2 * s->uvlinesize, pq); | |
| 258 | 32160 | v->vc1dsp.vc1_v_loop_filter8(dst + s->uvlinesize, 2 * s->uvlinesize, pq); | |
| 259 |
4/4✓ Branch 0 taken 16320 times.
✓ Branch 1 taken 16080 times.
✓ Branch 2 taken 11066 times.
✓ Branch 3 taken 5254 times.
|
32400 | } else if (block_num < 2 || !fieldtx) { |
| 260 | 27146 | v->vc1dsp.vc1_v_loop_filter16(dst, 2 * s->linesize, pq); | |
| 261 | 27146 | v->vc1dsp.vc1_v_loop_filter16(dst + s->linesize, 2 * s->linesize, pq); | |
| 262 | } | ||
| 263 | } else | ||
| 264 |
2/2✓ Branch 0 taken 47428 times.
✓ Branch 1 taken 50352 times.
|
97780 | if (block_num > 3) |
| 265 | 47428 | v->vc1dsp.vc1_v_loop_filter8(dst, s->uvlinesize, pq); | |
| 266 | else | ||
| 267 | 50352 | v->vc1dsp.vc1_v_loop_filter16(dst, s->linesize, pq); | |
| 268 | } | ||
| 269 | } | ||
| 270 | |||
| 271 | 42958 | void ff_vc1_i_loop_filter(VC1Context *v) | |
| 272 | { | ||
| 273 | 42958 | MpegEncContext *s = &v->s; | |
| 274 | 42958 | int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; | |
| 275 | 42958 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 276 | uint8_t *dest, fieldtx; | ||
| 277 | 42958 | uint32_t flags = 0; | |
| 278 | int i; | ||
| 279 | |||
| 280 | /* Within a MB, the vertical loop filter always runs before the horizontal. | ||
| 281 | * To accomplish that, we run the V loop filter on top and internal | ||
| 282 | * horizontal borders of the last overlap filtered MB. Then, we wait for | ||
| 283 | * the loop filter iteration on the next row to do V loop filter on the | ||
| 284 | * bottom edge of this MB, before moving over and running the H loop | ||
| 285 | * filter on the left and internal vertical borders. Therefore, the loop | ||
| 286 | * filter trails by one row and one column relative to the overlap filter | ||
| 287 | * and two rows and two columns relative to the decoding loop. */ | ||
| 288 |
2/2✓ Branch 0 taken 39794 times.
✓ Branch 1 taken 3164 times.
|
42958 | if (!s->first_slice_line) { |
| 289 | 39794 | dest = s->dest[0] - 16 * s->linesize - 16; | |
| 290 |
2/2✓ Branch 0 taken 2986 times.
✓ Branch 1 taken 36808 times.
|
39794 | flags = s->mb_y == s->start_mb_y + 1 ? TOP_EDGE : 0; |
| 291 |
2/2✓ Branch 0 taken 38337 times.
✓ Branch 1 taken 1457 times.
|
39794 | if (s->mb_x) { |
| 292 | 38337 | fieldtx = v->fieldtx_plane[mb_pos - s->mb_stride - 1]; | |
| 293 |
2/2✓ Branch 0 taken 230022 times.
✓ Branch 1 taken 38337 times.
|
268359 | for (i = 0; i < block_count; i++) |
| 294 |
2/2✓ Branch 0 taken 76674 times.
✓ Branch 1 taken 153348 times.
|
230022 | vc1_i_v_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, flags, fieldtx, i); |
| 295 | } | ||
| 296 |
2/2✓ Branch 0 taken 1457 times.
✓ Branch 1 taken 38337 times.
|
39794 | if (s->mb_x == v->end_mb_x - 1) { |
| 297 | 1457 | dest += 16; | |
| 298 | 1457 | fieldtx = v->fieldtx_plane[mb_pos - s->mb_stride]; | |
| 299 |
2/2✓ Branch 0 taken 8742 times.
✓ Branch 1 taken 1457 times.
|
10199 | for (i = 0; i < block_count; i++) |
| 300 |
2/2✓ Branch 0 taken 2914 times.
✓ Branch 1 taken 5828 times.
|
8742 | vc1_i_v_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, flags, fieldtx, i); |
| 301 | } | ||
| 302 | } | ||
| 303 |
2/2✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 39794 times.
|
42958 | if (s->mb_y == s->end_mb_y - 1) { |
| 304 | 3164 | dest = s->dest[0] - 16; | |
| 305 |
2/2✓ Branch 0 taken 178 times.
✓ Branch 1 taken 2986 times.
|
3164 | flags = s->first_slice_line ? TOP_EDGE | BOTTOM_EDGE : BOTTOM_EDGE; |
| 306 |
2/2✓ Branch 0 taken 2993 times.
✓ Branch 1 taken 171 times.
|
3164 | if (s->mb_x) { |
| 307 | 2993 | fieldtx = v->fieldtx_plane[mb_pos - 1]; | |
| 308 |
2/2✓ Branch 0 taken 17958 times.
✓ Branch 1 taken 2993 times.
|
20951 | for (i = 0; i < block_count; i++) |
| 309 |
2/2✓ Branch 0 taken 5986 times.
✓ Branch 1 taken 11972 times.
|
17958 | vc1_i_v_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 : dest, flags, fieldtx, i); |
| 310 | } | ||
| 311 |
2/2✓ Branch 0 taken 171 times.
✓ Branch 1 taken 2993 times.
|
3164 | if (s->mb_x == v->end_mb_x - 1) { |
| 312 | 171 | dest += 16; | |
| 313 | 171 | fieldtx = v->fieldtx_plane[mb_pos]; | |
| 314 |
2/2✓ Branch 0 taken 1026 times.
✓ Branch 1 taken 171 times.
|
1197 | for (i = 0; i < block_count; i++) |
| 315 |
2/2✓ Branch 0 taken 342 times.
✓ Branch 1 taken 684 times.
|
1026 | vc1_i_v_loop_filter(v, i > 3 ? s->dest[i - 3] : dest, flags, fieldtx, i); |
| 316 | } | ||
| 317 | } | ||
| 318 | |||
| 319 |
2/2✓ Branch 0 taken 36808 times.
✓ Branch 1 taken 6150 times.
|
42958 | if (s->mb_y >= s->start_mb_y + 2) { |
| 320 | 36808 | dest = s->dest[0] - 32 * s->linesize - 16; | |
| 321 |
2/2✓ Branch 0 taken 35518 times.
✓ Branch 1 taken 1290 times.
|
36808 | if (s->mb_x) { |
| 322 | 35518 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 323 |
2/2✓ Branch 0 taken 213108 times.
✓ Branch 1 taken 35518 times.
|
248626 | for (i = 0; i < block_count; i++) |
| 324 |
2/2✓ Branch 0 taken 71036 times.
✓ Branch 1 taken 142072 times.
|
213108 | vc1_i_h_loop_filter(v, i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize - 8 : dest, flags, i); |
| 325 | } | ||
| 326 |
2/2✓ Branch 0 taken 1290 times.
✓ Branch 1 taken 35518 times.
|
36808 | if (s->mb_x == v->end_mb_x - 1) { |
| 327 | 1290 | dest += 16; | |
| 328 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1290 times.
|
1290 | flags = s->mb_x == 0 ? LEFT_EDGE | RIGHT_EDGE : RIGHT_EDGE; |
| 329 |
2/2✓ Branch 0 taken 7740 times.
✓ Branch 1 taken 1290 times.
|
9030 | for (i = 0; i < block_count; i++) |
| 330 |
2/2✓ Branch 0 taken 2580 times.
✓ Branch 1 taken 5160 times.
|
7740 | vc1_i_h_loop_filter(v, i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize : dest, flags, i); |
| 331 | } | ||
| 332 | } | ||
| 333 |
2/2✓ Branch 0 taken 3164 times.
✓ Branch 1 taken 39794 times.
|
42958 | if (s->mb_y == s->end_mb_y - 1) { |
| 334 |
2/2✓ Branch 0 taken 2986 times.
✓ Branch 1 taken 178 times.
|
3164 | if (s->mb_y >= s->start_mb_y + 1) { |
| 335 | 2986 | dest = s->dest[0] - 16 * s->linesize - 16; | |
| 336 |
2/2✓ Branch 0 taken 2819 times.
✓ Branch 1 taken 167 times.
|
2986 | if (s->mb_x) { |
| 337 | 2819 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 338 |
2/2✓ Branch 0 taken 16914 times.
✓ Branch 1 taken 2819 times.
|
19733 | for (i = 0; i < block_count; i++) |
| 339 |
2/2✓ Branch 0 taken 5638 times.
✓ Branch 1 taken 11276 times.
|
16914 | vc1_i_h_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, flags, i); |
| 340 | } | ||
| 341 |
2/2✓ Branch 0 taken 167 times.
✓ Branch 1 taken 2819 times.
|
2986 | if (s->mb_x == v->end_mb_x - 1) { |
| 342 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 167 times.
|
167 | flags = s->mb_x == 0 ? LEFT_EDGE | RIGHT_EDGE : RIGHT_EDGE; |
| 343 | 167 | dest += 16; | |
| 344 |
2/2✓ Branch 0 taken 1002 times.
✓ Branch 1 taken 167 times.
|
1169 | for (i = 0; i < block_count; i++) |
| 345 |
2/2✓ Branch 0 taken 334 times.
✓ Branch 1 taken 668 times.
|
1002 | vc1_i_h_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, flags, i); |
| 346 | } | ||
| 347 | } | ||
| 348 | 3164 | dest = s->dest[0] - 16; | |
| 349 |
2/2✓ Branch 0 taken 2993 times.
✓ Branch 1 taken 171 times.
|
3164 | if (s->mb_x) { |
| 350 | 2993 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 351 |
2/2✓ Branch 0 taken 17958 times.
✓ Branch 1 taken 2993 times.
|
20951 | for (i = 0; i < block_count; i++) |
| 352 |
2/2✓ Branch 0 taken 5986 times.
✓ Branch 1 taken 11972 times.
|
17958 | vc1_i_h_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 : dest, flags, i); |
| 353 | } | ||
| 354 |
2/2✓ Branch 0 taken 171 times.
✓ Branch 1 taken 2993 times.
|
3164 | if (s->mb_x == v->end_mb_x - 1) { |
| 355 | 171 | dest += 16; | |
| 356 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 171 times.
|
171 | flags = s->mb_x == 0 ? LEFT_EDGE | RIGHT_EDGE : RIGHT_EDGE; |
| 357 |
2/2✓ Branch 0 taken 1026 times.
✓ Branch 1 taken 171 times.
|
1197 | for (i = 0; i < block_count; i++) |
| 358 |
2/2✓ Branch 0 taken 342 times.
✓ Branch 1 taken 684 times.
|
1026 | vc1_i_h_loop_filter(v, i > 3 ? s->dest[i - 3] : dest, flags, i); |
| 359 | } | ||
| 360 | } | ||
| 361 | 42958 | } | |
| 362 | |||
| 363 | 787344 | static av_always_inline void vc1_p_h_loop_filter(VC1Context *v, uint8_t *dest, uint32_t *cbp, | |
| 364 | uint8_t *is_intra, int16_t (*mv)[2], uint8_t *mv_f, | ||
| 365 | int *ttblk, uint32_t flags, int block_num) | ||
| 366 | { | ||
| 367 | 787344 | MpegEncContext *s = &v->s; | |
| 368 | 787344 | int pq = v->pq; | |
| 369 | 787344 | uint32_t left_cbp = cbp[0] >> (block_num * 4), right_cbp; | |
| 370 | uint8_t left_is_intra, right_is_intra; | ||
| 371 | int tt; | ||
| 372 |
2/2✓ Branch 0 taken 262448 times.
✓ Branch 1 taken 524896 times.
|
787344 | int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize; |
| 373 | uint8_t *dst; | ||
| 374 | |||
| 375 |
2/2✓ Branch 0 taken 262448 times.
✓ Branch 1 taken 524896 times.
|
787344 | if (block_num > 3) |
| 376 | 262448 | dst = dest; | |
| 377 | else | ||
| 378 | 524896 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 379 | |||
| 380 |
4/4✓ Branch 0 taken 22842 times.
✓ Branch 1 taken 764502 times.
✓ Branch 2 taken 7614 times.
✓ Branch 3 taken 15228 times.
|
787344 | if (!(flags & RIGHT_EDGE) || !(block_num & 5)) { |
| 381 | 772116 | left_is_intra = is_intra[0] & (1 << block_num); | |
| 382 | |||
| 383 |
2/2✓ Branch 0 taken 254834 times.
✓ Branch 1 taken 517282 times.
|
772116 | if (block_num > 3) { |
| 384 | 254834 | right_is_intra = is_intra[1] & (1 << block_num); | |
| 385 | 254834 | right_cbp = cbp[1] >> (block_num * 4); | |
| 386 |
2/2✓ Branch 0 taken 254834 times.
✓ Branch 1 taken 262448 times.
|
517282 | } else if (block_num & 1) { |
| 387 | 254834 | right_is_intra = is_intra[1] & (1 << block_num - 1); | |
| 388 | 254834 | right_cbp = cbp[1] >> ((block_num - 1) * 4); | |
| 389 | } else { | ||
| 390 | 262448 | right_is_intra = is_intra[0] & (1 << block_num + 1); | |
| 391 | 262448 | right_cbp = cbp[0] >> ((block_num + 1) * 4); | |
| 392 | } | ||
| 393 | |||
| 394 |
4/4✓ Branch 0 taken 575422 times.
✓ Branch 1 taken 196694 times.
✓ Branch 2 taken 496503 times.
✓ Branch 3 taken 78919 times.
|
772116 | if (left_is_intra || right_is_intra || |
| 395 |
4/4✓ Branch 0 taken 309318 times.
✓ Branch 1 taken 187185 times.
✓ Branch 2 taken 271431 times.
✓ Branch 3 taken 37887 times.
|
496503 | mv[0][0] != mv[1][0] || mv[0][1] != mv[1][1] || |
| 396 |
4/4✓ Branch 0 taken 80650 times.
✓ Branch 1 taken 190781 times.
✓ Branch 2 taken 5796 times.
✓ Branch 3 taken 74854 times.
|
271431 | (v->fcm == ILACE_FIELD && mv_f[0] != mv_f[1])) |
| 397 | 506481 | v->vc1dsp.vc1_h_loop_filter8(dst + 8, linesize, pq); | |
| 398 | else { | ||
| 399 | 265635 | idx = (left_cbp | (right_cbp >> 1)) & 5; | |
| 400 |
2/2✓ Branch 0 taken 104922 times.
✓ Branch 1 taken 160713 times.
|
265635 | if (idx & 1) |
| 401 | 104922 | v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize + 8, linesize, pq); | |
| 402 |
2/2✓ Branch 0 taken 104480 times.
✓ Branch 1 taken 161155 times.
|
265635 | if (idx & 4) |
| 403 | 104480 | v->vc1dsp.vc1_h_loop_filter4(dst + 8, linesize, pq); | |
| 404 | } | ||
| 405 | } | ||
| 406 | |||
| 407 | 787344 | tt = ttblk[0] >> (block_num * 4) & 0xf; | |
| 408 |
4/4✓ Branch 0 taken 751163 times.
✓ Branch 1 taken 36181 times.
✓ Branch 2 taken 49749 times.
✓ Branch 3 taken 701414 times.
|
787344 | if (tt == TT_4X4 || tt == TT_4X8) { |
| 409 |
2/2✓ Branch 0 taken 79045 times.
✓ Branch 1 taken 6885 times.
|
85930 | if (left_cbp & 3) |
| 410 | 79045 | v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize + 4, linesize, pq); | |
| 411 |
2/2✓ Branch 0 taken 78481 times.
✓ Branch 1 taken 7449 times.
|
85930 | if (left_cbp & 12) |
| 412 | 78481 | v->vc1dsp.vc1_h_loop_filter4(dst + 4, linesize, pq); | |
| 413 | } | ||
| 414 | 787344 | } | |
| 415 | |||
| 416 | static av_always_inline | ||
| 417 | 787344 | void vc1_p_v_loop_filter(VC1Context *v, uint8_t *dest, const uint32_t *cbp, | |
| 418 | const uint8_t *is_intra, int16_t (*mv)[2], const uint8_t *mv_f, | ||
| 419 | const int *ttblk, uint32_t flags, int block_num) | ||
| 420 | { | ||
| 421 | 787344 | MpegEncContext *s = &v->s; | |
| 422 | 787344 | int pq = v->pq; | |
| 423 | 787344 | uint32_t top_cbp = cbp[0] >> (block_num * 4), bottom_cbp; | |
| 424 | uint8_t top_is_intra, bottom_is_intra; | ||
| 425 | int tt; | ||
| 426 |
2/2✓ Branch 0 taken 262448 times.
✓ Branch 1 taken 524896 times.
|
787344 | int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize; |
| 427 | uint8_t *dst; | ||
| 428 | |||
| 429 |
2/2✓ Branch 0 taken 262448 times.
✓ Branch 1 taken 524896 times.
|
787344 | if (block_num > 3) |
| 430 | 262448 | dst = dest; | |
| 431 | else | ||
| 432 | 524896 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 433 | |||
| 434 |
4/4✓ Branch 0 taken 201216 times.
✓ Branch 1 taken 586128 times.
✓ Branch 2 taken 67072 times.
✓ Branch 3 taken 134144 times.
|
787344 | if(!(flags & BOTTOM_EDGE) || block_num < 2) { |
| 435 | 653200 | top_is_intra = is_intra[0] & (1 << block_num); | |
| 436 | |||
| 437 |
2/2✓ Branch 0 taken 195376 times.
✓ Branch 1 taken 457824 times.
|
653200 | if (block_num > 3) { |
| 438 | 195376 | bottom_is_intra = is_intra[s->mb_stride] & (1 << block_num); | |
| 439 | 195376 | bottom_cbp = cbp[s->mb_stride] >> (block_num * 4); | |
| 440 |
2/2✓ Branch 0 taken 262448 times.
✓ Branch 1 taken 195376 times.
|
457824 | } else if (block_num < 2) { |
| 441 | 262448 | bottom_is_intra = is_intra[0] & (1 << block_num + 2); | |
| 442 | 262448 | bottom_cbp = cbp[0] >> ((block_num + 2) * 4); | |
| 443 | } else { | ||
| 444 | 195376 | bottom_is_intra = is_intra[s->mb_stride] & (1 << block_num - 2); | |
| 445 | 195376 | bottom_cbp = cbp[s->mb_stride] >> ((block_num - 2) * 4); | |
| 446 | } | ||
| 447 | |||
| 448 |
4/4✓ Branch 0 taken 497372 times.
✓ Branch 1 taken 155828 times.
✓ Branch 2 taken 443018 times.
✓ Branch 3 taken 54354 times.
|
653200 | if (top_is_intra || bottom_is_intra || |
| 449 |
4/4✓ Branch 0 taken 125238 times.
✓ Branch 1 taken 317780 times.
✓ Branch 2 taken 281193 times.
✓ Branch 3 taken 161825 times.
|
443018 | mv[0][0] != mv[block_num > 3 ? s->mb_stride : s->b8_stride][0] || |
| 450 |
4/4✓ Branch 0 taken 55496 times.
✓ Branch 1 taken 225697 times.
✓ Branch 2 taken 245396 times.
✓ Branch 3 taken 35797 times.
|
281193 | mv[0][1] != mv[block_num > 3 ? s->mb_stride : s->b8_stride][1] || |
| 451 |
6/6✓ Branch 0 taken 75136 times.
✓ Branch 1 taken 170260 times.
✓ Branch 2 taken 13094 times.
✓ Branch 3 taken 62042 times.
✓ Branch 4 taken 6349 times.
✓ Branch 5 taken 68787 times.
|
245396 | (v->fcm == ILACE_FIELD && mv_f[0] != mv_f[block_num > 3 ? s->mb_stride : s->b8_stride])) |
| 452 | 414153 | v->vc1dsp.vc1_v_loop_filter8(dst + 8 * linesize, linesize, pq); | |
| 453 | else { | ||
| 454 | 239047 | idx = (top_cbp | (bottom_cbp >> 2)) & 3; | |
| 455 |
2/2✓ Branch 0 taken 99812 times.
✓ Branch 1 taken 139235 times.
|
239047 | if (idx & 1) |
| 456 | 99812 | v->vc1dsp.vc1_v_loop_filter4(dst + 8 * linesize + 4, linesize, pq); | |
| 457 |
2/2✓ Branch 0 taken 99786 times.
✓ Branch 1 taken 139261 times.
|
239047 | if (idx & 2) |
| 458 | 99786 | v->vc1dsp.vc1_v_loop_filter4(dst + 8 * linesize, linesize, pq); | |
| 459 | } | ||
| 460 | } | ||
| 461 | |||
| 462 | 787344 | tt = ttblk[0] >> (block_num * 4) & 0xf; | |
| 463 |
4/4✓ Branch 0 taken 751163 times.
✓ Branch 1 taken 36181 times.
✓ Branch 2 taken 49424 times.
✓ Branch 3 taken 701739 times.
|
787344 | if (tt == TT_4X4 || tt == TT_8X4) { |
| 464 |
2/2✓ Branch 0 taken 79159 times.
✓ Branch 1 taken 6446 times.
|
85605 | if (top_cbp & 5) |
| 465 | 79159 | v->vc1dsp.vc1_v_loop_filter4(dst + 4 * linesize + 4, linesize, pq); | |
| 466 |
2/2✓ Branch 0 taken 79196 times.
✓ Branch 1 taken 6409 times.
|
85605 | if (top_cbp & 10) |
| 467 | 79196 | v->vc1dsp.vc1_v_loop_filter4(dst + 4 * linesize, linesize, pq); | |
| 468 | } | ||
| 469 | 787344 | } | |
| 470 | |||
| 471 | 131248 | void ff_vc1_p_loop_filter(VC1Context *v) | |
| 472 | { | ||
| 473 | 131248 | MpegEncContext *s = &v->s; | |
| 474 | 131248 | int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; | |
| 475 | uint8_t *dest; | ||
| 476 | uint32_t *cbp; | ||
| 477 | uint8_t *is_intra; | ||
| 478 | int16_t (*uvmv)[2]; | ||
| 479 | int *ttblk; | ||
| 480 | uint32_t flags; | ||
| 481 | int i; | ||
| 482 | |||
| 483 | /* Within a MB, the vertical loop filter always runs before the horizontal. | ||
| 484 | * To accomplish that, we run the V loop filter on all applicable | ||
| 485 | * horizontal borders of the MB above the last overlap filtered MB. Then, | ||
| 486 | * we wait for the next loop filter iteration to do H loop filter on all | ||
| 487 | * applicable vertical borders of this MB. Therefore, the loop filter | ||
| 488 | * trails by one row and one column relative to the overlap filter and two | ||
| 489 | * rows and two columns relative to the decoding loop. */ | ||
| 490 |
2/2✓ Branch 0 taken 83223 times.
✓ Branch 1 taken 48025 times.
|
131248 | if (s->mb_y >= s->start_mb_y + 2) { |
| 491 |
2/2✓ Branch 0 taken 80713 times.
✓ Branch 1 taken 2510 times.
|
83223 | if (s->mb_x) { |
| 492 | 80713 | dest = s->dest[0] - 32 * s->linesize - 16; | |
| 493 | 80713 | cbp = &v->cbp[s->mb_x - 2 * s->mb_stride - 1]; | |
| 494 | 80713 | is_intra = &v->is_intra[s->mb_x - 2 * s->mb_stride - 1]; | |
| 495 | 80713 | uvmv = &v->luma_mv[s->mb_x - 2 * s->mb_stride - 1]; | |
| 496 | 80713 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride - 1]; | |
| 497 |
2/2✓ Branch 0 taken 9923 times.
✓ Branch 1 taken 70790 times.
|
80713 | flags = s->mb_y == s->start_mb_y + 2 ? TOP_EDGE : 0; |
| 498 |
2/2✓ Branch 0 taken 484278 times.
✓ Branch 1 taken 80713 times.
|
564991 | for (i = 0; i < block_count; i++) |
| 499 |
6/6✓ Branch 0 taken 161426 times.
✓ Branch 1 taken 322852 times.
✓ Branch 2 taken 322852 times.
✓ Branch 3 taken 161426 times.
✓ Branch 4 taken 161426 times.
✓ Branch 5 taken 322852 times.
|
1452834 | vc1_p_v_loop_filter(v, |
| 500 | 161426 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize - 8 : dest, | |
| 501 | cbp, | ||
| 502 | is_intra, | ||
| 503 | i > 3 ? uvmv : | ||
| 504 | 322852 | &s->cur_pic.motion_val[0][s->block_index[i] - 4 * s->b8_stride - 2 + v->blocks_off], | |
| 505 | 161426 | i > 3 ? &v->mv_f[0][s->block_index[i] - 2 * s->mb_stride - 1 + v->mb_off] : | |
| 506 | 322852 | &v->mv_f[0][s->block_index[i] - 4 * s->b8_stride - 2 + v->blocks_off], | |
| 507 | ttblk, | ||
| 508 | flags, | ||
| 509 | i); | ||
| 510 | } | ||
| 511 |
2/2✓ Branch 0 taken 2510 times.
✓ Branch 1 taken 80713 times.
|
83223 | if (s->mb_x == s->mb_width - 1) { |
| 512 | 2510 | dest = s->dest[0] - 32 * s->linesize; | |
| 513 | 2510 | cbp = &v->cbp[s->mb_x - 2 * s->mb_stride]; | |
| 514 | 2510 | is_intra = &v->is_intra[s->mb_x - 2 * s->mb_stride]; | |
| 515 | 2510 | uvmv = &v->luma_mv[s->mb_x - 2 * s->mb_stride]; | |
| 516 | 2510 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride]; | |
| 517 |
2/2✓ Branch 0 taken 338 times.
✓ Branch 1 taken 2172 times.
|
2510 | flags = s->mb_y == s->start_mb_y + 2 ? TOP_EDGE : 0; |
| 518 |
2/2✓ Branch 0 taken 15060 times.
✓ Branch 1 taken 2510 times.
|
17570 | for (i = 0; i < block_count; i++) |
| 519 |
6/6✓ Branch 0 taken 5020 times.
✓ Branch 1 taken 10040 times.
✓ Branch 2 taken 10040 times.
✓ Branch 3 taken 5020 times.
✓ Branch 4 taken 5020 times.
✓ Branch 5 taken 10040 times.
|
45180 | vc1_p_v_loop_filter(v, |
| 520 | 5020 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize : dest, | |
| 521 | cbp, | ||
| 522 | is_intra, | ||
| 523 | i > 3 ? uvmv : | ||
| 524 | 10040 | &s->cur_pic.motion_val[0][s->block_index[i] - 4 * s->b8_stride + v->blocks_off], | |
| 525 | 5020 | i > 3 ? &v->mv_f[0][s->block_index[i] - 2 * s->mb_stride + v->mb_off] : | |
| 526 | 10040 | &v->mv_f[0][s->block_index[i] - 4 * s->b8_stride + v->blocks_off], | |
| 527 | ttblk, | ||
| 528 | flags, | ||
| 529 | i); | ||
| 530 | } | ||
| 531 | } | ||
| 532 |
2/2✓ Branch 0 taken 33536 times.
✓ Branch 1 taken 97712 times.
|
131248 | if (s->mb_y == s->end_mb_y - 1) { |
| 533 |
2/2✓ Branch 0 taken 32672 times.
✓ Branch 1 taken 864 times.
|
33536 | if (s->mb_x) { |
| 534 |
2/2✓ Branch 0 taken 14032 times.
✓ Branch 1 taken 18640 times.
|
32672 | if (s->mb_y >= s->start_mb_y + 1) { |
| 535 | 14032 | dest = s->dest[0] - 16 * s->linesize - 16; | |
| 536 | 14032 | cbp = &v->cbp[s->mb_x - s->mb_stride - 1]; | |
| 537 | 14032 | is_intra = &v->is_intra[s->mb_x - s->mb_stride - 1]; | |
| 538 | 14032 | uvmv = &v->luma_mv[s->mb_x - s->mb_stride - 1]; | |
| 539 | 14032 | ttblk = &v->ttblk[s->mb_x - s->mb_stride - 1]; | |
| 540 |
2/2✓ Branch 0 taken 4109 times.
✓ Branch 1 taken 9923 times.
|
14032 | flags = s->mb_y == s->start_mb_y + 1 ? TOP_EDGE : 0; |
| 541 |
2/2✓ Branch 0 taken 84192 times.
✓ Branch 1 taken 14032 times.
|
98224 | for (i = 0; i < block_count; i++) |
| 542 |
6/6✓ Branch 0 taken 28064 times.
✓ Branch 1 taken 56128 times.
✓ Branch 2 taken 56128 times.
✓ Branch 3 taken 28064 times.
✓ Branch 4 taken 28064 times.
✓ Branch 5 taken 56128 times.
|
252576 | vc1_p_v_loop_filter(v, |
| 543 | 28064 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, | |
| 544 | cbp, | ||
| 545 | is_intra, | ||
| 546 | i > 3 ? uvmv : | ||
| 547 | 56128 | &s->cur_pic.motion_val[0][s->block_index[i] - 2 * s->b8_stride - 2 + v->blocks_off], | |
| 548 | 28064 | i > 3 ? &v->mv_f[0][s->block_index[i] - s->mb_stride - 1 + v->mb_off] : | |
| 549 | 56128 | &v->mv_f[0][s->block_index[i] - 2 * s->b8_stride - 2 + v->blocks_off], | |
| 550 | ttblk, | ||
| 551 | flags, | ||
| 552 | i); | ||
| 553 | } | ||
| 554 | 32672 | dest = s->dest[0] - 16; | |
| 555 | 32672 | cbp = &v->cbp[s->mb_x - 1]; | |
| 556 | 32672 | is_intra = &v->is_intra[s->mb_x - 1]; | |
| 557 | 32672 | uvmv = &v->luma_mv[s->mb_x - 1]; | |
| 558 | 32672 | ttblk = &v->ttblk[s->mb_x - 1]; | |
| 559 |
2/2✓ Branch 0 taken 18640 times.
✓ Branch 1 taken 14032 times.
|
32672 | flags = s->mb_y == s->start_mb_y ? TOP_EDGE | BOTTOM_EDGE : BOTTOM_EDGE; |
| 560 |
2/2✓ Branch 0 taken 196032 times.
✓ Branch 1 taken 32672 times.
|
228704 | for (i = 0; i < block_count; i++) |
| 561 |
6/6✓ Branch 0 taken 65344 times.
✓ Branch 1 taken 130688 times.
✓ Branch 2 taken 130688 times.
✓ Branch 3 taken 65344 times.
✓ Branch 4 taken 65344 times.
✓ Branch 5 taken 130688 times.
|
588096 | vc1_p_v_loop_filter(v, |
| 562 | 65344 | i > 3 ? s->dest[i - 3] - 8 : dest, | |
| 563 | cbp, | ||
| 564 | is_intra, | ||
| 565 | i > 3 ? uvmv : | ||
| 566 | 130688 | &s->cur_pic.motion_val[0][s->block_index[i] - 2 + v->blocks_off], | |
| 567 | 65344 | i > 3 ? &v->mv_f[0][s->block_index[i] - 1 + v->mb_off] : | |
| 568 | 130688 | &v->mv_f[0][s->block_index[i] - 2 + v->blocks_off], | |
| 569 | ttblk, | ||
| 570 | flags, | ||
| 571 | i); | ||
| 572 | } | ||
| 573 |
2/2✓ Branch 0 taken 864 times.
✓ Branch 1 taken 32672 times.
|
33536 | if (s->mb_x == s->mb_width - 1) { |
| 574 |
2/2✓ Branch 0 taken 433 times.
✓ Branch 1 taken 431 times.
|
864 | if (s->mb_y >= s->start_mb_y + 1) { |
| 575 | 433 | dest = s->dest[0] - 16 * s->linesize; | |
| 576 | 433 | cbp = &v->cbp[s->mb_x - s->mb_stride]; | |
| 577 | 433 | is_intra = &v->is_intra[s->mb_x - s->mb_stride]; | |
| 578 | 433 | uvmv = &v->luma_mv[s->mb_x - s->mb_stride]; | |
| 579 | 433 | ttblk = &v->ttblk[s->mb_x - s->mb_stride]; | |
| 580 |
2/2✓ Branch 0 taken 95 times.
✓ Branch 1 taken 338 times.
|
433 | flags = s->mb_y == s->start_mb_y + 1 ? TOP_EDGE : 0; |
| 581 |
2/2✓ Branch 0 taken 2598 times.
✓ Branch 1 taken 433 times.
|
3031 | for (i = 0; i < block_count; i++) |
| 582 |
6/6✓ Branch 0 taken 866 times.
✓ Branch 1 taken 1732 times.
✓ Branch 2 taken 1732 times.
✓ Branch 3 taken 866 times.
✓ Branch 4 taken 866 times.
✓ Branch 5 taken 1732 times.
|
7794 | vc1_p_v_loop_filter(v, |
| 583 | 866 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, | |
| 584 | cbp, | ||
| 585 | is_intra, | ||
| 586 | i > 3 ? uvmv : | ||
| 587 | 1732 | &s->cur_pic.motion_val[0][s->block_index[i] - 2 * s->b8_stride + v->blocks_off], | |
| 588 | 866 | i > 3 ? &v->mv_f[0][s->block_index[i] - s->mb_stride + v->mb_off] : | |
| 589 | 1732 | &v->mv_f[0][s->block_index[i] - 2 * s->b8_stride + v->blocks_off], | |
| 590 | ttblk, | ||
| 591 | flags, | ||
| 592 | i); | ||
| 593 | } | ||
| 594 | 864 | dest = s->dest[0]; | |
| 595 | 864 | cbp = &v->cbp[s->mb_x]; | |
| 596 | 864 | is_intra = &v->is_intra[s->mb_x]; | |
| 597 | 864 | uvmv = &v->luma_mv[s->mb_x]; | |
| 598 | 864 | ttblk = &v->ttblk[s->mb_x]; | |
| 599 |
2/2✓ Branch 0 taken 431 times.
✓ Branch 1 taken 433 times.
|
864 | flags = s->mb_y == s->start_mb_y ? TOP_EDGE | BOTTOM_EDGE : BOTTOM_EDGE; |
| 600 |
2/2✓ Branch 0 taken 5184 times.
✓ Branch 1 taken 864 times.
|
6048 | for (i = 0; i < block_count; i++) |
| 601 |
6/6✓ Branch 0 taken 1728 times.
✓ Branch 1 taken 3456 times.
✓ Branch 2 taken 3456 times.
✓ Branch 3 taken 1728 times.
✓ Branch 4 taken 1728 times.
✓ Branch 5 taken 3456 times.
|
15552 | vc1_p_v_loop_filter(v, |
| 602 | 1728 | i > 3 ? s->dest[i - 3] : dest, | |
| 603 | cbp, | ||
| 604 | is_intra, | ||
| 605 | i > 3 ? uvmv : | ||
| 606 | 3456 | &s->cur_pic.motion_val[0][s->block_index[i] + v->blocks_off], | |
| 607 | 1728 | i > 3 ? &v->mv_f[0][s->block_index[i] + v->mb_off] : | |
| 608 | 3456 | &v->mv_f[0][s->block_index[i] + v->blocks_off], | |
| 609 | ttblk, | ||
| 610 | flags, | ||
| 611 | i); | ||
| 612 | } | ||
| 613 | } | ||
| 614 | |||
| 615 |
2/2✓ Branch 0 taken 83223 times.
✓ Branch 1 taken 48025 times.
|
131248 | if (s->mb_y >= s->start_mb_y + 2) { |
| 616 |
2/2✓ Branch 0 taken 78203 times.
✓ Branch 1 taken 5020 times.
|
83223 | if (s->mb_x >= 2) { |
| 617 | 78203 | dest = s->dest[0] - 32 * s->linesize - 32; | |
| 618 | 78203 | cbp = &v->cbp[s->mb_x - 2 * s->mb_stride - 2]; | |
| 619 | 78203 | is_intra = &v->is_intra[s->mb_x - 2 * s->mb_stride - 2]; | |
| 620 | 78203 | uvmv = &v->luma_mv[s->mb_x - 2 * s->mb_stride - 2]; | |
| 621 | 78203 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride - 2]; | |
| 622 | 78203 | flags = s->mb_x == 2 ? LEFT_EDGE : 0; | |
| 623 |
2/2✓ Branch 0 taken 469218 times.
✓ Branch 1 taken 78203 times.
|
547421 | for (i = 0; i < block_count; i++) |
| 624 |
6/6✓ Branch 0 taken 156406 times.
✓ Branch 1 taken 312812 times.
✓ Branch 2 taken 312812 times.
✓ Branch 3 taken 156406 times.
✓ Branch 4 taken 156406 times.
✓ Branch 5 taken 312812 times.
|
1407654 | vc1_p_h_loop_filter(v, |
| 625 | 156406 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize - 16 : dest, | |
| 626 | cbp, | ||
| 627 | is_intra, | ||
| 628 | i > 3 ? uvmv : | ||
| 629 | 312812 | &s->cur_pic.motion_val[0][s->block_index[i] - 4 * s->b8_stride - 4 + v->blocks_off], | |
| 630 | 156406 | i > 3 ? &v->mv_f[0][s->block_index[i] - 2 * s->mb_stride - 2 + v->mb_off] : | |
| 631 | 312812 | &v->mv_f[0][s->block_index[i] - 4 * s->b8_stride - 4 + v->blocks_off], | |
| 632 | ttblk, | ||
| 633 | flags, | ||
| 634 | i); | ||
| 635 | } | ||
| 636 |
2/2✓ Branch 0 taken 2510 times.
✓ Branch 1 taken 80713 times.
|
83223 | if (s->mb_x == s->mb_width - 1) { |
| 637 |
1/2✓ Branch 0 taken 2510 times.
✗ Branch 1 not taken.
|
2510 | if (s->mb_x >= 1) { |
| 638 | 2510 | dest = s->dest[0] - 32 * s->linesize - 16; | |
| 639 | 2510 | cbp = &v->cbp[s->mb_x - 2 * s->mb_stride - 1]; | |
| 640 | 2510 | is_intra = &v->is_intra[s->mb_x - 2 * s->mb_stride - 1]; | |
| 641 | 2510 | uvmv = &v->luma_mv[s->mb_x - 2 * s->mb_stride - 1]; | |
| 642 | 2510 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride - 1]; | |
| 643 | 2510 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 644 |
2/2✓ Branch 0 taken 15060 times.
✓ Branch 1 taken 2510 times.
|
17570 | for (i = 0; i < block_count; i++) |
| 645 |
6/6✓ Branch 0 taken 5020 times.
✓ Branch 1 taken 10040 times.
✓ Branch 2 taken 10040 times.
✓ Branch 3 taken 5020 times.
✓ Branch 4 taken 5020 times.
✓ Branch 5 taken 10040 times.
|
45180 | vc1_p_h_loop_filter(v, |
| 646 | 5020 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize - 8 : dest, | |
| 647 | cbp, | ||
| 648 | is_intra, | ||
| 649 | i > 3 ? uvmv : | ||
| 650 | 10040 | &s->cur_pic.motion_val[0][s->block_index[i] - 4 * s->b8_stride - 2 + v->blocks_off], | |
| 651 | 5020 | i > 3 ? &v->mv_f[0][s->block_index[i] - 2 * s->mb_stride - 1 + v->mb_off] : | |
| 652 | 10040 | &v->mv_f[0][s->block_index[i] - 4 * s->b8_stride - 2 + v->blocks_off], | |
| 653 | ttblk, | ||
| 654 | flags, | ||
| 655 | i); | ||
| 656 | } | ||
| 657 | 2510 | dest = s->dest[0] - 32 * s->linesize; | |
| 658 | 2510 | cbp = &v->cbp[s->mb_x - 2 * s->mb_stride]; | |
| 659 | 2510 | is_intra = &v->is_intra[s->mb_x - 2 * s->mb_stride]; | |
| 660 | 2510 | uvmv = &v->luma_mv[s->mb_x - 2 * s->mb_stride]; | |
| 661 | 2510 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride]; | |
| 662 |
1/2✓ Branch 0 taken 2510 times.
✗ Branch 1 not taken.
|
2510 | flags = s->mb_x ? RIGHT_EDGE : LEFT_EDGE | RIGHT_EDGE; |
| 663 |
2/2✓ Branch 0 taken 15060 times.
✓ Branch 1 taken 2510 times.
|
17570 | for (i = 0; i < block_count; i++) |
| 664 |
6/6✓ Branch 0 taken 5020 times.
✓ Branch 1 taken 10040 times.
✓ Branch 2 taken 10040 times.
✓ Branch 3 taken 5020 times.
✓ Branch 4 taken 5020 times.
✓ Branch 5 taken 10040 times.
|
45180 | vc1_p_h_loop_filter(v, |
| 665 | 5020 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize : dest, | |
| 666 | cbp, | ||
| 667 | is_intra, | ||
| 668 | i > 3 ? uvmv : | ||
| 669 | 10040 | &s->cur_pic.motion_val[0][s->block_index[i] - 4 * s->b8_stride + v->blocks_off], | |
| 670 | 5020 | i > 3 ? &v->mv_f[0][s->block_index[i] - 2 * s->mb_stride + v->mb_off] : | |
| 671 | 10040 | &v->mv_f[0][s->block_index[i] - 4 * s->b8_stride + v->blocks_off], | |
| 672 | ttblk, | ||
| 673 | flags, | ||
| 674 | i); | ||
| 675 | } | ||
| 676 | } | ||
| 677 |
2/2✓ Branch 0 taken 33536 times.
✓ Branch 1 taken 97712 times.
|
131248 | if (s->mb_y == s->end_mb_y - 1) { |
| 678 |
2/2✓ Branch 0 taken 14465 times.
✓ Branch 1 taken 19071 times.
|
33536 | if (s->mb_y >= s->start_mb_y + 1) { |
| 679 |
2/2✓ Branch 0 taken 13599 times.
✓ Branch 1 taken 866 times.
|
14465 | if (s->mb_x >= 2) { |
| 680 | 13599 | dest = s->dest[0] - 16 * s->linesize - 32; | |
| 681 | 13599 | cbp = &v->cbp[s->mb_x - s->mb_stride - 2]; | |
| 682 | 13599 | is_intra = &v->is_intra[s->mb_x - s->mb_stride - 2]; | |
| 683 | 13599 | uvmv = &v->luma_mv[s->mb_x - s->mb_stride - 2]; | |
| 684 | 13599 | ttblk = &v->ttblk[s->mb_x - s->mb_stride - 2]; | |
| 685 | 13599 | flags = s->mb_x == 2 ? LEFT_EDGE : 0; | |
| 686 |
2/2✓ Branch 0 taken 81594 times.
✓ Branch 1 taken 13599 times.
|
95193 | for (i = 0; i < block_count; i++) |
| 687 |
6/6✓ Branch 0 taken 27198 times.
✓ Branch 1 taken 54396 times.
✓ Branch 2 taken 54396 times.
✓ Branch 3 taken 27198 times.
✓ Branch 4 taken 27198 times.
✓ Branch 5 taken 54396 times.
|
244782 | vc1_p_h_loop_filter(v, |
| 688 | 27198 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 16 : dest, | |
| 689 | cbp, | ||
| 690 | is_intra, | ||
| 691 | i > 3 ? uvmv : | ||
| 692 | 54396 | &s->cur_pic.motion_val[0][s->block_index[i] - 2 * s->b8_stride - 4 + v->blocks_off], | |
| 693 | 27198 | i > 3 ? &v->mv_f[0][s->block_index[i] - s->mb_stride - 2 + v->mb_off] : | |
| 694 | 54396 | &v->mv_f[0][s->block_index[i] - 2 * s->b8_stride - 4 + v->blocks_off], | |
| 695 | ttblk, | ||
| 696 | flags, | ||
| 697 | i); | ||
| 698 | } | ||
| 699 |
2/2✓ Branch 0 taken 433 times.
✓ Branch 1 taken 14032 times.
|
14465 | if (s->mb_x == s->mb_width - 1) { |
| 700 |
1/2✓ Branch 0 taken 433 times.
✗ Branch 1 not taken.
|
433 | if (s->mb_x >= 1) { |
| 701 | 433 | dest = s->dest[0] - 16 * s->linesize - 16; | |
| 702 | 433 | cbp = &v->cbp[s->mb_x - s->mb_stride - 1]; | |
| 703 | 433 | is_intra = &v->is_intra[s->mb_x - s->mb_stride - 1]; | |
| 704 | 433 | uvmv = &v->luma_mv[s->mb_x - s->mb_stride - 1]; | |
| 705 | 433 | ttblk = &v->ttblk[s->mb_x - s->mb_stride - 1]; | |
| 706 | 433 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 707 |
2/2✓ Branch 0 taken 2598 times.
✓ Branch 1 taken 433 times.
|
3031 | for (i = 0; i < block_count; i++) |
| 708 |
6/6✓ Branch 0 taken 866 times.
✓ Branch 1 taken 1732 times.
✓ Branch 2 taken 1732 times.
✓ Branch 3 taken 866 times.
✓ Branch 4 taken 866 times.
✓ Branch 5 taken 1732 times.
|
7794 | vc1_p_h_loop_filter(v, |
| 709 | 866 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, | |
| 710 | cbp, | ||
| 711 | is_intra, | ||
| 712 | i > 3 ? uvmv : | ||
| 713 | 1732 | &s->cur_pic.motion_val[0][s->block_index[i] - 2 * s->b8_stride - 2 + v->blocks_off], | |
| 714 | 866 | i > 3 ? &v->mv_f[0][s->block_index[i] - s->mb_stride - 1 + v->mb_off] : | |
| 715 | 1732 | &v->mv_f[0][s->block_index[i] - 2 * s->b8_stride - 2 + v->blocks_off], | |
| 716 | ttblk, | ||
| 717 | flags, | ||
| 718 | i); | ||
| 719 | } | ||
| 720 | 433 | dest = s->dest[0] - 16 * s->linesize; | |
| 721 | 433 | cbp = &v->cbp[s->mb_x - s->mb_stride]; | |
| 722 | 433 | is_intra = &v->is_intra[s->mb_x - s->mb_stride]; | |
| 723 | 433 | uvmv = &v->luma_mv[s->mb_x - s->mb_stride]; | |
| 724 | 433 | ttblk = &v->ttblk[s->mb_x - s->mb_stride]; | |
| 725 |
1/2✓ Branch 0 taken 433 times.
✗ Branch 1 not taken.
|
433 | flags = s->mb_x ? RIGHT_EDGE : LEFT_EDGE | RIGHT_EDGE; |
| 726 |
2/2✓ Branch 0 taken 2598 times.
✓ Branch 1 taken 433 times.
|
3031 | for (i = 0; i < block_count; i++) |
| 727 |
6/6✓ Branch 0 taken 866 times.
✓ Branch 1 taken 1732 times.
✓ Branch 2 taken 1732 times.
✓ Branch 3 taken 866 times.
✓ Branch 4 taken 866 times.
✓ Branch 5 taken 1732 times.
|
7794 | vc1_p_h_loop_filter(v, |
| 728 | 866 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, | |
| 729 | cbp, | ||
| 730 | is_intra, | ||
| 731 | i > 3 ? uvmv : | ||
| 732 | 1732 | &s->cur_pic.motion_val[0][s->block_index[i] - 2 * s->b8_stride + v->blocks_off], | |
| 733 | 866 | i > 3 ? &v->mv_f[0][s->block_index[i] - s->mb_stride + v->mb_off] : | |
| 734 | 1732 | &v->mv_f[0][s->block_index[i] - 2 * s->b8_stride + v->blocks_off], | |
| 735 | ttblk, | ||
| 736 | flags, | ||
| 737 | i); | ||
| 738 | } | ||
| 739 | } | ||
| 740 |
2/2✓ Branch 0 taken 31808 times.
✓ Branch 1 taken 1728 times.
|
33536 | if (s->mb_x >= 2) { |
| 741 | 31808 | dest = s->dest[0] - 32; | |
| 742 | 31808 | cbp = &v->cbp[s->mb_x - 2]; | |
| 743 | 31808 | is_intra = &v->is_intra[s->mb_x - 2]; | |
| 744 | 31808 | uvmv = &v->luma_mv[s->mb_x - 2]; | |
| 745 | 31808 | ttblk = &v->ttblk[s->mb_x - 2]; | |
| 746 | 31808 | flags = s->mb_x == 2 ? LEFT_EDGE : 0; | |
| 747 |
2/2✓ Branch 0 taken 190848 times.
✓ Branch 1 taken 31808 times.
|
222656 | for (i = 0; i < block_count; i++) |
| 748 |
6/6✓ Branch 0 taken 63616 times.
✓ Branch 1 taken 127232 times.
✓ Branch 2 taken 127232 times.
✓ Branch 3 taken 63616 times.
✓ Branch 4 taken 63616 times.
✓ Branch 5 taken 127232 times.
|
572544 | vc1_p_h_loop_filter(v, |
| 749 | 63616 | i > 3 ? s->dest[i - 3] - 16 : dest, | |
| 750 | cbp, | ||
| 751 | is_intra, | ||
| 752 | i > 3 ? uvmv : | ||
| 753 | 127232 | &s->cur_pic.motion_val[0][s->block_index[i] - 4 + v->blocks_off], | |
| 754 | 63616 | i > 3 ? &v->mv_f[0][s->block_index[i] - 2 + v->mb_off] : | |
| 755 | 127232 | &v->mv_f[0][s->block_index[i] - 4 + v->blocks_off], | |
| 756 | ttblk, | ||
| 757 | flags, | ||
| 758 | i); | ||
| 759 | } | ||
| 760 |
2/2✓ Branch 0 taken 864 times.
✓ Branch 1 taken 32672 times.
|
33536 | if (s->mb_x == s->mb_width - 1) { |
| 761 |
1/2✓ Branch 0 taken 864 times.
✗ Branch 1 not taken.
|
864 | if (s->mb_x >= 1) { |
| 762 | 864 | dest = s->dest[0] - 16; | |
| 763 | 864 | cbp = &v->cbp[s->mb_x - 1]; | |
| 764 | 864 | is_intra = &v->is_intra[s->mb_x - 1]; | |
| 765 | 864 | uvmv = &v->luma_mv[s->mb_x - 1]; | |
| 766 | 864 | ttblk = &v->ttblk[s->mb_x - 1]; | |
| 767 | 864 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 768 |
2/2✓ Branch 0 taken 5184 times.
✓ Branch 1 taken 864 times.
|
6048 | for (i = 0; i < block_count; i++) |
| 769 |
6/6✓ Branch 0 taken 1728 times.
✓ Branch 1 taken 3456 times.
✓ Branch 2 taken 3456 times.
✓ Branch 3 taken 1728 times.
✓ Branch 4 taken 1728 times.
✓ Branch 5 taken 3456 times.
|
15552 | vc1_p_h_loop_filter(v, |
| 770 | 1728 | i > 3 ? s->dest[i - 3] - 8 : dest, | |
| 771 | cbp, | ||
| 772 | is_intra, | ||
| 773 | i > 3 ? uvmv : | ||
| 774 | 3456 | &s->cur_pic.motion_val[0][s->block_index[i] - 2 + v->blocks_off], | |
| 775 | 1728 | i > 3 ? &v->mv_f[0][s->block_index[i] - 1 + v->mb_off] : | |
| 776 | 3456 | &v->mv_f[0][s->block_index[i] - 2 + v->blocks_off], | |
| 777 | ttblk, | ||
| 778 | flags, | ||
| 779 | i); | ||
| 780 | } | ||
| 781 | 864 | dest = s->dest[0]; | |
| 782 | 864 | cbp = &v->cbp[s->mb_x]; | |
| 783 | 864 | is_intra = &v->is_intra[s->mb_x]; | |
| 784 | 864 | uvmv = &v->luma_mv[s->mb_x]; | |
| 785 | 864 | ttblk = &v->ttblk[s->mb_x]; | |
| 786 |
1/2✓ Branch 0 taken 864 times.
✗ Branch 1 not taken.
|
864 | flags = s->mb_x ? RIGHT_EDGE : LEFT_EDGE | RIGHT_EDGE; |
| 787 |
2/2✓ Branch 0 taken 5184 times.
✓ Branch 1 taken 864 times.
|
6048 | for (i = 0; i < block_count; i++) |
| 788 |
6/6✓ Branch 0 taken 1728 times.
✓ Branch 1 taken 3456 times.
✓ Branch 2 taken 3456 times.
✓ Branch 3 taken 1728 times.
✓ Branch 4 taken 1728 times.
✓ Branch 5 taken 3456 times.
|
15552 | vc1_p_h_loop_filter(v, |
| 789 | 1728 | i > 3 ? s->dest[i - 3] : dest, | |
| 790 | cbp, | ||
| 791 | is_intra, | ||
| 792 | i > 3 ? uvmv : | ||
| 793 | 3456 | &s->cur_pic.motion_val[0][s->block_index[i] + v->blocks_off], | |
| 794 | 1728 | i > 3 ? &v->mv_f[0][s->block_index[i] + v->mb_off] : | |
| 795 | 3456 | &v->mv_f[0][s->block_index[i] + v->blocks_off], | |
| 796 | ttblk, | ||
| 797 | flags, | ||
| 798 | i); | ||
| 799 | } | ||
| 800 | } | ||
| 801 | 131248 | } | |
| 802 | |||
| 803 | 293760 | static av_always_inline void vc1_p_h_intfr_loop_filter(VC1Context *v, uint8_t *dest, const int *ttblk, | |
| 804 | uint32_t flags, uint8_t fieldtx, int block_num) | ||
| 805 | { | ||
| 806 | 293760 | MpegEncContext *s = &v->s; | |
| 807 | 293760 | int pq = v->pq; | |
| 808 | int tt; | ||
| 809 |
2/2✓ Branch 0 taken 97920 times.
✓ Branch 1 taken 195840 times.
|
293760 | int linesize = block_num > 3 ? s->uvlinesize : s->linesize; |
| 810 | uint8_t *dst; | ||
| 811 | |||
| 812 |
2/2✓ Branch 0 taken 97920 times.
✓ Branch 1 taken 195840 times.
|
293760 | if (block_num > 3) |
| 813 | 97920 | dst = dest; | |
| 814 | else | ||
| 815 | 195840 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 816 | |||
| 817 | 293760 | tt = ttblk[0] >> (block_num * 4) & 0xf; | |
| 818 |
2/2✓ Branch 0 taken 195840 times.
✓ Branch 1 taken 97920 times.
|
293760 | if (block_num < 4) { |
| 819 |
2/2✓ Branch 0 taken 81784 times.
✓ Branch 1 taken 114056 times.
|
195840 | if (fieldtx) { |
| 820 |
2/2✓ Branch 0 taken 40892 times.
✓ Branch 1 taken 40892 times.
|
81784 | if (block_num < 2) { |
| 821 |
4/4✓ Branch 0 taken 38482 times.
✓ Branch 1 taken 2410 times.
✓ Branch 2 taken 5011 times.
✓ Branch 3 taken 33471 times.
|
40892 | if (tt == TT_4X4 || tt == TT_4X8) |
| 822 | 7421 | v->vc1dsp.vc1_h_loop_filter8(dst + 4, 2 * linesize, pq); | |
| 823 |
4/4✓ Branch 0 taken 340 times.
✓ Branch 1 taken 40552 times.
✓ Branch 2 taken 170 times.
✓ Branch 3 taken 170 times.
|
40892 | if (!(flags & RIGHT_EDGE) || block_num == 0) |
| 824 | 40722 | v->vc1dsp.vc1_h_loop_filter8(dst + 8, 2 * linesize, pq); | |
| 825 | } else { | ||
| 826 |
4/4✓ Branch 0 taken 38543 times.
✓ Branch 1 taken 2349 times.
✓ Branch 2 taken 4917 times.
✓ Branch 3 taken 33626 times.
|
40892 | if (tt == TT_4X4 || tt == TT_4X8) |
| 827 | 7266 | v->vc1dsp.vc1_h_loop_filter8(dst - 7 * linesize + 4, 2 * linesize, pq); | |
| 828 |
4/4✓ Branch 0 taken 340 times.
✓ Branch 1 taken 40552 times.
✓ Branch 2 taken 170 times.
✓ Branch 3 taken 170 times.
|
40892 | if (!(flags & RIGHT_EDGE) || block_num == 2) |
| 829 | 40722 | v->vc1dsp.vc1_h_loop_filter8(dst - 7 * linesize + 8, 2 * linesize, pq); | |
| 830 | } | ||
| 831 | } else { | ||
| 832 |
4/4✓ Branch 0 taken 107886 times.
✓ Branch 1 taken 6170 times.
✓ Branch 2 taken 16740 times.
✓ Branch 3 taken 91146 times.
|
114056 | if(tt == TT_4X4 || tt == TT_4X8) { |
| 833 | 22910 | v->vc1dsp.vc1_h_loop_filter4(dst + 4, 2 * linesize, pq); | |
| 834 | 22910 | v->vc1dsp.vc1_h_loop_filter4(dst + linesize + 4, 2 * linesize, pq); | |
| 835 | } | ||
| 836 |
4/4✓ Branch 0 taken 952 times.
✓ Branch 1 taken 113104 times.
✓ Branch 2 taken 476 times.
✓ Branch 3 taken 476 times.
|
114056 | if (!(flags & RIGHT_EDGE) || !(block_num & 5)) { |
| 837 | 113580 | v->vc1dsp.vc1_h_loop_filter4(dst + 8, 2 * linesize, pq); | |
| 838 | 113580 | v->vc1dsp.vc1_h_loop_filter4(dst + linesize + 8, 2 * linesize, pq); | |
| 839 | } | ||
| 840 | } | ||
| 841 | } else { | ||
| 842 |
4/4✓ Branch 0 taken 95825 times.
✓ Branch 1 taken 2095 times.
✓ Branch 2 taken 10183 times.
✓ Branch 3 taken 85642 times.
|
97920 | if (tt == TT_4X4 || tt == TT_4X8) { |
| 843 | 12278 | v->vc1dsp.vc1_h_loop_filter4(dst + 4, 2 * linesize, pq); | |
| 844 | 12278 | v->vc1dsp.vc1_h_loop_filter4(dst + linesize + 4, 2 * linesize, pq); | |
| 845 | } | ||
| 846 |
2/2✓ Branch 0 taken 97104 times.
✓ Branch 1 taken 816 times.
|
97920 | if (!(flags & RIGHT_EDGE)) { |
| 847 | 97104 | v->vc1dsp.vc1_h_loop_filter4(dst + 8, 2 * linesize, pq); | |
| 848 | 97104 | v->vc1dsp.vc1_h_loop_filter4(dst + linesize + 8, 2 * linesize, pq); | |
| 849 | } | ||
| 850 | } | ||
| 851 | 293760 | } | |
| 852 | |||
| 853 | static av_always_inline | ||
| 854 | 293760 | void vc1_p_v_intfr_loop_filter(VC1Context *v, uint8_t *dest, const int *ttblk, | |
| 855 | uint32_t flags, uint8_t fieldtx, int block_num) | ||
| 856 | { | ||
| 857 | 293760 | MpegEncContext *s = &v->s; | |
| 858 | 293760 | int pq = v->pq; | |
| 859 | int tt; | ||
| 860 |
2/2✓ Branch 0 taken 97920 times.
✓ Branch 1 taken 195840 times.
|
293760 | int linesize = block_num > 3 ? s->uvlinesize : s->linesize; |
| 861 | uint8_t *dst; | ||
| 862 | |||
| 863 |
2/2✓ Branch 0 taken 97920 times.
✓ Branch 1 taken 195840 times.
|
293760 | if (block_num > 3) |
| 864 | 97920 | dst = dest; | |
| 865 | else | ||
| 866 | 195840 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 867 | |||
| 868 | 293760 | tt = ttblk[0] >> (block_num * 4) & 0xf; | |
| 869 |
2/2✓ Branch 0 taken 195840 times.
✓ Branch 1 taken 97920 times.
|
293760 | if (block_num < 4) { |
| 870 |
2/2✓ Branch 0 taken 81784 times.
✓ Branch 1 taken 114056 times.
|
195840 | if (fieldtx) { |
| 871 |
2/2✓ Branch 0 taken 40892 times.
✓ Branch 1 taken 40892 times.
|
81784 | if (block_num < 2) { |
| 872 |
4/4✓ Branch 0 taken 38482 times.
✓ Branch 1 taken 2410 times.
✓ Branch 2 taken 5492 times.
✓ Branch 3 taken 32990 times.
|
40892 | if (tt == TT_4X4 || tt == TT_8X4) |
| 873 | 7902 | v->vc1dsp.vc1_v_loop_filter8(dst + 8 * linesize, 2 * linesize, pq); | |
| 874 |
2/2✓ Branch 0 taken 40500 times.
✓ Branch 1 taken 392 times.
|
40892 | if (!(flags & BOTTOM_EDGE)) |
| 875 | 40500 | v->vc1dsp.vc1_v_loop_filter8(dst + 16 * linesize, 2 * linesize, pq); | |
| 876 | } else { | ||
| 877 |
4/4✓ Branch 0 taken 38543 times.
✓ Branch 1 taken 2349 times.
✓ Branch 2 taken 5227 times.
✓ Branch 3 taken 33316 times.
|
40892 | if (tt == TT_4X4 || tt == TT_8X4) |
| 878 | 7576 | v->vc1dsp.vc1_v_loop_filter8(dst + linesize, 2 * linesize, pq); | |
| 879 |
2/2✓ Branch 0 taken 40500 times.
✓ Branch 1 taken 392 times.
|
40892 | if (!(flags & BOTTOM_EDGE)) |
| 880 | 40500 | v->vc1dsp.vc1_v_loop_filter8(dst + 9 * linesize, 2 * linesize, pq); | |
| 881 | } | ||
| 882 | } else { | ||
| 883 |
2/2✓ Branch 0 taken 57028 times.
✓ Branch 1 taken 57028 times.
|
114056 | if (block_num < 2) { |
| 884 |
6/6✓ Branch 0 taken 56208 times.
✓ Branch 1 taken 820 times.
✓ Branch 2 taken 53138 times.
✓ Branch 3 taken 3070 times.
✓ Branch 4 taken 6577 times.
✓ Branch 5 taken 46561 times.
|
57028 | if (!(flags & TOP_EDGE) && (tt == TT_4X4 || tt == TT_8X4)) { |
| 885 | 9647 | v->vc1dsp.vc1_v_loop_filter8(dst + 4 * linesize, 2 * linesize, pq); | |
| 886 | 9647 | v->vc1dsp.vc1_v_loop_filter8(dst + 5 * linesize, 2 * linesize, pq); | |
| 887 | } | ||
| 888 | 57028 | v->vc1dsp.vc1_v_loop_filter8(dst + 8 * linesize, 2 * linesize, pq); | |
| 889 | 57028 | v->vc1dsp.vc1_v_loop_filter8(dst + 9 * linesize, 2 * linesize, pq); | |
| 890 |
2/2✓ Branch 0 taken 55980 times.
✓ Branch 1 taken 1048 times.
|
57028 | } else if (!(flags & BOTTOM_EDGE)) { |
| 891 |
4/4✓ Branch 0 taken 52932 times.
✓ Branch 1 taken 3048 times.
✓ Branch 2 taken 6565 times.
✓ Branch 3 taken 46367 times.
|
55980 | if (tt == TT_4X4 || tt == TT_8X4) { |
| 892 | 9613 | v->vc1dsp.vc1_v_loop_filter8(dst + 4 * linesize, 2 * linesize, pq); | |
| 893 | 9613 | v->vc1dsp.vc1_v_loop_filter8(dst + 5 * linesize, 2 * linesize, pq); | |
| 894 | } | ||
| 895 | 55980 | v->vc1dsp.vc1_v_loop_filter8(dst + 8 * linesize, 2 * linesize, pq); | |
| 896 | 55980 | v->vc1dsp.vc1_v_loop_filter8(dst + 9 * linesize, 2 * linesize, pq); | |
| 897 | } | ||
| 898 | } | ||
| 899 | } else { | ||
| 900 |
2/2✓ Branch 0 taken 96480 times.
✓ Branch 1 taken 1440 times.
|
97920 | if (!(flags & BOTTOM_EDGE)) { |
| 901 |
6/6✓ Branch 0 taken 95040 times.
✓ Branch 1 taken 1440 times.
✓ Branch 2 taken 92969 times.
✓ Branch 3 taken 2071 times.
✓ Branch 4 taken 7630 times.
✓ Branch 5 taken 85339 times.
|
96480 | if (!(flags & TOP_EDGE) && (tt == TT_4X4 || tt == TT_8X4)) { |
| 902 | 9701 | v->vc1dsp.vc1_v_loop_filter8(dst + 4 * linesize, 2 * linesize, pq); | |
| 903 | 9701 | v->vc1dsp.vc1_v_loop_filter8(dst + 5 * linesize, 2 * linesize, pq); | |
| 904 | } | ||
| 905 | 96480 | v->vc1dsp.vc1_v_loop_filter8(dst + 8 * linesize, 2 * linesize, pq); | |
| 906 | 96480 | v->vc1dsp.vc1_v_loop_filter8(dst + 9 * linesize, 2 * linesize, pq); | |
| 907 | } | ||
| 908 | } | ||
| 909 | 293760 | } | |
| 910 | |||
| 911 | 48960 | void ff_vc1_p_intfr_loop_filter(VC1Context *v) | |
| 912 | { | ||
| 913 | 48960 | MpegEncContext *s = &v->s; | |
| 914 | 48960 | int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; | |
| 915 | 48960 | int mb_pos = s->mb_x + s->mb_y * s->mb_stride; | |
| 916 | uint8_t *dest; | ||
| 917 | int *ttblk; | ||
| 918 | uint32_t flags; | ||
| 919 | uint8_t fieldtx; | ||
| 920 | int i; | ||
| 921 | |||
| 922 | /* Within a MB, the vertical loop filter always runs before the horizontal. | ||
| 923 | * To accomplish that, we run the V loop filter on all applicable | ||
| 924 | * horizontal borders of the MB above the last overlap filtered MB. Then, | ||
| 925 | * we wait for the loop filter iteration on the next row and next column to | ||
| 926 | * do H loop filter on all applicable vertical borders of this MB. | ||
| 927 | * Therefore, the loop filter trails by two rows and one column relative to | ||
| 928 | * the overlap filter and two rows and two columns relative to the decoding | ||
| 929 | * loop. */ | ||
| 930 |
2/2✓ Branch 0 taken 48552 times.
✓ Branch 1 taken 408 times.
|
48960 | if (s->mb_x) { |
| 931 |
2/2✓ Branch 0 taken 47838 times.
✓ Branch 1 taken 714 times.
|
48552 | if (s->mb_y >= s->start_mb_y + 1) { |
| 932 | 47838 | dest = s->dest[0] - 16 * s->linesize - 16; | |
| 933 | 47838 | ttblk = &v->ttblk[s->mb_x - s->mb_stride - 1]; | |
| 934 |
2/2✓ Branch 0 taken 714 times.
✓ Branch 1 taken 47124 times.
|
47838 | flags = s->mb_y == s->start_mb_y + 1 ? TOP_EDGE : 0; |
| 935 | 47838 | fieldtx = v->fieldtx_plane[mb_pos - s->mb_stride - 1]; | |
| 936 |
2/2✓ Branch 0 taken 287028 times.
✓ Branch 1 taken 47838 times.
|
334866 | for (i = 0; i < block_count; i++) |
| 937 |
2/2✓ Branch 0 taken 95676 times.
✓ Branch 1 taken 191352 times.
|
382704 | vc1_p_v_intfr_loop_filter(v, |
| 938 | 95676 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, | |
| 939 | ttblk, | ||
| 940 | flags, | ||
| 941 | fieldtx, | ||
| 942 | i); | ||
| 943 | } | ||
| 944 | } | ||
| 945 |
2/2✓ Branch 0 taken 408 times.
✓ Branch 1 taken 48552 times.
|
48960 | if (s->mb_x == s->mb_width - 1) { |
| 946 |
2/2✓ Branch 0 taken 402 times.
✓ Branch 1 taken 6 times.
|
408 | if (s->mb_y >= s->start_mb_y + 1) { |
| 947 | 402 | dest = s->dest[0] - 16 * s->linesize; | |
| 948 | 402 | ttblk = &v->ttblk[s->mb_x - s->mb_stride]; | |
| 949 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 396 times.
|
402 | flags = s->mb_y == s->start_mb_y + 1 ? TOP_EDGE : 0; |
| 950 | 402 | fieldtx = v->fieldtx_plane[mb_pos - s->mb_stride]; | |
| 951 |
2/2✓ Branch 0 taken 2412 times.
✓ Branch 1 taken 402 times.
|
2814 | for (i = 0; i < block_count; i++) |
| 952 |
2/2✓ Branch 0 taken 804 times.
✓ Branch 1 taken 1608 times.
|
3216 | vc1_p_v_intfr_loop_filter(v, |
| 953 | 804 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, | |
| 954 | ttblk, | ||
| 955 | flags, | ||
| 956 | fieldtx, | ||
| 957 | i); | ||
| 958 | } | ||
| 959 | } | ||
| 960 |
2/2✓ Branch 0 taken 720 times.
✓ Branch 1 taken 48240 times.
|
48960 | if (s->mb_y == s->end_mb_y - 1) { |
| 961 |
2/2✓ Branch 0 taken 714 times.
✓ Branch 1 taken 6 times.
|
720 | if (s->mb_x) { |
| 962 | 714 | dest = s->dest[0] - 16; | |
| 963 | 714 | ttblk = &v->ttblk[s->mb_x - 1]; | |
| 964 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 714 times.
|
714 | flags = s->mb_y == s->start_mb_y ? TOP_EDGE | BOTTOM_EDGE : BOTTOM_EDGE; |
| 965 | 714 | fieldtx = v->fieldtx_plane[mb_pos - 1]; | |
| 966 |
2/2✓ Branch 0 taken 4284 times.
✓ Branch 1 taken 714 times.
|
4998 | for (i = 0; i < block_count; i++) |
| 967 |
2/2✓ Branch 0 taken 1428 times.
✓ Branch 1 taken 2856 times.
|
5712 | vc1_p_v_intfr_loop_filter(v, |
| 968 | 1428 | i > 3 ? s->dest[i - 3] - 8 : dest, | |
| 969 | ttblk, | ||
| 970 | flags, | ||
| 971 | fieldtx, | ||
| 972 | i); | ||
| 973 | } | ||
| 974 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 714 times.
|
720 | if (s->mb_x == s->mb_width - 1) { |
| 975 | 6 | dest = s->dest[0]; | |
| 976 | 6 | ttblk = &v->ttblk[s->mb_x]; | |
| 977 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
|
6 | flags = s->mb_y == s->start_mb_y ? TOP_EDGE | BOTTOM_EDGE : BOTTOM_EDGE; |
| 978 | 6 | fieldtx = v->fieldtx_plane[mb_pos]; | |
| 979 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 6 times.
|
42 | for (i = 0; i < block_count; i++) |
| 980 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 24 times.
|
48 | vc1_p_v_intfr_loop_filter(v, |
| 981 | 12 | i > 3 ? s->dest[i - 3] : dest, | |
| 982 | ttblk, | ||
| 983 | flags, | ||
| 984 | fieldtx, | ||
| 985 | i); | ||
| 986 | } | ||
| 987 | } | ||
| 988 | |||
| 989 |
2/2✓ Branch 0 taken 47520 times.
✓ Branch 1 taken 1440 times.
|
48960 | if (s->mb_y >= s->start_mb_y + 2) { |
| 990 |
2/2✓ Branch 0 taken 46728 times.
✓ Branch 1 taken 792 times.
|
47520 | if (s->mb_x >= 2) { |
| 991 | 46728 | dest = s->dest[0] - 32 * s->linesize - 32; | |
| 992 | 46728 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride - 2]; | |
| 993 | 46728 | flags = s->mb_x == 2 ? LEFT_EDGE : 0; | |
| 994 | 46728 | fieldtx = v->fieldtx_plane[mb_pos - 2 * s->mb_stride - 2]; | |
| 995 |
2/2✓ Branch 0 taken 280368 times.
✓ Branch 1 taken 46728 times.
|
327096 | for (i = 0; i < block_count; i++) |
| 996 |
2/2✓ Branch 0 taken 93456 times.
✓ Branch 1 taken 186912 times.
|
373824 | vc1_p_h_intfr_loop_filter(v, |
| 997 | 93456 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize - 16 : dest, | |
| 998 | ttblk, | ||
| 999 | flags, | ||
| 1000 | fieldtx, | ||
| 1001 | i); | ||
| 1002 | } | ||
| 1003 |
2/2✓ Branch 0 taken 396 times.
✓ Branch 1 taken 47124 times.
|
47520 | if (s->mb_x == s->mb_width - 1) { |
| 1004 |
1/2✓ Branch 0 taken 396 times.
✗ Branch 1 not taken.
|
396 | if (s->mb_x >= 1) { |
| 1005 | 396 | dest = s->dest[0] - 32 * s->linesize - 16; | |
| 1006 | 396 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride - 1]; | |
| 1007 | 396 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 1008 | 396 | fieldtx = v->fieldtx_plane[mb_pos - 2 * s->mb_stride - 1]; | |
| 1009 |
2/2✓ Branch 0 taken 2376 times.
✓ Branch 1 taken 396 times.
|
2772 | for (i = 0; i < block_count; i++) |
| 1010 |
2/2✓ Branch 0 taken 792 times.
✓ Branch 1 taken 1584 times.
|
3168 | vc1_p_h_intfr_loop_filter(v, |
| 1011 | 792 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize - 8 : dest, | |
| 1012 | ttblk, | ||
| 1013 | flags, | ||
| 1014 | fieldtx, | ||
| 1015 | i); | ||
| 1016 | } | ||
| 1017 | 396 | dest = s->dest[0] - 32 * s->linesize; | |
| 1018 | 396 | ttblk = &v->ttblk[s->mb_x - 2 * s->mb_stride]; | |
| 1019 |
1/2✓ Branch 0 taken 396 times.
✗ Branch 1 not taken.
|
396 | flags = s->mb_x ? RIGHT_EDGE : LEFT_EDGE | RIGHT_EDGE; |
| 1020 | 396 | fieldtx = v->fieldtx_plane[mb_pos - 2 * s->mb_stride]; | |
| 1021 |
2/2✓ Branch 0 taken 2376 times.
✓ Branch 1 taken 396 times.
|
2772 | for (i = 0; i < block_count; i++) |
| 1022 |
2/2✓ Branch 0 taken 792 times.
✓ Branch 1 taken 1584 times.
|
3168 | vc1_p_h_intfr_loop_filter(v, |
| 1023 | 792 | i > 3 ? s->dest[i - 3] - 16 * s->uvlinesize : dest, | |
| 1024 | ttblk, | ||
| 1025 | flags, | ||
| 1026 | fieldtx, | ||
| 1027 | i); | ||
| 1028 | } | ||
| 1029 | } | ||
| 1030 |
2/2✓ Branch 0 taken 720 times.
✓ Branch 1 taken 48240 times.
|
48960 | if (s->mb_y == s->end_mb_y - 1) { |
| 1031 |
1/2✓ Branch 0 taken 720 times.
✗ Branch 1 not taken.
|
720 | if (s->mb_y >= s->start_mb_y + 1) { |
| 1032 |
2/2✓ Branch 0 taken 708 times.
✓ Branch 1 taken 12 times.
|
720 | if (s->mb_x >= 2) { |
| 1033 | 708 | dest = s->dest[0] - 16 * s->linesize - 32; | |
| 1034 | 708 | ttblk = &v->ttblk[s->mb_x - s->mb_stride - 2]; | |
| 1035 | 708 | flags = s->mb_x == 2 ? LEFT_EDGE : 0; | |
| 1036 | 708 | fieldtx = v->fieldtx_plane[mb_pos - s->mb_stride - 2]; | |
| 1037 |
2/2✓ Branch 0 taken 4248 times.
✓ Branch 1 taken 708 times.
|
4956 | for (i = 0; i < block_count; i++) |
| 1038 |
2/2✓ Branch 0 taken 1416 times.
✓ Branch 1 taken 2832 times.
|
5664 | vc1_p_h_intfr_loop_filter(v, |
| 1039 | 1416 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 16 : dest, | |
| 1040 | ttblk, | ||
| 1041 | flags, | ||
| 1042 | fieldtx, | ||
| 1043 | i); | ||
| 1044 | } | ||
| 1045 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 714 times.
|
720 | if (s->mb_x == s->mb_width - 1) { |
| 1046 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if (s->mb_x >= 1) { |
| 1047 | 6 | dest = s->dest[0] - 16 * s->linesize - 16; | |
| 1048 | 6 | ttblk = &v->ttblk[s->mb_x - s->mb_stride - 1]; | |
| 1049 | 6 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 1050 | 6 | fieldtx = v->fieldtx_plane[mb_pos - s->mb_stride - 1]; | |
| 1051 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 6 times.
|
42 | for (i = 0; i < block_count; i++) |
| 1052 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 24 times.
|
48 | vc1_p_h_intfr_loop_filter(v, |
| 1053 | 12 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, | |
| 1054 | ttblk, | ||
| 1055 | flags, | ||
| 1056 | fieldtx, | ||
| 1057 | i); | ||
| 1058 | } | ||
| 1059 | 6 | dest = s->dest[0] - 16 * s->linesize; | |
| 1060 | 6 | ttblk = &v->ttblk[s->mb_x - s->mb_stride]; | |
| 1061 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | flags = s->mb_x ? RIGHT_EDGE : LEFT_EDGE | RIGHT_EDGE; |
| 1062 | 6 | fieldtx = v->fieldtx_plane[mb_pos - s->mb_stride]; | |
| 1063 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 6 times.
|
42 | for (i = 0; i < block_count; i++) |
| 1064 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 24 times.
|
48 | vc1_p_h_intfr_loop_filter(v, |
| 1065 | 12 | i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, | |
| 1066 | ttblk, | ||
| 1067 | flags, | ||
| 1068 | fieldtx, | ||
| 1069 | i); | ||
| 1070 | } | ||
| 1071 | } | ||
| 1072 |
2/2✓ Branch 0 taken 708 times.
✓ Branch 1 taken 12 times.
|
720 | if (s->mb_x >= 2) { |
| 1073 | 708 | dest = s->dest[0] - 32; | |
| 1074 | 708 | ttblk = &v->ttblk[s->mb_x - 2]; | |
| 1075 | 708 | flags = s->mb_x == 2 ? LEFT_EDGE : 0; | |
| 1076 | 708 | fieldtx = v->fieldtx_plane[mb_pos - 2]; | |
| 1077 |
2/2✓ Branch 0 taken 4248 times.
✓ Branch 1 taken 708 times.
|
4956 | for (i = 0; i < block_count; i++) |
| 1078 |
2/2✓ Branch 0 taken 1416 times.
✓ Branch 1 taken 2832 times.
|
5664 | vc1_p_h_intfr_loop_filter(v, |
| 1079 | 1416 | i > 3 ? s->dest[i - 3] - 16 : dest, | |
| 1080 | ttblk, | ||
| 1081 | flags, | ||
| 1082 | fieldtx, | ||
| 1083 | i); | ||
| 1084 | } | ||
| 1085 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 714 times.
|
720 | if (s->mb_x == s->mb_width - 1) { |
| 1086 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | if (s->mb_x >= 1) { |
| 1087 | 6 | dest = s->dest[0] - 16; | |
| 1088 | 6 | ttblk = &v->ttblk[s->mb_x - 1]; | |
| 1089 | 6 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 1090 | 6 | fieldtx = v->fieldtx_plane[mb_pos - 1]; | |
| 1091 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 6 times.
|
42 | for (i = 0; i < block_count; i++) |
| 1092 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 24 times.
|
48 | vc1_p_h_intfr_loop_filter(v, |
| 1093 | 12 | i > 3 ? s->dest[i - 3] - 8 : dest, | |
| 1094 | ttblk, | ||
| 1095 | flags, | ||
| 1096 | fieldtx, | ||
| 1097 | i); | ||
| 1098 | } | ||
| 1099 | 6 | dest = s->dest[0]; | |
| 1100 | 6 | ttblk = &v->ttblk[s->mb_x]; | |
| 1101 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
6 | flags = s->mb_x ? RIGHT_EDGE : LEFT_EDGE | RIGHT_EDGE; |
| 1102 | 6 | fieldtx = v->fieldtx_plane[mb_pos]; | |
| 1103 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 6 times.
|
42 | for (i = 0; i < block_count; i++) |
| 1104 |
2/2✓ Branch 0 taken 12 times.
✓ Branch 1 taken 24 times.
|
48 | vc1_p_h_intfr_loop_filter(v, |
| 1105 | 12 | i > 3 ? s->dest[i - 3] : dest, | |
| 1106 | ttblk, | ||
| 1107 | flags, | ||
| 1108 | fieldtx, | ||
| 1109 | i); | ||
| 1110 | } | ||
| 1111 | } | ||
| 1112 | 48960 | } | |
| 1113 | |||
| 1114 | static av_always_inline | ||
| 1115 | 309240 | void vc1_b_h_intfi_loop_filter(VC1Context *v, uint8_t *dest, const uint32_t *cbp, | |
| 1116 | const int *ttblk, uint32_t flags, int block_num) | ||
| 1117 | { | ||
| 1118 | 309240 | MpegEncContext *s = &v->s; | |
| 1119 | 309240 | int pq = v->pq; | |
| 1120 | uint8_t *dst; | ||
| 1121 | 309240 | uint32_t block_cbp = cbp[0] >> (block_num * 4); | |
| 1122 | int tt; | ||
| 1123 |
2/2✓ Branch 0 taken 103080 times.
✓ Branch 1 taken 206160 times.
|
309240 | int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize; |
| 1124 | |||
| 1125 |
2/2✓ Branch 0 taken 103080 times.
✓ Branch 1 taken 206160 times.
|
309240 | if (block_num > 3) |
| 1126 | 103080 | dst = dest; | |
| 1127 | else | ||
| 1128 | 206160 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 1129 | |||
| 1130 |
4/4✓ Branch 0 taken 4152 times.
✓ Branch 1 taken 305088 times.
✓ Branch 2 taken 1384 times.
✓ Branch 3 taken 2768 times.
|
309240 | if (!(flags & RIGHT_EDGE) || !(block_num & 5)) { |
| 1131 | 306472 | v->vc1dsp.vc1_h_loop_filter8(dst + 8, linesize, pq); | |
| 1132 | } | ||
| 1133 | |||
| 1134 | 309240 | tt = ttblk[0] >> (block_num * 4) & 0xf; | |
| 1135 |
4/4✓ Branch 0 taken 294456 times.
✓ Branch 1 taken 14784 times.
✓ Branch 2 taken 23865 times.
✓ Branch 3 taken 270591 times.
|
309240 | if (tt == TT_4X4 || tt == TT_4X8) { |
| 1136 | 38649 | idx = (block_cbp | (block_cbp >> 1)) & 5; | |
| 1137 |
2/2✓ Branch 0 taken 34919 times.
✓ Branch 1 taken 3730 times.
|
38649 | if (idx & 1) |
| 1138 | 34919 | v->vc1dsp.vc1_h_loop_filter4(dst + 4 * linesize + 4, linesize, pq); | |
| 1139 |
2/2✓ Branch 0 taken 34510 times.
✓ Branch 1 taken 4139 times.
|
38649 | if (idx & 4) |
| 1140 | 34510 | v->vc1dsp.vc1_h_loop_filter4(dst + 4, linesize, pq); | |
| 1141 | } | ||
| 1142 | 309240 | } | |
| 1143 | |||
| 1144 | static av_always_inline | ||
| 1145 | 309240 | void vc1_b_v_intfi_loop_filter(VC1Context *v, uint8_t *dest, const uint32_t *cbp, | |
| 1146 | const int *ttblk, uint32_t flags, int block_num) | ||
| 1147 | { | ||
| 1148 | 309240 | MpegEncContext *s = &v->s; | |
| 1149 | 309240 | int pq = v->pq; | |
| 1150 | uint8_t *dst; | ||
| 1151 | 309240 | uint32_t block_cbp = cbp[0] >> (block_num * 4); | |
| 1152 | int tt; | ||
| 1153 |
2/2✓ Branch 0 taken 103080 times.
✓ Branch 1 taken 206160 times.
|
309240 | int idx, linesize = block_num > 3 ? s->uvlinesize : s->linesize; |
| 1154 | |||
| 1155 |
2/2✓ Branch 0 taken 103080 times.
✓ Branch 1 taken 206160 times.
|
309240 | if (block_num > 3) |
| 1156 | 103080 | dst = dest; | |
| 1157 | else | ||
| 1158 | 206160 | dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; | |
| 1159 | |||
| 1160 |
4/4✓ Branch 0 taken 13320 times.
✓ Branch 1 taken 295920 times.
✓ Branch 2 taken 4440 times.
✓ Branch 3 taken 8880 times.
|
309240 | if(!(flags & BOTTOM_EDGE) || block_num < 2) |
| 1161 | 300360 | v->vc1dsp.vc1_v_loop_filter8(dst + 8 * linesize, linesize, pq); | |
| 1162 | |||
| 1163 | 309240 | tt = ttblk[0] >> (block_num * 4) & 0xf; | |
| 1164 |
4/4✓ Branch 0 taken 294456 times.
✓ Branch 1 taken 14784 times.
✓ Branch 2 taken 23465 times.
✓ Branch 3 taken 270991 times.
|
309240 | if (tt == TT_4X4 || tt == TT_8X4) { |
| 1165 | 38249 | idx = (block_cbp | (block_cbp >> 2)) & 3; | |
| 1166 |
2/2✓ Branch 0 taken 34613 times.
✓ Branch 1 taken 3636 times.
|
38249 | if (idx & 1) |
| 1167 | 34613 | v->vc1dsp.vc1_v_loop_filter4(dst + 4 * linesize + 4, linesize, pq); | |
| 1168 |
2/2✓ Branch 0 taken 34929 times.
✓ Branch 1 taken 3320 times.
|
38249 | if (idx & 2) |
| 1169 | 34929 | v->vc1dsp.vc1_v_loop_filter4(dst + 4 * linesize, linesize, pq); | |
| 1170 | } | ||
| 1171 | 309240 | } | |
| 1172 | |||
| 1173 | 51540 | void ff_vc1_b_intfi_loop_filter(VC1Context *v) | |
| 1174 | { | ||
| 1175 | 51540 | MpegEncContext *s = &v->s; | |
| 1176 | 51540 | int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6; | |
| 1177 | uint8_t *dest; | ||
| 1178 | const uint32_t *cbp; | ||
| 1179 | int *ttblk; | ||
| 1180 | 51540 | uint32_t flags = 0; | |
| 1181 | int i; | ||
| 1182 | |||
| 1183 | /* Within a MB, the vertical loop filter always runs before the horizontal. | ||
| 1184 | * To accomplish that, we run the V loop filter on all applicable | ||
| 1185 | * horizontal borders of the MB above the currently decoded MB. Then, | ||
| 1186 | * we wait for the next loop filter iteration to do H loop filter on all | ||
| 1187 | * applicable vertical borders of this MB. Therefore, the loop filter | ||
| 1188 | * trails by one row and one column relative to the decoding loop. */ | ||
| 1189 |
2/2✓ Branch 0 taken 49320 times.
✓ Branch 1 taken 2220 times.
|
51540 | if (!s->first_slice_line) { |
| 1190 | 49320 | dest = s->dest[0] - 16 * s->linesize; | |
| 1191 | 49320 | cbp = &v->cbp[s->mb_x - s->mb_stride]; | |
| 1192 | 49320 | ttblk = &v->ttblk[s->mb_x - s->mb_stride]; | |
| 1193 |
2/2✓ Branch 0 taken 2220 times.
✓ Branch 1 taken 47100 times.
|
49320 | flags = s->mb_y == s->start_mb_y + 1 ? TOP_EDGE : 0; |
| 1194 |
2/2✓ Branch 0 taken 295920 times.
✓ Branch 1 taken 49320 times.
|
345240 | for (i = 0; i < block_count; i++) |
| 1195 |
2/2✓ Branch 0 taken 98640 times.
✓ Branch 1 taken 197280 times.
|
295920 | vc1_b_v_intfi_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, cbp, ttblk, flags, i); |
| 1196 | } | ||
| 1197 |
2/2✓ Branch 0 taken 2220 times.
✓ Branch 1 taken 49320 times.
|
51540 | if (s->mb_y == s->end_mb_y - 1) { |
| 1198 | 2220 | dest = s->dest[0]; | |
| 1199 | 2220 | cbp = &v->cbp[s->mb_x]; | |
| 1200 | 2220 | ttblk = &v->ttblk[s->mb_x]; | |
| 1201 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 2220 times.
|
2220 | flags = s->first_slice_line ? TOP_EDGE | BOTTOM_EDGE : BOTTOM_EDGE; |
| 1202 |
2/2✓ Branch 0 taken 13320 times.
✓ Branch 1 taken 2220 times.
|
15540 | for (i = 0; i < block_count; i++) |
| 1203 |
2/2✓ Branch 0 taken 4440 times.
✓ Branch 1 taken 8880 times.
|
13320 | vc1_b_v_intfi_loop_filter(v, i > 3 ? s->dest[i - 3] : dest, cbp, ttblk, flags, i); |
| 1204 | } | ||
| 1205 | |||
| 1206 |
2/2✓ Branch 0 taken 49320 times.
✓ Branch 1 taken 2220 times.
|
51540 | if (!s->first_slice_line) { |
| 1207 | 49320 | dest = s->dest[0] - 16 * s->linesize - 16; | |
| 1208 | 49320 | cbp = &v->cbp[s->mb_x - s->mb_stride - 1]; | |
| 1209 | 49320 | ttblk = &v->ttblk[s->mb_x - s->mb_stride - 1]; | |
| 1210 |
2/2✓ Branch 0 taken 48664 times.
✓ Branch 1 taken 656 times.
|
49320 | if (s->mb_x) { |
| 1211 | 48664 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 1212 |
2/2✓ Branch 0 taken 291984 times.
✓ Branch 1 taken 48664 times.
|
340648 | for (i = 0; i < block_count; i++) |
| 1213 |
2/2✓ Branch 0 taken 97328 times.
✓ Branch 1 taken 194656 times.
|
291984 | vc1_b_h_intfi_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest, cbp, ttblk, flags, i); |
| 1214 | } | ||
| 1215 |
2/2✓ Branch 0 taken 656 times.
✓ Branch 1 taken 48664 times.
|
49320 | if (s->mb_x == s->mb_width - 1) { |
| 1216 | 656 | dest += 16; | |
| 1217 | 656 | cbp++; | |
| 1218 | 656 | ttblk++; | |
| 1219 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 656 times.
|
656 | flags = s->mb_x == 0 ? LEFT_EDGE | RIGHT_EDGE : RIGHT_EDGE; |
| 1220 |
2/2✓ Branch 0 taken 3936 times.
✓ Branch 1 taken 656 times.
|
4592 | for (i = 0; i < block_count; i++) |
| 1221 |
2/2✓ Branch 0 taken 1312 times.
✓ Branch 1 taken 2624 times.
|
3936 | vc1_b_h_intfi_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest, cbp, ttblk, flags, i); |
| 1222 | } | ||
| 1223 | } | ||
| 1224 |
2/2✓ Branch 0 taken 2220 times.
✓ Branch 1 taken 49320 times.
|
51540 | if (s->mb_y == s->end_mb_y - 1) { |
| 1225 | 2220 | dest = s->dest[0] - 16; | |
| 1226 | 2220 | cbp = &v->cbp[s->mb_x - 1]; | |
| 1227 | 2220 | ttblk = &v->ttblk[s->mb_x - 1]; | |
| 1228 |
2/2✓ Branch 0 taken 2184 times.
✓ Branch 1 taken 36 times.
|
2220 | if (s->mb_x) { |
| 1229 | 2184 | flags = s->mb_x == 1 ? LEFT_EDGE : 0; | |
| 1230 |
2/2✓ Branch 0 taken 13104 times.
✓ Branch 1 taken 2184 times.
|
15288 | for (i = 0; i < block_count; i++) |
| 1231 |
2/2✓ Branch 0 taken 4368 times.
✓ Branch 1 taken 8736 times.
|
13104 | vc1_b_h_intfi_loop_filter(v, i > 3 ? s->dest[i - 3] - 8 : dest, cbp, ttblk, flags, i); |
| 1232 | } | ||
| 1233 |
2/2✓ Branch 0 taken 36 times.
✓ Branch 1 taken 2184 times.
|
2220 | if (s->mb_x == s->mb_width - 1) { |
| 1234 | 36 | dest += 16; | |
| 1235 | 36 | cbp++; | |
| 1236 | 36 | ttblk++; | |
| 1237 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
|
36 | flags = s->mb_x == 0 ? LEFT_EDGE | RIGHT_EDGE : RIGHT_EDGE; |
| 1238 |
2/2✓ Branch 0 taken 216 times.
✓ Branch 1 taken 36 times.
|
252 | for (i = 0; i < block_count; i++) |
| 1239 |
2/2✓ Branch 0 taken 72 times.
✓ Branch 1 taken 144 times.
|
216 | vc1_b_h_intfi_loop_filter(v, i > 3 ? s->dest[i - 3] : dest, cbp, ttblk, flags, i); |
| 1240 | } | ||
| 1241 | } | ||
| 1242 | 51540 | } | |
| 1243 |