From 30b6147521a3b2a9df4a4094ccee65a5fd8bc18f Mon Sep 17 00:00:00 2001 From: Stefano Sabatini Date: Sun, 24 Jan 2010 12:55:05 +0000 Subject: Use av_get_bits_per_pixel() for computing the bits per pixel of the source and destination format, cache those values in the newly added SwsContext:srcFormatBpp and SwsContext:dstFormatBpp fields, and remove the fmt_depth() function. Originally committed as revision 30419 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale --- libswscale/swscale.c | 14 +++++++------- libswscale/swscale_internal.h | 40 ++-------------------------------------- libswscale/utils.c | 2 ++ libswscale/yuv2rgb.c | 2 +- 4 files changed, 12 insertions(+), 46 deletions(-) diff --git a/libswscale/swscale.c b/libswscale/swscale.c index cd365b73c5..79137088bd 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -882,7 +882,7 @@ static inline void yuv2rgbXinC_full(SwsContext *c, const int16_t *lumFilter, con const int16_t **alpSrc, uint8_t *dest, int dstW, int y) { int i; - int step= fmt_depth(c->dstFormat)/8; + int step= c->dstFormatBpp/8; int aidx= 3; switch(c->dstFormat) { @@ -1430,10 +1430,10 @@ static int rgb2rgbWrapper(SwsContext *c, const uint8_t* src[], int srcStride[], { const enum PixelFormat srcFormat= c->srcFormat; const enum PixelFormat dstFormat= c->dstFormat; - const int srcBpp= (fmt_depth(srcFormat) + 7) >> 3; - const int dstBpp= (fmt_depth(dstFormat) + 7) >> 3; - const int srcId= fmt_depth(srcFormat) >> 2; /* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 */ - const int dstId= fmt_depth(dstFormat) >> 2; + const int srcBpp= (c->srcFormatBpp + 7) >> 3; + const int dstBpp= (c->dstFormatBpp + 7) >> 3; + const int srcId= c->srcFormatBpp >> 2; /* 1:0, 4:1, 8:2, 15:3, 16:4, 24:6, 32:8 */ + const int dstId= c->dstFormatBpp >> 2; void (*conv)(const uint8_t *src, uint8_t *dst, long src_size)=NULL; /* BGR -> BGR */ @@ -1661,8 +1661,8 @@ void ff_get_unscaled_swscale(SwsContext *c) int needsDither; needsDither= (isBGR(dstFormat) || isRGB(dstFormat)) - && (fmt_depth(dstFormat))<24 - && ((fmt_depth(dstFormat))<(fmt_depth(srcFormat)) || (!(isRGB(srcFormat) || isBGR(srcFormat)))); + && c->srcFormatBpp < 24 + && (c->dstFormatBpp < c->srcFormatBpp || (!(isRGB(srcFormat) || isBGR(srcFormat)))); /* yv12_to_nv12 */ if ((srcFormat == PIX_FMT_YUV420P || srcFormat == PIX_FMT_YUVA420P) && (dstFormat == PIX_FMT_NV12 || dstFormat == PIX_FMT_NV21)) { diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index 658c4aef72..aba4de25ff 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -86,6 +86,8 @@ typedef struct SwsContext { int lumYInc, chrYInc; enum PixelFormat dstFormat; ///< Destination pixel format. enum PixelFormat srcFormat; ///< Source pixel format. + int dstFormatBpp; ///< Number of bits per pixel of the destination pixel format. + int srcFormatBpp; ///< Number of bits per pixel of the source pixel format. int chrSrcHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in source image. int chrSrcVSubSample; ///< Binary logarithm of vertical subsampling factor between luma/alpha and chroma planes in source image. int chrDstHSubSample; ///< Binary logarithm of horizontal subsampling factor between luma/alpha and chroma planes in destination image. @@ -417,44 +419,6 @@ const char *sws_format_name(enum PixelFormat format); || (x)==PIX_FMT_YUVA420P \ ) -static inline int fmt_depth(enum PixelFormat fmt) -{ - switch(fmt) { - case PIX_FMT_RGB48BE: - case PIX_FMT_RGB48LE: - return 48; - case PIX_FMT_BGRA: - case PIX_FMT_ABGR: - case PIX_FMT_RGBA: - case PIX_FMT_ARGB: - return 32; - case PIX_FMT_BGR24: - case PIX_FMT_RGB24: - return 24; - case PIX_FMT_BGR565: - case PIX_FMT_RGB565: - case PIX_FMT_GRAY16BE: - case PIX_FMT_GRAY16LE: - return 16; - case PIX_FMT_BGR555: - case PIX_FMT_RGB555: - return 15; - case PIX_FMT_BGR8: - case PIX_FMT_RGB8: - return 8; - case PIX_FMT_BGR4: - case PIX_FMT_RGB4: - case PIX_FMT_BGR4_BYTE: - case PIX_FMT_RGB4_BYTE: - return 4; - case PIX_FMT_MONOBLACK: - case PIX_FMT_MONOWHITE: - return 1; - default: - return 0; - } -} - extern const uint64_t ff_dither4[2]; extern const uint64_t ff_dither8[2]; diff --git a/libswscale/utils.c b/libswscale/utils.c index b2347087b2..512b23f043 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -854,6 +854,8 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, c->flags= flags; c->dstFormat= dstFormat; c->srcFormat= srcFormat; + c->dstFormatBpp = av_get_bits_per_pixel(&av_pix_fmt_descriptors[dstFormat]); + c->srcFormatBpp = av_get_bits_per_pixel(&av_pix_fmt_descriptors[srcFormat]); c->vRounder= 4* 0x0001000100010001ULL; usesHFilter= usesVFilter= 0; diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c index 3f81d0f102..3c7bb3fd9f 100644 --- a/libswscale/yuv2rgb.c +++ b/libswscale/yuv2rgb.c @@ -595,7 +595,7 @@ av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int || c->dstFormat==PIX_FMT_RGB4 || c->dstFormat==PIX_FMT_RGB4_BYTE || c->dstFormat==PIX_FMT_MONOBLACK; - const int bpp = fmt_depth(c->dstFormat); + const int bpp = c->dstFormatBpp; uint8_t *y_table; uint16_t *y_table16; uint32_t *y_table32; -- cgit v1.2.3