OSDN Git Service

Implement sws_getCachedContext() in swscale emulation
authorLuca Abeni <lucabe72@email.it>
Tue, 17 Oct 2006 10:26:37 +0000 (10:26 +0000)
committerLuca Abeni <lucabe72@email.it>
Tue, 17 Oct 2006 10:26:37 +0000 (10:26 +0000)
Originally committed as revision 6718 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/imgresample.c
libavcodec/swscale.h

index 18aec56..e294dbc 100644 (file)
@@ -676,6 +676,42 @@ void sws_freeContext(struct SwsContext *ctx)
     av_free(ctx);
 }
 
+
+/**
+ * Checks if context is valid or reallocs a new one instead.
+ * If context is NULL, just calls sws_getContext() to get a new one.
+ * Otherwise, checks if the parameters are the same already saved in context.
+ * If that is the case, returns the current context.
+ * Otherwise, frees context and gets a new one.
+ *
+ * Be warned that srcFilter, dstFilter are not checked, they are
+ * asumed to remain valid.
+ */
+struct SwsContext *sws_getCachedContext(struct SwsContext *ctx,
+                        int srcW, int srcH, int srcFormat,
+                        int dstW, int dstH, int dstFormat, int flags,
+                        SwsFilter *srcFilter, SwsFilter *dstFilter, double *param)
+{
+    if (ctx != NULL) {
+        if ((ctx->resampling_ctx->iwidth != srcW) ||
+                        (ctx->resampling_ctx->iheight != srcH) ||
+                        (ctx->src_pix_fmt != srcFormat) ||
+                        (ctx->resampling_ctx->owidth != dstW) ||
+                        (ctx->resampling_ctx->oheight != dstH) ||
+                        (ctx->dst_pix_fmt != dstFormat))
+        {
+            sws_freeContext(ctx);
+            ctx = NULL;
+        }
+    }
+    if (ctx == NULL) {
+        return sws_getContext(srcW, srcH, srcFormat,
+                        dstW, dstH, dstFormat, flags,
+                        srcFilter, dstFilter, param);
+    }
+    return ctx;
+}
+
 int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[],
               int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])
 {
index 9dc3ca3..69d5c0f 100644 (file)
@@ -54,6 +54,11 @@ int sws_scale(struct SwsContext *ctx, uint8_t* src[], int srcStride[],
 
 void sws_freeContext(struct SwsContext *swsContext);
 
+struct SwsContext *sws_getCachedContext(struct SwsContext *context,
+                int srcW, int srcH, int srcFormat,
+                int dstW, int dstH, int dstFormat, int flags,
+                SwsFilter *srcFilter, SwsFilter *dstFilter, double *param);
+
 #ifdef __cplusplus
 }
 #endif