swscale: replace formatConvBuffer[VOF] by allocated array.
This allows to convert between formats of arbitrary width, regardless of the value of VOF/VOFW.
This commit is contained in:
parent
522d65ba25
commit
69645c021a
@ -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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
#endif /* HAVE_MMX */
|
#endif /* HAVE_MMX */
|
||||||
|
|
||||||
av_freep(&c->yuvTable);
|
av_freep(&c->yuvTable);
|
||||||
|
av_free(c->formatConvBuffer);
|
||||||
|
|
||||||
av_free(c);
|
av_free(c);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user