static void sycc444_to_rgb(opj_image_t *img) { int *d0, *d1, *d2, *r, *g, *b; const int *y, *cb, *cr; int maxw, maxh, max, i, offset, upb; i = img->comps[0].prec; offset = 1<<(i - 1); upb = (1<<i)-1; maxw = img->comps[0].w; maxh = img->comps[0].h; max = maxw * maxh; y = img->comps[0].data; cb = img->comps[1].data; cr = img->comps[2].data; d0 = r = (int*)malloc(sizeof(int) * max); d1 = g = (int*)malloc(sizeof(int) * max); d2 = b = (int*)malloc(sizeof(int) * max); for(i = 0; i < max; ++i) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++cb; ++cr; ++r; ++g; ++b; } free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[2].data); img->comps[2].data = d2; }/* sycc444_to_rgb() */
static void sycc444_to_rgb(opj_image_t* img) { int prec = img->comps[0].prec; int offset = 1 << (prec - 1); int upb = (1 << prec) - 1; OPJ_UINT32 maxw = std::min({img->comps[0].w, img->comps[1].w, img->comps[2].w}); OPJ_UINT32 maxh = std::min({img->comps[0].h, img->comps[1].h, img->comps[2].h}); FX_SAFE_SIZE_T max_size = maxw; max_size *= maxh; if (!max_size.IsValid()) return; const int* y = img->comps[0].data; const int* cb = img->comps[1].data; const int* cr = img->comps[2].data; if (!y || !cb || !cr) return; int* r = FX_Alloc(int, max_size.ValueOrDie()); int* g = FX_Alloc(int, max_size.ValueOrDie()); int* b = FX_Alloc(int, max_size.ValueOrDie()); int* d0 = r; int* d1 = g; int* d2 = b; for (size_t i = 0; i < max_size.ValueOrDie(); ++i) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++cb; ++cr; ++r; ++g; ++b; } FX_Free(img->comps[0].data); FX_Free(img->comps[1].data); FX_Free(img->comps[2].data); img->comps[0].data = d0; img->comps[1].data = d1; img->comps[2].data = d2; }
static void sycc420_to_rgb(opj_image_t *img) { int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb; const int *y, *cb, *cr, *ny; int maxw, maxh, max, offset, upb; int i, j; i = img->comps[0].prec; offset = 1<<(i - 1); upb = (1<<i)-1; maxw = img->comps[0].w; maxh = img->comps[0].h; max = maxw * maxh; y = img->comps[0].data; cb = img->comps[1].data; cr = img->comps[2].data; d0 = r = (int*)malloc(sizeof(int) * max); d1 = g = (int*)malloc(sizeof(int) * max); d2 = b = (int*)malloc(sizeof(int) * max); for(i=0; i < maxh; i += 2) { ny = y + maxw; nr = r + maxw; ng = g + maxw; nb = b + maxw; for(j=0; j < maxw; j += 2) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; } y += maxw; r += maxw; g += maxw; b += maxw; } free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[2].data); img->comps[2].data = d2; img->comps[1].w = maxw; img->comps[1].h = maxh; img->comps[2].w = maxw; img->comps[2].h = maxh; img->comps[1].dx = img->comps[0].dx; img->comps[2].dx = img->comps[0].dx; img->comps[1].dy = img->comps[0].dy; img->comps[2].dy = img->comps[0].dy; }/* sycc420_to_rgb() */
void sycc420_to_rgb(opj_image_t* img) { if (!sycc420_size_is_valid(img)) return; OPJ_UINT32 prec = img->comps[0].prec; if (!prec) return; OPJ_UINT32 offset = 1 << (prec - 1); OPJ_UINT32 upb = (1 << prec) - 1; OPJ_UINT32 yw = img->comps[0].w; OPJ_UINT32 yh = img->comps[0].h; OPJ_UINT32 cbw = img->comps[1].w; OPJ_UINT32 cbh = img->comps[1].h; OPJ_UINT32 crw = img->comps[2].w; bool extw = sycc420_must_extend_cbcr(yw, cbw); bool exth = sycc420_must_extend_cbcr(yh, cbh); FX_SAFE_UINT32 safeSize = yw; safeSize *= yh; if (!safeSize.IsValid()) return; int* r = FX_Alloc(int, safeSize.ValueOrDie()); int* g = FX_Alloc(int, safeSize.ValueOrDie()); int* b = FX_Alloc(int, safeSize.ValueOrDie()); int* d0 = r; int* d1 = g; int* d2 = b; const int* y = img->comps[0].data; const int* cb = img->comps[1].data; const int* cr = img->comps[2].data; if (!y || !cb || !cr) return; const int* ny = nullptr; int* nr = nullptr; int* ng = nullptr; int* nb = nullptr; OPJ_UINT32 i = 0; OPJ_UINT32 j = 0; for (i = 0; i < (yh & ~(OPJ_UINT32)1); i += 2) { ny = y + yw; nr = r + yw; ng = g + yw; nb = b + yw; for (j = 0; j < (yw & ~(OPJ_UINT32)1); j += 2) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; } if (j < yw) { if (extw) { --cb; --cr; } sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); ++ny; ++nr; ++ng; ++nb; ++cb; ++cr; } y += yw; r += yw; g += yw; b += yw; } if (i < yh) { if (exth) { cb -= cbw; cr -= crw; } for (j = 0; j < (yw & ~(OPJ_UINT32)1); j += 2) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; ++cb; ++cr; } if (j < yw) { if (extw) { --cb; --cr; } sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); } } FX_Free(img->comps[0].data); img->comps[0].data = d0; FX_Free(img->comps[1].data); img->comps[1].data = d1; FX_Free(img->comps[2].data); img->comps[2].data = d2; img->comps[1].w = yw; img->comps[1].h = yh; img->comps[2].w = yw; img->comps[2].h = yh; img->comps[1].w = yw; img->comps[1].h = yh; img->comps[2].w = yw; img->comps[2].h = yh; img->comps[1].dx = img->comps[0].dx; img->comps[2].dx = img->comps[0].dx; img->comps[1].dy = img->comps[0].dy; img->comps[2].dy = img->comps[0].dy; }
static void sycc422_to_rgb(opj_image_t* img) { if (!sycc422_size_is_valid(img)) return; int prec = img->comps[0].prec; if (prec <= 0 || prec >= 32) return; int offset = 1 << (prec - 1); int upb = (1 << prec) - 1; OPJ_UINT32 maxw = img->comps[0].w; OPJ_UINT32 maxh = img->comps[0].h; FX_SAFE_SIZE_T max_size = maxw; max_size *= maxh; if (!max_size.IsValid()) return; const int* y = img->comps[0].data; const int* cb = img->comps[1].data; const int* cr = img->comps[2].data; if (!y || !cb || !cr) return; int *d0, *d1, *d2, *r, *g, *b; d0 = r = FX_Alloc(int, max_size.ValueOrDie()); d1 = g = FX_Alloc(int, max_size.ValueOrDie()); d2 = b = FX_Alloc(int, max_size.ValueOrDie()); for (uint32_t i = 0; i < maxh; ++i) { OPJ_UINT32 j; for (j = 0; j < (maxw & ~static_cast<OPJ_UINT32>(1)); j += 2) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; ++cb; ++cr; } if (j < maxw) { sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); ++y; ++r; ++g; ++b; ++cb; ++cr; } } FX_Free(img->comps[0].data); img->comps[0].data = d0; FX_Free(img->comps[1].data); img->comps[1].data = d1; FX_Free(img->comps[2].data); img->comps[2].data = d2; img->comps[1].w = maxw; img->comps[1].h = maxh; img->comps[2].w = maxw; img->comps[2].h = maxh; img->comps[1].dx = img->comps[0].dx; img->comps[2].dx = img->comps[0].dx; img->comps[1].dy = img->comps[0].dy; img->comps[2].dy = img->comps[0].dy; }