| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * Copyright (C) 2015 Pedro Arthur <bygrandao@gmail.com> | ||
| 3 | * | ||
| 4 | * This file is part of FFmpeg. | ||
| 5 | * | ||
| 6 | * FFmpeg is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU Lesser General Public | ||
| 8 | * License as published by the Free Software Foundation; either | ||
| 9 | * version 2.1 of the License, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * FFmpeg is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 14 | * Lesser General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU Lesser General Public | ||
| 17 | * License along with FFmpeg; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 19 | */ | ||
| 20 | #include "libavutil/mem.h" | ||
| 21 | #include "swscale_internal.h" | ||
| 22 | |||
| 23 | typedef struct VScalerContext | ||
| 24 | { | ||
| 25 | uint16_t *filter[2]; | ||
| 26 | int32_t *filter_pos; | ||
| 27 | int filter_size; | ||
| 28 | int isMMX; | ||
| 29 | union { | ||
| 30 | yuv2planar1_fn yuv2planar1; | ||
| 31 | yuv2planarX_fn yuv2planarX; | ||
| 32 | yuv2interleavedX_fn yuv2interleavedX; | ||
| 33 | yuv2packed1_fn yuv2packed1; | ||
| 34 | yuv2packed2_fn yuv2packed2; | ||
| 35 | yuv2anyX_fn yuv2anyX; | ||
| 36 | } pfn; | ||
| 37 | yuv2packedX_fn yuv2packedX; | ||
| 38 | } VScalerContext; | ||
| 39 | |||
| 40 | |||
| 41 | 20637265 | static int lum_planar_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 42 | { | ||
| 43 | 20637265 | VScalerContext *inst = desc->instance; | |
| 44 | 20637265 | int dstW = desc->dst->width; | |
| 45 | |||
| 46 | 20637265 | int first = FFMAX(1-inst->filter_size, inst->filter_pos[sliceY]); | |
| 47 | 20637265 | int sp = first - desc->src->plane[0].sliceY; | |
| 48 | 20637265 | int dp = sliceY - desc->dst->plane[0].sliceY; | |
| 49 | 20637265 | uint8_t **src = desc->src->plane[0].line + sp; | |
| 50 | 20637265 | uint8_t **dst = desc->dst->plane[0].line + dp; | |
| 51 |
2/2✓ Branch 0 taken 20633599 times.
✓ Branch 1 taken 3666 times.
|
20637265 | uint16_t *filter = inst->filter[0] + (inst->isMMX ? 0 : sliceY * inst->filter_size); |
| 52 | |||
| 53 |
2/2✓ Branch 0 taken 17097509 times.
✓ Branch 1 taken 3539756 times.
|
20637265 | if (inst->filter_size == 1) |
| 54 | 17097509 | inst->pfn.yuv2planar1((const int16_t*)src[0], dst[0], dstW, c->lumDither8, 0); | |
| 55 | else | ||
| 56 | 3539756 | inst->pfn.yuv2planarX(filter, inst->filter_size, (const int16_t**)src, dst[0], dstW, c->lumDither8, 0); | |
| 57 | |||
| 58 |
2/2✓ Branch 0 taken 477960 times.
✓ Branch 1 taken 20159305 times.
|
20637265 | if (desc->alpha) { |
| 59 | 477960 | int sp = first - desc->src->plane[3].sliceY; | |
| 60 | 477960 | int dp = sliceY - desc->dst->plane[3].sliceY; | |
| 61 | 477960 | uint8_t **src = desc->src->plane[3].line + sp; | |
| 62 | 477960 | uint8_t **dst = desc->dst->plane[3].line + dp; | |
| 63 |
1/2✓ Branch 0 taken 477960 times.
✗ Branch 1 not taken.
|
477960 | uint16_t *filter = inst->filter[1] + (inst->isMMX ? 0 : sliceY * inst->filter_size); |
| 64 | |||
| 65 |
2/2✓ Branch 0 taken 472864 times.
✓ Branch 1 taken 5096 times.
|
477960 | if (inst->filter_size == 1) |
| 66 | 472864 | inst->pfn.yuv2planar1((const int16_t*)src[0], dst[0], dstW, c->lumDither8, 0); | |
| 67 | else | ||
| 68 | 5096 | inst->pfn.yuv2planarX(filter, inst->filter_size, (const int16_t**)src, dst[0], dstW, c->lumDither8, 0); | |
| 69 | } | ||
| 70 | |||
| 71 | 20637265 | return 1; | |
| 72 | } | ||
| 73 | |||
| 74 | 19648316 | static int chr_planar_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 75 | { | ||
| 76 | 19648316 | const int chrSkipMask = (1 << desc->dst->v_chr_sub_sample) - 1; | |
| 77 |
2/2✓ Branch 0 taken 4157706 times.
✓ Branch 1 taken 15490610 times.
|
19648316 | if (sliceY & chrSkipMask) |
| 78 | 4157706 | return 0; | |
| 79 | else { | ||
| 80 | 15490610 | VScalerContext *inst = desc->instance; | |
| 81 | 15490610 | int dstW = AV_CEIL_RSHIFT(desc->dst->width, desc->dst->h_chr_sub_sample); | |
| 82 | 15490610 | int chrSliceY = sliceY >> desc->dst->v_chr_sub_sample; | |
| 83 | |||
| 84 | 15490610 | int first = FFMAX(1-inst->filter_size, inst->filter_pos[chrSliceY]); | |
| 85 | 15490610 | int sp1 = first - desc->src->plane[1].sliceY; | |
| 86 | 15490610 | int sp2 = first - desc->src->plane[2].sliceY; | |
| 87 | 15490610 | int dp1 = chrSliceY - desc->dst->plane[1].sliceY; | |
| 88 | 15490610 | int dp2 = chrSliceY - desc->dst->plane[2].sliceY; | |
| 89 | 15490610 | uint8_t **src1 = desc->src->plane[1].line + sp1; | |
| 90 | 15490610 | uint8_t **src2 = desc->src->plane[2].line + sp2; | |
| 91 | 15490610 | uint8_t **dst1 = desc->dst->plane[1].line + dp1; | |
| 92 | 15490610 | uint8_t **dst2 = desc->dst->plane[2].line + dp2; | |
| 93 |
2/2✓ Branch 0 taken 15487884 times.
✓ Branch 1 taken 2726 times.
|
15490610 | uint16_t *filter = inst->filter[0] + (inst->isMMX ? 0 : chrSliceY * inst->filter_size); |
| 94 | |||
| 95 |
2/2✓ Branch 0 taken 3753640 times.
✓ Branch 1 taken 11736970 times.
|
15490610 | if (c->yuv2nv12cX) { |
| 96 | 3753640 | inst->pfn.yuv2interleavedX(c->opts.dst_format, c->chrDither8, filter, inst->filter_size, (const int16_t**)src1, (const int16_t**)src2, dst1[0], dstW); | |
| 97 |
2/2✓ Branch 0 taken 5716250 times.
✓ Branch 1 taken 6020720 times.
|
11736970 | } else if (inst->filter_size == 1) { |
| 98 | 5716250 | inst->pfn.yuv2planar1((const int16_t*)src1[0], dst1[0], dstW, c->chrDither8, 0); | |
| 99 | 5716250 | inst->pfn.yuv2planar1((const int16_t*)src2[0], dst2[0], dstW, c->chrDither8, 3); | |
| 100 | } else { | ||
| 101 | 6020720 | inst->pfn.yuv2planarX(filter, inst->filter_size, (const int16_t**)src1, dst1[0], dstW, c->chrDither8, 0); | |
| 102 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6020720 times.
|
6020720 | inst->pfn.yuv2planarX(filter, inst->filter_size, (const int16_t**)src2, dst2[0], dstW, c->chrDither8, inst->isMMX ? (c->uv_offx2 >> 1) : 3); |
| 103 | } | ||
| 104 | } | ||
| 105 | |||
| 106 | 15490610 | return 1; | |
| 107 | } | ||
| 108 | |||
| 109 | 5819340 | static int packed_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 110 | { | ||
| 111 | 5819340 | VScalerContext *inst = desc->instance; | |
| 112 | 5819340 | int dstW = desc->dst->width; | |
| 113 | 5819340 | int chrSliceY = sliceY >> desc->dst->v_chr_sub_sample; | |
| 114 | |||
| 115 | 5819340 | int lum_fsize = inst[0].filter_size; | |
| 116 | 5819340 | int chr_fsize = inst[1].filter_size; | |
| 117 | 5819340 | uint16_t *lum_filter = inst[0].filter[0]; | |
| 118 | 5819340 | uint16_t *chr_filter = inst[1].filter[0]; | |
| 119 | |||
| 120 | 5819340 | int firstLum = FFMAX(1-lum_fsize, inst[0].filter_pos[ sliceY]); | |
| 121 | 5819340 | int firstChr = FFMAX(1-chr_fsize, inst[1].filter_pos[chrSliceY]); | |
| 122 | |||
| 123 | 5819340 | int sp0 = firstLum - desc->src->plane[0].sliceY; | |
| 124 | 5819340 | int sp1 = firstChr - desc->src->plane[1].sliceY; | |
| 125 | 5819340 | int sp2 = firstChr - desc->src->plane[2].sliceY; | |
| 126 | 5819340 | int sp3 = firstLum - desc->src->plane[3].sliceY; | |
| 127 | 5819340 | int dp = sliceY - desc->dst->plane[0].sliceY; | |
| 128 | 5819340 | uint8_t **src0 = desc->src->plane[0].line + sp0; | |
| 129 | 5819340 | uint8_t **src1 = desc->src->plane[1].line + sp1; | |
| 130 | 5819340 | uint8_t **src2 = desc->src->plane[2].line + sp2; | |
| 131 |
2/2✓ Branch 0 taken 12521 times.
✓ Branch 1 taken 5806819 times.
|
5819340 | uint8_t **src3 = desc->alpha ? desc->src->plane[3].line + sp3 : NULL; |
| 132 | 5819340 | uint8_t **dst = desc->dst->plane[0].line + dp; | |
| 133 | |||
| 134 | |||
| 135 |
6/6✓ Branch 0 taken 4858896 times.
✓ Branch 1 taken 960444 times.
✓ Branch 2 taken 4820905 times.
✓ Branch 3 taken 37991 times.
✓ Branch 4 taken 3034725 times.
✓ Branch 5 taken 1786180 times.
|
5819340 | if (c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 1) { // unscaled RGB |
| 136 | 3034725 | inst->pfn.yuv2packed1(c, (const int16_t*)*src0, (const int16_t**)src1, (const int16_t**)src2, | |
| 137 |
2/2✓ Branch 0 taken 1728 times.
✓ Branch 1 taken 3032997 times.
|
3034725 | (const int16_t*)(desc->alpha ? *src3 : NULL), *dst, dstW, 0, sliceY); |
| 138 |
5/6✓ Branch 0 taken 1824171 times.
✓ Branch 1 taken 960444 times.
✓ Branch 2 taken 1786180 times.
✓ Branch 3 taken 37991 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1786180 times.
|
2784615 | } else if (c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 2 && |
| 139 | ✗ | chr_filter[2 * chrSliceY + 1] + chr_filter[2 * chrSliceY] == 4096 && | |
| 140 | ✗ | chr_filter[2 * chrSliceY + 1] <= 4096U) { // unscaled RGB | |
| 141 | ✗ | int chrAlpha = chr_filter[2 * chrSliceY + 1]; | |
| 142 | ✗ | inst->pfn.yuv2packed1(c, (const int16_t*)*src0, (const int16_t**)src1, (const int16_t**)src2, | |
| 143 | ✗ | (const int16_t*)(desc->alpha ? *src3 : NULL), *dst, dstW, chrAlpha, sliceY); | |
| 144 |
3/6✓ Branch 0 taken 1824171 times.
✓ Branch 1 taken 960444 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1824171 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2784615 | } else if (c->yuv2packed2 && lum_fsize == 2 && chr_fsize == 2 && |
| 145 | ✗ | lum_filter[2 * sliceY + 1] + lum_filter[2 * sliceY] == 4096 && | |
| 146 | ✗ | lum_filter[2 * sliceY + 1] <= 4096U && | |
| 147 | ✗ | chr_filter[2 * chrSliceY + 1] + chr_filter[2 * chrSliceY] == 4096 && | |
| 148 | ✗ | chr_filter[2 * chrSliceY + 1] <= 4096U | |
| 149 | ✗ | ) { // bilinear upscale RGB | |
| 150 | ✗ | int lumAlpha = lum_filter[2 * sliceY + 1]; | |
| 151 | ✗ | int chrAlpha = chr_filter[2 * chrSliceY + 1]; | |
| 152 | ✗ | c->lumMmxFilter[2] = | |
| 153 | ✗ | c->lumMmxFilter[3] = lum_filter[2 * sliceY] * 0x10001; | |
| 154 | ✗ | c->chrMmxFilter[2] = | |
| 155 | ✗ | c->chrMmxFilter[3] = chr_filter[2 * chrSliceY] * 0x10001; | |
| 156 | ✗ | inst->pfn.yuv2packed2(c, (const int16_t**)src0, (const int16_t**)src1, (const int16_t**)src2, (const int16_t**)src3, | |
| 157 | *dst, dstW, lumAlpha, chrAlpha, sliceY); | ||
| 158 | } else { // general RGB | ||
| 159 |
5/6✓ Branch 0 taken 1824171 times.
✓ Branch 1 taken 960444 times.
✓ Branch 2 taken 1786180 times.
✓ Branch 3 taken 37991 times.
✓ Branch 4 taken 1786180 times.
✗ Branch 5 not taken.
|
2784615 | if ((c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 2) || |
| 160 |
3/6✓ Branch 0 taken 1824171 times.
✓ Branch 1 taken 960444 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1824171 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2784615 | (c->yuv2packed2 && lum_fsize == 2 && chr_fsize == 2)) { |
| 161 | ✗ | if (!c->warned_unuseable_bilinear) | |
| 162 | ✗ | av_log(c, AV_LOG_INFO, "Optimized 2 tap filter code cannot be used\n"); | |
| 163 | ✗ | c->warned_unuseable_bilinear = 1; | |
| 164 | } | ||
| 165 | |||
| 166 | 2784615 | inst->yuv2packedX(c, lum_filter + sliceY * lum_fsize, | |
| 167 | 2784615 | (const int16_t**)src0, lum_fsize, chr_filter + chrSliceY * chr_fsize, | |
| 168 | (const int16_t**)src1, (const int16_t**)src2, chr_fsize, (const int16_t**)src3, *dst, dstW, sliceY); | ||
| 169 | } | ||
| 170 | 5819340 | return 1; | |
| 171 | } | ||
| 172 | |||
| 173 | 3183423 | static int any_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 174 | { | ||
| 175 | 3183423 | VScalerContext *inst = desc->instance; | |
| 176 | 3183423 | int dstW = desc->dst->width; | |
| 177 | 3183423 | int chrSliceY = sliceY >> desc->dst->v_chr_sub_sample; | |
| 178 | |||
| 179 | 3183423 | int lum_fsize = inst[0].filter_size; | |
| 180 | 3183423 | int chr_fsize = inst[1].filter_size; | |
| 181 | 3183423 | uint16_t *lum_filter = inst[0].filter[0]; | |
| 182 | 3183423 | uint16_t *chr_filter = inst[1].filter[0]; | |
| 183 | |||
| 184 | 3183423 | int firstLum = FFMAX(1-lum_fsize, inst[0].filter_pos[ sliceY]); | |
| 185 | 3183423 | int firstChr = FFMAX(1-chr_fsize, inst[1].filter_pos[chrSliceY]); | |
| 186 | |||
| 187 | 3183423 | int sp0 = firstLum - desc->src->plane[0].sliceY; | |
| 188 | 3183423 | int sp1 = firstChr - desc->src->plane[1].sliceY; | |
| 189 | 3183423 | int sp2 = firstChr - desc->src->plane[2].sliceY; | |
| 190 | 3183423 | int sp3 = firstLum - desc->src->plane[3].sliceY; | |
| 191 | 3183423 | int dp0 = sliceY - desc->dst->plane[0].sliceY; | |
| 192 | 3183423 | int dp1 = chrSliceY - desc->dst->plane[1].sliceY; | |
| 193 | 3183423 | int dp2 = chrSliceY - desc->dst->plane[2].sliceY; | |
| 194 | 3183423 | int dp3 = sliceY - desc->dst->plane[3].sliceY; | |
| 195 | |||
| 196 | 3183423 | uint8_t **src0 = desc->src->plane[0].line + sp0; | |
| 197 | 3183423 | uint8_t **src1 = desc->src->plane[1].line + sp1; | |
| 198 | 3183423 | uint8_t **src2 = desc->src->plane[2].line + sp2; | |
| 199 |
2/2✓ Branch 0 taken 6477 times.
✓ Branch 1 taken 3176946 times.
|
3183423 | uint8_t **src3 = desc->alpha ? desc->src->plane[3].line + sp3 : NULL; |
| 200 | 6366846 | uint8_t *dst[4] = { desc->dst->plane[0].line[dp0], | |
| 201 | 3183423 | desc->dst->plane[1].line[dp1], | |
| 202 | 3183423 | desc->dst->plane[2].line[dp2], | |
| 203 |
2/2✓ Branch 0 taken 6477 times.
✓ Branch 1 taken 3176946 times.
|
3183423 | desc->alpha ? desc->dst->plane[3].line[dp3] : NULL }; |
| 204 | |||
| 205 | av_assert1(!c->yuv2packed1 && !c->yuv2packed2); | ||
| 206 | 3183423 | inst->pfn.yuv2anyX(c, lum_filter + sliceY * lum_fsize, | |
| 207 | 3183423 | (const int16_t**)src0, lum_fsize, chr_filter + sliceY * chr_fsize, | |
| 208 | (const int16_t**)src1, (const int16_t**)src2, chr_fsize, (const int16_t**)src3, dst, dstW, sliceY); | ||
| 209 | |||
| 210 | 3183423 | return 1; | |
| 211 | |||
| 212 | } | ||
| 213 | |||
| 214 | 43369 | int ff_init_vscale(SwsInternal *c, SwsFilterDescriptor *desc, SwsSlice *src, SwsSlice *dst) | |
| 215 | { | ||
| 216 | 43369 | VScalerContext *lumCtx = NULL; | |
| 217 | 43369 | VScalerContext *chrCtx = NULL; | |
| 218 | |||
| 219 |
6/6✓ Branch 1 taken 14077 times.
✓ Branch 2 taken 29292 times.
✓ Branch 4 taken 1333 times.
✓ Branch 5 taken 12744 times.
✓ Branch 7 taken 1259 times.
✓ Branch 8 taken 74 times.
|
43369 | if (isPlanarYUV(c->opts.dst_format) || (isGray(c->opts.dst_format) && !isALPHA(c->opts.dst_format))) { |
| 220 | 30551 | lumCtx = av_mallocz(sizeof(VScalerContext)); | |
| 221 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 30551 times.
|
30551 | if (!lumCtx) |
| 222 | ✗ | return AVERROR(ENOMEM); | |
| 223 | |||
| 224 | |||
| 225 | 30551 | desc[0].process = lum_planar_vscale; | |
| 226 | 30551 | desc[0].instance = lumCtx; | |
| 227 | 30551 | desc[0].src = src; | |
| 228 | 30551 | desc[0].dst = dst; | |
| 229 | 30551 | desc[0].alpha = c->needAlpha; | |
| 230 | |||
| 231 |
2/2✓ Branch 1 taken 29292 times.
✓ Branch 2 taken 1259 times.
|
59843 | if (!isGray(c->opts.dst_format)) { |
| 232 | 29292 | chrCtx = av_mallocz(sizeof(VScalerContext)); | |
| 233 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 29292 times.
|
29292 | if (!chrCtx) |
| 234 | ✗ | return AVERROR(ENOMEM); | |
| 235 | 29292 | desc[1].process = chr_planar_vscale; | |
| 236 | 29292 | desc[1].instance = chrCtx; | |
| 237 | 29292 | desc[1].src = src; | |
| 238 | 29292 | desc[1].dst = dst; | |
| 239 | } | ||
| 240 | } else { | ||
| 241 | 12818 | lumCtx = av_calloc(2, sizeof(*lumCtx)); | |
| 242 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 12818 times.
|
12818 | if (!lumCtx) |
| 243 | ✗ | return AVERROR(ENOMEM); | |
| 244 | 12818 | chrCtx = &lumCtx[1]; | |
| 245 | |||
| 246 |
2/2✓ Branch 0 taken 8132 times.
✓ Branch 1 taken 4686 times.
|
12818 | desc[0].process = c->yuv2packedX ? packed_vscale : any_vscale; |
| 247 | 12818 | desc[0].instance = lumCtx; | |
| 248 | 12818 | desc[0].src = src; | |
| 249 | 12818 | desc[0].dst = dst; | |
| 250 | 12818 | desc[0].alpha = c->needAlpha; | |
| 251 | } | ||
| 252 | |||
| 253 | 43369 | ff_init_vscale_pfn(c, c->yuv2plane1, c->yuv2planeX, c->yuv2nv12cX, | |
| 254 | c->yuv2packed1, c->yuv2packed2, c->yuv2packedX, c->yuv2anyX, c->use_mmx_vfilter); | ||
| 255 | 43369 | return 0; | |
| 256 | } | ||
| 257 | |||
| 258 | 831795 | void ff_init_vscale_pfn(SwsInternal *c, | |
| 259 | yuv2planar1_fn yuv2plane1, | ||
| 260 | yuv2planarX_fn yuv2planeX, | ||
| 261 | yuv2interleavedX_fn yuv2nv12cX, | ||
| 262 | yuv2packed1_fn yuv2packed1, | ||
| 263 | yuv2packed2_fn yuv2packed2, | ||
| 264 | yuv2packedX_fn yuv2packedX, | ||
| 265 | yuv2anyX_fn yuv2anyX, int use_mmx) | ||
| 266 | { | ||
| 267 | 831795 | VScalerContext *lumCtx = NULL; | |
| 268 | 831795 | VScalerContext *chrCtx = NULL; | |
| 269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 831795 times.
|
831795 | int idx = c->numDesc - (c->is_internal_gamma ? 2 : 1); //FIXME avoid hardcoding indexes |
| 270 | |||
| 271 |
6/6✓ Branch 1 taken 320488 times.
✓ Branch 2 taken 511307 times.
✓ Branch 4 taken 32269 times.
✓ Branch 5 taken 288219 times.
✓ Branch 7 taken 31778 times.
✓ Branch 8 taken 491 times.
|
831795 | if (isPlanarYUV(c->opts.dst_format) || (isGray(c->opts.dst_format) && !isALPHA(c->opts.dst_format))) { |
| 272 |
2/2✓ Branch 1 taken 511307 times.
✓ Branch 2 taken 31778 times.
|
543085 | if (!isGray(c->opts.dst_format)) { |
| 273 | 511307 | chrCtx = c->desc[idx].instance; | |
| 274 | |||
| 275 |
2/2✓ Branch 0 taken 58 times.
✓ Branch 1 taken 511249 times.
|
511307 | chrCtx->filter[0] = use_mmx ? (int16_t*)c->chrMmxFilter : c->vChrFilter; |
| 276 | 511307 | chrCtx->filter_size = c->vChrFilterSize; | |
| 277 | 511307 | chrCtx->filter_pos = c->vChrFilterPos; | |
| 278 | 511307 | chrCtx->isMMX = use_mmx; | |
| 279 | |||
| 280 | 511307 | --idx; | |
| 281 |
2/2✓ Branch 0 taken 156200 times.
✓ Branch 1 taken 355107 times.
|
511307 | if (yuv2nv12cX) chrCtx->pfn.yuv2interleavedX = yuv2nv12cX; |
| 282 |
2/2✓ Branch 0 taken 199508 times.
✓ Branch 1 taken 155599 times.
|
355107 | else if (c->vChrFilterSize == 1) chrCtx->pfn.yuv2planar1 = yuv2plane1; |
| 283 | 155599 | else chrCtx->pfn.yuv2planarX = yuv2planeX; | |
| 284 | } | ||
| 285 | |||
| 286 | 543085 | lumCtx = c->desc[idx].instance; | |
| 287 | |||
| 288 |
2/2✓ Branch 0 taken 78 times.
✓ Branch 1 taken 543007 times.
|
543085 | lumCtx->filter[0] = use_mmx ? (int16_t*)c->lumMmxFilter : c->vLumFilter; |
| 289 |
2/2✓ Branch 0 taken 78 times.
✓ Branch 1 taken 543007 times.
|
543085 | lumCtx->filter[1] = use_mmx ? (int16_t*)c->alpMmxFilter : c->vLumFilter; |
| 290 | 543085 | lumCtx->filter_size = c->vLumFilterSize; | |
| 291 | 543085 | lumCtx->filter_pos = c->vLumFilterPos; | |
| 292 | 543085 | lumCtx->isMMX = use_mmx; | |
| 293 | |||
| 294 |
2/2✓ Branch 0 taken 518148 times.
✓ Branch 1 taken 24937 times.
|
543085 | if (c->vLumFilterSize == 1) lumCtx->pfn.yuv2planar1 = yuv2plane1; |
| 295 | 24937 | else lumCtx->pfn.yuv2planarX = yuv2planeX; | |
| 296 | |||
| 297 | } else { | ||
| 298 | 288710 | lumCtx = c->desc[idx].instance; | |
| 299 | 288710 | chrCtx = &lumCtx[1]; | |
| 300 | |||
| 301 | 288710 | lumCtx->filter[0] = c->vLumFilter; | |
| 302 | 288710 | lumCtx->filter_size = c->vLumFilterSize; | |
| 303 | 288710 | lumCtx->filter_pos = c->vLumFilterPos; | |
| 304 | |||
| 305 | 288710 | chrCtx->filter[0] = c->vChrFilter; | |
| 306 | 288710 | chrCtx->filter_size = c->vChrFilterSize; | |
| 307 | 288710 | chrCtx->filter_pos = c->vChrFilterPos; | |
| 308 | |||
| 309 | 288710 | lumCtx->isMMX = use_mmx; | |
| 310 | 288710 | chrCtx->isMMX = use_mmx; | |
| 311 | |||
| 312 |
2/2✓ Branch 0 taken 174946 times.
✓ Branch 1 taken 113764 times.
|
288710 | if (yuv2packedX) { |
| 313 |
6/6✓ Branch 0 taken 140820 times.
✓ Branch 1 taken 34126 times.
✓ Branch 2 taken 139024 times.
✓ Branch 3 taken 1796 times.
✓ Branch 4 taken 103677 times.
✓ Branch 5 taken 35347 times.
|
174946 | if (c->yuv2packed1 && c->vLumFilterSize == 1 && c->vChrFilterSize <= 2) |
| 314 | 103677 | lumCtx->pfn.yuv2packed1 = yuv2packed1; | |
| 315 |
3/6✓ Branch 0 taken 37143 times.
✓ Branch 1 taken 34126 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 37143 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
71269 | else if (c->yuv2packed2 && c->vLumFilterSize == 2 && c->vChrFilterSize == 2) |
| 316 | ✗ | lumCtx->pfn.yuv2packed2 = yuv2packed2; | |
| 317 | 174946 | lumCtx->yuv2packedX = yuv2packedX; | |
| 318 | } else | ||
| 319 | 113764 | lumCtx->pfn.yuv2anyX = yuv2anyX; | |
| 320 | } | ||
| 321 | 831795 | } | |
| 322 |