[FFmpeg-devel] [PATCH 2/2] Re: deduplicated [PATCH] Cinepak: speed up decoding several-fold, depending on the scenario, by supporting multiple output pixel formats.

u-9iep at aetey.se u-9iep at aetey.se
Sat Feb 25 22:04:51 EET 2017


Support for conditional compilation,
a simple non-intrusive means to avoid binary bloat when this is relevant.

OTOH this change adds some extra lines to the source, which
may be acceptable or not.

Regards,
Rune
-------------- next part --------------
>From 11b5906e5161748b77bbad242ac28a49851c8b4f Mon Sep 17 00:00:00 2001
From: Rl <addr-see-the-website at aetey.se>
Date: Sat, 25 Feb 2017 19:14:18 +0100
Subject: [PATCH 2/2] Cinepak decoding: allow selective build of support for
 output pixel formats.

A simple non-intrusive means to avoid bloat
if the library is being built for some specific scenario.
---
 libavcodec/cinepak.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/libavcodec/cinepak.c b/libavcodec/cinepak.c
index 97836b3ab1..e32b07ce8a 100644
--- a/libavcodec/cinepak.c
+++ b/libavcodec/cinepak.c
@@ -46,6 +46,20 @@
 #include "avcodec.h"
 #include "internal.h"
 
+/* allow to choose which output formats are to be supported,
+ * if nothing specific is enabled explicitly, activate all */
+#if !defined(CINEPAK_ENABLE_DECODE_TO_RGB32) && \
+    !defined(CINEPAK_ENABLE_DECODE_TO_RGB24) && \
+    !defined(CINEPAK_ENABLE_DECODE_TO_RGB565) && \
+    !defined(CINEPAK_ENABLE_DECODE_TO_YUV420P) && \
+    !defined(CINEPAK_ENABLE_DECODE_TO_PAL8)
+#define CINEPAK_ENABLE_DECODE_TO_RGB32
+#define CINEPAK_ENABLE_DECODE_TO_RGB24
+#define CINEPAK_ENABLE_DECODE_TO_RGB565
+#define CINEPAK_ENABLE_DECODE_TO_YUV420P
+#define CINEPAK_ENABLE_DECODE_TO_PAL8
+#endif
+
 /* rounding to nearest; truncation would be slightly faster
  * but it noticeably affects the picture quality;
  * unless we become extremely desperate to use every single cycle
@@ -64,11 +78,21 @@
  */
 
 typedef union cvid_codebook {
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB32
     uint32_t   rgb32[256][ 4];
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB24
     uint8_t    rgb24[256][12];
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB565
     uint16_t  rgb565[256][ 4];
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_YUV420P
     uint8_t  yuv420p[256][ 6];
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_PAL8
     uint8_t     pal8[256][ 4];
+#endif
 } cvid_codebook;
 
 #define MAX_STRIPS      32    /* an arbitrary limit -- rl */
@@ -233,6 +257,7 @@ static int cinepak_decode_vectors_##pixel_format (CinepakContext *s, cvid_strip
  * (instead of in-loop checking) */\
         VECTOR_STREAM_PARSING\
 
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB32
 DECODE_CODEBOOK(rgb32)
     uint32_t *p = codebook->rgb32[0];
 
@@ -320,7 +345,9 @@ DECODE_VECTORS(rgb32)
 
     return 0;
 }
+#endif /* #ifdef CINEPAK_ENABLE_DECODE_TO_RGB32 */
 
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB24
 DECODE_CODEBOOK(rgb24)
     uint8_t *p = codebook->rgb24[0];
 
@@ -411,7 +438,9 @@ DECODE_VECTORS(rgb24)
 
     return 0;
 }
+#endif /* #ifdef CINEPAK_ENABLE_DECODE_TO_RGB24 */
 
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB565
 DECODE_CODEBOOK(rgb565)
     uint16_t *p = codebook->rgb565[0];
 
@@ -498,7 +527,9 @@ DECODE_VECTORS(rgb565)
 
     return 0;
 }
+#endif /* #ifdef CINEPAK_ENABLE_DECODE_TO_RGB565 */
 
+#ifdef CINEPAK_ENABLE_DECODE_TO_YUV420P
 /* a simplistic version to begin with, it is also fast -- rl */
 DECODE_CODEBOOK(yuv420p)
     uint8_t *p = codebook->yuv420p[0];
@@ -620,7 +651,9 @@ DECODE_VECTORS(yuv420p)
 
     return 0;
 }
+#endif /* #ifdef CINEPAK_ENABLE_DECODE_TO_YUV420P */
 
+#ifdef CINEPAK_ENABLE_DECODE_TO_PAL8
 /* here we do not expect anything besides palettized video,
  * nor check the data for validity, which should be ok,
  * to the best of our knowledge we do not write beyond the bounds */
@@ -702,6 +735,7 @@ DECODE_VECTORS(pal8)
 
     return 0;
 }
+#endif /* #ifdef CINEPAK_ENABLE_DECODE_TO_PAL8 */
 
 static int cinepak_decode_strip (CinepakContext *s,
                                  cvid_strip *strip, const uint8_t *data, int size)
@@ -844,20 +878,38 @@ static int cinepak_decode (CinepakContext *s)
 
 /* given a palettized input */
 static const enum AVPixelFormat pixfmt_list[] = {
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB24
     AV_PIX_FMT_RGB24,
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB32
     AV_PIX_FMT_RGB32,
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB565
     AV_PIX_FMT_RGB565,
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_YUV420P
     AV_PIX_FMT_YUV420P,
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_PAL8
     AV_PIX_FMT_PAL8, /* only when input is palettized */
+#endif
     AV_PIX_FMT_NONE
 };
 
 /* given a non-palettized input */
 static const enum AVPixelFormat pixfmt_list_2[] = {
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB24
     AV_PIX_FMT_RGB24,
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB32
     AV_PIX_FMT_RGB32,
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB565
     AV_PIX_FMT_RGB565,
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_YUV420P
     AV_PIX_FMT_YUV420P,
+#endif
     AV_PIX_FMT_NONE
 };
 
@@ -891,16 +943,26 @@ static av_cold int cinepak_decode_init(AVCodecContext *avctx)
  break;\
 
     switch (avctx->pix_fmt) {
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB32
     case AV_PIX_FMT_RGB32:   DECODE_TO(rgb32)
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB24
     case AV_PIX_FMT_RGB24:   DECODE_TO(rgb24)
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_RGB565
     case AV_PIX_FMT_RGB565:  DECODE_TO(rgb565)
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_YUV420P
     case AV_PIX_FMT_YUV420P: DECODE_TO(yuv420p)
+#endif
+#ifdef CINEPAK_ENABLE_DECODE_TO_PAL8
     case AV_PIX_FMT_PAL8:
         if (!s->palette_video) {
             av_log(avctx, AV_LOG_ERROR, "Palettized output not supported without palettized input\n");
             return AVERROR(EINVAL);
         }
         DECODE_TO(pal8)
+#endif
     default:
         av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format %s\n", av_get_pix_fmt_name(avctx->pix_fmt));
         return AVERROR(EINVAL);
-- 
2.11.0



More information about the ffmpeg-devel mailing list