mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
swscale/rgb2xyz: follow convention on image pointers and strides
Instead of taking an int16_t pointer and a stride in halfwords, follow the usual convention of treating all planes and strides as byte-addressed. This does not have any immediate effect but makes these functions more reusable without unintended "gotchas". Sponsored-by: Sovereign Tech Fund Signed-off-by: Niklas Haas <git@haasn.dev>
This commit is contained in:
parent
9d8f5141cf
commit
775de8c19d
@ -637,23 +637,26 @@ static int check_image_pointers(const uint8_t * const data[4], enum AVPixelForma
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void xyz12Torgb48(struct SwsContext *c, uint16_t *dst,
|
||||
const uint16_t *src, int stride, int w, int h)
|
||||
static void xyz12Torgb48(struct SwsContext *c, uint8_t *dst, int dst_stride,
|
||||
const uint8_t *src, int src_stride, int w, int h)
|
||||
{
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->srcFormat);
|
||||
|
||||
for (int yp = 0; yp < h; yp++) {
|
||||
const uint16_t *src16 = (const uint16_t *) src;
|
||||
uint16_t *dst16 = (uint16_t *) dst;
|
||||
|
||||
for (int xp = 0; xp < 3 * w; xp += 3) {
|
||||
int x, y, z, r, g, b;
|
||||
|
||||
if (desc->flags & AV_PIX_FMT_FLAG_BE) {
|
||||
x = AV_RB16(src + xp + 0);
|
||||
y = AV_RB16(src + xp + 1);
|
||||
z = AV_RB16(src + xp + 2);
|
||||
x = AV_RB16(src16 + xp + 0);
|
||||
y = AV_RB16(src16 + xp + 1);
|
||||
z = AV_RB16(src16 + xp + 2);
|
||||
} else {
|
||||
x = AV_RL16(src + xp + 0);
|
||||
y = AV_RL16(src + xp + 1);
|
||||
z = AV_RL16(src + xp + 2);
|
||||
x = AV_RL16(src16 + xp + 0);
|
||||
y = AV_RL16(src16 + xp + 1);
|
||||
z = AV_RL16(src16 + xp + 2);
|
||||
}
|
||||
|
||||
x = c->xyzgamma[x >> 4];
|
||||
@ -678,37 +681,41 @@ static void xyz12Torgb48(struct SwsContext *c, uint16_t *dst,
|
||||
|
||||
// convert from sRGBlinear to RGB and scale from 12bit to 16bit
|
||||
if (desc->flags & AV_PIX_FMT_FLAG_BE) {
|
||||
AV_WB16(dst + xp + 0, c->rgbgamma[r] << 4);
|
||||
AV_WB16(dst + xp + 1, c->rgbgamma[g] << 4);
|
||||
AV_WB16(dst + xp + 2, c->rgbgamma[b] << 4);
|
||||
AV_WB16(dst16 + xp + 0, c->rgbgamma[r] << 4);
|
||||
AV_WB16(dst16 + xp + 1, c->rgbgamma[g] << 4);
|
||||
AV_WB16(dst16 + xp + 2, c->rgbgamma[b] << 4);
|
||||
} else {
|
||||
AV_WL16(dst + xp + 0, c->rgbgamma[r] << 4);
|
||||
AV_WL16(dst + xp + 1, c->rgbgamma[g] << 4);
|
||||
AV_WL16(dst + xp + 2, c->rgbgamma[b] << 4);
|
||||
AV_WL16(dst16 + xp + 0, c->rgbgamma[r] << 4);
|
||||
AV_WL16(dst16 + xp + 1, c->rgbgamma[g] << 4);
|
||||
AV_WL16(dst16 + xp + 2, c->rgbgamma[b] << 4);
|
||||
}
|
||||
}
|
||||
src += stride;
|
||||
dst += stride;
|
||||
|
||||
src += src_stride;
|
||||
dst += dst_stride;
|
||||
}
|
||||
}
|
||||
|
||||
static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst,
|
||||
const uint16_t *src, int stride, int w, int h)
|
||||
static void rgb48Toxyz12(struct SwsContext *c, uint8_t *dst, int dst_stride,
|
||||
const uint8_t *src, int src_stride, int w, int h)
|
||||
{
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->dstFormat);
|
||||
|
||||
for (int yp = 0; yp < h; yp++) {
|
||||
uint16_t *src16 = (uint16_t *) src;
|
||||
uint16_t *dst16 = (uint16_t *) dst;
|
||||
|
||||
for (int xp = 0; xp < 3 * w; xp += 3) {
|
||||
int x, y, z, r, g, b;
|
||||
|
||||
if (desc->flags & AV_PIX_FMT_FLAG_BE) {
|
||||
r = AV_RB16(src + xp + 0);
|
||||
g = AV_RB16(src + xp + 1);
|
||||
b = AV_RB16(src + xp + 2);
|
||||
r = AV_RB16(src16 + xp + 0);
|
||||
g = AV_RB16(src16 + xp + 1);
|
||||
b = AV_RB16(src16 + xp + 2);
|
||||
} else {
|
||||
r = AV_RL16(src + xp + 0);
|
||||
g = AV_RL16(src + xp + 1);
|
||||
b = AV_RL16(src + xp + 2);
|
||||
r = AV_RL16(src16 + xp + 0);
|
||||
g = AV_RL16(src16 + xp + 1);
|
||||
b = AV_RL16(src16 + xp + 2);
|
||||
}
|
||||
|
||||
r = c->rgbgammainv[r>>4];
|
||||
@ -733,17 +740,18 @@ static void rgb48Toxyz12(struct SwsContext *c, uint16_t *dst,
|
||||
|
||||
// convert from XYZlinear to X'Y'Z' and scale from 12bit to 16bit
|
||||
if (desc->flags & AV_PIX_FMT_FLAG_BE) {
|
||||
AV_WB16(dst + xp + 0, c->xyzgammainv[x] << 4);
|
||||
AV_WB16(dst + xp + 1, c->xyzgammainv[y] << 4);
|
||||
AV_WB16(dst + xp + 2, c->xyzgammainv[z] << 4);
|
||||
AV_WB16(dst16 + xp + 0, c->xyzgammainv[x] << 4);
|
||||
AV_WB16(dst16 + xp + 1, c->xyzgammainv[y] << 4);
|
||||
AV_WB16(dst16 + xp + 2, c->xyzgammainv[z] << 4);
|
||||
} else {
|
||||
AV_WL16(dst + xp + 0, c->xyzgammainv[x] << 4);
|
||||
AV_WL16(dst + xp + 1, c->xyzgammainv[y] << 4);
|
||||
AV_WL16(dst + xp + 2, c->xyzgammainv[z] << 4);
|
||||
AV_WL16(dst16 + xp + 0, c->xyzgammainv[x] << 4);
|
||||
AV_WL16(dst16 + xp + 1, c->xyzgammainv[y] << 4);
|
||||
AV_WL16(dst16 + xp + 2, c->xyzgammainv[z] << 4);
|
||||
}
|
||||
}
|
||||
src += stride;
|
||||
dst += stride;
|
||||
|
||||
src += src_stride;
|
||||
dst += dst_stride;
|
||||
}
|
||||
}
|
||||
|
||||
@ -993,8 +1001,7 @@ static int scale_internal(SwsContext *c,
|
||||
base = srcStride[0] < 0 ? c->xyz_scratch - srcStride[0] * (srcSliceH-1) :
|
||||
c->xyz_scratch;
|
||||
|
||||
xyz12Torgb48(c, (uint16_t*)base, (const uint16_t*)src2[0], srcStride[0]/2,
|
||||
c->srcW, srcSliceH);
|
||||
xyz12Torgb48(c, base, srcStride[0], src2[0], srcStride[0], c->srcW, srcSliceH);
|
||||
src2[0] = base;
|
||||
}
|
||||
|
||||
@ -1052,21 +1059,21 @@ static int scale_internal(SwsContext *c,
|
||||
}
|
||||
|
||||
if (c->dstXYZ && !(c->srcXYZ && c->srcW==c->dstW && c->srcH==c->dstH)) {
|
||||
uint16_t *dst16;
|
||||
uint8_t *dst;
|
||||
|
||||
if (scale_dst) {
|
||||
dst16 = (uint16_t *)dst2[0];
|
||||
dst = dst2[0];
|
||||
} else {
|
||||
int dstY = c->dstY ? c->dstY : srcSliceY + srcSliceH;
|
||||
|
||||
av_assert0(dstY >= ret);
|
||||
av_assert0(ret >= 0);
|
||||
av_assert0(c->dstH >= dstY);
|
||||
dst16 = (uint16_t*)(dst2[0] + (dstY - ret) * dstStride2[0]);
|
||||
dst = dst2[0] + (dstY - ret) * dstStride2[0];
|
||||
}
|
||||
|
||||
/* replace on the same data */
|
||||
rgb48Toxyz12(c, dst16, dst16, dstStride2[0]/2, c->dstW, ret);
|
||||
rgb48Toxyz12(c, dst, dstStride2[0], dst, dstStride2[0], c->dstW, ret);
|
||||
}
|
||||
|
||||
/* reset slice direction at end of frame */
|
||||
|
Loading…
Reference in New Issue
Block a user