aboutsummaryrefslogtreecommitdiff
path: root/source/convert_jpeg.cc
diff options
context:
space:
mode:
Diffstat (limited to 'source/convert_jpeg.cc')
-rw-r--r--source/convert_jpeg.cc602
1 files changed, 0 insertions, 602 deletions
diff --git a/source/convert_jpeg.cc b/source/convert_jpeg.cc
deleted file mode 100644
index d7556ee9..00000000
--- a/source/convert_jpeg.cc
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
- * Copyright 2011 The LibYuv Project Authors. All rights reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "libyuv/convert.h"
-#include "libyuv/convert_argb.h"
-
-#ifdef HAVE_JPEG
-#include "libyuv/mjpeg_decoder.h"
-#endif
-
-#ifdef __cplusplus
-namespace libyuv {
-extern "C" {
-#endif
-
-#ifdef HAVE_JPEG
-struct I420Buffers {
- uint8_t* y;
- int y_stride;
- uint8_t* u;
- int u_stride;
- uint8_t* v;
- int v_stride;
- int w;
- int h;
-};
-
-static void JpegCopyI420(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- I420Buffers* dest = (I420Buffers*)(opaque);
- I420Copy(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
- dest->v_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->u += ((rows + 1) >> 1) * dest->u_stride;
- dest->v += ((rows + 1) >> 1) * dest->v_stride;
- dest->h -= rows;
-}
-
-static void JpegI422ToI420(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- I420Buffers* dest = (I420Buffers*)(opaque);
- I422ToI420(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
- dest->v_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->u += ((rows + 1) >> 1) * dest->u_stride;
- dest->v += ((rows + 1) >> 1) * dest->v_stride;
- dest->h -= rows;
-}
-
-static void JpegI444ToI420(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- I420Buffers* dest = (I420Buffers*)(opaque);
- I444ToI420(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
- dest->v_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->u += ((rows + 1) >> 1) * dest->u_stride;
- dest->v += ((rows + 1) >> 1) * dest->v_stride;
- dest->h -= rows;
-}
-
-static void JpegI400ToI420(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- I420Buffers* dest = (I420Buffers*)(opaque);
- I400ToI420(data[0], strides[0], dest->y, dest->y_stride, dest->u,
- dest->u_stride, dest->v, dest->v_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->u += ((rows + 1) >> 1) * dest->u_stride;
- dest->v += ((rows + 1) >> 1) * dest->v_stride;
- dest->h -= rows;
-}
-
-// Query size of MJPG in pixels.
-LIBYUV_API
-int MJPGSize(const uint8_t* src_mjpg,
- size_t src_size_mjpg,
- int* width,
- int* height) {
- MJpegDecoder mjpeg_decoder;
- LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
- if (ret) {
- *width = mjpeg_decoder.GetWidth();
- *height = mjpeg_decoder.GetHeight();
- }
- mjpeg_decoder.UnloadFrame();
- return ret ? 0 : -1; // -1 for runtime failure.
-}
-
-// MJPG (Motion JPeg) to I420
-// TODO(fbarchard): review src_width and src_height requirement. dst_width and
-// dst_height may be enough.
-LIBYUV_API
-int MJPGToI420(const uint8_t* src_mjpg,
- size_t src_size_mjpg,
- uint8_t* dst_y,
- int dst_stride_y,
- uint8_t* dst_u,
- int dst_stride_u,
- uint8_t* dst_v,
- int dst_stride_v,
- int src_width,
- int src_height,
- int dst_width,
- int dst_height) {
- if (src_size_mjpg == kUnknownDataSize) {
- // ERROR: MJPEG frame size unknown
- return -1;
- }
-
- // TODO(fbarchard): Port MJpeg to C.
- MJpegDecoder mjpeg_decoder;
- LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
- if (ret && (mjpeg_decoder.GetWidth() != src_width ||
- mjpeg_decoder.GetHeight() != src_height)) {
- // ERROR: MJPEG frame has unexpected dimensions
- mjpeg_decoder.UnloadFrame();
- return 1; // runtime failure
- }
- if (ret) {
- I420Buffers bufs = {dst_y, dst_stride_y, dst_u, dst_stride_u,
- dst_v, dst_stride_v, dst_width, dst_height};
- // YUV420
- if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 2 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegCopyI420, &bufs, dst_width,
- dst_height);
- // YUV422
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToI420, &bufs, dst_width,
- dst_height);
- // YUV444
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToI420, &bufs, dst_width,
- dst_height);
- // YUV400
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceGrayscale &&
- mjpeg_decoder.GetNumComponents() == 1 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToI420, &bufs, dst_width,
- dst_height);
- } else {
- // TODO(fbarchard): Implement conversion for any other
- // colorspace/subsample factors that occur in practice. ERROR: Unable to
- // convert MJPEG frame because format is not supported
- mjpeg_decoder.UnloadFrame();
- return 1;
- }
- }
- return ret ? 0 : 1;
-}
-
-struct NV21Buffers {
- uint8_t* y;
- int y_stride;
- uint8_t* vu;
- int vu_stride;
- int w;
- int h;
-};
-
-static void JpegI420ToNV21(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- I420ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-static void JpegI422ToNV21(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- I422ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-static void JpegI444ToNV21(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- I444ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-static void JpegI400ToNV21(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- I400ToNV21(data[0], strides[0], dest->y, dest->y_stride, dest->vu,
- dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-// MJPG (Motion JPeg) to NV21
-LIBYUV_API
-int MJPGToNV21(const uint8_t* src_mjpg,
- size_t src_size_mjpg,
- uint8_t* dst_y,
- int dst_stride_y,
- uint8_t* dst_vu,
- int dst_stride_vu,
- int src_width,
- int src_height,
- int dst_width,
- int dst_height) {
- if (src_size_mjpg == kUnknownDataSize) {
- // ERROR: MJPEG frame size unknown
- return -1;
- }
-
- // TODO(fbarchard): Port MJpeg to C.
- MJpegDecoder mjpeg_decoder;
- LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
- if (ret && (mjpeg_decoder.GetWidth() != src_width ||
- mjpeg_decoder.GetHeight() != src_height)) {
- // ERROR: MJPEG frame has unexpected dimensions
- mjpeg_decoder.UnloadFrame();
- return 1; // runtime failure
- }
- if (ret) {
- NV21Buffers bufs = {dst_y, dst_stride_y, dst_vu,
- dst_stride_vu, dst_width, dst_height};
- // YUV420
- if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 2 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToNV21, &bufs, dst_width,
- dst_height);
- // YUV422
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToNV21, &bufs, dst_width,
- dst_height);
- // YUV444
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToNV21, &bufs, dst_width,
- dst_height);
- // YUV400
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceGrayscale &&
- mjpeg_decoder.GetNumComponents() == 1 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToNV21, &bufs, dst_width,
- dst_height);
- } else {
- // Unknown colorspace.
- mjpeg_decoder.UnloadFrame();
- return 1;
- }
- }
- return ret ? 0 : 1;
-}
-
-static void JpegI420ToNV12(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- // Use NV21 with VU swapped.
- I420ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
- dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-static void JpegI422ToNV12(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- // Use NV21 with VU swapped.
- I422ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
- dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-static void JpegI444ToNV12(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- // Use NV21 with VU swapped.
- I444ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
- dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-static void JpegI400ToNV12(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- NV21Buffers* dest = (NV21Buffers*)(opaque);
- // Use NV21 since there is no UV plane.
- I400ToNV21(data[0], strides[0], dest->y, dest->y_stride, dest->vu,
- dest->vu_stride, dest->w, rows);
- dest->y += rows * dest->y_stride;
- dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
- dest->h -= rows;
-}
-
-// MJPG (Motion JPEG) to NV12.
-LIBYUV_API
-int MJPGToNV12(const uint8_t* sample,
- size_t sample_size,
- uint8_t* dst_y,
- int dst_stride_y,
- uint8_t* dst_uv,
- int dst_stride_uv,
- int src_width,
- int src_height,
- int dst_width,
- int dst_height) {
- if (sample_size == kUnknownDataSize) {
- // ERROR: MJPEG frame size unknown
- return -1;
- }
-
- // TODO(fbarchard): Port MJpeg to C.
- MJpegDecoder mjpeg_decoder;
- LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size);
- if (ret && (mjpeg_decoder.GetWidth() != src_width ||
- mjpeg_decoder.GetHeight() != src_height)) {
- // ERROR: MJPEG frame has unexpected dimensions
- mjpeg_decoder.UnloadFrame();
- return 1; // runtime failure
- }
- if (ret) {
- // Use NV21Buffers but with UV instead of VU.
- NV21Buffers bufs = {dst_y, dst_stride_y, dst_uv,
- dst_stride_uv, dst_width, dst_height};
- // YUV420
- if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 2 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToNV12, &bufs, dst_width,
- dst_height);
- // YUV422
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToNV12, &bufs, dst_width,
- dst_height);
- // YUV444
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToNV12, &bufs, dst_width,
- dst_height);
- // YUV400
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceGrayscale &&
- mjpeg_decoder.GetNumComponents() == 1 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToNV12, &bufs, dst_width,
- dst_height);
- } else {
- // Unknown colorspace.
- mjpeg_decoder.UnloadFrame();
- return 1;
- }
- }
- return ret ? 0 : 1;
-}
-
-struct ARGBBuffers {
- uint8_t* argb;
- int argb_stride;
- int w;
- int h;
-};
-
-static void JpegI420ToARGB(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- ARGBBuffers* dest = (ARGBBuffers*)(opaque);
- I420ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->argb, dest->argb_stride, dest->w, rows);
- dest->argb += rows * dest->argb_stride;
- dest->h -= rows;
-}
-
-static void JpegI422ToARGB(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- ARGBBuffers* dest = (ARGBBuffers*)(opaque);
- I422ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->argb, dest->argb_stride, dest->w, rows);
- dest->argb += rows * dest->argb_stride;
- dest->h -= rows;
-}
-
-static void JpegI444ToARGB(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- ARGBBuffers* dest = (ARGBBuffers*)(opaque);
- I444ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
- dest->argb, dest->argb_stride, dest->w, rows);
- dest->argb += rows * dest->argb_stride;
- dest->h -= rows;
-}
-
-static void JpegI400ToARGB(void* opaque,
- const uint8_t* const* data,
- const int* strides,
- int rows) {
- ARGBBuffers* dest = (ARGBBuffers*)(opaque);
- I400ToARGB(data[0], strides[0], dest->argb, dest->argb_stride, dest->w, rows);
- dest->argb += rows * dest->argb_stride;
- dest->h -= rows;
-}
-
-// MJPG (Motion JPeg) to ARGB
-// TODO(fbarchard): review src_width and src_height requirement. dst_width and
-// dst_height may be enough.
-LIBYUV_API
-int MJPGToARGB(const uint8_t* src_mjpg,
- size_t src_size_mjpg,
- uint8_t* dst_argb,
- int dst_stride_argb,
- int src_width,
- int src_height,
- int dst_width,
- int dst_height) {
- if (src_size_mjpg == kUnknownDataSize) {
- // ERROR: MJPEG frame size unknown
- return -1;
- }
-
- // TODO(fbarchard): Port MJpeg to C.
- MJpegDecoder mjpeg_decoder;
- LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
- if (ret && (mjpeg_decoder.GetWidth() != src_width ||
- mjpeg_decoder.GetHeight() != src_height)) {
- // ERROR: MJPEG frame has unexpected dimensions
- mjpeg_decoder.UnloadFrame();
- return 1; // runtime failure
- }
- if (ret) {
- ARGBBuffers bufs = {dst_argb, dst_stride_argb, dst_width, dst_height};
- // YUV420
- if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 2 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToARGB, &bufs, dst_width,
- dst_height);
- // YUV422
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToARGB, &bufs, dst_width,
- dst_height);
- // YUV444
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceYCbCr &&
- mjpeg_decoder.GetNumComponents() == 3 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
- mjpeg_decoder.GetVertSampFactor(1) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
- mjpeg_decoder.GetVertSampFactor(2) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(2) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToARGB, &bufs, dst_width,
- dst_height);
- // YUV400
- } else if (mjpeg_decoder.GetColorSpace() ==
- MJpegDecoder::kColorSpaceGrayscale &&
- mjpeg_decoder.GetNumComponents() == 1 &&
- mjpeg_decoder.GetVertSampFactor(0) == 1 &&
- mjpeg_decoder.GetHorizSampFactor(0) == 1) {
- ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToARGB, &bufs, dst_width,
- dst_height);
- } else {
- // TODO(fbarchard): Implement conversion for any other
- // colorspace/subsample factors that occur in practice. ERROR: Unable to
- // convert MJPEG frame because format is not supported
- mjpeg_decoder.UnloadFrame();
- return 1;
- }
- }
- return ret ? 0 : 1;
-}
-
-#endif // HAVE_JPEG
-
-#ifdef __cplusplus
-} // extern "C"
-} // namespace libyuv
-#endif