1*4882a593SmuzhiyunFrom b276d982a27c421495582b120b0215ad578b7367 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Mon, 4 Nov 2019 11:11:59 +0800 4*4882a593SmuzhiyunSubject: [PATCH 2/6] Support PIXMAN_nv12 format 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 7*4882a593Smuzhiyun--- 8*4882a593Smuzhiyun pixman/pixman-access.c | 86 ++++++++++++++++++++++++++++++++++++++++++ 9*4882a593Smuzhiyun pixman/pixman.c | 3 +- 10*4882a593Smuzhiyun pixman/pixman.h | 6 ++- 11*4882a593Smuzhiyun 3 files changed, 93 insertions(+), 2 deletions(-) 12*4882a593Smuzhiyun 13*4882a593Smuzhiyundiff --git a/pixman/pixman-access.c b/pixman/pixman-access.c 14*4882a593Smuzhiyunindex 7c5ce78..1e5c0ba 100644 15*4882a593Smuzhiyun--- a/pixman/pixman-access.c 16*4882a593Smuzhiyun+++ b/pixman/pixman-access.c 17*4882a593Smuzhiyun@@ -192,6 +192,25 @@ 18*4882a593Smuzhiyun ((uint8_t *) ((bits) + offset0 + \ 19*4882a593Smuzhiyun ((stride) >> 1) * ((line) >> 1))) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun+/* 22*4882a593Smuzhiyun+ * NV12 setup and access macros 23*4882a593Smuzhiyun+ */ 24*4882a593Smuzhiyun+ 25*4882a593Smuzhiyun+#define NV12_SETUP(image) \ 26*4882a593Smuzhiyun+ bits_image_t *__bits_image = (bits_image_t *)image; \ 27*4882a593Smuzhiyun+ uint32_t *bits = __bits_image->bits; \ 28*4882a593Smuzhiyun+ int stride = __bits_image->rowstride; \ 29*4882a593Smuzhiyun+ int offset0 = stride < 0 ? \ 30*4882a593Smuzhiyun+ (-stride) * ((__bits_image->height - 1) >> 1) - stride : \ 31*4882a593Smuzhiyun+ stride * __bits_image->height 32*4882a593Smuzhiyun+ 33*4882a593Smuzhiyun+#define NV12_Y(line) \ 34*4882a593Smuzhiyun+ ((uint8_t *) ((bits) + (stride) * (line))) 35*4882a593Smuzhiyun+ 36*4882a593Smuzhiyun+#define NV12_UV(line) \ 37*4882a593Smuzhiyun+ ((uint8_t *) ((bits) + offset0 + \ 38*4882a593Smuzhiyun+ (stride) * ((line) >> 1))) 39*4882a593Smuzhiyun+ 40*4882a593Smuzhiyun /* Misc. helpers */ 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun static force_inline void 43*4882a593Smuzhiyun@@ -845,6 +864,42 @@ fetch_scanline_yv12 (bits_image_t *image, 44*4882a593Smuzhiyun } 45*4882a593Smuzhiyun } 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun+static void 48*4882a593Smuzhiyun+fetch_scanline_nv12 (bits_image_t *image, 49*4882a593Smuzhiyun+ int x, 50*4882a593Smuzhiyun+ int line, 51*4882a593Smuzhiyun+ int width, 52*4882a593Smuzhiyun+ uint32_t * buffer, 53*4882a593Smuzhiyun+ const uint32_t *mask) 54*4882a593Smuzhiyun+{ 55*4882a593Smuzhiyun+ NV12_SETUP (image); 56*4882a593Smuzhiyun+ uint8_t *y_line = NV12_Y (line); 57*4882a593Smuzhiyun+ uint8_t *uv_line = NV12_UV (line); 58*4882a593Smuzhiyun+ int i; 59*4882a593Smuzhiyun+ 60*4882a593Smuzhiyun+ for (i = 0; i < width; i++) 61*4882a593Smuzhiyun+ { 62*4882a593Smuzhiyun+ int16_t y, u, v; 63*4882a593Smuzhiyun+ int32_t r, g, b; 64*4882a593Smuzhiyun+ 65*4882a593Smuzhiyun+ y = y_line[x + i] - 16; 66*4882a593Smuzhiyun+ u = uv_line[(x + i) & -2] - 128; 67*4882a593Smuzhiyun+ v = uv_line[((x + i) & -2) + 1] - 128; 68*4882a593Smuzhiyun+ 69*4882a593Smuzhiyun+ /* R = 1.164(Y - 16) + 1.596(V - 128) */ 70*4882a593Smuzhiyun+ r = 0x012b27 * y + 0x019a2e * v; 71*4882a593Smuzhiyun+ /* G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) */ 72*4882a593Smuzhiyun+ g = 0x012b27 * y - 0x00d0f2 * v - 0x00647e * u; 73*4882a593Smuzhiyun+ /* B = 1.164(Y - 16) + 2.018(U - 128) */ 74*4882a593Smuzhiyun+ b = 0x012b27 * y + 0x0206a2 * u; 75*4882a593Smuzhiyun+ 76*4882a593Smuzhiyun+ *buffer++ = 0xff000000 | 77*4882a593Smuzhiyun+ (r >= 0 ? r < 0x1000000 ? r & 0xff0000 : 0xff0000 : 0) | 78*4882a593Smuzhiyun+ (g >= 0 ? g < 0x1000000 ? (g >> 8) & 0x00ff00 : 0x00ff00 : 0) | 79*4882a593Smuzhiyun+ (b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0); 80*4882a593Smuzhiyun+ } 81*4882a593Smuzhiyun+} 82*4882a593Smuzhiyun+ 83*4882a593Smuzhiyun /**************************** Pixel wise fetching *****************************/ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #ifndef PIXMAN_FB_ACCESSORS 86*4882a593Smuzhiyun@@ -1036,6 +1091,32 @@ fetch_pixel_yv12 (bits_image_t *image, 87*4882a593Smuzhiyun (b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0); 88*4882a593Smuzhiyun } 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun+static uint32_t 91*4882a593Smuzhiyun+fetch_pixel_nv12 (bits_image_t *image, 92*4882a593Smuzhiyun+ int offset, 93*4882a593Smuzhiyun+ int line) 94*4882a593Smuzhiyun+{ 95*4882a593Smuzhiyun+ NV12_SETUP (image); 96*4882a593Smuzhiyun+ int16_t y = NV12_Y (line)[offset] - 16; 97*4882a593Smuzhiyun+ int16_t u = NV12_UV (line)[offset & -2] - 128; 98*4882a593Smuzhiyun+ int16_t v = NV12_UV (line)[(offset & -2) + 1] - 128; 99*4882a593Smuzhiyun+ int32_t r, g, b; 100*4882a593Smuzhiyun+ 101*4882a593Smuzhiyun+ /* R = 1.164(Y - 16) + 1.596(V - 128) */ 102*4882a593Smuzhiyun+ r = 0x012b27 * y + 0x019a2e * v; 103*4882a593Smuzhiyun+ 104*4882a593Smuzhiyun+ /* G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) */ 105*4882a593Smuzhiyun+ g = 0x012b27 * y - 0x00d0f2 * v - 0x00647e * u; 106*4882a593Smuzhiyun+ 107*4882a593Smuzhiyun+ /* B = 1.164(Y - 16) + 2.018(U - 128) */ 108*4882a593Smuzhiyun+ b = 0x012b27 * y + 0x0206a2 * u; 109*4882a593Smuzhiyun+ 110*4882a593Smuzhiyun+ return 0xff000000 | 111*4882a593Smuzhiyun+ (r >= 0 ? r < 0x1000000 ? r & 0xff0000 : 0xff0000 : 0) | 112*4882a593Smuzhiyun+ (g >= 0 ? g < 0x1000000 ? (g >> 8) & 0x00ff00 : 0x00ff00 : 0) | 113*4882a593Smuzhiyun+ (b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0); 114*4882a593Smuzhiyun+} 115*4882a593Smuzhiyun+ 116*4882a593Smuzhiyun /*********************************** Store ************************************/ 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #ifndef PIXMAN_FB_ACCESSORS 119*4882a593Smuzhiyun@@ -1509,6 +1590,11 @@ static const format_info_t accessors[] = 120*4882a593Smuzhiyun fetch_pixel_yv12, fetch_pixel_generic_float, 121*4882a593Smuzhiyun NULL, NULL }, 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun+ { PIXMAN_nv12, 124*4882a593Smuzhiyun+ fetch_scanline_nv12, fetch_scanline_generic_float, 125*4882a593Smuzhiyun+ fetch_pixel_nv12, fetch_pixel_generic_float, 126*4882a593Smuzhiyun+ NULL, NULL }, 127*4882a593Smuzhiyun+ 128*4882a593Smuzhiyun { PIXMAN_null }, 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyundiff --git a/pixman/pixman.c b/pixman/pixman.c 132*4882a593Smuzhiyunindex c09b528..d8a2d24 100644 133*4882a593Smuzhiyun--- a/pixman/pixman.c 134*4882a593Smuzhiyun+++ b/pixman/pixman.c 135*4882a593Smuzhiyun@@ -1070,6 +1070,7 @@ pixman_format_supported_source (pixman_format_code_t format) 136*4882a593Smuzhiyun /* YUV formats */ 137*4882a593Smuzhiyun case PIXMAN_yuy2: 138*4882a593Smuzhiyun case PIXMAN_yv12: 139*4882a593Smuzhiyun+ case PIXMAN_nv12: 140*4882a593Smuzhiyun return TRUE; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun default: 143*4882a593Smuzhiyun@@ -1092,7 +1093,7 @@ PIXMAN_EXPORT pixman_bool_t 144*4882a593Smuzhiyun pixman_format_supported_destination (pixman_format_code_t format) 145*4882a593Smuzhiyun { 146*4882a593Smuzhiyun /* YUV formats cannot be written to at the moment */ 147*4882a593Smuzhiyun- if (format == PIXMAN_yuy2 || format == PIXMAN_yv12) 148*4882a593Smuzhiyun+ if (format == PIXMAN_yuy2 || format == PIXMAN_yv12 || format == PIXMAN_nv12) 149*4882a593Smuzhiyun return FALSE; 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun return pixman_format_supported_source (format); 152*4882a593Smuzhiyundiff --git a/pixman/pixman.h b/pixman/pixman.h 153*4882a593Smuzhiyunindex 08303b5..3bb2fa5 100644 154*4882a593Smuzhiyun--- a/pixman/pixman.h 155*4882a593Smuzhiyun+++ b/pixman/pixman.h 156*4882a593Smuzhiyun@@ -861,6 +861,9 @@ struct pixman_indexed 157*4882a593Smuzhiyun #define PIXMAN_TYPE_ARGB_SRGB 10 158*4882a593Smuzhiyun #define PIXMAN_TYPE_RGBA_FLOAT 11 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun+/* HACK: Use maximum value to avoid conflict */ 161*4882a593Smuzhiyun+#define PIXMAN_TYPE_NV12 0x3f 162*4882a593Smuzhiyun+ 163*4882a593Smuzhiyun #define PIXMAN_FORMAT_COLOR(f) \ 164*4882a593Smuzhiyun (PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ARGB || \ 165*4882a593Smuzhiyun PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ABGR || \ 166*4882a593Smuzhiyun@@ -941,7 +944,8 @@ typedef enum { 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* YUV formats */ 169*4882a593Smuzhiyun PIXMAN_yuy2 = PIXMAN_FORMAT(16,PIXMAN_TYPE_YUY2,0,0,0,0), 170*4882a593Smuzhiyun- PIXMAN_yv12 = PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0) 171*4882a593Smuzhiyun+ PIXMAN_yv12 = PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0), 172*4882a593Smuzhiyun+ PIXMAN_nv12 = PIXMAN_FORMAT(12,PIXMAN_TYPE_NV12,0,0,0,0), 173*4882a593Smuzhiyun } pixman_format_code_t; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* Querying supported format values. */ 176*4882a593Smuzhiyun-- 177*4882a593Smuzhiyun2.20.1 178*4882a593Smuzhiyun 179