mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
swscale: split hScale() function pointer into h[cy]Scale().
This allows using more specific implementations for chroma/luma, e.g. we can make assumptions on filterSize being constant, thus avoiding that test at runtime.
This commit is contained in:
parent
38e06c2969
commit
3f04ab4fcd
@ -400,7 +400,7 @@ void ff_sws_init_swScale_altivec(SwsContext *c)
|
||||
return;
|
||||
|
||||
if (c->srcBpc == 8 && c->dstBpc <= 10) {
|
||||
c->hScale = hScale_altivec_real;
|
||||
c->hyScale = c->hcScale = hScale_altivec_real;
|
||||
}
|
||||
if (!is16BPS(dstFormat) && !is9_OR_10BPS(dstFormat) &&
|
||||
dstFormat != PIX_FMT_NV12 && dstFormat != PIX_FMT_NV21 &&
|
||||
|
@ -2087,7 +2087,7 @@ static av_always_inline void hyscale(SwsContext *c, int16_t *dst, int dstWidth,
|
||||
}
|
||||
|
||||
if (!c->hyscale_fast) {
|
||||
c->hScale(c, dst, dstWidth, src, hLumFilter, hLumFilterPos, hLumFilterSize);
|
||||
c->hyScale(c, dst, dstWidth, src, hLumFilter, hLumFilterPos, hLumFilterSize);
|
||||
} else { // fast bilinear upscale / crap downscale
|
||||
c->hyscale_fast(c, dst, dstWidth, src, srcW, xInc);
|
||||
}
|
||||
@ -2125,8 +2125,8 @@ static av_always_inline void hcscale(SwsContext *c, int16_t *dst1, int16_t *dst2
|
||||
}
|
||||
|
||||
if (!c->hcscale_fast) {
|
||||
c->hScale(c, dst1, dstWidth, src1, hChrFilter, hChrFilterPos, hChrFilterSize);
|
||||
c->hScale(c, dst2, dstWidth, src2, hChrFilter, hChrFilterPos, hChrFilterSize);
|
||||
c->hcScale(c, dst1, dstWidth, src1, hChrFilter, hChrFilterPos, hChrFilterSize);
|
||||
c->hcScale(c, dst2, dstWidth, src2, hChrFilter, hChrFilterPos, hChrFilterSize);
|
||||
} else { // fast bilinear upscale / crap downscale
|
||||
c->hcscale_fast(c, dst1, dst2, dstWidth, src1, src2, srcW, xInc);
|
||||
}
|
||||
@ -2789,16 +2789,16 @@ static av_cold void sws_init_swScale_c(SwsContext *c)
|
||||
|
||||
if (c->srcBpc == 8) {
|
||||
if (c->dstBpc <= 10) {
|
||||
c->hScale = hScale8To15_c;
|
||||
c->hyScale = c->hcScale = hScale8To15_c;
|
||||
if (c->flags & SWS_FAST_BILINEAR) {
|
||||
c->hyscale_fast = hyscale_fast_c;
|
||||
c->hcscale_fast = hcscale_fast_c;
|
||||
}
|
||||
} else {
|
||||
c->hScale = hScale8To19_c;
|
||||
c->hyScale = c->hcScale = hScale8To19_c;
|
||||
}
|
||||
} else {
|
||||
c->hScale = c->dstBpc > 10 ? hScale16To19_c : hScale16To15_c;
|
||||
c->hyScale = c->hcScale = c->dstBpc > 10 ? hScale16To19_c : hScale16To15_c;
|
||||
}
|
||||
|
||||
if (c->srcRange != c->dstRange && !isAnyRGB(c->dstFormat)) {
|
||||
|
@ -481,9 +481,14 @@ typedef struct SwsContext {
|
||||
* (and input coefficients thus padded with zeroes)
|
||||
* to simplify creating SIMD code.
|
||||
*/
|
||||
void (*hScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src,
|
||||
const int16_t *filter, const int16_t *filterPos,
|
||||
int filterSize);
|
||||
/** @{ */
|
||||
void (*hyScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src,
|
||||
const int16_t *filter, const int16_t *filterPos,
|
||||
int filterSize);
|
||||
void (*hcScale)(struct SwsContext *c, int16_t *dst, int dstW, const uint8_t *src,
|
||||
const int16_t *filter, const int16_t *filterPos,
|
||||
int filterSize);
|
||||
/** @} */
|
||||
|
||||
void (*lumConvertRange)(int16_t *dst, int width); ///< Color range conversion function for luma plane if needed.
|
||||
void (*chrConvertRange)(int16_t *dst1, int16_t *dst2, int width); ///< Color range conversion function for chroma planes if needed.
|
||||
|
@ -2318,7 +2318,7 @@ static av_cold void RENAME(sws_init_swScale)(SwsContext *c)
|
||||
|
||||
if (c->srcBpc == 8 && c->dstBpc <= 10) {
|
||||
#if !COMPILE_TEMPLATE_MMX2
|
||||
c->hScale = RENAME(hScale );
|
||||
c->hyScale = c->hcScale = RENAME(hScale );
|
||||
#endif /* !COMPILE_TEMPLATE_MMX2 */
|
||||
|
||||
// Use the new MMX scaler if the MMX2 one can't be used (it is faster than the x86 ASM one).
|
||||
|
Loading…
Reference in New Issue
Block a user