mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-30 12:06:40 +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. | ||||
|  * 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 (usePal(c->srcFormat)) { | ||||
|         for (i = 0; i < 256; i++) { | ||||
|             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 (usePal(c->srcFormat)) | ||||
|         update_palette(c, (const uint32_t *)srcSlice[1]); | ||||
|  | ||||
|     if (c->src0Alpha && !c->dst0Alpha && isALPHA(c->dstFormat)) { | ||||
|         uint8_t *base; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Anton Khirnov
					Anton Khirnov