mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-30 20:16:42 +08:00 
			
		
		
		
	sws: factor out updating the palette
This commit is contained in:
		| @@ -736,6 +736,81 @@ static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst, | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void update_palette(SwsContext *c, const uint32_t *pal) | ||||||
|  | { | ||||||
|  |         for (int i = 0; i < 256; i++) { | ||||||
|  |             int r, g, b, y, u, v, a = 0xff; | ||||||
|  |             if (c->srcFormat == AV_PIX_FMT_PAL8) { | ||||||
|  |                 uint32_t p = pal[i]; | ||||||
|  |                 a = (p >> 24) & 0xFF; | ||||||
|  |                 r = (p >> 16) & 0xFF; | ||||||
|  |                 g = (p >>  8) & 0xFF; | ||||||
|  |                 b =  p        & 0xFF; | ||||||
|  |             } else if (c->srcFormat == AV_PIX_FMT_RGB8) { | ||||||
|  |                 r = ( i >> 5     ) * 36; | ||||||
|  |                 g = ((i >> 2) & 7) * 36; | ||||||
|  |                 b = ( i       & 3) * 85; | ||||||
|  |             } else if (c->srcFormat == AV_PIX_FMT_BGR8) { | ||||||
|  |                 b = ( i >> 6     ) * 85; | ||||||
|  |                 g = ((i >> 3) & 7) * 36; | ||||||
|  |                 r = ( i       & 7) * 36; | ||||||
|  |             } else if (c->srcFormat == AV_PIX_FMT_RGB4_BYTE) { | ||||||
|  |                 r = ( i >> 3     ) * 255; | ||||||
|  |                 g = ((i >> 1) & 3) * 85; | ||||||
|  |                 b = ( i       & 1) * 255; | ||||||
|  |             } else if (c->srcFormat == AV_PIX_FMT_GRAY8 || c->srcFormat == AV_PIX_FMT_GRAY8A) { | ||||||
|  |                 r = g = b = i; | ||||||
|  |             } else { | ||||||
|  |                 av_assert1(c->srcFormat == AV_PIX_FMT_BGR4_BYTE); | ||||||
|  |                 b = ( i >> 3     ) * 255; | ||||||
|  |                 g = ((i >> 1) & 3) * 85; | ||||||
|  |                 r = ( i       & 1) * 255; | ||||||
|  |             } | ||||||
|  | #define RGB2YUV_SHIFT 15 | ||||||
|  | #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  | #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) | ||||||
|  |  | ||||||
|  |             y = av_clip_uint8((RY * r + GY * g + BY * b + ( 33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); | ||||||
|  |             u = av_clip_uint8((RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); | ||||||
|  |             v = av_clip_uint8((RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); | ||||||
|  |             c->pal_yuv[i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24); | ||||||
|  |  | ||||||
|  |             switch (c->dstFormat) { | ||||||
|  |             case AV_PIX_FMT_BGR32: | ||||||
|  | #if !HAVE_BIGENDIAN | ||||||
|  |             case AV_PIX_FMT_RGB24: | ||||||
|  | #endif | ||||||
|  |                 c->pal_rgb[i]=  r + (g<<8) + (b<<16) + ((unsigned)a<<24); | ||||||
|  |                 break; | ||||||
|  |             case AV_PIX_FMT_BGR32_1: | ||||||
|  | #if HAVE_BIGENDIAN | ||||||
|  |             case AV_PIX_FMT_BGR24: | ||||||
|  | #endif | ||||||
|  |                 c->pal_rgb[i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24); | ||||||
|  |                 break; | ||||||
|  |             case AV_PIX_FMT_RGB32_1: | ||||||
|  | #if HAVE_BIGENDIAN | ||||||
|  |             case AV_PIX_FMT_RGB24: | ||||||
|  | #endif | ||||||
|  |                 c->pal_rgb[i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24); | ||||||
|  |                 break; | ||||||
|  |             case AV_PIX_FMT_RGB32: | ||||||
|  | #if !HAVE_BIGENDIAN | ||||||
|  |             case AV_PIX_FMT_BGR24: | ||||||
|  | #endif | ||||||
|  |             default: | ||||||
|  |                 c->pal_rgb[i]=  b + (g<<8) + (r<<16) + ((unsigned)a<<24); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * swscale wrapper, so we don't need to export the SwsContext. |  * swscale wrapper, so we don't need to export the SwsContext. | ||||||
|  * Assumes planar YUV to be in YUV order instead of YVU. |  * Assumes planar YUV to be in YUV order instead of YVU. | ||||||
| @@ -833,79 +908,8 @@ int attribute_align_arg sws_scale(struct SwsContext *c, | |||||||
|         if (srcSliceY == 0) c->sliceDir = 1; else c->sliceDir = -1; |         if (srcSliceY == 0) c->sliceDir = 1; else c->sliceDir = -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (usePal(c->srcFormat)) { |     if (usePal(c->srcFormat)) | ||||||
|         for (i = 0; i < 256; i++) { |         update_palette(c, (const uint32_t *)srcSlice[1]); | ||||||
|             int r, g, b, y, u, v, a = 0xff; |  | ||||||
|             if (c->srcFormat == AV_PIX_FMT_PAL8) { |  | ||||||
|                 uint32_t p = ((const uint32_t *)(srcSlice[1]))[i]; |  | ||||||
|                 a = (p >> 24) & 0xFF; |  | ||||||
|                 r = (p >> 16) & 0xFF; |  | ||||||
|                 g = (p >>  8) & 0xFF; |  | ||||||
|                 b =  p        & 0xFF; |  | ||||||
|             } else if (c->srcFormat == AV_PIX_FMT_RGB8) { |  | ||||||
|                 r = ( i >> 5     ) * 36; |  | ||||||
|                 g = ((i >> 2) & 7) * 36; |  | ||||||
|                 b = ( i       & 3) * 85; |  | ||||||
|             } else if (c->srcFormat == AV_PIX_FMT_BGR8) { |  | ||||||
|                 b = ( i >> 6     ) * 85; |  | ||||||
|                 g = ((i >> 3) & 7) * 36; |  | ||||||
|                 r = ( i       & 7) * 36; |  | ||||||
|             } else if (c->srcFormat == AV_PIX_FMT_RGB4_BYTE) { |  | ||||||
|                 r = ( i >> 3     ) * 255; |  | ||||||
|                 g = ((i >> 1) & 3) * 85; |  | ||||||
|                 b = ( i       & 1) * 255; |  | ||||||
|             } else if (c->srcFormat == AV_PIX_FMT_GRAY8 || c->srcFormat == AV_PIX_FMT_GRAY8A) { |  | ||||||
|                 r = g = b = i; |  | ||||||
|             } else { |  | ||||||
|                 av_assert1(c->srcFormat == AV_PIX_FMT_BGR4_BYTE); |  | ||||||
|                 b = ( i >> 3     ) * 255; |  | ||||||
|                 g = ((i >> 1) & 3) * 85; |  | ||||||
|                 r = ( i       & 1) * 255; |  | ||||||
|             } |  | ||||||
| #define RGB2YUV_SHIFT 15 |  | ||||||
| #define BY ( (int) (0.114 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define BV (-(int) (0.081 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define BU ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define GY ( (int) (0.587 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define GV (-(int) (0.419 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define GU (-(int) (0.331 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define RY ( (int) (0.299 * 219 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define RV ( (int) (0.500 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
| #define RU (-(int) (0.169 * 224 / 255 * (1 << RGB2YUV_SHIFT) + 0.5)) |  | ||||||
|  |  | ||||||
|             y = av_clip_uint8((RY * r + GY * g + BY * b + ( 33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); |  | ||||||
|             u = av_clip_uint8((RU * r + GU * g + BU * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); |  | ||||||
|             v = av_clip_uint8((RV * r + GV * g + BV * b + (257 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT); |  | ||||||
|             c->pal_yuv[i]= y + (u<<8) + (v<<16) + ((unsigned)a<<24); |  | ||||||
|  |  | ||||||
|             switch (c->dstFormat) { |  | ||||||
|             case AV_PIX_FMT_BGR32: |  | ||||||
| #if !HAVE_BIGENDIAN |  | ||||||
|             case AV_PIX_FMT_RGB24: |  | ||||||
| #endif |  | ||||||
|                 c->pal_rgb[i]=  r + (g<<8) + (b<<16) + ((unsigned)a<<24); |  | ||||||
|                 break; |  | ||||||
|             case AV_PIX_FMT_BGR32_1: |  | ||||||
| #if HAVE_BIGENDIAN |  | ||||||
|             case AV_PIX_FMT_BGR24: |  | ||||||
| #endif |  | ||||||
|                 c->pal_rgb[i]= a + (r<<8) + (g<<16) + ((unsigned)b<<24); |  | ||||||
|                 break; |  | ||||||
|             case AV_PIX_FMT_RGB32_1: |  | ||||||
| #if HAVE_BIGENDIAN |  | ||||||
|             case AV_PIX_FMT_RGB24: |  | ||||||
| #endif |  | ||||||
|                 c->pal_rgb[i]= a + (b<<8) + (g<<16) + ((unsigned)r<<24); |  | ||||||
|                 break; |  | ||||||
|             case AV_PIX_FMT_RGB32: |  | ||||||
| #if !HAVE_BIGENDIAN |  | ||||||
|             case AV_PIX_FMT_BGR24: |  | ||||||
| #endif |  | ||||||
|             default: |  | ||||||
|                 c->pal_rgb[i]=  b + (g<<8) + (r<<16) + ((unsigned)a<<24); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (c->src0Alpha && !c->dst0Alpha && isALPHA(c->dstFormat)) { |     if (c->src0Alpha && !c->dst0Alpha && isALPHA(c->dstFormat)) { | ||||||
|         uint8_t *base; |         uint8_t *base; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Anton Khirnov
					Anton Khirnov