Add pixel formats for 9- and 10-bit yuv420p.
Also add support for these formats in libswscale. Needed for high bit depth h264 decoding. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
		
							parent
							
								
									af0b2d6736
								
							
						
					
					
						commit
						d4497f6dfb
					
				| @ -143,6 +143,10 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int l | |||||||
|     case PIX_FMT_YUVJ440P: |     case PIX_FMT_YUVJ440P: | ||||||
|     case PIX_FMT_YUVJ444P: |     case PIX_FMT_YUVJ444P: | ||||||
|     case PIX_FMT_YUVA420P: |     case PIX_FMT_YUVA420P: | ||||||
|  |     case PIX_FMT_YUV420P9LE: | ||||||
|  |     case PIX_FMT_YUV420P9BE: | ||||||
|  |     case PIX_FMT_YUV420P10LE: | ||||||
|  |     case PIX_FMT_YUV420P10BE: | ||||||
|         w_align= 16; //FIXME check for non mpeg style codecs and use less alignment
 |         w_align= 16; //FIXME check for non mpeg style codecs and use less alignment
 | ||||||
|         h_align= 16; |         h_align= 16; | ||||||
|         if(s->codec_id == CODEC_ID_MPEG2VIDEO || s->codec_id == CODEC_ID_MJPEG || s->codec_id == CODEC_ID_AMV || s->codec_id == CODEC_ID_THP || s->codec_id == CODEC_ID_H264) |         if(s->codec_id == CODEC_ID_MPEG2VIDEO || s->codec_id == CODEC_ID_MJPEG || s->codec_id == CODEC_ID_AMV || s->codec_id == CODEC_ID_THP || s->codec_id == CODEC_ID_H264) | ||||||
|  | |||||||
| @ -740,6 +740,52 @@ const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = { | |||||||
|         .log2_chroma_h = 1, |         .log2_chroma_h = 1, | ||||||
|         .flags = PIX_FMT_HWACCEL, |         .flags = PIX_FMT_HWACCEL, | ||||||
|     }, |     }, | ||||||
|  |     [PIX_FMT_YUV420P9LE] = { | ||||||
|  |         .name = "yuv420p9le", | ||||||
|  |         .nb_components= 3, | ||||||
|  |         .log2_chroma_w= 1, | ||||||
|  |         .log2_chroma_h= 1, | ||||||
|  |         .comp = { | ||||||
|  |             {0,1,1,0,8},        /* Y */ | ||||||
|  |             {1,1,1,0,8},        /* U */ | ||||||
|  |             {2,1,1,0,8},        /* V */ | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |     [PIX_FMT_YUV420P9BE] = { | ||||||
|  |         .name = "yuv420p9be", | ||||||
|  |         .nb_components= 3, | ||||||
|  |         .log2_chroma_w= 1, | ||||||
|  |         .log2_chroma_h= 1, | ||||||
|  |         .comp = { | ||||||
|  |             {0,1,1,0,8},        /* Y */ | ||||||
|  |             {1,1,1,0,8},        /* U */ | ||||||
|  |             {2,1,1,0,8},        /* V */ | ||||||
|  |         }, | ||||||
|  |         .flags = PIX_FMT_BE, | ||||||
|  |     }, | ||||||
|  |     [PIX_FMT_YUV420P10LE] = { | ||||||
|  |         .name = "yuv420p10le", | ||||||
|  |         .nb_components= 3, | ||||||
|  |         .log2_chroma_w= 1, | ||||||
|  |         .log2_chroma_h= 1, | ||||||
|  |         .comp = { | ||||||
|  |             {0,1,1,0,9},        /* Y */ | ||||||
|  |             {1,1,1,0,9},        /* U */ | ||||||
|  |             {2,1,1,0,9},        /* V */ | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  |     [PIX_FMT_YUV420P10BE] = { | ||||||
|  |         .name = "yuv420p10be", | ||||||
|  |         .nb_components= 3, | ||||||
|  |         .log2_chroma_w= 1, | ||||||
|  |         .log2_chroma_h= 1, | ||||||
|  |         .comp = { | ||||||
|  |             {0,1,1,0,9},        /* Y */ | ||||||
|  |             {1,1,1,0,9},        /* U */ | ||||||
|  |             {2,1,1,0,9},        /* V */ | ||||||
|  |         }, | ||||||
|  |         .flags = PIX_FMT_BE, | ||||||
|  |     }, | ||||||
|     [PIX_FMT_YUV420P16LE] = { |     [PIX_FMT_YUV420P16LE] = { | ||||||
|         .name = "yuv420p16le", |         .name = "yuv420p16le", | ||||||
|         .nb_components= 3, |         .nb_components= 3, | ||||||
|  | |||||||
| @ -135,6 +135,13 @@ enum PixelFormat { | |||||||
|     PIX_FMT_Y400A,     ///< 8bit gray, 8bit alpha
 |     PIX_FMT_Y400A,     ///< 8bit gray, 8bit alpha
 | ||||||
|     PIX_FMT_BGR48LE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
 |     PIX_FMT_BGR48LE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian
 | ||||||
|     PIX_FMT_BGR48BE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
 |     PIX_FMT_BGR48BE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian
 | ||||||
|  | 
 | ||||||
|  |     //the following 4 formats are deprecated and should be replaced by PIX_FMT_YUV420P16* with the bpp stored seperately
 | ||||||
|  |     PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
 | ||||||
|  |     PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
 | ||||||
|  |     PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
 | ||||||
|  |     PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
 | ||||||
|  | 
 | ||||||
|     PIX_FMT_NB,        ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
 |     PIX_FMT_NB,        ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -159,6 +166,8 @@ enum PixelFormat { | |||||||
| #define PIX_FMT_BGR555 PIX_FMT_NE(BGR555BE, BGR555LE) | #define PIX_FMT_BGR555 PIX_FMT_NE(BGR555BE, BGR555LE) | ||||||
| #define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE) | #define PIX_FMT_BGR444 PIX_FMT_NE(BGR444BE, BGR444LE) | ||||||
| 
 | 
 | ||||||
|  | #define PIX_FMT_YUV420P9  PIX_FMT_NE(YUV420P9BE , YUV420P9LE) | ||||||
|  | #define PIX_FMT_YUV420P10 PIX_FMT_NE(YUV420P10BE, YUV420P10LE) | ||||||
| #define PIX_FMT_YUV420P16 PIX_FMT_NE(YUV420P16BE, YUV420P16LE) | #define PIX_FMT_YUV420P16 PIX_FMT_NE(YUV420P16BE, YUV420P16LE) | ||||||
| #define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE) | #define PIX_FMT_YUV422P16 PIX_FMT_NE(YUV422P16BE, YUV422P16LE) | ||||||
| #define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE) | #define PIX_FMT_YUV444P16 PIX_FMT_NE(YUV444P16BE, YUV444P16LE) | ||||||
|  | |||||||
| @ -1747,7 +1747,28 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t* src[], int srcStride[ | |||||||
|                 length*=2; |                 length*=2; | ||||||
|             fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128); |             fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128); | ||||||
|         } else { |         } else { | ||||||
|             if(is16BPS(c->srcFormat) && !is16BPS(c->dstFormat)) { |             if(isNBPS(c->srcFormat)) { | ||||||
|  |                 const int depth = av_pix_fmt_descriptors[c->srcFormat].comp[plane].depth_minus1+1; | ||||||
|  |                 uint16_t *srcPtr2 = (uint16_t*)srcPtr; | ||||||
|  | 
 | ||||||
|  |                 if (is16BPS(c->dstFormat)) { | ||||||
|  |                     uint16_t *dstPtr2 = (uint16_t*)dstPtr; | ||||||
|  |                     for (i = 0; i < height; i++) { | ||||||
|  |                         for (j = 0; j < length; j++) | ||||||
|  |                             dstPtr2[j] = (srcPtr2[j]<<(16-depth)) | (srcPtr2[j]>>(2*depth-16)); | ||||||
|  |                         dstPtr2 += dstStride[plane]/2; | ||||||
|  |                         srcPtr2 += srcStride[plane]/2; | ||||||
|  |                     } | ||||||
|  |                 } else { | ||||||
|  |                     // FIXME Maybe dither instead.
 | ||||||
|  |                     for (i = 0; i < height; i++) { | ||||||
|  |                         for (j = 0; j < length; j++) | ||||||
|  |                             dstPtr[j] = srcPtr2[j]>>(depth-8); | ||||||
|  |                         dstPtr  += dstStride[plane]; | ||||||
|  |                         srcPtr2 += srcStride[plane]/2; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } else if(is16BPS(c->srcFormat) && !is16BPS(c->dstFormat)) { | ||||||
|                 if (!isBE(c->srcFormat)) srcPtr++; |                 if (!isBE(c->srcFormat)) srcPtr++; | ||||||
|                 for (i=0; i<height; i++) { |                 for (i=0; i<height; i++) { | ||||||
|                     for (j=0; j<length; j++) dstPtr[j] = srcPtr[j<<1]; |                     for (j=0; j<length; j++) dstPtr[j] = srcPtr[j<<1]; | ||||||
|  | |||||||
| @ -352,6 +352,12 @@ const char *sws_format_name(enum PixelFormat format); | |||||||
|         || (x)==PIX_FMT_YUV422P16BE \ |         || (x)==PIX_FMT_YUV422P16BE \ | ||||||
|         || (x)==PIX_FMT_YUV444P16BE \ |         || (x)==PIX_FMT_YUV444P16BE \ | ||||||
|     ) |     ) | ||||||
|  | #define isNBPS(x)       (           \ | ||||||
|  |            (x)==PIX_FMT_YUV420P9LE  \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P9BE  \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P10LE \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P10BE \ | ||||||
|  |     ) | ||||||
| #define isBE(x) ((x)&1) | #define isBE(x) ((x)&1) | ||||||
| #define isPlanar8YUV(x) (           \ | #define isPlanar8YUV(x) (           \ | ||||||
|            (x)==PIX_FMT_YUV410P     \ |            (x)==PIX_FMT_YUV410P     \ | ||||||
| @ -366,9 +372,13 @@ const char *sws_format_name(enum PixelFormat format); | |||||||
|     ) |     ) | ||||||
| #define isPlanarYUV(x)  (           \ | #define isPlanarYUV(x)  (           \ | ||||||
|         isPlanar8YUV(x)             \ |         isPlanar8YUV(x)             \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P9LE  \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P10LE \ | ||||||
|         || (x)==PIX_FMT_YUV420P16LE \ |         || (x)==PIX_FMT_YUV420P16LE \ | ||||||
|         || (x)==PIX_FMT_YUV422P16LE \ |         || (x)==PIX_FMT_YUV422P16LE \ | ||||||
|         || (x)==PIX_FMT_YUV444P16LE \ |         || (x)==PIX_FMT_YUV444P16LE \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P9BE  \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P10BE \ | ||||||
|         || (x)==PIX_FMT_YUV420P16BE \ |         || (x)==PIX_FMT_YUV420P16BE \ | ||||||
|         || (x)==PIX_FMT_YUV422P16BE \ |         || (x)==PIX_FMT_YUV422P16BE \ | ||||||
|         || (x)==PIX_FMT_YUV444P16BE \ |         || (x)==PIX_FMT_YUV444P16BE \ | ||||||
|  | |||||||
| @ -1826,6 +1826,29 @@ static inline void RENAME(nv21ToUV)(uint8_t *dstU, uint8_t *dstV, | |||||||
|     RENAME(nvXXtoUV)(dstV, dstU, src1, width); |     RENAME(nvXXtoUV)(dstV, dstU, src1, width); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // FIXME Maybe dither instead.
 | ||||||
|  | #define YUV_NBPS(depth) \ | ||||||
|  | static inline void RENAME(yuv ## depth ## ToUV)(uint8_t *dstU, uint8_t *dstV, \ | ||||||
|  |                                      const uint16_t *srcU, const uint16_t *srcV, \ | ||||||
|  |                                      long width, uint32_t *unused) \ | ||||||
|  | { \ | ||||||
|  |     int i; \ | ||||||
|  |     for (i = 0; i < width; i++) { \ | ||||||
|  |         dstU[i] = srcU[i]>>(depth-8); \ | ||||||
|  |         dstV[i] = srcV[i]>>(depth-8); \ | ||||||
|  |     } \ | ||||||
|  | } \ | ||||||
|  | \ | ||||||
|  | static inline void RENAME(yuv ## depth ## ToY)(uint8_t *dstY, const uint16_t *srcY, long width, uint32_t *unused) \ | ||||||
|  | { \ | ||||||
|  |     int i; \ | ||||||
|  |     for (i = 0; i < width; i++) \ | ||||||
|  |         dstY[i] = srcY[i]>>(depth-8); \ | ||||||
|  | } \ | ||||||
|  | 
 | ||||||
|  | YUV_NBPS( 9) | ||||||
|  | YUV_NBPS(10) | ||||||
|  | 
 | ||||||
| #if COMPILE_TEMPLATE_MMX | #if COMPILE_TEMPLATE_MMX | ||||||
| static inline void RENAME(bgr24ToY_mmx)(uint8_t *dst, const uint8_t *src, long width, enum PixelFormat srcFormat) | static inline void RENAME(bgr24ToY_mmx)(uint8_t *dst, const uint8_t *src, long width, enum PixelFormat srcFormat) | ||||||
| { | { | ||||||
| @ -2955,6 +2978,8 @@ static void RENAME(sws_init_swScale)(SwsContext *c) | |||||||
|         case PIX_FMT_PAL8     : |         case PIX_FMT_PAL8     : | ||||||
|         case PIX_FMT_BGR4_BYTE: |         case PIX_FMT_BGR4_BYTE: | ||||||
|         case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV; break; |         case PIX_FMT_RGB4_BYTE: c->chrToYV12 = palToUV; break; | ||||||
|  |         case PIX_FMT_YUV420P9 : c->chrToYV12 = (void*)RENAME(yuv9ToUV ); break; | ||||||
|  |         case PIX_FMT_YUV420P10: c->chrToYV12 = (void*)RENAME(yuv10ToUV); break; | ||||||
|         case PIX_FMT_YUV420P16BE: |         case PIX_FMT_YUV420P16BE: | ||||||
|         case PIX_FMT_YUV422P16BE: |         case PIX_FMT_YUV422P16BE: | ||||||
|         case PIX_FMT_YUV444P16BE: c->chrToYV12 = RENAME(BEToUV); break; |         case PIX_FMT_YUV444P16BE: c->chrToYV12 = RENAME(BEToUV); break; | ||||||
| @ -3001,6 +3026,8 @@ static void RENAME(sws_init_swScale)(SwsContext *c) | |||||||
|     c->lumToYV12 = NULL; |     c->lumToYV12 = NULL; | ||||||
|     c->alpToYV12 = NULL; |     c->alpToYV12 = NULL; | ||||||
|     switch (srcFormat) { |     switch (srcFormat) { | ||||||
|  |     case PIX_FMT_YUV420P9 : c->lumToYV12 = (void*)RENAME(yuv9ToY ); break; | ||||||
|  |     case PIX_FMT_YUV420P10: c->lumToYV12 = (void*)RENAME(yuv10ToY); break; | ||||||
|     case PIX_FMT_YUYV422  : |     case PIX_FMT_YUYV422  : | ||||||
|     case PIX_FMT_YUV420P16BE: |     case PIX_FMT_YUV420P16BE: | ||||||
|     case PIX_FMT_YUV422P16BE: |     case PIX_FMT_YUV422P16BE: | ||||||
|  | |||||||
| @ -112,6 +112,8 @@ const char *swscale_license(void) | |||||||
|         || (x)==PIX_FMT_YUV420P16BE   \ |         || (x)==PIX_FMT_YUV420P16BE   \ | ||||||
|         || (x)==PIX_FMT_YUV422P16BE   \ |         || (x)==PIX_FMT_YUV422P16BE   \ | ||||||
|         || (x)==PIX_FMT_YUV444P16BE   \ |         || (x)==PIX_FMT_YUV444P16BE   \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P9    \ | ||||||
|  |         || (x)==PIX_FMT_YUV420P10   \ | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| int sws_isSupportedInput(enum PixelFormat pix_fmt) | int sws_isSupportedInput(enum PixelFormat pix_fmt) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user