|
@@ -0,0 +1,298 @@
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#include "yuv.h"
|
|
|
+#include "esp_attr.h"
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ int16_t vY;
|
|
|
+ int16_t vVr;
|
|
|
+ int16_t vVg;
|
|
|
+ int16_t vUg;
|
|
|
+ int16_t vUb;
|
|
|
+} yuv_table_row;
|
|
|
+
|
|
|
+static const yuv_table_row yuv_table[256] = {
|
|
|
+
|
|
|
+ { -18, -204, 50, 104, -258 },
|
|
|
+ { -17, -202, 49, 103, -256 },
|
|
|
+ { -16, -201, 49, 102, -254 },
|
|
|
+ { -15, -199, 48, 101, -252 },
|
|
|
+ { -13, -197, 48, 100, -250 },
|
|
|
+ { -12, -196, 48, 99, -248 },
|
|
|
+ { -11, -194, 47, 99, -246 },
|
|
|
+ { -10, -193, 47, 98, -244 },
|
|
|
+ { -9, -191, 46, 97, -242 },
|
|
|
+ { -8, -189, 46, 96, -240 },
|
|
|
+ { -6, -188, 46, 95, -238 },
|
|
|
+ { -5, -186, 45, 95, -236 },
|
|
|
+ { -4, -185, 45, 94, -234 },
|
|
|
+ { -3, -183, 44, 93, -232 },
|
|
|
+ { -2, -181, 44, 92, -230 },
|
|
|
+ { -1, -180, 44, 91, -228 },
|
|
|
+ { 0, -178, 43, 91, -226 },
|
|
|
+ { 1, -177, 43, 90, -223 },
|
|
|
+ { 2, -175, 43, 89, -221 },
|
|
|
+ { 3, -173, 42, 88, -219 },
|
|
|
+ { 4, -172, 42, 87, -217 },
|
|
|
+ { 5, -170, 41, 86, -215 },
|
|
|
+ { 6, -169, 41, 86, -213 },
|
|
|
+ { 8, -167, 41, 85, -211 },
|
|
|
+ { 9, -165, 40, 84, -209 },
|
|
|
+ { 10, -164, 40, 83, -207 },
|
|
|
+ { 11, -162, 39, 82, -205 },
|
|
|
+ { 12, -161, 39, 82, -203 },
|
|
|
+ { 13, -159, 39, 81, -201 },
|
|
|
+ { 15, -158, 38, 80, -199 },
|
|
|
+ { 16, -156, 38, 79, -197 },
|
|
|
+ { 17, -154, 37, 78, -195 },
|
|
|
+ { 18, -153, 37, 78, -193 },
|
|
|
+ { 19, -151, 37, 77, -191 },
|
|
|
+ { 20, -150, 36, 76, -189 },
|
|
|
+ { 22, -148, 36, 75, -187 },
|
|
|
+ { 23, -146, 35, 74, -185 },
|
|
|
+ { 24, -145, 35, 73, -183 },
|
|
|
+ { 25, -143, 35, 73, -181 },
|
|
|
+ { 26, -142, 34, 72, -179 },
|
|
|
+ { 27, -140, 34, 71, -177 },
|
|
|
+ { 29, -138, 34, 70, -175 },
|
|
|
+ { 30, -137, 33, 69, -173 },
|
|
|
+ { 31, -135, 33, 69, -171 },
|
|
|
+ { 32, -134, 32, 68, -169 },
|
|
|
+ { 33, -132, 32, 67, -167 },
|
|
|
+ { 34, -130, 32, 66, -165 },
|
|
|
+ { 36, -129, 31, 65, -163 },
|
|
|
+ { 37, -127, 31, 65, -161 },
|
|
|
+ { 38, -126, 30, 64, -159 },
|
|
|
+ { 39, -124, 30, 63, -157 },
|
|
|
+ { 40, -122, 30, 62, -155 },
|
|
|
+ { 41, -121, 29, 61, -153 },
|
|
|
+ { 43, -119, 29, 60, -151 },
|
|
|
+ { 44, -118, 28, 60, -149 },
|
|
|
+ { 45, -116, 28, 59, -147 },
|
|
|
+ { 46, -114, 28, 58, -145 },
|
|
|
+ { 47, -113, 27, 57, -143 },
|
|
|
+ { 48, -111, 27, 56, -141 },
|
|
|
+ { 50, -110, 26, 56, -139 },
|
|
|
+ { 51, -108, 26, 55, -137 },
|
|
|
+ { 52, -106, 26, 54, -135 },
|
|
|
+ { 53, -105, 25, 53, -133 },
|
|
|
+ { 54, -103, 25, 52, -131 },
|
|
|
+ { 55, -102, 25, 52, -129 },
|
|
|
+ { 57, -100, 24, 51, -127 },
|
|
|
+ { 58, -98, 24, 50, -125 },
|
|
|
+ { 59, -97, 23, 49, -123 },
|
|
|
+ { 60, -95, 23, 48, -121 },
|
|
|
+ { 61, -94, 23, 47, -119 },
|
|
|
+ { 62, -92, 22, 47, -117 },
|
|
|
+ { 64, -90, 22, 46, -115 },
|
|
|
+ { 65, -89, 21, 45, -113 },
|
|
|
+ { 66, -87, 21, 44, -110 },
|
|
|
+ { 67, -86, 21, 43, -108 },
|
|
|
+ { 68, -84, 20, 43, -106 },
|
|
|
+ { 69, -82, 20, 42, -104 },
|
|
|
+ { 71, -81, 19, 41, -102 },
|
|
|
+ { 72, -79, 19, 40, -100 },
|
|
|
+ { 73, -78, 19, 39, -98 },
|
|
|
+ { 74, -76, 18, 39, -96 },
|
|
|
+ { 75, -75, 18, 38, -94 },
|
|
|
+ { 76, -73, 17, 37, -92 },
|
|
|
+ { 77, -71, 17, 36, -90 },
|
|
|
+ { 79, -70, 17, 35, -88 },
|
|
|
+ { 80, -68, 16, 34, -86 },
|
|
|
+ { 81, -67, 16, 34, -84 },
|
|
|
+ { 82, -65, 16, 33, -82 },
|
|
|
+ { 83, -63, 15, 32, -80 },
|
|
|
+ { 84, -62, 15, 31, -78 },
|
|
|
+ { 86, -60, 14, 30, -76 },
|
|
|
+ { 87, -59, 14, 30, -74 },
|
|
|
+ { 88, -57, 14, 29, -72 },
|
|
|
+ { 89, -55, 13, 28, -70 },
|
|
|
+ { 90, -54, 13, 27, -68 },
|
|
|
+ { 91, -52, 12, 26, -66 },
|
|
|
+ { 93, -51, 12, 26, -64 },
|
|
|
+ { 94, -49, 12, 25, -62 },
|
|
|
+ { 95, -47, 11, 24, -60 },
|
|
|
+ { 96, -46, 11, 23, -58 },
|
|
|
+ { 97, -44, 10, 22, -56 },
|
|
|
+ { 98, -43, 10, 21, -54 },
|
|
|
+ { 100, -41, 10, 21, -52 },
|
|
|
+ { 101, -39, 9, 20, -50 },
|
|
|
+ { 102, -38, 9, 19, -48 },
|
|
|
+ { 103, -36, 8, 18, -46 },
|
|
|
+ { 104, -35, 8, 17, -44 },
|
|
|
+ { 105, -33, 8, 17, -42 },
|
|
|
+ { 107, -31, 7, 16, -40 },
|
|
|
+ { 108, -30, 7, 15, -38 },
|
|
|
+ { 109, -28, 7, 14, -36 },
|
|
|
+ { 110, -27, 6, 13, -34 },
|
|
|
+ { 111, -25, 6, 13, -32 },
|
|
|
+ { 112, -23, 5, 12, -30 },
|
|
|
+ { 114, -22, 5, 11, -28 },
|
|
|
+ { 115, -20, 5, 10, -26 },
|
|
|
+ { 116, -19, 4, 9, -24 },
|
|
|
+ { 117, -17, 4, 8, -22 },
|
|
|
+ { 118, -15, 3, 8, -20 },
|
|
|
+ { 119, -14, 3, 7, -18 },
|
|
|
+ { 121, -12, 3, 6, -16 },
|
|
|
+ { 122, -11, 2, 5, -14 },
|
|
|
+ { 123, -9, 2, 4, -12 },
|
|
|
+ { 124, -7, 1, 4, -10 },
|
|
|
+ { 125, -6, 1, 3, -8 },
|
|
|
+ { 126, -4, 1, 2, -6 },
|
|
|
+ { 128, -3, 0, 1, -4 },
|
|
|
+ { 129, -1, 0, 0, -2 },
|
|
|
+ { 130, 0, 0, 0, 0 },
|
|
|
+ { 131, 1, 0, 0, 2 },
|
|
|
+ { 132, 3, 0, -1, 4 },
|
|
|
+ { 133, 4, -1, -2, 6 },
|
|
|
+ { 135, 6, -1, -3, 8 },
|
|
|
+ { 136, 7, -1, -4, 10 },
|
|
|
+ { 137, 9, -2, -4, 12 },
|
|
|
+ { 138, 11, -2, -5, 14 },
|
|
|
+ { 139, 12, -3, -6, 16 },
|
|
|
+ { 140, 14, -3, -7, 18 },
|
|
|
+ { 142, 15, -3, -8, 20 },
|
|
|
+ { 143, 17, -4, -8, 22 },
|
|
|
+ { 144, 19, -4, -9, 24 },
|
|
|
+ { 145, 20, -5, -10, 26 },
|
|
|
+ { 146, 22, -5, -11, 28 },
|
|
|
+ { 147, 23, -5, -12, 30 },
|
|
|
+ { 148, 25, -6, -13, 32 },
|
|
|
+ { 150, 27, -6, -13, 34 },
|
|
|
+ { 151, 28, -7, -14, 36 },
|
|
|
+ { 152, 30, -7, -15, 38 },
|
|
|
+ { 153, 31, -7, -16, 40 },
|
|
|
+ { 154, 33, -8, -17, 42 },
|
|
|
+ { 155, 35, -8, -17, 44 },
|
|
|
+ { 157, 36, -8, -18, 46 },
|
|
|
+ { 158, 38, -9, -19, 48 },
|
|
|
+ { 159, 39, -9, -20, 50 },
|
|
|
+ { 160, 41, -10, -21, 52 },
|
|
|
+ { 161, 43, -10, -21, 54 },
|
|
|
+ { 162, 44, -10, -22, 56 },
|
|
|
+ { 164, 46, -11, -23, 58 },
|
|
|
+ { 165, 47, -11, -24, 60 },
|
|
|
+ { 166, 49, -12, -25, 62 },
|
|
|
+ { 167, 51, -12, -26, 64 },
|
|
|
+ { 168, 52, -12, -26, 66 },
|
|
|
+ { 169, 54, -13, -27, 68 },
|
|
|
+ { 171, 55, -13, -28, 70 },
|
|
|
+ { 172, 57, -14, -29, 72 },
|
|
|
+ { 173, 59, -14, -30, 74 },
|
|
|
+ { 174, 60, -14, -30, 76 },
|
|
|
+ { 175, 62, -15, -31, 78 },
|
|
|
+ { 176, 63, -15, -32, 80 },
|
|
|
+ { 178, 65, -16, -33, 82 },
|
|
|
+ { 179, 67, -16, -34, 84 },
|
|
|
+ { 180, 68, -16, -34, 86 },
|
|
|
+ { 181, 70, -17, -35, 88 },
|
|
|
+ { 182, 71, -17, -36, 90 },
|
|
|
+ { 183, 73, -17, -37, 92 },
|
|
|
+ { 185, 75, -18, -38, 94 },
|
|
|
+ { 186, 76, -18, -39, 96 },
|
|
|
+ { 187, 78, -19, -39, 98 },
|
|
|
+ { 188, 79, -19, -40, 100 },
|
|
|
+ { 189, 81, -19, -41, 102 },
|
|
|
+ { 190, 82, -20, -42, 104 },
|
|
|
+ { 192, 84, -20, -43, 106 },
|
|
|
+ { 193, 86, -21, -43, 108 },
|
|
|
+ { 194, 87, -21, -44, 110 },
|
|
|
+ { 195, 89, -21, -45, 113 },
|
|
|
+ { 196, 90, -22, -46, 115 },
|
|
|
+ { 197, 92, -22, -47, 117 },
|
|
|
+ { 199, 94, -23, -47, 119 },
|
|
|
+ { 200, 95, -23, -48, 121 },
|
|
|
+ { 201, 97, -23, -49, 123 },
|
|
|
+ { 202, 98, -24, -50, 125 },
|
|
|
+ { 203, 100, -24, -51, 127 },
|
|
|
+ { 204, 102, -25, -52, 129 },
|
|
|
+ { 206, 103, -25, -52, 131 },
|
|
|
+ { 207, 105, -25, -53, 133 },
|
|
|
+ { 208, 106, -26, -54, 135 },
|
|
|
+ { 209, 108, -26, -55, 137 },
|
|
|
+ { 210, 110, -26, -56, 139 },
|
|
|
+ { 211, 111, -27, -56, 141 },
|
|
|
+ { 213, 113, -27, -57, 143 },
|
|
|
+ { 214, 114, -28, -58, 145 },
|
|
|
+ { 215, 116, -28, -59, 147 },
|
|
|
+ { 216, 118, -28, -60, 149 },
|
|
|
+ { 217, 119, -29, -60, 151 },
|
|
|
+ { 218, 121, -29, -61, 153 },
|
|
|
+ { 219, 122, -30, -62, 155 },
|
|
|
+ { 221, 124, -30, -63, 157 },
|
|
|
+ { 222, 126, -30, -64, 159 },
|
|
|
+ { 223, 127, -31, -65, 161 },
|
|
|
+ { 224, 129, -31, -65, 163 },
|
|
|
+ { 225, 130, -32, -66, 165 },
|
|
|
+ { 226, 132, -32, -67, 167 },
|
|
|
+ { 228, 134, -32, -68, 169 },
|
|
|
+ { 229, 135, -33, -69, 171 },
|
|
|
+ { 230, 137, -33, -69, 173 },
|
|
|
+ { 231, 138, -34, -70, 175 },
|
|
|
+ { 232, 140, -34, -71, 177 },
|
|
|
+ { 233, 142, -34, -72, 179 },
|
|
|
+ { 235, 143, -35, -73, 181 },
|
|
|
+ { 236, 145, -35, -73, 183 },
|
|
|
+ { 237, 146, -35, -74, 185 },
|
|
|
+ { 238, 148, -36, -75, 187 },
|
|
|
+ { 239, 150, -36, -76, 189 },
|
|
|
+ { 240, 151, -37, -77, 191 },
|
|
|
+ { 242, 153, -37, -78, 193 },
|
|
|
+ { 243, 154, -37, -78, 195 },
|
|
|
+ { 244, 156, -38, -79, 197 },
|
|
|
+ { 245, 158, -38, -80, 199 },
|
|
|
+ { 246, 159, -39, -81, 201 },
|
|
|
+ { 247, 161, -39, -82, 203 },
|
|
|
+ { 249, 162, -39, -82, 205 },
|
|
|
+ { 250, 164, -40, -83, 207 },
|
|
|
+ { 251, 165, -40, -84, 209 },
|
|
|
+ { 252, 167, -41, -85, 211 },
|
|
|
+ { 253, 169, -41, -86, 213 },
|
|
|
+ { 254, 170, -41, -86, 215 },
|
|
|
+ { 256, 172, -42, -87, 217 },
|
|
|
+ { 257, 173, -42, -88, 219 },
|
|
|
+ { 258, 175, -43, -89, 221 },
|
|
|
+ { 259, 177, -43, -90, 223 },
|
|
|
+ { 260, 178, -43, -91, 226 },
|
|
|
+ { 261, 180, -44, -91, 228 },
|
|
|
+ { 263, 181, -44, -92, 230 },
|
|
|
+ { 264, 183, -44, -93, 232 },
|
|
|
+ { 265, 185, -45, -94, 234 },
|
|
|
+ { 266, 186, -45, -95, 236 },
|
|
|
+ { 267, 188, -46, -95, 238 },
|
|
|
+ { 268, 189, -46, -96, 240 },
|
|
|
+ { 270, 191, -46, -97, 242 },
|
|
|
+ { 271, 193, -47, -98, 244 },
|
|
|
+ { 272, 194, -47, -99, 246 },
|
|
|
+ { 273, 196, -48, -99, 248 },
|
|
|
+ { 274, 197, -48, -100, 250 },
|
|
|
+ { 275, 199, -48, -101, 252 },
|
|
|
+ { 277, 201, -49, -102, 254 },
|
|
|
+ { 278, 202, -49, -103, 256 }
|
|
|
+};
|
|
|
+
|
|
|
+#define YUYV_CONSTRAIN(v) ((v)<0)?0:(((v)>255)?255:(v))
|
|
|
+
|
|
|
+void IRAM_ATTR yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b)
|
|
|
+{
|
|
|
+ int16_t ri, gi, bi;
|
|
|
+
|
|
|
+ ri = yuv_table[y].vY + yuv_table[v].vVr;
|
|
|
+ gi = yuv_table[y].vY + yuv_table[u].vUg + yuv_table[v].vVg;
|
|
|
+ bi = yuv_table[y].vY + yuv_table[u].vUb;
|
|
|
+
|
|
|
+ *r = YUYV_CONSTRAIN(ri);
|
|
|
+ *g = YUYV_CONSTRAIN(gi);
|
|
|
+ *b = YUYV_CONSTRAIN(bi);
|
|
|
+}
|