[FFmpeg-cvslog] swscale: replace formatConvBuffer[VOF] by allocated array.
Ronald S. Bultje
git at videolan.org
Fri May 27 02:53:54 CEST 2011
ffmpeg | branch: master | Ronald S. Bultje <rsbultje at gmail.com> | Thu May 26 09:15:38 2011 -0400| [69645c021ad2cc503769b44b9008f98b014423de] | committer: 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.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=69645c021ad2cc503769b44b9008f98b014423de
---
libswscale/swscale_internal.h | 2 +-
libswscale/swscale_template.c | 5 +++--
libswscale/utils.c | 6 ++----
3 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 5f2ff94..1e52ea2 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -122,7 +122,7 @@ typedef struct SwsContext {
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.
diff --git a/libswscale/swscale_template.c b/libswscale/swscale_template.c
index aeeb428..8784359 100644
--- a/libswscale/swscale_template.c
+++ b/libswscale/swscale_template.c
@@ -459,9 +459,10 @@ inline static void hcscale_c(SwsContext *c, uint16_t *dst, long dstWidth,
src2 += c->chrSrcOffset;
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;
- src2= formatConvBuffer+VOFW;
+ src2= buf2;
}
if (!c->hcscale_fast) {
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 96b3207..20f07d6 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -790,10 +790,7 @@ int sws_init_context(SwsContext *c, SwsFilter *srcFilter, SwsFilter *dstFilter)
srcW, srcH, dstW, dstH);
return AVERROR(EINVAL);
}
- if(srcW > VOFW || dstW > VOFW) {
- av_log(NULL, AV_LOG_ERROR, "swScaler: Compile-time maximum width is "AV_STRINGIFY(VOFW)" change VOF/VOFW and recompile\n");
- return AVERROR(EINVAL);
- }
+ FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW, 16) * 2, fail);
if (!dstFilter) dstFilter= &dummyFilter;
if (!srcFilter) srcFilter= &dummyFilter;
@@ -1507,6 +1504,7 @@ void sws_freeContext(SwsContext *c)
#endif /* HAVE_MMX */
av_freep(&c->yuvTable);
+ av_free(c->formatConvBuffer);
av_free(c);
}
More information about the ffmpeg-cvslog
mailing list