diff mbox

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

Message ID 20170225200449.GH32749@example.net
State Superseded
Headers show

Commit Message

u-9iep@aetey.se Feb. 25, 2017, 8:04 p.m. UTC
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
From 11b5906e5161748b77bbad242ac28a49851c8b4f Mon Sep 17 00:00:00 2001
From: Rl <addr-see-the-website@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 mbox

Patch

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);