| 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 | 22160506 | static int lum_planar_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 42 | { | ||
| 43 | 22160506 | VScalerContext *inst = desc->instance; | |
| 44 | 22160506 | int dstW = desc->dst->width; | |
| 45 | |||
| 46 | 22160506 | int first = FFMAX(1-inst->filter_size, inst->filter_pos[sliceY]); | |
| 47 | 22160506 | int sp = first - desc->src->plane[0].sliceY; | |
| 48 | 22160506 | int dp = sliceY - desc->dst->plane[0].sliceY; | |
| 49 | 22160506 | uint8_t **src = desc->src->plane[0].line + sp; | |
| 50 | 22160506 | uint8_t **dst = desc->dst->plane[0].line + dp; | |
| 51 |
2/2✓ Branch 0 taken 22160412 times.
✓ Branch 1 taken 94 times.
|
22160506 | uint16_t *filter = inst->filter[0] + (inst->isMMX ? 0 : sliceY * inst->filter_size); |
| 52 | |||
| 53 |
2/2✓ Branch 0 taken 17237038 times.
✓ Branch 1 taken 4923468 times.
|
22160506 | if (inst->filter_size == 1) |
| 54 | 17237038 | inst->pfn.yuv2planar1((const int16_t*)src[0], dst[0], dstW, c->lumDither8, 0); | |
| 55 | else | ||
| 56 | 4923468 | inst->pfn.yuv2planarX(filter, inst->filter_size, (const int16_t**)src, dst[0], dstW, c->lumDither8, 0); | |
| 57 | |||
| 58 |
2/2✓ Branch 0 taken 1075848 times.
✓ Branch 1 taken 21084658 times.
|
22160506 | if (desc->alpha) { |
| 59 | 1075848 | int sp = first - desc->src->plane[3].sliceY; | |
| 60 | 1075848 | int dp = sliceY - desc->dst->plane[3].sliceY; | |
| 61 | 1075848 | uint8_t **src = desc->src->plane[3].line + sp; | |
| 62 | 1075848 | uint8_t **dst = desc->dst->plane[3].line + dp; | |
| 63 |
1/2✓ Branch 0 taken 1075848 times.
✗ Branch 1 not taken.
|
1075848 | uint16_t *filter = inst->filter[1] + (inst->isMMX ? 0 : sliceY * inst->filter_size); |
| 64 | |||
| 65 |
2/2✓ Branch 0 taken 609664 times.
✓ Branch 1 taken 466184 times.
|
1075848 | if (inst->filter_size == 1) |
| 66 | 609664 | inst->pfn.yuv2planar1((const int16_t*)src[0], dst[0], dstW, c->lumDither8, 0); | |
| 67 | else | ||
| 68 | 466184 | inst->pfn.yuv2planarX(filter, inst->filter_size, (const int16_t**)src, dst[0], dstW, c->lumDither8, 0); | |
| 69 | } | ||
| 70 | |||
| 71 | 22160506 | return 1; | |
| 72 | } | ||
| 73 | |||
| 74 | 21183173 | static int chr_planar_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 75 | { | ||
| 76 | 21183173 | const int chrSkipMask = (1 << desc->dst->v_chr_sub_sample) - 1; | |
| 77 |
2/2✓ Branch 0 taken 4157834 times.
✓ Branch 1 taken 17025339 times.
|
21183173 | if (sliceY & chrSkipMask) |
| 78 | 4157834 | return 0; | |
| 79 | else { | ||
| 80 | 17025339 | VScalerContext *inst = desc->instance; | |
| 81 | 17025339 | int dstW = AV_CEIL_RSHIFT(desc->dst->width, desc->dst->h_chr_sub_sample); | |
| 82 | 17025339 | int chrSliceY = sliceY >> desc->dst->v_chr_sub_sample; | |
| 83 | |||
| 84 | 17025339 | int first = FFMAX(1-inst->filter_size, inst->filter_pos[chrSliceY]); | |
| 85 | 17025339 | int sp1 = first - desc->src->plane[1].sliceY; | |
| 86 | 17025339 | int sp2 = first - desc->src->plane[2].sliceY; | |
| 87 | 17025339 | int dp1 = chrSliceY - desc->dst->plane[1].sliceY; | |
| 88 | 17025339 | int dp2 = chrSliceY - desc->dst->plane[2].sliceY; | |
| 89 | 17025339 | uint8_t **src1 = desc->src->plane[1].line + sp1; | |
| 90 | 17025339 | uint8_t **src2 = desc->src->plane[2].line + sp2; | |
| 91 | 17025339 | uint8_t **dst1 = desc->dst->plane[1].line + dp1; | |
| 92 | 17025339 | uint8_t **dst2 = desc->dst->plane[2].line + dp2; | |
| 93 |
2/2✓ Branch 0 taken 17025245 times.
✓ Branch 1 taken 94 times.
|
17025339 | uint16_t *filter = inst->filter[0] + (inst->isMMX ? 0 : chrSliceY * inst->filter_size); |
| 94 | |||
| 95 |
2/2✓ Branch 0 taken 3658408 times.
✓ Branch 1 taken 13366931 times.
|
17025339 | if (c->yuv2nv12cX) { |
| 96 | 3658408 | 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 5977027 times.
✓ Branch 1 taken 7389904 times.
|
13366931 | } else if (inst->filter_size == 1) { |
| 98 | 5977027 | inst->pfn.yuv2planar1((const int16_t*)src1[0], dst1[0], dstW, c->chrDither8, 0); | |
| 99 | 5977027 | inst->pfn.yuv2planar1((const int16_t*)src2[0], dst2[0], dstW, c->chrDither8, 3); | |
| 100 | } else { | ||
| 101 | 7389904 | 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 7389904 times.
|
7389904 | 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 | 17025339 | return 1; | |
| 107 | } | ||
| 108 | |||
| 109 | 5780988 | static int packed_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 110 | { | ||
| 111 | 5780988 | VScalerContext *inst = desc->instance; | |
| 112 | 5780988 | int dstW = desc->dst->width; | |
| 113 | 5780988 | int chrSliceY = sliceY >> desc->dst->v_chr_sub_sample; | |
| 114 | |||
| 115 | 5780988 | int lum_fsize = inst[0].filter_size; | |
| 116 | 5780988 | int chr_fsize = inst[1].filter_size; | |
| 117 | 5780988 | uint16_t *lum_filter = inst[0].filter[0]; | |
| 118 | 5780988 | uint16_t *chr_filter = inst[1].filter[0]; | |
| 119 | |||
| 120 | 5780988 | int firstLum = FFMAX(1-lum_fsize, inst[0].filter_pos[ sliceY]); | |
| 121 | 5780988 | int firstChr = FFMAX(1-chr_fsize, inst[1].filter_pos[chrSliceY]); | |
| 122 | |||
| 123 | 5780988 | int sp0 = firstLum - desc->src->plane[0].sliceY; | |
| 124 | 5780988 | int sp1 = firstChr - desc->src->plane[1].sliceY; | |
| 125 | 5780988 | int sp2 = firstChr - desc->src->plane[2].sliceY; | |
| 126 | 5780988 | int sp3 = firstLum - desc->src->plane[3].sliceY; | |
| 127 | 5780988 | int dp = sliceY - desc->dst->plane[0].sliceY; | |
| 128 | 5780988 | uint8_t **src0 = desc->src->plane[0].line + sp0; | |
| 129 | 5780988 | uint8_t **src1 = desc->src->plane[1].line + sp1; | |
| 130 | 5780988 | uint8_t **src2 = desc->src->plane[2].line + sp2; | |
| 131 |
2/2✓ Branch 0 taken 14441 times.
✓ Branch 1 taken 5766547 times.
|
5780988 | uint8_t **src3 = desc->alpha ? desc->src->plane[3].line + sp3 : NULL; |
| 132 | 5780988 | uint8_t **dst = desc->dst->plane[0].line + dp; | |
| 133 | |||
| 134 | |||
| 135 |
6/6✓ Branch 0 taken 4813056 times.
✓ Branch 1 taken 967932 times.
✓ Branch 2 taken 4774945 times.
✓ Branch 3 taken 38111 times.
✓ Branch 4 taken 2977509 times.
✓ Branch 5 taken 1797436 times.
|
5780988 | if (c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 1) { // unscaled RGB |
| 136 | 2977509 | inst->pfn.yuv2packed1(c, (const int16_t*)*src0, (const int16_t**)src1, (const int16_t**)src2, | |
| 137 |
2/2✓ Branch 0 taken 3456 times.
✓ Branch 1 taken 2974053 times.
|
2977509 | (const int16_t*)(desc->alpha ? *src3 : NULL), *dst, dstW, 0, sliceY); |
| 138 |
5/6✓ Branch 0 taken 1835547 times.
✓ Branch 1 taken 967932 times.
✓ Branch 2 taken 1797436 times.
✓ Branch 3 taken 38111 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1797436 times.
|
2803479 | } 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 1835547 times.
✓ Branch 1 taken 967932 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1835547 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2803479 | } 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 1835547 times.
✓ Branch 1 taken 967932 times.
✓ Branch 2 taken 1797436 times.
✓ Branch 3 taken 38111 times.
✓ Branch 4 taken 1797436 times.
✗ Branch 5 not taken.
|
2803479 | if ((c->yuv2packed1 && lum_fsize == 1 && chr_fsize == 2) || |
| 160 |
3/6✓ Branch 0 taken 1835547 times.
✓ Branch 1 taken 967932 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1835547 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2803479 | (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 | 2803479 | inst->yuv2packedX(c, lum_filter + sliceY * lum_fsize, | |
| 167 | 2803479 | (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 | 5780988 | return 1; | |
| 171 | } | ||
| 172 | |||
| 173 | 3161919 | static int any_vscale(SwsInternal *c, SwsFilterDescriptor *desc, int sliceY, int sliceH) | |
| 174 | { | ||
| 175 | 3161919 | VScalerContext *inst = desc->instance; | |
| 176 | 3161919 | int dstW = desc->dst->width; | |
| 177 | 3161919 | int chrSliceY = sliceY >> desc->dst->v_chr_sub_sample; | |
| 178 | |||
| 179 | 3161919 | int lum_fsize = inst[0].filter_size; | |
| 180 | 3161919 | int chr_fsize = inst[1].filter_size; | |
| 181 | 3161919 | uint16_t *lum_filter = inst[0].filter[0]; | |
| 182 | 3161919 | uint16_t *chr_filter = inst[1].filter[0]; | |
| 183 | |||
| 184 | 3161919 | int firstLum = FFMAX(1-lum_fsize, inst[0].filter_pos[ sliceY]); | |
| 185 | 3161919 | int firstChr = FFMAX(1-chr_fsize, inst[1].filter_pos[chrSliceY]); | |
| 186 | |||
| 187 | 3161919 | int sp0 = firstLum - desc->src->plane[0].sliceY; | |
| 188 | 3161919 | int sp1 = firstChr - desc->src->plane[1].sliceY; | |
| 189 | 3161919 | int sp2 = firstChr - desc->src->plane[2].sliceY; | |
| 190 | 3161919 | int sp3 = firstLum - desc->src->plane[3].sliceY; | |
| 191 | 3161919 | int dp0 = sliceY - desc->dst->plane[0].sliceY; | |
| 192 | 3161919 | int dp1 = chrSliceY - desc->dst->plane[1].sliceY; | |
| 193 | 3161919 | int dp2 = chrSliceY - desc->dst->plane[2].sliceY; | |
| 194 | 3161919 | int dp3 = sliceY - desc->dst->plane[3].sliceY; | |
| 195 | |||
| 196 | 3161919 | uint8_t **src0 = desc->src->plane[0].line + sp0; | |
| 197 | 3161919 | uint8_t **src1 = desc->src->plane[1].line + sp1; | |
| 198 | 3161919 | uint8_t **src2 = desc->src->plane[2].line + sp2; | |
| 199 |
2/2✓ Branch 0 taken 7149 times.
✓ Branch 1 taken 3154770 times.
|
3161919 | uint8_t **src3 = desc->alpha ? desc->src->plane[3].line + sp3 : NULL; |
| 200 | 6323838 | uint8_t *dst[4] = { desc->dst->plane[0].line[dp0], | |
| 201 | 3161919 | desc->dst->plane[1].line[dp1], | |
| 202 | 3161919 | desc->dst->plane[2].line[dp2], | |
| 203 |
2/2✓ Branch 0 taken 7149 times.
✓ Branch 1 taken 3154770 times.
|
3161919 | desc->alpha ? desc->dst->plane[3].line[dp3] : NULL }; |
| 204 | |||
| 205 | av_assert1(!c->yuv2packed1 && !c->yuv2packed2); | ||
| 206 | 3161919 | inst->pfn.yuv2anyX(c, lum_filter + sliceY * lum_fsize, | |
| 207 | 3161919 | (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 | 3161919 | return 1; | |
| 211 | |||
| 212 | } | ||
| 213 | |||
| 214 | 58937 | int ff_init_vscale(SwsInternal *c, SwsFilterDescriptor *desc, SwsSlice *src, SwsSlice *dst) | |
| 215 | { | ||
| 216 | 58937 | VScalerContext *lumCtx = NULL; | |
| 217 | 58937 | VScalerContext *chrCtx = NULL; | |
| 218 | |||
| 219 |
6/6✓ Branch 1 taken 14815 times.
✓ Branch 2 taken 44122 times.
✓ Branch 4 taken 1185 times.
✓ Branch 5 taken 13630 times.
✓ Branch 7 taken 1138 times.
✓ Branch 8 taken 47 times.
|
58937 | if (isPlanarYUV(c->opts.dst_format) || (isGray(c->opts.dst_format) && !isALPHA(c->opts.dst_format))) { |
| 220 | 45260 | lumCtx = av_mallocz(sizeof(VScalerContext)); | |
| 221 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 45260 times.
|
45260 | if (!lumCtx) |
| 222 | ✗ | return AVERROR(ENOMEM); | |
| 223 | |||
| 224 | |||
| 225 | 45260 | desc[0].process = lum_planar_vscale; | |
| 226 | 45260 | desc[0].instance = lumCtx; | |
| 227 | 45260 | desc[0].src = src; | |
| 228 | 45260 | desc[0].dst = dst; | |
| 229 | 45260 | desc[0].alpha = c->needAlpha; | |
| 230 | |||
| 231 |
2/2✓ Branch 1 taken 44122 times.
✓ Branch 2 taken 1138 times.
|
89382 | if (!isGray(c->opts.dst_format)) { |
| 232 | 44122 | chrCtx = av_mallocz(sizeof(VScalerContext)); | |
| 233 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 44122 times.
|
44122 | if (!chrCtx) |
| 234 | ✗ | return AVERROR(ENOMEM); | |
| 235 | 44122 | desc[1].process = chr_planar_vscale; | |
| 236 | 44122 | desc[1].instance = chrCtx; | |
| 237 | 44122 | desc[1].src = src; | |
| 238 | 44122 | desc[1].dst = dst; | |
| 239 | } | ||
| 240 | } else { | ||
| 241 | 13677 | lumCtx = av_calloc(2, sizeof(*lumCtx)); | |
| 242 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13677 times.
|
13677 | if (!lumCtx) |
| 243 | ✗ | return AVERROR(ENOMEM); | |
| 244 | 13677 | chrCtx = &lumCtx[1]; | |
| 245 | |||
| 246 |
2/2✓ Branch 0 taken 9103 times.
✓ Branch 1 taken 4574 times.
|
13677 | desc[0].process = c->yuv2packedX ? packed_vscale : any_vscale; |
| 247 | 13677 | desc[0].instance = lumCtx; | |
| 248 | 13677 | desc[0].src = src; | |
| 249 | 13677 | desc[0].dst = dst; | |
| 250 | 13677 | desc[0].alpha = c->needAlpha; | |
| 251 | } | ||
| 252 | |||
| 253 | 58937 | 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 | 58937 | return 0; | |
| 256 | } | ||
| 257 | |||
| 258 | 893188 | 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 | 893188 | VScalerContext *lumCtx = NULL; | |
| 268 | 893188 | VScalerContext *chrCtx = NULL; | |
| 269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 893188 times.
|
893188 | int idx = c->numDesc - (c->is_internal_gamma ? 2 : 1); //FIXME avoid hardcoding indexes |
| 270 | |||
| 271 |
6/6✓ Branch 1 taken 319137 times.
✓ Branch 2 taken 574051 times.
✓ Branch 4 taken 31677 times.
✓ Branch 5 taken 287460 times.
✓ Branch 7 taken 31294 times.
✓ Branch 8 taken 383 times.
|
893188 | if (isPlanarYUV(c->opts.dst_format) || (isGray(c->opts.dst_format) && !isALPHA(c->opts.dst_format))) { |
| 272 |
2/2✓ Branch 1 taken 574051 times.
✓ Branch 2 taken 31294 times.
|
605345 | if (!isGray(c->opts.dst_format)) { |
| 273 | 574051 | chrCtx = c->desc[idx].instance; | |
| 274 | |||
| 275 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 574049 times.
|
574051 | chrCtx->filter[0] = use_mmx ? (int16_t*)c->chrMmxFilter : c->vChrFilter; |
| 276 | 574051 | chrCtx->filter_size = c->vChrFilterSize; | |
| 277 | 574051 | chrCtx->filter_pos = c->vChrFilterPos; | |
| 278 | 574051 | chrCtx->isMMX = use_mmx; | |
| 279 | |||
| 280 | 574051 | --idx; | |
| 281 |
2/2✓ Branch 0 taken 152230 times.
✓ Branch 1 taken 421821 times.
|
574051 | if (yuv2nv12cX) chrCtx->pfn.yuv2interleavedX = yuv2nv12cX; |
| 282 |
2/2✓ Branch 0 taken 210114 times.
✓ Branch 1 taken 211707 times.
|
421821 | else if (c->vChrFilterSize == 1) chrCtx->pfn.yuv2planar1 = yuv2plane1; |
| 283 | 211707 | else chrCtx->pfn.yuv2planarX = yuv2planeX; | |
| 284 | } | ||
| 285 | |||
| 286 | 605345 | lumCtx = c->desc[idx].instance; | |
| 287 | |||
| 288 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 605343 times.
|
605345 | lumCtx->filter[0] = use_mmx ? (int16_t*)c->lumMmxFilter : c->vLumFilter; |
| 289 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 605343 times.
|
605345 | lumCtx->filter[1] = use_mmx ? (int16_t*)c->alpMmxFilter : c->vLumFilter; |
| 290 | 605345 | lumCtx->filter_size = c->vLumFilterSize; | |
| 291 | 605345 | lumCtx->filter_pos = c->vLumFilterPos; | |
| 292 | 605345 | lumCtx->isMMX = use_mmx; | |
| 293 | |||
| 294 |
2/2✓ Branch 0 taken 523740 times.
✓ Branch 1 taken 81605 times.
|
605345 | if (c->vLumFilterSize == 1) lumCtx->pfn.yuv2planar1 = yuv2plane1; |
| 295 | 81605 | else lumCtx->pfn.yuv2planarX = yuv2planeX; | |
| 296 | |||
| 297 | } else { | ||
| 298 | 287843 | lumCtx = c->desc[idx].instance; | |
| 299 | 287843 | chrCtx = &lumCtx[1]; | |
| 300 | |||
| 301 | 287843 | lumCtx->filter[0] = c->vLumFilter; | |
| 302 | 287843 | lumCtx->filter_size = c->vLumFilterSize; | |
| 303 | 287843 | lumCtx->filter_pos = c->vLumFilterPos; | |
| 304 | |||
| 305 | 287843 | chrCtx->filter[0] = c->vChrFilter; | |
| 306 | 287843 | chrCtx->filter_size = c->vChrFilterSize; | |
| 307 | 287843 | chrCtx->filter_pos = c->vChrFilterPos; | |
| 308 | |||
| 309 | 287843 | lumCtx->isMMX = use_mmx; | |
| 310 | 287843 | chrCtx->isMMX = use_mmx; | |
| 311 | |||
| 312 |
2/2✓ Branch 0 taken 174863 times.
✓ Branch 1 taken 112980 times.
|
287843 | if (yuv2packedX) { |
| 313 |
6/6✓ Branch 0 taken 140465 times.
✓ Branch 1 taken 34398 times.
✓ Branch 2 taken 138671 times.
✓ Branch 3 taken 1794 times.
✓ Branch 4 taken 102861 times.
✓ Branch 5 taken 35810 times.
|
174863 | if (c->yuv2packed1 && c->vLumFilterSize == 1 && c->vChrFilterSize <= 2) |
| 314 | 102861 | lumCtx->pfn.yuv2packed1 = yuv2packed1; | |
| 315 |
3/6✓ Branch 0 taken 37604 times.
✓ Branch 1 taken 34398 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 37604 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
72002 | else if (c->yuv2packed2 && c->vLumFilterSize == 2 && c->vChrFilterSize == 2) |
| 316 | ✗ | lumCtx->pfn.yuv2packed2 = yuv2packed2; | |
| 317 | 174863 | lumCtx->yuv2packedX = yuv2packedX; | |
| 318 | } else | ||
| 319 | 112980 | lumCtx->pfn.yuv2anyX = yuv2anyX; | |
| 320 | } | ||
| 321 | 893188 | } | |
| 322 |