From 257adfb0bebff631d0bd5850db9a8359bb5f02b0 Mon Sep 17 00:00:00 2001 From: Pascal Massimino Date: Thu, 3 Jul 2014 13:20:06 -0700 Subject: [PATCH] remove experimental YUV444 YUV422 and YUV400 code (never used) Change-Id: I12a886703592133939607df05132e9b498f916c1 --- examples/cwebp.c | 11 ---- src/dec/webp.c | 4 +- src/enc/picture.c | 151 ++++++---------------------------------------- src/webp/encode.h | 23 +++---- 4 files changed, 27 insertions(+), 162 deletions(-) diff --git a/examples/cwebp.c b/examples/cwebp.c index 74a262af..f8dbe142 100644 --- a/examples/cwebp.c +++ b/examples/cwebp.c @@ -597,9 +597,6 @@ static void HelpLong(void) { printf(" -resize ........ resize picture (after any cropping)\n"); printf(" -mt .................... use multi-threading if available\n"); printf(" -low_memory ............ reduce memory usage (slower encoding)\n"); -#ifdef WEBP_EXPERIMENTAL_FEATURES - printf(" -444 / -422 / -gray .... change colorspace\n"); -#endif printf(" -map ............. print map of extra info\n"); printf(" -print_psnr ............ prints averaged PSNR distortion\n"); printf(" -print_ssim ............ prints averaged SSIM distortion\n"); @@ -812,14 +809,6 @@ int main(int argc, const char *argv[]) { config.partition_limit = strtol(argv[++c], NULL, 0); } else if (!strcmp(argv[c], "-map") && c < argc - 1) { picture.extra_info_type = strtol(argv[++c], NULL, 0); -#ifdef WEBP_EXPERIMENTAL_FEATURES - } else if (!strcmp(argv[c], "-444")) { - picture.colorspace = WEBP_YUV444; - } else if (!strcmp(argv[c], "-422")) { - picture.colorspace = WEBP_YUV422; - } else if (!strcmp(argv[c], "-gray")) { - picture.colorspace = WEBP_YUV400; -#endif } else if (!strcmp(argv[c], "-crop") && c < argc - 4) { crop = 1; crop_x = strtol(argv[++c], NULL, 0); diff --git a/src/dec/webp.c b/src/dec/webp.c index bf244839..c76a704b 100644 --- a/src/dec/webp.c +++ b/src/dec/webp.c @@ -788,9 +788,9 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options, h = options->crop_height; x = options->crop_left; y = options->crop_top; - if (!WebPIsRGBMode(src_colorspace)) { // only snap for YUV420 or YUV422 + if (!WebPIsRGBMode(src_colorspace)) { // only snap for YUV420 x &= ~1; - y &= ~1; // TODO(later): only for YUV420, not YUV422. + y &= ~1; } if (x < 0 || y < 0 || w <= 0 || h <= 0 || x + w > W || y + h > H) { return 0; // out of frame boundary error diff --git a/src/enc/picture.c b/src/enc/picture.c index 615b1a5c..b8ceadfc 100644 --- a/src/enc/picture.c +++ b/src/enc/picture.c @@ -26,7 +26,6 @@ #define USE_GAMMA_COMPRESSION #define HALVE(x) (((x) + 1) >> 1) -#define IS_YUV_CSP(csp, YUV_CSP) (((csp) & WEBP_CSP_UV_MASK) == (YUV_CSP)) static const union { uint32_t argb; @@ -54,29 +53,17 @@ int WebPPictureAlloc(WebPPicture* picture) { const int uv_width = HALVE(width); const int uv_height = HALVE(height); const int uv_stride = uv_width; - int uv0_stride = 0; int a_width, a_stride; - uint64_t y_size, uv_size, uv0_size, a_size, total_size; + uint64_t y_size, uv_size, a_size, total_size; uint8_t* mem; // U/V switch (uv_csp) { case WEBP_YUV420: break; -#ifdef WEBP_EXPERIMENTAL_FEATURES - case WEBP_YUV400: // for now, we'll just reset the U/V samples - break; - case WEBP_YUV422: - uv0_stride = uv_width; - break; - case WEBP_YUV444: - uv0_stride = width; - break; -#endif default: return 0; } - uv0_size = height * uv0_stride; // alpha a_width = has_alpha ? width : 0; @@ -85,7 +72,7 @@ int WebPPictureAlloc(WebPPicture* picture) { uv_size = (uint64_t)uv_stride * uv_height; a_size = (uint64_t)a_stride * height; - total_size = y_size + a_size + 2 * uv_size + 2 * uv0_size; + total_size = y_size + a_size + 2 * uv_size; // Security and validation checks if (width <= 0 || height <= 0 || // luma/alpha param error @@ -102,7 +89,7 @@ int WebPPictureAlloc(WebPPicture* picture) { picture->y_stride = y_stride; picture->uv_stride = uv_stride; picture->a_stride = a_stride; - picture->uv0_stride = uv0_stride; + // TODO(skal): we could align the y/u/v planes and adjust stride. picture->y = mem; mem += y_size; @@ -112,16 +99,10 @@ int WebPPictureAlloc(WebPPicture* picture) { picture->v = mem; mem += uv_size; - if (a_size) { + if (a_size > 0) { picture->a = mem; mem += a_size; } - if (uv0_size) { - picture->u0 = mem; - mem += uv0_size; - picture->v0 = mem; - mem += uv0_size; - } (void)mem; // makes the static analyzer happy } else { void* memory; @@ -154,10 +135,8 @@ static void PictureResetARGB(WebPPicture* const picture) { static void PictureResetYUVA(WebPPicture* const picture) { picture->memory_ = NULL; picture->y = picture->u = picture->v = picture->a = NULL; - picture->u0 = picture->v0 = NULL; picture->y_stride = picture->uv_stride = 0; picture->a_stride = 0; - picture->uv0_stride = 0; } // Grab the 'specs' (writer, *opaque, width, height...) from 'src' and copy them @@ -214,11 +193,8 @@ static void CopyPlane(const uint8_t* src, int src_stride, static void SnapTopLeftPosition(const WebPPicture* const pic, int* const left, int* const top) { if (!pic->use_argb) { - const int is_yuv422 = IS_YUV_CSP(pic->colorspace, WEBP_YUV422); - if (IS_YUV_CSP(pic->colorspace, WEBP_YUV420) || is_yuv422) { - *left &= ~1; - if (!is_yuv422) *top &= ~1; - } + *left &= ~1; + *top &= ~1; } } @@ -252,18 +228,6 @@ int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst) { CopyPlane(src->a, src->a_stride, dst->a, dst->a_stride, dst->width, dst->height); } -#ifdef WEBP_EXPERIMENTAL_FEATURES - if (dst->u0 != NULL) { - int uv0_width = src->width; - if (IS_YUV_CSP(dst->colorspace, WEBP_YUV422)) { - uv0_width = HALVE(uv0_width); - } - CopyPlane(src->u0, src->uv0_stride, - dst->u0, dst->uv0_stride, uv0_width, dst->height); - CopyPlane(src->v0, src->uv0_stride, - dst->v0, dst->uv0_stride, uv0_width, dst->height); - } -#endif } else { CopyPlane((const uint8_t*)src->argb, 4 * src->argb_stride, (uint8_t*)dst->argb, 4 * dst->argb_stride, @@ -303,15 +267,6 @@ int WebPPictureView(const WebPPicture* src, dst->a = src->a + top * src->a_stride + left; dst->a_stride = src->a_stride; } -#ifdef WEBP_EXPERIMENTAL_FEATURES - if (src->u0 != NULL) { - const int left_pos = - IS_YUV_CSP(dst->colorspace, WEBP_YUV422) ? (left >> 1) : left; - dst->u0 = src->u0 + top * src->uv0_stride + left_pos; - dst->v0 = src->v0 + top * src->uv0_stride + left_pos; - dst->uv0_stride = src->uv0_stride; - } -#endif } else { dst->argb = src->argb + top * src->argb_stride + left; dst->argb_stride = src->argb_stride; @@ -349,20 +304,6 @@ int WebPPictureCrop(WebPPicture* pic, CopyPlane(pic->a + a_offset, pic->a_stride, tmp.a, tmp.a_stride, width, height); } -#ifdef WEBP_EXPERIMENTAL_FEATURES - if (tmp.u0 != NULL) { - int w = width; - int left_pos = left; - if (IS_YUV_CSP(tmp.colorspace, WEBP_YUV422)) { - w = HALVE(w); - left_pos = HALVE(left_pos); - } - CopyPlane(pic->u0 + top * pic->uv0_stride + left_pos, pic->uv0_stride, - tmp.u0, tmp.uv0_stride, w, height); - CopyPlane(pic->v0 + top * pic->uv0_stride + left_pos, pic->uv0_stride, - tmp.v0, tmp.uv0_stride, w, height); - } -#endif } else { const uint8_t* const src = (const uint8_t*)(pic->argb + top * pic->argb_stride + left); @@ -465,18 +406,6 @@ int WebPPictureRescale(WebPPicture* pic, int width, int height) { HALVE(prev_width), HALVE(prev_height), pic->uv_stride, tmp.v, HALVE(width), HALVE(height), tmp.uv_stride, work, 1); - -#ifdef WEBP_EXPERIMENTAL_FEATURES - if (tmp.u0 != NULL) { - const int s = IS_YUV_CSP(tmp.colorspace, WEBP_YUV422) ? 2 : 1; - RescalePlane( - pic->u0, (prev_width + s / 2) / s, prev_height, pic->uv0_stride, - tmp.u0, (width + s / 2) / s, height, tmp.uv0_stride, work, 1); - RescalePlane( - pic->v0, (prev_width + s / 2) / s, prev_height, pic->uv0_stride, - tmp.v0, (width + s / 2) / s, height, tmp.uv0_stride, work, 1); - } -#endif } else { work = (int32_t*)WebPSafeMalloc(2ULL * width * 4, sizeof(*work)); if (work == NULL) { @@ -687,26 +616,6 @@ static WEBP_INLINE int LinearToGamma(uint32_t base_value, int shift) { picture->v[dst] = RGBToV(r, g, b, &rg); \ } -#define RGB_TO_UV0(x_in, x_out, y, SUM) { \ - const int src = (step * (x_in) + (y) * rgb_stride); \ - const int dst = (x_out) + (y) * picture->uv0_stride; \ - const int r = SUM(r_ptr + src); \ - const int g = SUM(g_ptr + src); \ - const int b = SUM(b_ptr + src); \ - picture->u0[dst] = RGBToU(r, g, b, &rg); \ - picture->v0[dst] = RGBToV(r, g, b, &rg); \ -} - -static void MakeGray(WebPPicture* const picture) { - int y; - const int uv_width = HALVE(picture->width); - const int uv_height = HALVE(picture->height); - for (y = 0; y < uv_height; ++y) { - memset(picture->u + y * picture->uv_stride, 128, uv_width); - memset(picture->v + y * picture->uv_stride, 128, uv_width); - } -} - static int ImportYUVAFromRGBA(const uint8_t* const r_ptr, const uint8_t* const g_ptr, const uint8_t* const b_ptr, @@ -742,45 +651,21 @@ static int ImportYUVAFromRGBA(const uint8_t* const r_ptr, } // Downsample U/V plane - if (uv_csp != WEBP_YUV400) { - for (y = 0; y < (height >> 1); ++y) { - for (x = 0; x < (width >> 1); ++x) { - RGB_TO_UV(x, y, SUM4); - } - if (width & 1) { - RGB_TO_UV(x, y, SUM2V); - } + for (y = 0; y < (height >> 1); ++y) { + for (x = 0; x < (width >> 1); ++x) { + RGB_TO_UV(x, y, SUM4); } - if (height & 1) { - for (x = 0; x < (width >> 1); ++x) { - RGB_TO_UV(x, y, SUM2H); - } - if (width & 1) { - RGB_TO_UV(x, y, SUM1); - } + if (width & 1) { + RGB_TO_UV(x, y, SUM2V); } - -#ifdef WEBP_EXPERIMENTAL_FEATURES - // Store original U/V samples too - if (uv_csp == WEBP_YUV422) { - for (y = 0; y < height; ++y) { - for (x = 0; x < (width >> 1); ++x) { - RGB_TO_UV0(2 * x, x, y, SUM2H); - } - if (width & 1) { - RGB_TO_UV0(2 * x, x, y, SUM1); - } - } - } else if (uv_csp == WEBP_YUV444) { - for (y = 0; y < height; ++y) { - for (x = 0; x < width; ++x) { - RGB_TO_UV0(x, x, y, SUM1); - } - } + } + if (height & 1) { + for (x = 0; x < (width >> 1); ++x) { + RGB_TO_UV(x, y, SUM2H); + } + if (width & 1) { + RGB_TO_UV(x, y, SUM1); } -#endif - } else { - MakeGray(picture); } if (has_alpha) { diff --git a/src/webp/encode.h b/src/webp/encode.h index 718575a3..ccd2bd66 100644 --- a/src/webp/encode.h +++ b/src/webp/encode.h @@ -246,16 +246,9 @@ typedef int (*WebPProgressHook)(int percent, const WebPPicture* picture); // Color spaces. typedef enum WebPEncCSP { // chroma sampling - WEBP_YUV420 = 0, // 4:2:0 - WEBP_YUV422 = 1, // 4:2:2 - WEBP_YUV444 = 2, // 4:4:4 - WEBP_YUV400 = 3, // grayscale - WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors - // alpha channel variants - WEBP_YUV420A = 4, - WEBP_YUV422A = 5, - WEBP_YUV444A = 6, - WEBP_YUV400A = 7, // grayscale + alpha + WEBP_YUV420 = 0, // 4:2:0 + WEBP_YUV420A = 4, // alpha channel variant + WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors WEBP_CSP_ALPHA_BIT = 4 // bit that is set if alpha is present } WebPEncCSP; @@ -334,17 +327,15 @@ struct WebPPicture { uint32_t pad3[3]; // padding for later use - // Unused for now: original samples (for non-YUV420 modes) - uint8_t *u0, *v0; - int uv0_stride; - - uint32_t pad4[7]; // padding for later use + // Unused for now + uint8_t *pad4, *pad5; + uint32_t pad6[8]; // padding for later use // PRIVATE FIELDS //////////////////// void* memory_; // row chunk of memory for yuva planes void* memory_argb_; // and for argb too. - void* pad5[2]; // padding for later use + void* pad7[2]; // padding for later use }; // Internal, version-checked, entry point