141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org/* 241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org * Copyright 2011 The LibYuv Project Authors. All rights reserved. 341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org * 441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org * Use of this source code is governed by a BSD-style license 541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org * that can be found in the LICENSE file in the root of the source 641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org * tree. An additional intellectual property rights grant can be found 741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org * in the file PATENTS. All contributing project authors may 841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org * be found in the AUTHORS file in the root of the source tree. 941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org */ 1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "libyuv/convert.h" 1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef HAVE_JPEG 1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "libyuv/mjpeg_decoder.h" 1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif 1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef __cplusplus 1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgnamespace libyuv { 1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgextern "C" { 2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif 2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef HAVE_JPEG 2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstruct I420Buffers { 2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* y; 2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int y_stride; 2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* u; 2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int u_stride; 2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* v; 2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int v_stride; 3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int w; 3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int h; 3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}; 3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegCopyI420(void* opaque, 3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420Buffers* dest = (I420Buffers*)(opaque); 3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420Copy(data[0], strides[0], 4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y, dest->y_stride, 4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u, dest->u_stride, 4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v, dest->v_stride, 4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y += rows * dest->y_stride; 4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u += ((rows + 1) >> 1) * dest->u_stride; 4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v += ((rows + 1) >> 1) * dest->v_stride; 4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 5141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 5241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI422ToI420(void* opaque, 5341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 5541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420Buffers* dest = (I420Buffers*)(opaque); 5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I422ToI420(data[0], strides[0], 5841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 5941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y, dest->y_stride, 6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u, dest->u_stride, 6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v, dest->v_stride, 6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y += rows * dest->y_stride; 6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u += ((rows + 1) >> 1) * dest->u_stride; 6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v += ((rows + 1) >> 1) * dest->v_stride; 6741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 6941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI444ToI420(void* opaque, 7141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 7341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 7441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420Buffers* dest = (I420Buffers*)(opaque); 7541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I444ToI420(data[0], strides[0], 7641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 7841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y, dest->y_stride, 7941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u, dest->u_stride, 8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v, dest->v_stride, 8141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y += rows * dest->y_stride; 8341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u += ((rows + 1) >> 1) * dest->u_stride; 8441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v += ((rows + 1) >> 1) * dest->v_stride; 8541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 8641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 8741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI411ToI420(void* opaque, 8941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 9041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420Buffers* dest = (I420Buffers*)(opaque); 9341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I411ToI420(data[0], strides[0], 9441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 9541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 9641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y, dest->y_stride, 9741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u, dest->u_stride, 9841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v, dest->v_stride, 9941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 10041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y += rows * dest->y_stride; 10141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u += ((rows + 1) >> 1) * dest->u_stride; 10241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v += ((rows + 1) >> 1) * dest->v_stride; 10341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 10441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 10541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 10641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI400ToI420(void* opaque, 10741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 10841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 10941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 11041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420Buffers* dest = (I420Buffers*)(opaque); 11141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I400ToI420(data[0], strides[0], 11241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y, dest->y_stride, 11341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u, dest->u_stride, 11441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v, dest->v_stride, 11541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 11641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->y += rows * dest->y_stride; 11741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->u += ((rows + 1) >> 1) * dest->u_stride; 11841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->v += ((rows + 1) >> 1) * dest->v_stride; 11941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 12041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 12141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 12241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Query size of MJPG in pixels. 12341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgLIBYUV_API 12441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgint MJPGSize(const uint8* sample, size_t sample_size, 12541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int* width, int* height) { 12641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder mjpeg_decoder; 12741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size); 12841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (ret) { 12941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *width = mjpeg_decoder.GetWidth(); 13041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org *height = mjpeg_decoder.GetHeight(); 13141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 13241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.UnloadFrame(); 13341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return ret ? 0 : -1; // -1 for runtime failure. 13441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 13541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 13641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// MJPG (Motion JPeg) to I420 13741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// TODO(fbarchard): review w and h requirement. dw and dh may be enough. 13841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgLIBYUV_API 13941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgint MJPGToI420(const uint8* sample, 14041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org size_t sample_size, 14141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* y, int y_stride, 14241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* u, int u_stride, 14341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* v, int v_stride, 14441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int w, int h, 14541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int dw, int dh) { 14641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (sample_size == kUnknownDataSize) { 14741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // ERROR: MJPEG frame size unknown 14841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return -1; 14941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 15041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 15141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // TODO(fbarchard): Port MJpeg to C. 15241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder mjpeg_decoder; 15341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size); 15441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (ret && (mjpeg_decoder.GetWidth() != w || 15541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHeight() != h)) { 15641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // ERROR: MJPEG frame has unexpected dimensions 15741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.UnloadFrame(); 15841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return 1; // runtime failure 15941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 16041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (ret) { 16141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420Buffers bufs = { y, y_stride, u, u_stride, v, v_stride, dw, dh }; 16241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV420 16341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (mjpeg_decoder.GetColorSpace() == 16441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 16541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 16641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 2 && 16741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 2 && 16841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 16941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 17041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 17141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 17241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegCopyI420, &bufs, dw, dh); 17341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV422 17441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 17541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 17641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 17741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 17841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 2 && 17941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 18041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 18141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 18241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 18341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToI420, &bufs, dw, dh); 18441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV444 18541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 18641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 18741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 18841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 18941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 1 && 19041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 19141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 19241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 19341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 19441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToI420, &bufs, dw, dh); 19541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV411 19641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 19741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 19841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 19941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 20041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 4 && 20141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 20241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 20341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 20441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 20541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI411ToI420, &bufs, dw, dh); 20641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV400 20741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 20841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceGrayscale && 20941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 1 && 21041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 21141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 1) { 21241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToI420, &bufs, dw, dh); 21341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else { 21441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // TODO(fbarchard): Implement conversion for any other colorspace/sample 21541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // factors that occur in practice. 411 is supported by libjpeg 21641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // ERROR: Unable to convert MJPEG frame because format is not supported 21741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.UnloadFrame(); 21841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return 1; 21941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 22041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 22141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return ret ? 0 : 1; 22241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 22341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 22441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef HAVE_JPEG 22541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstruct ARGBBuffers { 22641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* argb; 22741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int argb_stride; 22841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int w; 22941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int h; 23041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}; 23141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 23241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI420ToARGB(void* opaque, 23341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 23441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 23541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 23641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ARGBBuffers* dest = (ARGBBuffers*)(opaque); 23741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I420ToARGB(data[0], strides[0], 23841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 23941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 24041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb, dest->argb_stride, 24141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 24241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb += rows * dest->argb_stride; 24341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 24441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 24541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 24641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI422ToARGB(void* opaque, 24741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 24841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 24941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 25041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ARGBBuffers* dest = (ARGBBuffers*)(opaque); 25141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I422ToARGB(data[0], strides[0], 25241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 25341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 25441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb, dest->argb_stride, 25541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 25641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb += rows * dest->argb_stride; 25741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 25841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 25941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 26041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI444ToARGB(void* opaque, 26141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 26241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 26341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 26441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ARGBBuffers* dest = (ARGBBuffers*)(opaque); 26541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I444ToARGB(data[0], strides[0], 26641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 26741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 26841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb, dest->argb_stride, 26941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 27041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb += rows * dest->argb_stride; 27141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 27241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 27341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 27441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI411ToARGB(void* opaque, 27541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 27641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 27741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 27841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ARGBBuffers* dest = (ARGBBuffers*)(opaque); 27941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I411ToARGB(data[0], strides[0], 28041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[1], strides[1], 28141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org data[2], strides[2], 28241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb, dest->argb_stride, 28341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 28441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb += rows * dest->argb_stride; 28541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 28641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 28741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 28841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic void JpegI400ToARGB(void* opaque, 28941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const uint8* const* data, 29041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org const int* strides, 29141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int rows) { 29241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ARGBBuffers* dest = (ARGBBuffers*)(opaque); 29341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org I400ToARGB(data[0], strides[0], 29441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb, dest->argb_stride, 29541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->w, rows); 29641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->argb += rows * dest->argb_stride; 29741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org dest->h -= rows; 29841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 29941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 30041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// MJPG (Motion JPeg) to ARGB 30141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// TODO(fbarchard): review w and h requirement. dw and dh may be enough. 30241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgLIBYUV_API 30341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgint MJPGToARGB(const uint8* sample, 30441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org size_t sample_size, 30541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org uint8* argb, int argb_stride, 30641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int w, int h, 30741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int dw, int dh) { 30841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (sample_size == kUnknownDataSize) { 30941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // ERROR: MJPEG frame size unknown 31041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return -1; 31141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 31241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 31341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // TODO(fbarchard): Port MJpeg to C. 31441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder mjpeg_decoder; 31541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size); 31641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (ret && (mjpeg_decoder.GetWidth() != w || 31741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHeight() != h)) { 31841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // ERROR: MJPEG frame has unexpected dimensions 31941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.UnloadFrame(); 32041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return 1; // runtime failure 32141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 32241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (ret) { 32341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ARGBBuffers bufs = { argb, argb_stride, dw, dh }; 32441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV420 32541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org if (mjpeg_decoder.GetColorSpace() == 32641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 32741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 32841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 2 && 32941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 2 && 33041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 33141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 33241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 33341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 33441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToARGB, &bufs, dw, dh); 33541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV422 33641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 33741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 33841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 33941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 34041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 2 && 34141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 34241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 34341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 34441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 34541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToARGB, &bufs, dw, dh); 34641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV444 34741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 34841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 34941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 35041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 35141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 1 && 35241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 35341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 35441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 35541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 35641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToARGB, &bufs, dw, dh); 35741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV411 35841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 35941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceYCbCr && 36041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 3 && 36141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 36241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 4 && 36341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(1) == 1 && 36441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(1) == 1 && 36541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(2) == 1 && 36641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(2) == 1) { 36741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI411ToARGB, &bufs, dw, dh); 36841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // YUV400 36941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else if (mjpeg_decoder.GetColorSpace() == 37041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org MJpegDecoder::kColorSpaceGrayscale && 37141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetNumComponents() == 1 && 37241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetVertSampFactor(0) == 1 && 37341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.GetHorizSampFactor(0) == 1) { 37441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToARGB, &bufs, dw, dh); 37541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } else { 37641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // TODO(fbarchard): Implement conversion for any other colorspace/sample 37741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // factors that occur in practice. 411 is supported by libjpeg 37841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org // ERROR: Unable to convert MJPEG frame because format is not supported 37941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org mjpeg_decoder.UnloadFrame(); 38041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return 1; 38141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 38241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org } 38341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org return ret ? 0 : 1; 38441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} 38541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif 38641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 38741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif 38841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org 38941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#ifdef __cplusplus 39041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} // extern "C" 39141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org} // namespace libyuv 39241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#endif 393