mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-11-01 04:53:04 +08:00 
			
		
		
		
	swscale: Add support for unscaled 8-bit Packed RGB -> Planar RGB
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
This commit is contained in:
		| @@ -488,6 +488,80 @@ static int planarRgbToRgbWrapper(SwsContext *c, const uint8_t *src[], | |||||||
|     return srcSliceH; |     return srcSliceH; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void packedtogbr24p(const uint8_t *src, int srcStride, | ||||||
|  |                            uint8_t *dst[], int dstStride[], int srcSliceH, | ||||||
|  |                            int alpha_first, int inc_size, int width) | ||||||
|  | { | ||||||
|  |     uint8_t *dest[3]; | ||||||
|  |     int x, h; | ||||||
|  |  | ||||||
|  |     dest[0] = dst[0]; | ||||||
|  |     dest[1] = dst[1]; | ||||||
|  |     dest[2] = dst[2]; | ||||||
|  |  | ||||||
|  |     if (alpha_first) | ||||||
|  |         src++; | ||||||
|  |  | ||||||
|  |     for (h = 0; h < srcSliceH; h++) { | ||||||
|  |         for (x = 0; x < width; x++) { | ||||||
|  |             dest[0][x] = src[0]; | ||||||
|  |             dest[1][x] = src[1]; | ||||||
|  |             dest[2][x] = src[2]; | ||||||
|  |  | ||||||
|  |             src += inc_size; | ||||||
|  |         } | ||||||
|  |         src     += srcStride - width * inc_size; | ||||||
|  |         dest[0] += dstStride[0]; | ||||||
|  |         dest[1] += dstStride[1]; | ||||||
|  |         dest[2] += dstStride[2]; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int rgbToPlanarRgbWrapper(SwsContext *c, const uint8_t *src[], | ||||||
|  |                                  int srcStride[], int srcSliceY, int srcSliceH, | ||||||
|  |                                  uint8_t *dst[], int dstStride[]) | ||||||
|  | { | ||||||
|  |     int alpha_first = 0; | ||||||
|  |     int stride102[] = { dstStride[1], dstStride[0], dstStride[2] }; | ||||||
|  |     int stride201[] = { dstStride[2], dstStride[0], dstStride[1] }; | ||||||
|  |     uint8_t *dst102[] = { dst[1] + srcSliceY * dstStride[1], | ||||||
|  |                           dst[0] + srcSliceY * dstStride[0], | ||||||
|  |                           dst[2] + srcSliceY * dstStride[2] }; | ||||||
|  |     uint8_t *dst201[] = { dst[2] + srcSliceY * dstStride[2], | ||||||
|  |                           dst[0] + srcSliceY * dstStride[0], | ||||||
|  |                           dst[1] + srcSliceY * dstStride[1] }; | ||||||
|  |  | ||||||
|  |     switch (c->srcFormat) { | ||||||
|  |     case PIX_FMT_RGB24: | ||||||
|  |         packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst201, | ||||||
|  |                        stride201, srcSliceH, alpha_first, 3, c->srcW); | ||||||
|  |         break; | ||||||
|  |     case PIX_FMT_BGR24: | ||||||
|  |         packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst102, | ||||||
|  |                        stride102, srcSliceH, alpha_first, 3, c->srcW); | ||||||
|  |         break; | ||||||
|  |     case PIX_FMT_ARGB: | ||||||
|  |         alpha_first = 1; | ||||||
|  |     case PIX_FMT_RGBA: | ||||||
|  |         packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst201, | ||||||
|  |                        stride201, srcSliceH, alpha_first, 4, c->srcW); | ||||||
|  |         break; | ||||||
|  |     case PIX_FMT_ABGR: | ||||||
|  |         alpha_first = 1; | ||||||
|  |     case PIX_FMT_BGRA: | ||||||
|  |         packedtogbr24p((const uint8_t *) src[0], srcStride[0], dst102, | ||||||
|  |                        stride102, srcSliceH, alpha_first, 4, c->srcW); | ||||||
|  |         break; | ||||||
|  |     default: | ||||||
|  |         av_log(c, AV_LOG_ERROR, | ||||||
|  |                "unsupported planar RGB conversion %s -> %s\n", | ||||||
|  |                av_get_pix_fmt_name(c->srcFormat), | ||||||
|  |                av_get_pix_fmt_name(c->dstFormat)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return srcSliceH; | ||||||
|  | } | ||||||
|  |  | ||||||
| #define isRGBA32(x) (            \ | #define isRGBA32(x) (            \ | ||||||
|            (x) == AV_PIX_FMT_ARGB   \ |            (x) == AV_PIX_FMT_ARGB   \ | ||||||
|         || (x) == AV_PIX_FMT_RGBA   \ |         || (x) == AV_PIX_FMT_RGBA   \ | ||||||
| @@ -971,6 +1045,10 @@ void ff_get_unscaled_swscale(SwsContext *c) | |||||||
|     if (srcFormat == AV_PIX_FMT_GBRP && isPlanar(srcFormat) && isByteRGB(dstFormat)) |     if (srcFormat == AV_PIX_FMT_GBRP && isPlanar(srcFormat) && isByteRGB(dstFormat)) | ||||||
|         c->swScale = planarRgbToRgbWrapper; |         c->swScale = planarRgbToRgbWrapper; | ||||||
|  |  | ||||||
|  |     if (av_pix_fmt_desc_get(srcFormat)->comp[0].depth_minus1 == 7 && | ||||||
|  |         isPackedRGB(srcFormat) && dstFormat == AV_PIX_FMT_GBRP) | ||||||
|  |         c->swScale = rgbToPlanarRgbWrapper; | ||||||
|  |  | ||||||
|     /* bswap 16 bits per pixel/component packed formats */ |     /* bswap 16 bits per pixel/component packed formats */ | ||||||
|     if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR444) || |     if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR444) || | ||||||
|         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR48)  || |         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_BGR48)  || | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Derek Buitenhuis
					Derek Buitenhuis