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-webs...@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
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel