mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-06 16:56:55 +08:00
ConvertToARGB
BUG=none TEST=none Review URL: https://webrtc-codereview.appspot.com/673007 git-svn-id: http://libyuv.googlecode.com/svn/trunk@297 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
a537bbdc59
commit
c4500c9f79
@ -1,6 +1,6 @@
|
|||||||
Name: libyuv
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 296
|
Version: 297
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -14,6 +14,7 @@
|
|||||||
#include "libyuv/basic_types.h"
|
#include "libyuv/basic_types.h"
|
||||||
#include "libyuv/compare.h"
|
#include "libyuv/compare.h"
|
||||||
#include "libyuv/convert.h"
|
#include "libyuv/convert.h"
|
||||||
|
#include "libyuv/convert_argb.h"
|
||||||
#include "libyuv/convert_from.h"
|
#include "libyuv/convert_from.h"
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
#include "libyuv/format_conversion.h"
|
||||||
|
|||||||
199
include/libyuv/convert_argb.h
Normal file
199
include/libyuv/convert_argb.h
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INCLUDE_LIBYUV_CONVERT_ARGB_H_ // NOLINT
|
||||||
|
#define INCLUDE_LIBYUV_CONVERT_ARGB_H_
|
||||||
|
|
||||||
|
#include "libyuv/basic_types.h"
|
||||||
|
// TODO(fbarchard): Remove the following headers includes
|
||||||
|
#include "libyuv/convert_from.h"
|
||||||
|
#include "libyuv/planar_functions.h"
|
||||||
|
#include "libyuv/rotate.h"
|
||||||
|
|
||||||
|
// TODO(fbarchard): This set of functions should exactly match convert.h
|
||||||
|
// Add missing V210 and Q420.
|
||||||
|
// TODO(fbarchard): Add tests. Create random content of right size and convert
|
||||||
|
// with C vs Opt and or to I420 and compare.
|
||||||
|
// TODO(fbarchard): Some of these functions lack parameter setting.
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
namespace libyuv {
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Alias
|
||||||
|
#define ARGBToARGB ARGBCopy
|
||||||
|
|
||||||
|
// Copy ARGB to ARGB.
|
||||||
|
int ARGBCopy(const uint8* src_argb, int src_stride_argb,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I420 to ARGB.
|
||||||
|
int I420ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I422 to ARGB.
|
||||||
|
int I422ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I444 to ARGB.
|
||||||
|
int I444ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I411 to ARGB.
|
||||||
|
int I411ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_u, int src_stride_u,
|
||||||
|
const uint8* src_v, int src_stride_v,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I400 (grey) to ARGB.
|
||||||
|
int I400ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert I400 to ARGB. Reverse of ARGBToI400.
|
||||||
|
int I400ToARGB_Reference(const uint8* src_y, int src_stride_y,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert NV12 to ARGB.
|
||||||
|
int NV12ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_uv, int src_stride_uv,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert NV21 to ARGB.
|
||||||
|
int NV21ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
const uint8* src_vu, int src_stride_vu,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert M420 to ARGB.
|
||||||
|
int M420ToARGB(const uint8* src_m420, int src_stride_m420,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// TODO(fbarchard): Convert Q420 to ARGB.
|
||||||
|
// int Q420ToARGB(const uint8* src_y, int src_stride_y,
|
||||||
|
// const uint8* src_yuy2, int src_stride_yuy2,
|
||||||
|
// uint8* dst_argb, int dst_stride_argb,
|
||||||
|
// int width, int height);
|
||||||
|
|
||||||
|
// Convert YUY2 to ARGB.
|
||||||
|
int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Convert UYVY to ARGB.
|
||||||
|
int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// TODO(fbarchard): Convert V210 to ARGB.
|
||||||
|
// int V210ToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
||||||
|
// uint8* dst_argb, int dst_stride_argb,
|
||||||
|
// int width, int height);
|
||||||
|
|
||||||
|
// BGRA little endian (argb in memory) to ARGB
|
||||||
|
int BGRAToARGB(const uint8* src_frame, int src_stride_frame,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// ABGR little endian (rgba in memory) to ARGB
|
||||||
|
int ABGRToARGB(const uint8* src_frame, int src_stride_frame,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// Deprecated function name.
|
||||||
|
#define BG24ToARGB RGB24ToARGB
|
||||||
|
|
||||||
|
// RGB little endian (bgr in memory) to ARGB
|
||||||
|
int RGB24ToARGB(const uint8* src_frame, int src_stride_frame,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// RGB big endian (rgb in memory) to ARGB
|
||||||
|
int RAWToARGB(const uint8* src_frame, int src_stride_frame,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// RGB16 (RGBP fourcc) little endian to ARGB
|
||||||
|
int RGB565ToARGB(const uint8* src_frame, int src_stride_frame,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// RGB15 (RGBO fourcc) little endian to ARGB
|
||||||
|
int ARGB1555ToARGB(const uint8* src_frame, int src_stride_frame,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
// RGB12 (R444 fourcc) little endian to ARGB
|
||||||
|
int ARGB4444ToARGB(const uint8* src_frame, int src_stride_frame,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
#ifdef HAVE_JPEG
|
||||||
|
// src_width/height provided by capture
|
||||||
|
// dst_width/height for clipping determine final size.
|
||||||
|
int MJPGToARGB(const uint8* sample, size_t sample_size,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int src_width, int src_height,
|
||||||
|
int dst_width, int dst_height);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Note Bayer formats (BGGR) to ARGB are in format_conversion.h
|
||||||
|
|
||||||
|
// Convert camera sample to ARGB with cropping, rotation and vertical flip.
|
||||||
|
// "src_size" is needed to parse MJPG.
|
||||||
|
// "dst_stride_argb" number of bytes in a row of the dst_argb plane.
|
||||||
|
// Normally this would be the same as dst_width, with recommended alignment
|
||||||
|
// to 16 bytes for better efficiency.
|
||||||
|
// If rotation of 90 or 270 is used, stride is affected. The caller should
|
||||||
|
// allocate the I420 buffer according to rotation.
|
||||||
|
// "dst_stride_u" number of bytes in a row of the dst_u plane.
|
||||||
|
// Normally this would be the same as (dst_width + 1) / 2, with
|
||||||
|
// recommended alignment to 16 bytes for better efficiency.
|
||||||
|
// If rotation of 90 or 270 is used, stride is affected.
|
||||||
|
// "crop_x" and "crop_y" are starting position for cropping.
|
||||||
|
// To center, crop_x = (src_width - dst_width) / 2
|
||||||
|
// crop_y = (src_height - dst_height) / 2
|
||||||
|
// "src_width" / "src_height" is size of src_frame in pixels.
|
||||||
|
// "src_height" can be negative indicating a vertically flipped image source.
|
||||||
|
// "dst_width" / "dst_height" is size of destination to crop to.
|
||||||
|
// Must be less than or equal to src_width/src_height
|
||||||
|
// Cropping parameters are pre-rotation.
|
||||||
|
// "rotation" can be 0, 90, 180 or 270.
|
||||||
|
// "format" is a fourcc. ie 'I420', 'YUY2'
|
||||||
|
// Returns 0 for successful; -1 for invalid parameter. Non-zero for failure.
|
||||||
|
int ConvertToARGB(const uint8* src_frame, size_t src_size,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int crop_x, int crop_y,
|
||||||
|
int src_width, int src_height,
|
||||||
|
int dst_width, int dst_height,
|
||||||
|
RotationMode rotation,
|
||||||
|
uint32 format);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
} // namespace libyuv
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // INCLUDE_LIBYUV_CONVERT_ARGB_H_ NOLINT
|
||||||
@ -52,23 +52,6 @@ int ARGBMirror(const uint8* src_argb, int src_stride_argb,
|
|||||||
uint8* dst_argb, int dst_stride_argb,
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
||||||
// Convert NV12 to ARGB.
|
|
||||||
int NV12ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_uv, int src_stride_uv,
|
|
||||||
uint8* dst_frame, int dst_stride_frame,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert NV21 to ARGB.
|
|
||||||
int NV21ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_vu, int src_stride_vu,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert M420 to ARGB.
|
|
||||||
int M420ToARGB(const uint8* src_m420, int src_stride_m420,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert NV12 to RGB565.
|
// Convert NV12 to RGB565.
|
||||||
int NV12ToRGB565(const uint8* src_y, int src_stride_y,
|
int NV12ToRGB565(const uint8* src_y, int src_stride_y,
|
||||||
const uint8* src_uv, int src_stride_uv,
|
const uint8* src_uv, int src_stride_uv,
|
||||||
@ -81,74 +64,9 @@ int NV21ToRGB565(const uint8* src_y, int src_stride_y,
|
|||||||
uint8* dst_rgb565, int dst_stride_rgb565,
|
uint8* dst_rgb565, int dst_stride_rgb565,
|
||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
||||||
// Convert YUY2 to ARGB.
|
|
||||||
int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert UYVY to ARGB.
|
|
||||||
int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert I444 to ARGB.
|
|
||||||
int I444ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_u, int src_stride_u,
|
|
||||||
const uint8* src_v, int src_stride_v,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert I422 to ARGB.
|
|
||||||
int I422ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_u, int src_stride_u,
|
|
||||||
const uint8* src_v, int src_stride_v,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert I411 to ARGB.
|
|
||||||
int I411ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_u, int src_stride_u,
|
|
||||||
const uint8* src_v, int src_stride_v,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert I400 to ARGB.
|
|
||||||
int I400ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert I400 to ARGB. Reverse of ARGBToI400.
|
|
||||||
int I400ToARGB_Reference(const uint8* src_y, int src_stride_y,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert RAW to ARGB.
|
|
||||||
int RAWToARGB(const uint8* src_raw, int src_stride_raw,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Deprecated function name.
|
|
||||||
#define BG24ToARGB RGB24ToARGB
|
|
||||||
|
|
||||||
// Convert RGB24 to ARGB.
|
|
||||||
int RGB24ToARGB(const uint8* src_bg24, int src_stride_bg24,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert ABGR to ARGB. Also used for ARGB to ABGR.
|
|
||||||
int ABGRToARGB(const uint8* src_abgr, int src_stride_abgr,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Aliases.
|
// Aliases.
|
||||||
#define ARGBToBGRA BGRAToARGB
|
#define ARGBToBGRA BGRAToARGB
|
||||||
#define ARGBToABGR ABGRToARGB
|
#define ARGBToABGR ABGRToARGB
|
||||||
#define ARGBToARGB ARGBCopy
|
|
||||||
|
|
||||||
// Convert BGRA to ARGB. Also used for ARGB to BGRA.
|
|
||||||
int BGRAToARGB(const uint8* src_bgra, int src_stride_bgra,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert ARGB To RGB24.
|
// Convert ARGB To RGB24.
|
||||||
int ARGBToRGB24(const uint8* src_argb, int src_stride_argb,
|
int ARGBToRGB24(const uint8* src_argb, int src_stride_argb,
|
||||||
@ -175,21 +93,6 @@ int ARGBToARGB4444(const uint8* src_argb, int src_stride_argb,
|
|||||||
uint8* dst_argb4444, int dst_stride_argb4444,
|
uint8* dst_argb4444, int dst_stride_argb4444,
|
||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
||||||
// Convert RGB565 To ARGB.
|
|
||||||
int RGB565ToARGB(const uint8* src_rgb565, int src_stride_rgb565,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert ARGB1555 To ARGB.
|
|
||||||
int ARGB1555ToARGB(const uint8* src_argb1555, int src_stride_argb1555,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert ARGB4444 To ARGB.
|
|
||||||
int ARGB4444ToARGB(const uint8* src_argb4444, int src_stride_argb4444,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Convert ARGB to I400.
|
// Convert ARGB to I400.
|
||||||
int ARGBToI400(const uint8* src_argb, int src_stride_argb,
|
int ARGBToI400(const uint8* src_argb, int src_stride_argb,
|
||||||
uint8* dst_y, int dst_stride_y,
|
uint8* dst_y, int dst_stride_y,
|
||||||
@ -285,6 +188,11 @@ int ARGBUnattenuate(const uint8* src_argb, int src_stride_argb,
|
|||||||
uint8* dst_argb, int dst_stride_argb,
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
||||||
|
// Multiply ARGB image by ARGB value.
|
||||||
|
int ARGBShade(const uint8* src_argb, int src_stride_argb,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height, uint32 value);
|
||||||
|
|
||||||
// Convert MJPG to ARGB.
|
// Convert MJPG to ARGB.
|
||||||
int MJPGToARGB(const uint8* sample, size_t sample_size,
|
int MJPGToARGB(const uint8* sample, size_t sample_size,
|
||||||
uint8* argb, int argb_stride,
|
uint8* argb, int argb_stride,
|
||||||
|
|||||||
@ -18,14 +18,14 @@ namespace libyuv {
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Supported rotation
|
// Supported rotation.
|
||||||
enum RotationMode {
|
enum RotationMode {
|
||||||
kRotate0 = 0, // No rotation
|
kRotate0 = 0, // No rotation.
|
||||||
kRotate90 = 90, // Rotate 90 degrees clockwise
|
kRotate90 = 90, // Rotate 90 degrees clockwise.
|
||||||
kRotate180 = 180, // Rotate 180 degrees
|
kRotate180 = 180, // Rotate 180 degrees.
|
||||||
kRotate270 = 270, // Rotate 270 degrees clockwise
|
kRotate270 = 270, // Rotate 270 degrees clockwise.
|
||||||
|
|
||||||
// Deprecated
|
// Deprecated.
|
||||||
kRotateNone = 0,
|
kRotateNone = 0,
|
||||||
kRotateClockwise = 90,
|
kRotateClockwise = 90,
|
||||||
kRotateCounterClockwise = 270,
|
kRotateCounterClockwise = 270,
|
||||||
|
|||||||
@ -11,6 +11,6 @@
|
|||||||
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
#ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT
|
||||||
#define INCLUDE_LIBYUV_VERSION_H_
|
#define INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|
||||||
#define LIBYUV_VERSION 296
|
#define LIBYUV_VERSION 297
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
||||||
|
|||||||
@ -35,7 +35,7 @@ extern "C" {
|
|||||||
// http://www.fourcc.org/yuv.php
|
// http://www.fourcc.org/yuv.php
|
||||||
// http://v4l2spec.bytesex.org/spec/book1.htm
|
// http://v4l2spec.bytesex.org/spec/book1.htm
|
||||||
// http://developer.apple.com/quicktime/icefloe/dispatch020.html
|
// http://developer.apple.com/quicktime/icefloe/dispatch020.html
|
||||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx#nv12
|
// http://msdn.microsoft.com/library/windows/desktop/dd206750.aspx#nv12
|
||||||
|
|
||||||
enum FourCC {
|
enum FourCC {
|
||||||
// Canonical fourcc codes used in our code.
|
// Canonical fourcc codes used in our code.
|
||||||
@ -56,9 +56,9 @@ enum FourCC {
|
|||||||
FOURCC_ABGR = FOURCC('A', 'B', 'G', 'R'),
|
FOURCC_ABGR = FOURCC('A', 'B', 'G', 'R'),
|
||||||
FOURCC_BGRA = FOURCC('B', 'G', 'R', 'A'),
|
FOURCC_BGRA = FOURCC('B', 'G', 'R', 'A'),
|
||||||
FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'),
|
FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'),
|
||||||
FOURCC_RGBP = FOURCC('R', 'G', 'B', 'P'), // bgr565
|
FOURCC_RGBP = FOURCC('R', 'G', 'B', 'P'), // bgr565.
|
||||||
FOURCC_RGBO = FOURCC('R', 'G', 'B', 'O'), // abgr1555
|
FOURCC_RGBO = FOURCC('R', 'G', 'B', 'O'), // abgr1555.
|
||||||
FOURCC_R444 = FOURCC('R', '4', '4', '4'), // argb4444
|
FOURCC_R444 = FOURCC('R', '4', '4', '4'), // argb4444.
|
||||||
FOURCC_MJPG = FOURCC('M', 'J', 'P', 'G'),
|
FOURCC_MJPG = FOURCC('M', 'J', 'P', 'G'),
|
||||||
FOURCC_RAW = FOURCC('r', 'a', 'w', ' '),
|
FOURCC_RAW = FOURCC('r', 'a', 'w', ' '),
|
||||||
FOURCC_NV21 = FOURCC('N', 'V', '2', '1'),
|
FOURCC_NV21 = FOURCC('N', 'V', '2', '1'),
|
||||||
@ -72,19 +72,19 @@ enum FourCC {
|
|||||||
|
|
||||||
// Aliases for canonical fourcc codes, replaced with their canonical
|
// Aliases for canonical fourcc codes, replaced with their canonical
|
||||||
// equivalents by CanonicalFourCC().
|
// equivalents by CanonicalFourCC().
|
||||||
FOURCC_IYUV = FOURCC('I', 'Y', 'U', 'V'), // Alias for I420
|
FOURCC_IYUV = FOURCC('I', 'Y', 'U', 'V'), // Alias for I420.
|
||||||
FOURCC_YU12 = FOURCC('Y', 'U', '1', '2'), // Alias for I420
|
FOURCC_YU12 = FOURCC('Y', 'U', '1', '2'), // Alias for I420.
|
||||||
FOURCC_YU16 = FOURCC('Y', 'U', '1', '6'), // Alias for I422
|
FOURCC_YU16 = FOURCC('Y', 'U', '1', '6'), // Alias for I422.
|
||||||
FOURCC_YU24 = FOURCC('Y', 'U', '2', '4'), // Alias for I444
|
FOURCC_YU24 = FOURCC('Y', 'U', '2', '4'), // Alias for I444.
|
||||||
FOURCC_YUYV = FOURCC('Y', 'U', 'Y', 'V'), // Alias for YUY2
|
FOURCC_YUYV = FOURCC('Y', 'U', 'Y', 'V'), // Alias for YUY2.
|
||||||
FOURCC_YUVS = FOURCC('y', 'u', 'v', 's'), // Alias for YUY2 on Mac
|
FOURCC_YUVS = FOURCC('y', 'u', 'v', 's'), // Alias for YUY2 on Mac.
|
||||||
FOURCC_HDYC = FOURCC('H', 'D', 'Y', 'C'), // Alias for UYVY
|
FOURCC_HDYC = FOURCC('H', 'D', 'Y', 'C'), // Alias for UYVY.
|
||||||
FOURCC_2VUY = FOURCC('2', 'v', 'u', 'y'), // Alias for UYVY
|
FOURCC_2VUY = FOURCC('2', 'v', 'u', 'y'), // Alias for UYVY.
|
||||||
FOURCC_JPEG = FOURCC('J', 'P', 'E', 'G'), // Alias for MJPG
|
FOURCC_JPEG = FOURCC('J', 'P', 'E', 'G'), // Alias for MJPG.
|
||||||
FOURCC_DMB1 = FOURCC('d', 'm', 'b', '1'), // Alias for MJPG on Mac
|
FOURCC_DMB1 = FOURCC('d', 'm', 'b', '1'), // Alias for MJPG on Mac.
|
||||||
FOURCC_BA81 = FOURCC('B', 'A', '8', '1'), // Alias for BGGR
|
FOURCC_BA81 = FOURCC('B', 'A', '8', '1'), // Alias for BGGR.
|
||||||
FOURCC_RGB3 = FOURCC('R', 'G', 'B', '3'), // Alias for RAW
|
FOURCC_RGB3 = FOURCC('R', 'G', 'B', '3'), // Alias for RAW.
|
||||||
FOURCC_BGR3 = FOURCC('B', 'G', 'R', '3'), // Alias for 24BG
|
FOURCC_BGR3 = FOURCC('B', 'G', 'R', '3'), // Alias for 24BG.
|
||||||
|
|
||||||
// Match any fourcc.
|
// Match any fourcc.
|
||||||
FOURCC_ANY = 0xFFFFFFFF,
|
FOURCC_ANY = 0xFFFFFFFF,
|
||||||
|
|||||||
@ -33,6 +33,7 @@
|
|||||||
'include/libyuv/basic_types.h',
|
'include/libyuv/basic_types.h',
|
||||||
'include/libyuv/compare.h',
|
'include/libyuv/compare.h',
|
||||||
'include/libyuv/convert.h',
|
'include/libyuv/convert.h',
|
||||||
|
'include/libyuv/convert_argb.h',
|
||||||
'include/libyuv/convert_from.h',
|
'include/libyuv/convert_from.h',
|
||||||
'include/libyuv/cpu_id.h',
|
'include/libyuv/cpu_id.h',
|
||||||
'include/libyuv/format_conversion.h',
|
'include/libyuv/format_conversion.h',
|
||||||
@ -52,6 +53,7 @@
|
|||||||
# sources.
|
# sources.
|
||||||
'source/compare.cc',
|
'source/compare.cc',
|
||||||
'source/convert.cc',
|
'source/convert.cc',
|
||||||
|
'source/convert_argb.cc',
|
||||||
'source/convert_from.cc',
|
'source/convert_from.cc',
|
||||||
'source/cpu_id.cc',
|
'source/cpu_id.cc',
|
||||||
'source/format_conversion.cc',
|
'source/format_conversion.cc',
|
||||||
|
|||||||
@ -784,14 +784,12 @@ int UYVYToI420(const uint8* src_uyvy, int src_stride_uyvy,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// gcc provided macros
|
// Visual C for x86 defines these.
|
||||||
#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
|
#if defined(_M_X64) || defined(_M_IX86)
|
||||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
#define LIBYUV_LITTLE_ENDIAN
|
||||||
#define INCLUDE_LIBYUV_LITTLE_ENDIAN
|
// GCC provided macros.
|
||||||
#endif
|
#elif __BYTE_ORDER == __ORDER_LITTLE_ENDIAN__ || __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
// Visual C for x86 defines these
|
#define LIBYUV_LITTLE_ENDIAN
|
||||||
#elif defined(_M_X64) || defined(_M_IX86)
|
|
||||||
#define INCLUDE_LIBYUV_LITTLE_ENDIAN
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LIBYUV_LITTLE_ENDIAN
|
#ifdef LIBYUV_LITTLE_ENDIAN
|
||||||
|
|||||||
1126
source/convert_argb.cc
Normal file
1126
source/convert_argb.cc
Normal file
File diff suppressed because it is too large
Load Diff
@ -401,14 +401,12 @@ static void I42xToUYVYRow_C(const uint8* src_y,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// gcc provided macros
|
// Visual C for x86 defines these.
|
||||||
#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
|
#if defined(_M_X64) || defined(_M_IX86)
|
||||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
#define LIBYUV_LITTLE_ENDIAN
|
||||||
#define INCLUDE_LIBYUV_LITTLE_ENDIAN
|
// GCC provided macros.
|
||||||
#endif
|
#elif __BYTE_ORDER == __ORDER_LITTLE_ENDIAN__ || __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
// Visual C for x86 defines these
|
#define LIBYUV_LITTLE_ENDIAN
|
||||||
#elif defined(_M_X64) || defined(_M_IX86)
|
|
||||||
#define INCLUDE_LIBYUV_LITTLE_ENDIAN
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LIBYUV_LITTLE_ENDIAN
|
#ifdef LIBYUV_LITTLE_ENDIAN
|
||||||
|
|||||||
@ -174,27 +174,6 @@ int ARGBMirror(const uint8* src_argb, int src_stride_argb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy ARGB with optional flipping
|
|
||||||
int ARGBCopy(const uint8* src_argb, int src_stride_argb,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (!src_argb ||
|
|
||||||
!dst_argb ||
|
|
||||||
width <= 0 || height == 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_argb = src_argb + (height - 1) * src_stride_argb;
|
|
||||||
src_stride_argb = -src_stride_argb;
|
|
||||||
}
|
|
||||||
|
|
||||||
CopyPlane(src_argb, src_stride_argb, dst_argb, dst_stride_argb,
|
|
||||||
width * 4, height);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a blender that optimized for the CPU, alignment and pixel count.
|
// Get a blender that optimized for the CPU, alignment and pixel count.
|
||||||
// As there are 6 blenders to choose from, the caller should try to use
|
// As there are 6 blenders to choose from, the caller should try to use
|
||||||
// the same blend function for all pixels if possible.
|
// the same blend function for all pixels if possible.
|
||||||
@ -241,188 +220,6 @@ int ARGBBlend(const uint8* src_argb0, int src_stride_argb0,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert I444 to ARGB.
|
|
||||||
int I444ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_u, int src_stride_u,
|
|
||||||
const uint8* src_v, int src_stride_v,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
void (*I444ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* u_buf,
|
|
||||||
const uint8* v_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = I444ToARGBRow_C;
|
|
||||||
#if defined(HAS_I444TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
I444ToARGBRow = I444ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
I444ToARGBRow = I444ToARGBRow_Unaligned_SSSE3;
|
|
||||||
if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
I444ToARGBRow = I444ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
I444ToARGBRow(src_y, src_u, src_v, dst_argb, width);
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
src_y += src_stride_y;
|
|
||||||
src_u += src_stride_u;
|
|
||||||
src_v += src_stride_v;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert I422 to ARGB.
|
|
||||||
int I422ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_u, int src_stride_u,
|
|
||||||
const uint8* src_v, int src_stride_v,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
void (*I422ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* u_buf,
|
|
||||||
const uint8* v_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = I422ToARGBRow_C;
|
|
||||||
#if defined(HAS_I422TOARGBROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(HAS_I422TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Unaligned_SSSE3;
|
|
||||||
if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
I422ToARGBRow(src_y, src_u, src_v, dst_argb, width);
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
src_y += src_stride_y;
|
|
||||||
src_u += src_stride_u;
|
|
||||||
src_v += src_stride_v;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert I411 to ARGB.
|
|
||||||
int I411ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_u, int src_stride_u,
|
|
||||||
const uint8* src_v, int src_stride_v,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
void (*I411ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* u_buf,
|
|
||||||
const uint8* v_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = I411ToARGBRow_C;
|
|
||||||
#if defined(HAS_I411TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
I411ToARGBRow = I411ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
I411ToARGBRow = I411ToARGBRow_Unaligned_SSSE3;
|
|
||||||
if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
I411ToARGBRow = I411ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
I411ToARGBRow(src_y, src_u, src_v, dst_argb, width);
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
src_y += src_stride_y;
|
|
||||||
src_u += src_stride_u;
|
|
||||||
src_v += src_stride_v;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Convert I400 to ARGB.
|
|
||||||
int I400ToARGB_Reference(const uint8* src_y, int src_stride_y,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
void (*YToARGBRow)(const uint8* y_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = YToARGBRow_C;
|
|
||||||
#if defined(HAS_YTOARGBROW_SSE2)
|
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
|
||||||
IS_ALIGNED(width, 8) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
YToARGBRow = YToARGBRow_SSE2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
YToARGBRow(src_y, dst_argb, width);
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
src_y += src_stride_y;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert I400 to ARGB.
|
|
||||||
int I400ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_y = src_y + (height - 1) * src_stride_y;
|
|
||||||
src_stride_y = -src_stride_y;
|
|
||||||
}
|
|
||||||
void (*I400ToARGBRow)(const uint8* src_y, uint8* dst_argb, int pix) =
|
|
||||||
I400ToARGBRow_C;
|
|
||||||
#if defined(HAS_I400TOARGBROW_SSE2)
|
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
|
||||||
IS_ALIGNED(width, 8) &&
|
|
||||||
IS_ALIGNED(src_y, 8) && IS_ALIGNED(src_stride_y, 8) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
I400ToARGBRow = I400ToARGBRow_SSE2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
I400ToARGBRow(src_y, dst_argb, width);
|
|
||||||
src_y += src_stride_y;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert ARGB to I400.
|
// Convert ARGB to I400.
|
||||||
int ARGBToI400(const uint8* src_argb, int src_stride_argb,
|
int ARGBToI400(const uint8* src_argb, int src_stride_argb,
|
||||||
uint8* dst_y, int dst_stride_y,
|
uint8* dst_y, int dst_stride_y,
|
||||||
@ -497,196 +294,6 @@ int ARGBToI422(const uint8* src_argb, int src_stride_argb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ABGRToARGB(const uint8* src_abgr, int src_stride_abgr,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_abgr = src_abgr + (height - 1) * src_stride_abgr;
|
|
||||||
src_stride_abgr = -src_stride_abgr;
|
|
||||||
}
|
|
||||||
void (*ABGRToARGBRow)(const uint8* src_abgr, uint8* dst_argb, int pix) =
|
|
||||||
ABGRToARGBRow_C;
|
|
||||||
#if defined(HAS_ABGRTOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
|
||||||
IS_ALIGNED(width, 4) &&
|
|
||||||
IS_ALIGNED(src_abgr, 16) && IS_ALIGNED(src_stride_abgr, 16) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
ABGRToARGBRow = ABGRToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
ABGRToARGBRow(src_abgr, dst_argb, width);
|
|
||||||
src_abgr += src_stride_abgr;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert BGRA to ARGB.
|
|
||||||
int BGRAToARGB(const uint8* src_bgra, int src_stride_bgra,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_bgra = src_bgra + (height - 1) * src_stride_bgra;
|
|
||||||
src_stride_bgra = -src_stride_bgra;
|
|
||||||
}
|
|
||||||
void (*BGRAToARGBRow)(const uint8* src_bgra, uint8* dst_argb, int pix) =
|
|
||||||
BGRAToARGBRow_C;
|
|
||||||
#if defined(HAS_BGRATOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
|
||||||
IS_ALIGNED(width, 4) &&
|
|
||||||
IS_ALIGNED(src_bgra, 16) && IS_ALIGNED(src_stride_bgra, 16) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
BGRAToARGBRow = BGRAToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
BGRAToARGBRow(src_bgra, dst_argb, width);
|
|
||||||
src_bgra += src_stride_bgra;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert RAW to ARGB.
|
|
||||||
int RAWToARGB(const uint8* src_raw, int src_stride_raw,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_raw = src_raw + (height - 1) * src_stride_raw;
|
|
||||||
src_stride_raw = -src_stride_raw;
|
|
||||||
}
|
|
||||||
void (*RAWToARGBRow)(const uint8* src_raw, uint8* dst_argb, int pix) =
|
|
||||||
RAWToARGBRow_C;
|
|
||||||
#if defined(HAS_RAWTOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
|
||||||
IS_ALIGNED(width, 16) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
RAWToARGBRow = RAWToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
RAWToARGBRow(src_raw, dst_argb, width);
|
|
||||||
src_raw += src_stride_raw;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert RGB24 to ARGB.
|
|
||||||
int RGB24ToARGB(const uint8* src_rgb24, int src_stride_rgb24,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_rgb24 = src_rgb24 + (height - 1) * src_stride_rgb24;
|
|
||||||
src_stride_rgb24 = -src_stride_rgb24;
|
|
||||||
}
|
|
||||||
void (*RGB24ToARGBRow)(const uint8* src_rgb24, uint8* dst_argb, int pix) =
|
|
||||||
RGB24ToARGBRow_C;
|
|
||||||
#if defined(HAS_RGB24TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) &&
|
|
||||||
IS_ALIGNED(width, 16) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
RGB24ToARGBRow = RGB24ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
RGB24ToARGBRow(src_rgb24, dst_argb, width);
|
|
||||||
src_rgb24 += src_stride_rgb24;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert RGB565 to ARGB.
|
|
||||||
int RGB565ToARGB(const uint8* src_rgb565, int src_stride_rgb565,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_rgb565 = src_rgb565 + (height - 1) * src_stride_rgb565;
|
|
||||||
src_stride_rgb565 = -src_stride_rgb565;
|
|
||||||
}
|
|
||||||
void (*RGB565ToARGBRow)(const uint8* src_rgb565, uint8* dst_argb, int pix) =
|
|
||||||
RGB565ToARGBRow_C;
|
|
||||||
#if defined(HAS_RGB565TOARGBROW_SSE2)
|
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
|
||||||
IS_ALIGNED(width, 8) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
RGB565ToARGBRow = RGB565ToARGBRow_SSE2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
RGB565ToARGBRow(src_rgb565, dst_argb, width);
|
|
||||||
src_rgb565 += src_stride_rgb565;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert ARGB1555 to ARGB.
|
|
||||||
int ARGB1555ToARGB(const uint8* src_argb1555, int src_stride_argb1555,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_argb1555 = src_argb1555 + (height - 1) * src_stride_argb1555;
|
|
||||||
src_stride_argb1555 = -src_stride_argb1555;
|
|
||||||
}
|
|
||||||
void (*ARGB1555ToARGBRow)(const uint8* src_argb1555, uint8* dst_argb,
|
|
||||||
int pix) = ARGB1555ToARGBRow_C;
|
|
||||||
#if defined(HAS_ARGB1555TOARGBROW_SSE2)
|
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
|
||||||
IS_ALIGNED(width, 8) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
ARGB1555ToARGBRow = ARGB1555ToARGBRow_SSE2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
ARGB1555ToARGBRow(src_argb1555, dst_argb, width);
|
|
||||||
src_argb1555 += src_stride_argb1555;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert ARGB4444 to ARGB.
|
|
||||||
int ARGB4444ToARGB(const uint8* src_argb4444, int src_stride_argb4444,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_argb4444 = src_argb4444 + (height - 1) * src_stride_argb4444;
|
|
||||||
src_stride_argb4444 = -src_stride_argb4444;
|
|
||||||
}
|
|
||||||
void (*ARGB4444ToARGBRow)(const uint8* src_argb4444, uint8* dst_argb,
|
|
||||||
int pix) = ARGB4444ToARGBRow_C;
|
|
||||||
#if defined(HAS_ARGB4444TOARGBROW_SSE2)
|
|
||||||
if (TestCpuFlag(kCpuHasSSE2) &&
|
|
||||||
IS_ALIGNED(width, 8) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
ARGB4444ToARGBRow = ARGB4444ToARGBRow_SSE2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
ARGB4444ToARGBRow(src_argb4444, dst_argb, width);
|
|
||||||
src_argb4444 += src_stride_argb4444;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert ARGB To RGB24.
|
// Convert ARGB To RGB24.
|
||||||
int ARGBToRGB24(const uint8* src_argb, int src_stride_argb,
|
int ARGBToRGB24(const uint8* src_argb, int src_stride_argb,
|
||||||
uint8* dst_rgb24, int dst_stride_rgb24,
|
uint8* dst_rgb24, int dst_stride_rgb24,
|
||||||
@ -844,121 +451,6 @@ int ARGBToARGB4444(const uint8* src_argb, int src_stride_argb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert NV12 to ARGB.
|
|
||||||
int NV12ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_uv, int src_stride_uv,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
void (*NV12ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* uv_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = NV12ToARGBRow_C;
|
|
||||||
#if defined(HAS_NV12TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
NV12ToARGBRow = NV12ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
NV12ToARGBRow = NV12ToARGBRow_Unaligned_SSSE3;
|
|
||||||
if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
NV12ToARGBRow = NV12ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
NV12ToARGBRow(src_y, src_uv, dst_argb, width);
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
src_y += src_stride_y;
|
|
||||||
if (y & 1) {
|
|
||||||
src_uv += src_stride_uv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert NV21 to ARGB.
|
|
||||||
int NV21ToARGB(const uint8* src_y, int src_stride_y,
|
|
||||||
const uint8* src_vu, int src_stride_vu,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
void (*NV21ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* vu_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = NV21ToARGBRow_C;
|
|
||||||
#if defined(HAS_NV21TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
NV21ToARGBRow = NV21ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
NV21ToARGBRow = NV21ToARGBRow_Unaligned_SSSE3;
|
|
||||||
if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
NV21ToARGBRow = NV21ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
NV21ToARGBRow(src_y, src_vu, dst_argb, width);
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
src_y += src_stride_y;
|
|
||||||
if (y & 1) {
|
|
||||||
src_vu += src_stride_vu;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert M420 to ARGB.
|
|
||||||
int M420ToARGB(const uint8* src_m420, int src_stride_m420,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
void (*NV12ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* uv_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = NV12ToARGBRow_C;
|
|
||||||
#if defined(HAS_NV12TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
NV12ToARGBRow = NV12ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
NV12ToARGBRow = NV12ToARGBRow_Unaligned_SSSE3;
|
|
||||||
if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
NV12ToARGBRow = NV12ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int y = 0; y < height - 1; y += 2) {
|
|
||||||
NV12ToARGBRow(src_m420, src_m420 + src_stride_m420 * 2, dst_argb, width);
|
|
||||||
NV12ToARGBRow(src_m420 + src_stride_m420, src_m420 + src_stride_m420 * 2,
|
|
||||||
dst_argb + dst_stride_argb, width);
|
|
||||||
dst_argb += dst_stride_argb * 2;
|
|
||||||
src_m420 += src_stride_m420 * 3;
|
|
||||||
}
|
|
||||||
if (height & 1) {
|
|
||||||
NV12ToARGBRow(src_m420, src_m420 + src_stride_m420 * 2, dst_argb, width);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert NV12 to RGB565.
|
// Convert NV12 to RGB565.
|
||||||
// TODO(fbarchard): (Re) Optimize for Neon.
|
// TODO(fbarchard): (Re) Optimize for Neon.
|
||||||
int NV12ToRGB565(const uint8* src_y, int src_stride_y,
|
int NV12ToRGB565(const uint8* src_y, int src_stride_y,
|
||||||
@ -1044,138 +536,6 @@ int NV21ToRGB565(const uint8* src_y, int src_stride_y,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert YUY2 to ARGB.
|
|
||||||
int YUY2ToARGB(const uint8* src_yuy2, int src_stride_yuy2,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_yuy2 = src_yuy2 + (height - 1) * src_stride_yuy2;
|
|
||||||
src_stride_yuy2 = -src_stride_yuy2;
|
|
||||||
}
|
|
||||||
void (*YUY2ToUVRow)(const uint8* src_yuy2, int src_stride_yuy2,
|
|
||||||
uint8* dst_u, uint8* dst_v, int pix) = YUY2ToUVRow_C;
|
|
||||||
void (*YUY2ToYRow)(const uint8* src_yuy2,
|
|
||||||
uint8* dst_y, int pix) = YUY2ToYRow_C;
|
|
||||||
#if defined(HAS_YUY2TOYROW_SSE2)
|
|
||||||
if (TestCpuFlag(kCpuHasSSE2)) {
|
|
||||||
if (width > 16) {
|
|
||||||
YUY2ToUVRow = YUY2ToUVRow_Any_SSE2;
|
|
||||||
YUY2ToYRow = YUY2ToYRow_Any_SSE2;
|
|
||||||
}
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
YUY2ToUVRow = YUY2ToUVRow_Unaligned_SSE2;
|
|
||||||
YUY2ToYRow = YUY2ToYRow_Unaligned_SSE2;
|
|
||||||
if (IS_ALIGNED(src_yuy2, 16) && IS_ALIGNED(src_stride_yuy2, 16)) {
|
|
||||||
YUY2ToUVRow = YUY2ToUVRow_SSE2;
|
|
||||||
YUY2ToYRow = YUY2ToYRow_SSE2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
void (*I422ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* u_buf,
|
|
||||||
const uint8* v_buf,
|
|
||||||
uint8* argb_buf,
|
|
||||||
int width) = I422ToARGBRow_C;
|
|
||||||
#if defined(HAS_I422TOARGBROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(HAS_I422TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SIMD_ALIGNED(uint8 rowy[kMaxStride]);
|
|
||||||
SIMD_ALIGNED(uint8 rowu[kMaxStride]);
|
|
||||||
SIMD_ALIGNED(uint8 rowv[kMaxStride]);
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
YUY2ToUVRow(src_yuy2, src_stride_yuy2, rowu, rowv, width);
|
|
||||||
YUY2ToYRow(src_yuy2, rowy, width);
|
|
||||||
I422ToARGBRow(rowy, rowu, rowv, dst_argb, width);
|
|
||||||
src_yuy2 += src_stride_yuy2;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert UYVY to ARGB.
|
|
||||||
int UYVYToARGB(const uint8* src_uyvy, int src_stride_uyvy,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height) {
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_uyvy = src_uyvy + (height - 1) * src_stride_uyvy;
|
|
||||||
src_stride_uyvy = -src_stride_uyvy;
|
|
||||||
}
|
|
||||||
void (*UYVYToUVRow)(const uint8* src_uyvy, int src_stride_uyvy,
|
|
||||||
uint8* dst_u, uint8* dst_v, int pix) = UYVYToUVRow_C;
|
|
||||||
void (*UYVYToYRow)(const uint8* src_uyvy,
|
|
||||||
uint8* dst_y, int pix) = UYVYToYRow_C;
|
|
||||||
#if defined(HAS_UYVYTOYROW_SSE2)
|
|
||||||
if (TestCpuFlag(kCpuHasSSE2)) {
|
|
||||||
if (width > 16) {
|
|
||||||
UYVYToUVRow = UYVYToUVRow_Any_SSE2;
|
|
||||||
UYVYToYRow = UYVYToYRow_Any_SSE2;
|
|
||||||
}
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
UYVYToUVRow = UYVYToUVRow_Unaligned_SSE2;
|
|
||||||
UYVYToYRow = UYVYToYRow_Unaligned_SSE2;
|
|
||||||
if (IS_ALIGNED(src_uyvy, 16) && IS_ALIGNED(src_stride_uyvy, 16)) {
|
|
||||||
UYVYToUVRow = UYVYToUVRow_SSE2;
|
|
||||||
UYVYToYRow = UYVYToYRow_SSE2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
void (*I422ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* u_buf,
|
|
||||||
const uint8* v_buf,
|
|
||||||
uint8* argb_buf,
|
|
||||||
int width) = I422ToARGBRow_C;
|
|
||||||
#if defined(HAS_I422TOARGBROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#elif defined(HAS_I422TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8) &&
|
|
||||||
IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SIMD_ALIGNED(uint8 rowy[kMaxStride]);
|
|
||||||
SIMD_ALIGNED(uint8 rowu[kMaxStride]);
|
|
||||||
SIMD_ALIGNED(uint8 rowv[kMaxStride]);
|
|
||||||
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
UYVYToUVRow(src_uyvy, src_stride_uyvy, rowu, rowv, width);
|
|
||||||
UYVYToYRow(src_uyvy, rowy, width);
|
|
||||||
I422ToARGBRow(rowy, rowu, rowv, dst_argb, width);
|
|
||||||
src_uyvy += src_stride_uyvy;
|
|
||||||
dst_argb += dst_stride_argb;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRow8 writes 'count' bytes using a 32 bit value repeated
|
// SetRow8 writes 'count' bytes using a 32 bit value repeated
|
||||||
// SetRow32 writes 'count' words using a 32 bit value repeated
|
// SetRow32 writes 'count' words using a 32 bit value repeated
|
||||||
|
|
||||||
@ -1578,168 +938,6 @@ int ARGBQuantize(uint8* dst_argb, int dst_stride_argb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_JPEG
|
|
||||||
struct ARGBBuffers {
|
|
||||||
uint8* argb;
|
|
||||||
int argb_stride;
|
|
||||||
int w;
|
|
||||||
int h;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void JpegI420ToARGB(void* opaque,
|
|
||||||
const uint8* const* data,
|
|
||||||
const int* strides,
|
|
||||||
int rows) {
|
|
||||||
ARGBBuffers* dest = static_cast<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* const* data,
|
|
||||||
const int* strides,
|
|
||||||
int rows) {
|
|
||||||
ARGBBuffers* dest = static_cast<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* const* data,
|
|
||||||
const int* strides,
|
|
||||||
int rows) {
|
|
||||||
ARGBBuffers* dest = static_cast<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 JpegI411ToARGB(void* opaque,
|
|
||||||
const uint8* const* data,
|
|
||||||
const int* strides,
|
|
||||||
int rows) {
|
|
||||||
ARGBBuffers* dest = static_cast<ARGBBuffers*>(opaque);
|
|
||||||
I411ToARGB(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* const* data,
|
|
||||||
const int* strides,
|
|
||||||
int rows) {
|
|
||||||
ARGBBuffers* dest = static_cast<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 w and h requirement. dw and dh may be enough.
|
|
||||||
int MJPGToARGB(const uint8* sample,
|
|
||||||
size_t sample_size,
|
|
||||||
uint8* argb, int argb_stride,
|
|
||||||
int w, int h,
|
|
||||||
int dw, int dh) {
|
|
||||||
if (sample_size == kUnknownDataSize) {
|
|
||||||
// ERROR: MJPEG frame size unknown
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO(fbarchard): Port to C
|
|
||||||
MJpegDecoder mjpeg_decoder;
|
|
||||||
bool ret = mjpeg_decoder.LoadFrame(sample, sample_size);
|
|
||||||
if (ret && (mjpeg_decoder.GetWidth() != w ||
|
|
||||||
mjpeg_decoder.GetHeight() != h)) {
|
|
||||||
// ERROR: MJPEG frame has unexpected dimensions
|
|
||||||
mjpeg_decoder.UnloadFrame();
|
|
||||||
return 1; // runtime failure
|
|
||||||
}
|
|
||||||
if (ret) {
|
|
||||||
ARGBBuffers bufs = { argb, argb_stride, dw, dh };
|
|
||||||
// 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, dw, dh);
|
|
||||||
// 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, dw, dh);
|
|
||||||
// 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, dw, dh);
|
|
||||||
// YUV411
|
|
||||||
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
||||||
MJpegDecoder::kColorSpaceYCbCr &&
|
|
||||||
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
||||||
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
||||||
mjpeg_decoder.GetHorizSampFactor(0) == 4 &&
|
|
||||||
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
||||||
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
||||||
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
||||||
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
||||||
ret = mjpeg_decoder.DecodeToCallback(&JpegI411ToARGB, &bufs, dw, dh);
|
|
||||||
// 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, dw, dh);
|
|
||||||
} else {
|
|
||||||
// TODO(fbarchard): Implement conversion for any other colorspace/sample
|
|
||||||
// factors that occur in practice. 411 is supported by libjpeg
|
|
||||||
// ERROR: Unable to convert MJPEG frame because format is not supported
|
|
||||||
mjpeg_decoder.UnloadFrame();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Computes table of cumulative sum for image where the value is the sum
|
// Computes table of cumulative sum for image where the value is the sum
|
||||||
// of all values above and to the left of the entry. Used by ARGBBlur.
|
// of all values above and to the left of the entry. Used by ARGBBlur.
|
||||||
int ARGBComputeCumulativeSum(const uint8* src_argb, int src_stride_argb,
|
int ARGBComputeCumulativeSum(const uint8* src_argb, int src_stride_argb,
|
||||||
@ -1850,6 +1048,12 @@ int ARGBBlur(const uint8* src_argb, int src_stride_argb,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Multiply ARGB image by ARGB value.
|
||||||
|
int ARGBShade(const uint8* src_argb, int src_stride_argb,
|
||||||
|
uint8* dst_argb, int dst_stride_argb,
|
||||||
|
int width, int height, uint32 value) {
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
} // namespace libyuv
|
} // namespace libyuv
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "libyuv/convert_from.h"
|
#include "libyuv/convert_from.h"
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
|
#include "libyuv/convert_argb.h"
|
||||||
#include "libyuv/planar_functions.h"
|
#include "libyuv/planar_functions.h"
|
||||||
#include "libyuv/rotate.h"
|
#include "libyuv/rotate.h"
|
||||||
#include "unit_test/unit_test.h"
|
#include "unit_test/unit_test.h"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user