Commit 69645c02 authored by Ronald S. Bultje's avatar Ronald S. Bultje

swscale: replace formatConvBuffer[VOF] by allocated array.

This allows to convert between formats of arbitrary width,
regardless of the value of VOF/VOFW.
parent 522d65ba
...@@ -122,7 +122,7 @@ typedef struct SwsContext { ...@@ -122,7 +122,7 @@ typedef struct SwsContext {
int chrBufIndex; ///< Index in ring buffer of the last scaled horizontal chroma line from source. int chrBufIndex; ///< Index in ring buffer of the last scaled horizontal chroma line from source.
//@} //@}
uint8_t formatConvBuffer[VOF]; //FIXME dynamic allocation, but we have to change a lot of code for this to be useful uint8_t *formatConvBuffer;
/** /**
* @name Horizontal and vertical filters. * @name Horizontal and vertical filters.
......
...@@ -459,9 +459,10 @@ inline static void hcscale_c(SwsContext *c, uint16_t *dst, long dstWidth, ...@@ -459,9 +459,10 @@ inline static void hcscale_c(SwsContext *c, uint16_t *dst, long dstWidth,
src2 += c->chrSrcOffset; src2 += c->chrSrcOffset;
if (c->chrToYV12) { if (c->chrToYV12) {
c->chrToYV12(formatConvBuffer, formatConvBuffer+VOFW, src1, src2, srcW, pal); uint8_t *buf2 = formatConvBuffer + FFALIGN(srcW, 16);
c->chrToYV12(formatConvBuffer, buf2, src1, src2, srcW, pal);
src1= formatConvBuffer; src1= formatConvBuffer;
src2= formatConvBuffer+VOFW; src2= buf2;
} }
if (!c->hcscale_fast) { if (!c->hcscale_fast) {
......
...@@ -790,10 +790,7 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter) ...@@ -790,10 +790,7 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter)
srcW, srcH, dstW, dstH); srcW, srcH, dstW, dstH);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if(srcW > VOFW || dstW > VOFW) { FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW, 16) * 2, fail);
av_log(NULL, AV_LOG_ERROR, "swScaler: Compile-time maximum width is "AV_STRINGIFY(VOFW)" change VOF/VOFW and recompile\n");
return AVERROR(EINVAL);
}
if (!dstFilter) dstFilter= &dummyFilter; if (!dstFilter) dstFilter= &dummyFilter;
if (!srcFilter) srcFilter= &dummyFilter; if (!srcFilter) srcFilter= &dummyFilter;
...@@ -1507,6 +1504,7 @@ void sws_freeContext(SwsContext *c) ...@@ -1507,6 +1504,7 @@ void sws_freeContext(SwsContext *c)
#endif /* HAVE_MMX */ #endif /* HAVE_MMX */
av_freep(&c->yuvTable); av_freep(&c->yuvTable);
av_free(c->formatConvBuffer);
av_free(c); av_free(c);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment