1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| /** 内存分布 w +--------------------+ |Y0Y1Y2Y3... | |... | h |... | | | +--------------------+ |U0V0U1V1 | |... | h |... | | | +--------------------+ w/2 UV交织为NV16,VU交织为NV61 可以与上一函数合并,但方便查看,还是不合并 */ void yuv422sp_to_rgb24(YUV_TYPE type, unsigned char* yuv422sp, unsigned char* rgb, int width, int height) { int y, cb, cr; int r, g, b; int i = 0; unsigned char* p_y; unsigned char* p_uv; unsigned char* p_rgb; p_y = yuv422sp; p_uv = p_y + width * height; // uv分量在Y后面 p_rgb = rgb; init_yuv422p_table(); for (i = 0; i < width * height / 2; i++) { y = p_y[0]; if (type == FMT_NV16) { cb = p_uv[0]; cr = p_uv[1]; // v紧跟u,在u的下一个位置 } if (type == FMT_NV61) { cr = p_uv[0]; cb = p_uv[1]; // u紧跟v,在v的下一个位置 } r = MAX (0, MIN (255, (V[cr] + Y1[y])/10000)); //R value b = MAX (0, MIN (255, (U[cb] + Y1[y])/10000)); //B value g = MAX (0, MIN (255, (Y2[y] - 5094*(r) - 1942*(b))/10000)); //G value // 此处可调整RGB排序,BMP图片排序为BGR // 默认排序为:RGB p_rgb[0] = r; p_rgb[1] = g; p_rgb[2] = b; y = p_y[1]; if (type == FMT_NV16) { cb = p_uv[0]; cr = p_uv[1]; } if (type == FMT_NV61) { cr = p_uv[0]; cb = p_uv[1]; } r = MAX (0, MIN (255, (V[cr] + Y1[y])/10000)); //R value b = MAX (0, MIN (255, (U[cb] + Y1[y])/10000)); //B value g = MAX (0, MIN (255, (Y2[y] - 5094*(r) - 1942*(b))/10000)); //G value p_rgb[3] = r; p_rgb[4] = g; p_rgb[5] = b; p_y += 2; p_uv += 2; p_rgb += 6; } }
|