mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-06 16:56:55 +08:00
Remove bayer format support from libyuv. This format is very rare and used on legacy hardware. Its not well optimized and has bugs related to odd widths. Removing the format will allow tests to pass under more circumstances, run faster and allow focus on higher priority quality and performance issues.
BUG=301 TESTED=local unittests build/pass on windows gyp build. R=harryjin@google.com Review URL: https://webrtc-codereview.appspot.com/38059004 git-svn-id: http://libyuv.googlecode.com/svn/trunk@1270 16f28f9a-4ce2-e073-06de-1de4eb20be90
This commit is contained in:
parent
35037cb948
commit
0887315390
@ -16,7 +16,6 @@ LOCAL_SRC_FILES := \
|
|||||||
source/convert_to_argb.cc \
|
source/convert_to_argb.cc \
|
||||||
source/convert_to_i420.cc \
|
source/convert_to_i420.cc \
|
||||||
source/cpu_id.cc \
|
source/cpu_id.cc \
|
||||||
source/format_conversion.cc \
|
|
||||||
source/planar_functions.cc \
|
source/planar_functions.cc \
|
||||||
source/rotate.cc \
|
source/rotate.cc \
|
||||||
source/rotate_argb.cc \
|
source/rotate_argb.cc \
|
||||||
|
|||||||
2
BUILD.gn
2
BUILD.gn
@ -23,7 +23,6 @@ source_set("libyuv") {
|
|||||||
"include/libyuv/convert_from.h",
|
"include/libyuv/convert_from.h",
|
||||||
"include/libyuv/convert_from_argb.h",
|
"include/libyuv/convert_from_argb.h",
|
||||||
"include/libyuv/cpu_id.h",
|
"include/libyuv/cpu_id.h",
|
||||||
"include/libyuv/format_conversion.h",
|
|
||||||
"include/libyuv/mjpeg_decoder.h",
|
"include/libyuv/mjpeg_decoder.h",
|
||||||
"include/libyuv/planar_functions.h",
|
"include/libyuv/planar_functions.h",
|
||||||
"include/libyuv/rotate.h",
|
"include/libyuv/rotate.h",
|
||||||
@ -48,7 +47,6 @@ source_set("libyuv") {
|
|||||||
"source/convert_to_argb.cc",
|
"source/convert_to_argb.cc",
|
||||||
"source/convert_to_i420.cc",
|
"source/convert_to_i420.cc",
|
||||||
"source/cpu_id.cc",
|
"source/cpu_id.cc",
|
||||||
"source/format_conversion.cc",
|
|
||||||
"source/mjpeg_decoder.cc",
|
"source/mjpeg_decoder.cc",
|
||||||
"source/mjpeg_validate.cc",
|
"source/mjpeg_validate.cc",
|
||||||
"source/planar_functions.cc",
|
"source/planar_functions.cc",
|
||||||
|
|||||||
@ -24,7 +24,6 @@ set(ly_source_files
|
|||||||
${ly_src_dir}/convert_to_argb.cc
|
${ly_src_dir}/convert_to_argb.cc
|
||||||
${ly_src_dir}/convert_to_i420.cc
|
${ly_src_dir}/convert_to_i420.cc
|
||||||
${ly_src_dir}/cpu_id.cc
|
${ly_src_dir}/cpu_id.cc
|
||||||
${ly_src_dir}/format_conversion.cc
|
|
||||||
${ly_src_dir}/mjpeg_decoder.cc
|
${ly_src_dir}/mjpeg_decoder.cc
|
||||||
${ly_src_dir}/mjpeg_validate.cc
|
${ly_src_dir}/mjpeg_validate.cc
|
||||||
${ly_src_dir}/planar_functions.cc
|
${ly_src_dir}/planar_functions.cc
|
||||||
@ -73,7 +72,6 @@ set(ly_header_files
|
|||||||
${ly_inc_dir}/libyuv/convert_from.h
|
${ly_inc_dir}/libyuv/convert_from.h
|
||||||
${ly_inc_dir}/libyuv/convert_from_argb.h
|
${ly_inc_dir}/libyuv/convert_from_argb.h
|
||||||
${ly_inc_dir}/libyuv/cpu_id.h
|
${ly_inc_dir}/libyuv/cpu_id.h
|
||||||
${ly_inc_dir}/libyuv/format_conversion.h
|
|
||||||
${ly_inc_dir}/libyuv/planar_functions.h
|
${ly_inc_dir}/libyuv/planar_functions.h
|
||||||
${ly_inc_dir}/libyuv/rotate.h
|
${ly_inc_dir}/libyuv/rotate.h
|
||||||
${ly_inc_dir}/libyuv/rotate_argb.h
|
${ly_inc_dir}/libyuv/rotate_argb.h
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
Name: libyuv
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 1269
|
Version: 1270
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
#include "libyuv/convert_from.h"
|
#include "libyuv/convert_from.h"
|
||||||
#include "libyuv/convert_from_argb.h"
|
#include "libyuv/convert_from_argb.h"
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#include "libyuv/mjpeg_decoder.h"
|
#include "libyuv/mjpeg_decoder.h"
|
||||||
#include "libyuv/planar_functions.h"
|
#include "libyuv/planar_functions.h"
|
||||||
#include "libyuv/rotate.h"
|
#include "libyuv/rotate.h"
|
||||||
|
|||||||
@ -211,8 +211,6 @@ int MJPGSize(const uint8* sample, size_t sample_size,
|
|||||||
int* width, int* height);
|
int* width, int* height);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Note Bayer formats (BGGR) To I420 are in format_conversion.h
|
|
||||||
|
|
||||||
// Convert camera sample to I420 with cropping, rotation and vertical flip.
|
// Convert camera sample to I420 with cropping, rotation and vertical flip.
|
||||||
// "src_size" is needed to parse MJPG.
|
// "src_size" is needed to parse MJPG.
|
||||||
// "dst_stride_y" number of bytes in a row of the dst_y plane.
|
// "dst_stride_y" number of bytes in a row of the dst_y plane.
|
||||||
|
|||||||
@ -200,8 +200,6 @@ int MJPGToARGB(const uint8* sample, size_t sample_size,
|
|||||||
int dst_width, int dst_height);
|
int dst_width, int dst_height);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Note Bayer formats (BGGR) to ARGB are in format_conversion.h.
|
|
||||||
|
|
||||||
// Convert camera sample to ARGB with cropping, rotation and vertical flip.
|
// Convert camera sample to ARGB with cropping, rotation and vertical flip.
|
||||||
// "src_size" is needed to parse MJPG.
|
// "src_size" is needed to parse MJPG.
|
||||||
// "dst_stride_argb" number of bytes in a row of the dst_argb plane.
|
// "dst_stride_argb" number of bytes in a row of the dst_argb plane.
|
||||||
|
|||||||
@ -152,8 +152,6 @@ int I420ToARGB4444(const uint8* src_y, int src_stride_y,
|
|||||||
uint8* dst_frame, int dst_stride_frame,
|
uint8* dst_frame, int dst_stride_frame,
|
||||||
int width, int height);
|
int width, int height);
|
||||||
|
|
||||||
// Note Bayer formats (BGGR) To I420 are in format_conversion.h.
|
|
||||||
|
|
||||||
// Convert I420 to specified format.
|
// Convert I420 to specified format.
|
||||||
// "dst_sample_stride" is bytes in a row for the destination. Pass 0 if the
|
// "dst_sample_stride" is bytes in a row for the destination. Pass 0 if the
|
||||||
// buffer has contiguous rows. Can be negative. A multiple of 16 is optimal.
|
// buffer has contiguous rows. Can be negative. A multiple of 16 is optimal.
|
||||||
|
|||||||
@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2011 The LibYuv Project Authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef INCLUDE_LIBYUV_FORMATCONVERSION_H_ // NOLINT
|
|
||||||
#define INCLUDE_LIBYUV_FORMATCONVERSION_H_
|
|
||||||
|
|
||||||
#include "libyuv/basic_types.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
namespace libyuv {
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Convert Bayer RGB formats to I420.
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerBGGRToI420(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_y, int dst_stride_y,
|
|
||||||
uint8* dst_u, int dst_stride_u,
|
|
||||||
uint8* dst_v, int dst_stride_v,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerGBRGToI420(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_y, int dst_stride_y,
|
|
||||||
uint8* dst_u, int dst_stride_u,
|
|
||||||
uint8* dst_v, int dst_stride_v,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerGRBGToI420(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_y, int dst_stride_y,
|
|
||||||
uint8* dst_u, int dst_stride_u,
|
|
||||||
uint8* dst_v, int dst_stride_v,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerRGGBToI420(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_y, int dst_stride_y,
|
|
||||||
uint8* dst_u, int dst_stride_u,
|
|
||||||
uint8* dst_v, int dst_stride_v,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Temporary API mapper.
|
|
||||||
#define BayerRGBToI420(b, bs, f, y, ys, u, us, v, vs, w, h) \
|
|
||||||
BayerToI420(b, bs, y, ys, u, us, v, vs, w, h, f)
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerToI420(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_y, int dst_stride_y,
|
|
||||||
uint8* dst_u, int dst_stride_u,
|
|
||||||
uint8* dst_v, int dst_stride_v,
|
|
||||||
int width, int height,
|
|
||||||
uint32 src_fourcc_bayer);
|
|
||||||
|
|
||||||
// Convert I420 to Bayer RGB formats.
|
|
||||||
LIBYUV_API
|
|
||||||
int I420ToBayerBGGR(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_frame, int dst_stride_frame,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int I420ToBayerGBRG(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_frame, int dst_stride_frame,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int I420ToBayerGRBG(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_frame, int dst_stride_frame,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int I420ToBayerRGGB(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_frame, int dst_stride_frame,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Temporary API mapper.
|
|
||||||
#define I420ToBayerRGB(y, ys, u, us, v, vs, b, bs, f, w, h) \
|
|
||||||
I420ToBayer(y, ys, u, us, v, vs, b, bs, w, h, f)
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int I420ToBayer(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_frame, int dst_stride_frame,
|
|
||||||
int width, int height,
|
|
||||||
uint32 dst_fourcc_bayer);
|
|
||||||
|
|
||||||
// Convert Bayer RGB formats to ARGB.
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerBGGRToARGB(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerGBRGToARGB(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerGRBGToARGB(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerRGGBToARGB(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Temporary API mapper.
|
|
||||||
#define BayerRGBToARGB(b, bs, f, a, as, w, h) BayerToARGB(b, bs, a, as, w, h, f)
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerToARGB(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height,
|
|
||||||
uint32 src_fourcc_bayer);
|
|
||||||
|
|
||||||
// Converts ARGB to Bayer RGB formats.
|
|
||||||
LIBYUV_API
|
|
||||||
int ARGBToBayerBGGR(const uint8* src_argb, int src_stride_argb,
|
|
||||||
uint8* dst_bayer, int dst_stride_bayer,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int ARGBToBayerGBRG(const uint8* src_argb, int src_stride_argb,
|
|
||||||
uint8* dst_bayer, int dst_stride_bayer,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int ARGBToBayerGRBG(const uint8* src_argb, int src_stride_argb,
|
|
||||||
uint8* dst_bayer, int dst_stride_bayer,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int ARGBToBayerRGGB(const uint8* src_argb, int src_stride_argb,
|
|
||||||
uint8* dst_bayer, int dst_stride_bayer,
|
|
||||||
int width, int height);
|
|
||||||
|
|
||||||
// Temporary API mapper.
|
|
||||||
#define ARGBToBayerRGB(a, as, b, bs, f, w, h) ARGBToBayer(b, bs, a, as, w, h, f)
|
|
||||||
|
|
||||||
LIBYUV_API
|
|
||||||
int ARGBToBayer(const uint8* src_argb, int src_stride_argb,
|
|
||||||
uint8* dst_bayer, int dst_stride_bayer,
|
|
||||||
int width, int height,
|
|
||||||
uint32 dst_fourcc_bayer);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
} // namespace libyuv
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_FORMATCONVERSION_H_ NOLINT
|
|
||||||
@ -67,7 +67,6 @@ extern "C" {
|
|||||||
#define HAS_ARGBTOARGB1555ROW_SSE2
|
#define HAS_ARGBTOARGB1555ROW_SSE2
|
||||||
#define HAS_ARGBTOARGB4444ROW_SSE2
|
#define HAS_ARGBTOARGB4444ROW_SSE2
|
||||||
#define HAS_ARGBTOBAYERGGROW_SSE2
|
#define HAS_ARGBTOBAYERGGROW_SSE2
|
||||||
#define HAS_ARGBTOBAYERROW_SSSE3
|
|
||||||
#define HAS_ARGBTORAWROW_SSSE3
|
#define HAS_ARGBTORAWROW_SSSE3
|
||||||
#define HAS_ARGBTORGB24ROW_SSSE3
|
#define HAS_ARGBTORGB24ROW_SSSE3
|
||||||
#define HAS_ARGBTORGB565ROW_SSE2
|
#define HAS_ARGBTORGB565ROW_SSE2
|
||||||
@ -263,7 +262,6 @@ extern "C" {
|
|||||||
#define HAS_ARGBTOARGB1555ROW_NEON
|
#define HAS_ARGBTOARGB1555ROW_NEON
|
||||||
#define HAS_ARGBTOARGB4444ROW_NEON
|
#define HAS_ARGBTOARGB4444ROW_NEON
|
||||||
#define HAS_ARGBTOBAYERGGROW_NEON
|
#define HAS_ARGBTOBAYERGGROW_NEON
|
||||||
#define HAS_ARGBTOBAYERROW_NEON
|
|
||||||
#define HAS_ARGBTORAWROW_NEON
|
#define HAS_ARGBTORAWROW_NEON
|
||||||
#define HAS_ARGBTORGB24ROW_NEON
|
#define HAS_ARGBTORGB24ROW_NEON
|
||||||
#define HAS_ARGBTORGB565ROW_NEON
|
#define HAS_ARGBTORGB565ROW_NEON
|
||||||
@ -1467,16 +1465,6 @@ void UYVYToUVRow_Any_NEON(const uint8* src_uyvy, int stride_uyvy,
|
|||||||
void UYVYToUV422Row_Any_NEON(const uint8* src_uyvy,
|
void UYVYToUV422Row_Any_NEON(const uint8* src_uyvy,
|
||||||
uint8* dst_u, uint8* dst_v, int pix);
|
uint8* dst_u, uint8* dst_v, int pix);
|
||||||
|
|
||||||
void ARGBToBayerRow_C(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix);
|
|
||||||
void ARGBToBayerRow_SSSE3(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix);
|
|
||||||
void ARGBToBayerRow_NEON(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix);
|
|
||||||
void ARGBToBayerRow_Any_SSSE3(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix);
|
|
||||||
void ARGBToBayerRow_Any_NEON(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix);
|
|
||||||
void ARGBToBayerGGRow_C(const uint8* src_argb, uint8* dst_bayer,
|
void ARGBToBayerGGRow_C(const uint8* src_argb, uint8* dst_bayer,
|
||||||
uint32 /* selector */, int pix);
|
uint32 /* selector */, int pix);
|
||||||
void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
|
void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
|
||||||
|
|||||||
@ -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 1269
|
#define LIBYUV_VERSION 1270
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
#endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT
|
||||||
|
|||||||
@ -75,7 +75,7 @@ enum FourCC {
|
|||||||
FOURCC_RGBO = FOURCC('R', 'G', 'B', 'O'), // argb1555 LE.
|
FOURCC_RGBO = FOURCC('R', 'G', 'B', 'O'), // argb1555 LE.
|
||||||
FOURCC_R444 = FOURCC('R', '4', '4', '4'), // argb4444 LE.
|
FOURCC_R444 = FOURCC('R', '4', '4', '4'), // argb4444 LE.
|
||||||
|
|
||||||
// 4 Secondary RGB formats: 4 Bayer Patterns.
|
// 4 Secondary RGB formats: 4 Bayer Patterns. deprecated.
|
||||||
FOURCC_RGGB = FOURCC('R', 'G', 'G', 'B'),
|
FOURCC_RGGB = FOURCC('R', 'G', 'G', 'B'),
|
||||||
FOURCC_BGGR = FOURCC('B', 'G', 'G', 'R'),
|
FOURCC_BGGR = FOURCC('B', 'G', 'G', 'R'),
|
||||||
FOURCC_GRBG = FOURCC('G', 'R', 'B', 'G'),
|
FOURCC_GRBG = FOURCC('G', 'R', 'B', 'G'),
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
'include/libyuv/convert_from.h',
|
'include/libyuv/convert_from.h',
|
||||||
'include/libyuv/convert_from_argb.h',
|
'include/libyuv/convert_from_argb.h',
|
||||||
'include/libyuv/cpu_id.h',
|
'include/libyuv/cpu_id.h',
|
||||||
'include/libyuv/format_conversion.h',
|
|
||||||
'include/libyuv/mjpeg_decoder.h',
|
'include/libyuv/mjpeg_decoder.h',
|
||||||
'include/libyuv/planar_functions.h',
|
'include/libyuv/planar_functions.h',
|
||||||
'include/libyuv/rotate.h',
|
'include/libyuv/rotate.h',
|
||||||
@ -43,7 +42,6 @@
|
|||||||
'source/convert_to_argb.cc',
|
'source/convert_to_argb.cc',
|
||||||
'source/convert_to_i420.cc',
|
'source/convert_to_i420.cc',
|
||||||
'source/cpu_id.cc',
|
'source/cpu_id.cc',
|
||||||
'source/format_conversion.cc',
|
|
||||||
'source/mjpeg_decoder.cc',
|
'source/mjpeg_decoder.cc',
|
||||||
'source/mjpeg_validate.cc',
|
'source/mjpeg_validate.cc',
|
||||||
'source/planar_functions.cc',
|
'source/planar_functions.cc',
|
||||||
|
|||||||
1
linux.mk
1
linux.mk
@ -16,7 +16,6 @@ LOCAL_OBJ_FILES := \
|
|||||||
source/convert_to_argb.o \
|
source/convert_to_argb.o \
|
||||||
source/convert_to_i420.o \
|
source/convert_to_i420.o \
|
||||||
source/cpu_id.o \
|
source/cpu_id.o \
|
||||||
source/format_conversion.o \
|
|
||||||
source/planar_functions.o \
|
source/planar_functions.o \
|
||||||
source/rotate.o \
|
source/rotate.o \
|
||||||
source/rotate_argb.o \
|
source/rotate_argb.o \
|
||||||
|
|||||||
@ -11,7 +11,6 @@
|
|||||||
#include "libyuv/convert_argb.h"
|
#include "libyuv/convert_argb.h"
|
||||||
|
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#ifdef HAVE_JPEG
|
#ifdef HAVE_JPEG
|
||||||
#include "libyuv/mjpeg_decoder.h"
|
#include "libyuv/mjpeg_decoder.h"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -13,7 +13,6 @@
|
|||||||
#include "libyuv/basic_types.h"
|
#include "libyuv/basic_types.h"
|
||||||
#include "libyuv/convert.h" // For I420Copy
|
#include "libyuv/convert.h" // For I420Copy
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#include "libyuv/planar_functions.h"
|
#include "libyuv/planar_functions.h"
|
||||||
#include "libyuv/rotate.h"
|
#include "libyuv/rotate.h"
|
||||||
#include "libyuv/scale.h" // For ScalePlane()
|
#include "libyuv/scale.h" // For ScalePlane()
|
||||||
@ -1074,38 +1073,6 @@ int ConvertFromI420(const uint8* y, int y_stride,
|
|||||||
dst_sample_stride ? dst_sample_stride : width * 4,
|
dst_sample_stride ? dst_sample_stride : width * 4,
|
||||||
width, height);
|
width, height);
|
||||||
break;
|
break;
|
||||||
case FOURCC_BGGR:
|
|
||||||
r = I420ToBayerBGGR(y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
dst_sample,
|
|
||||||
dst_sample_stride ? dst_sample_stride : width,
|
|
||||||
width, height);
|
|
||||||
break;
|
|
||||||
case FOURCC_GBRG:
|
|
||||||
r = I420ToBayerGBRG(y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
dst_sample,
|
|
||||||
dst_sample_stride ? dst_sample_stride : width,
|
|
||||||
width, height);
|
|
||||||
break;
|
|
||||||
case FOURCC_GRBG:
|
|
||||||
r = I420ToBayerGRBG(y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
dst_sample,
|
|
||||||
dst_sample_stride ? dst_sample_stride : width,
|
|
||||||
width, height);
|
|
||||||
break;
|
|
||||||
case FOURCC_RGGB:
|
|
||||||
r = I420ToBayerRGGB(y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
dst_sample,
|
|
||||||
dst_sample_stride ? dst_sample_stride : width,
|
|
||||||
width, height);
|
|
||||||
break;
|
|
||||||
case FOURCC_I400:
|
case FOURCC_I400:
|
||||||
r = I400Copy(y, y_stride,
|
r = I400Copy(y, y_stride,
|
||||||
dst_sample,
|
dst_sample,
|
||||||
|
|||||||
@ -12,7 +12,6 @@
|
|||||||
|
|
||||||
#include "libyuv/basic_types.h"
|
#include "libyuv/basic_types.h"
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#include "libyuv/planar_functions.h"
|
#include "libyuv/planar_functions.h"
|
||||||
#include "libyuv/row.h"
|
#include "libyuv/row.h"
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,6 @@
|
|||||||
#include "libyuv/convert_argb.h"
|
#include "libyuv/convert_argb.h"
|
||||||
|
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#ifdef HAVE_JPEG
|
#ifdef HAVE_JPEG
|
||||||
#include "libyuv/mjpeg_decoder.h"
|
#include "libyuv/mjpeg_decoder.h"
|
||||||
#endif
|
#endif
|
||||||
@ -144,36 +143,6 @@ int ConvertToARGB(const uint8* sample, size_t sample_size,
|
|||||||
crop_argb, argb_stride,
|
crop_argb, argb_stride,
|
||||||
crop_width, inv_crop_height);
|
crop_width, inv_crop_height);
|
||||||
break;
|
break;
|
||||||
// TODO(fbarchard): Support cropping Bayer by odd numbers
|
|
||||||
// by adjusting fourcc.
|
|
||||||
case FOURCC_BGGR:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerBGGRToARGB(src, src_width,
|
|
||||||
crop_argb, argb_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FOURCC_GBRG:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerGBRGToARGB(src, src_width,
|
|
||||||
crop_argb, argb_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FOURCC_GRBG:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerGRBGToARGB(src, src_width,
|
|
||||||
crop_argb, argb_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FOURCC_RGGB:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerRGGBToARGB(src, src_width,
|
|
||||||
crop_argb, argb_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FOURCC_I400:
|
case FOURCC_I400:
|
||||||
src = sample + src_width * crop_y + crop_x;
|
src = sample + src_width * crop_y + crop_x;
|
||||||
r = I400ToARGB(src, src_width,
|
r = I400ToARGB(src, src_width,
|
||||||
|
|||||||
@ -12,7 +12,6 @@
|
|||||||
|
|
||||||
#include "libyuv/convert.h"
|
#include "libyuv/convert.h"
|
||||||
|
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#include "libyuv/video_common.h"
|
#include "libyuv/video_common.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -173,40 +172,6 @@ int ConvertToI420(const uint8* sample,
|
|||||||
v, v_stride,
|
v, v_stride,
|
||||||
crop_width, inv_crop_height);
|
crop_width, inv_crop_height);
|
||||||
break;
|
break;
|
||||||
// TODO(fbarchard): Support cropping Bayer by odd numbers
|
|
||||||
// by adjusting fourcc.
|
|
||||||
case FOURCC_BGGR:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerBGGRToI420(src, src_width,
|
|
||||||
y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
case FOURCC_GBRG:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerGBRGToI420(src, src_width,
|
|
||||||
y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
case FOURCC_GRBG:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerGRBGToI420(src, src_width,
|
|
||||||
y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
case FOURCC_RGGB:
|
|
||||||
src = sample + (src_width * crop_y + crop_x);
|
|
||||||
r = BayerRGGBToI420(src, src_width,
|
|
||||||
y, y_stride,
|
|
||||||
u, u_stride,
|
|
||||||
v, v_stride,
|
|
||||||
crop_width, inv_crop_height);
|
|
||||||
break;
|
|
||||||
case FOURCC_I400:
|
case FOURCC_I400:
|
||||||
src = sample + src_width * crop_y + crop_x;
|
src = sample + src_width * crop_y + crop_x;
|
||||||
r = I400ToI420(src, src_width,
|
r = I400ToI420(src, src_width,
|
||||||
|
|||||||
@ -1,553 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2011 The LibYuv Project Authors. All rights reserved.
|
|
||||||
*
|
|
||||||
* Use of this source code is governed by a BSD-style license
|
|
||||||
* that can be found in the LICENSE file in the root of the source
|
|
||||||
* tree. An additional intellectual property rights grant can be found
|
|
||||||
* in the file PATENTS. All contributing project authors may
|
|
||||||
* be found in the AUTHORS file in the root of the source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
|
|
||||||
#include "libyuv/basic_types.h"
|
|
||||||
#include "libyuv/cpu_id.h"
|
|
||||||
#include "libyuv/video_common.h"
|
|
||||||
#include "libyuv/row.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
namespace libyuv {
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// generate a selector mask useful for pshufb
|
|
||||||
static uint32 GenerateSelector(int select0, int select1) {
|
|
||||||
return (uint32)(select0) |
|
|
||||||
(uint32)((select1 + 4) << 8) |
|
|
||||||
(uint32)((select0 + 8) << 16) |
|
|
||||||
(uint32)((select1 + 12) << 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int MakeSelectors(const int blue_index,
|
|
||||||
const int green_index,
|
|
||||||
const int red_index,
|
|
||||||
uint32 dst_fourcc_bayer,
|
|
||||||
uint32* index_map) {
|
|
||||||
// Now build a lookup table containing the indices for the four pixels in each
|
|
||||||
// 2x2 Bayer grid.
|
|
||||||
switch (dst_fourcc_bayer) {
|
|
||||||
case FOURCC_BGGR:
|
|
||||||
index_map[0] = GenerateSelector(blue_index, green_index);
|
|
||||||
index_map[1] = GenerateSelector(green_index, red_index);
|
|
||||||
break;
|
|
||||||
case FOURCC_GBRG:
|
|
||||||
index_map[0] = GenerateSelector(green_index, blue_index);
|
|
||||||
index_map[1] = GenerateSelector(red_index, green_index);
|
|
||||||
break;
|
|
||||||
case FOURCC_RGGB:
|
|
||||||
index_map[0] = GenerateSelector(red_index, green_index);
|
|
||||||
index_map[1] = GenerateSelector(green_index, blue_index);
|
|
||||||
break;
|
|
||||||
case FOURCC_GRBG:
|
|
||||||
index_map[0] = GenerateSelector(green_index, red_index);
|
|
||||||
index_map[1] = GenerateSelector(blue_index, green_index);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -1; // Bad FourCC
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Converts 32 bit ARGB to Bayer RGB formats.
|
|
||||||
LIBYUV_API
|
|
||||||
int ARGBToBayer(const uint8* src_argb, int src_stride_argb,
|
|
||||||
uint8* dst_bayer, int dst_stride_bayer,
|
|
||||||
int width, int height,
|
|
||||||
uint32 dst_fourcc_bayer) {
|
|
||||||
int y;
|
|
||||||
const int blue_index = 0; // Offsets for ARGB format
|
|
||||||
const int green_index = 1;
|
|
||||||
const int red_index = 2;
|
|
||||||
uint32 index_map[2];
|
|
||||||
void (*ARGBToBayerRow)(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix) = ARGBToBayerRow_C;
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
src_argb = src_argb + (height - 1) * src_stride_argb;
|
|
||||||
src_stride_argb = -src_stride_argb;
|
|
||||||
}
|
|
||||||
#if defined(HAS_ARGBTOBAYERROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_ARGBTOBAYERROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (MakeSelectors(blue_index, green_index, red_index,
|
|
||||||
dst_fourcc_bayer, index_map)) {
|
|
||||||
return -1; // Bad FourCC
|
|
||||||
}
|
|
||||||
|
|
||||||
for (y = 0; y < height; ++y) {
|
|
||||||
ARGBToBayerRow(src_argb, dst_bayer, index_map[y & 1], width);
|
|
||||||
src_argb += src_stride_argb;
|
|
||||||
dst_bayer += dst_stride_bayer;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define AVG(a, b) (((a) + (b)) >> 1)
|
|
||||||
|
|
||||||
static void BayerRowBG(const uint8* src_bayer0, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix) {
|
|
||||||
const uint8* src_bayer1 = src_bayer0 + src_stride_bayer;
|
|
||||||
uint8 g = src_bayer0[1];
|
|
||||||
uint8 r = src_bayer1[1];
|
|
||||||
int x;
|
|
||||||
for (x = 0; x < pix - 2; x += 2) {
|
|
||||||
dst_argb[0] = src_bayer0[0];
|
|
||||||
dst_argb[1] = AVG(g, src_bayer0[1]);
|
|
||||||
dst_argb[2] = AVG(r, src_bayer1[1]);
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
dst_argb[4] = AVG(src_bayer0[0], src_bayer0[2]);
|
|
||||||
dst_argb[5] = src_bayer0[1];
|
|
||||||
dst_argb[6] = src_bayer1[1];
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
g = src_bayer0[1];
|
|
||||||
r = src_bayer1[1];
|
|
||||||
src_bayer0 += 2;
|
|
||||||
src_bayer1 += 2;
|
|
||||||
dst_argb += 8;
|
|
||||||
}
|
|
||||||
dst_argb[0] = src_bayer0[0];
|
|
||||||
dst_argb[1] = AVG(g, src_bayer0[1]);
|
|
||||||
dst_argb[2] = AVG(r, src_bayer1[1]);
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
if (!(pix & 1)) {
|
|
||||||
dst_argb[4] = src_bayer0[0];
|
|
||||||
dst_argb[5] = src_bayer0[1];
|
|
||||||
dst_argb[6] = src_bayer1[1];
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void BayerRowRG(const uint8* src_bayer0, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix) {
|
|
||||||
const uint8* src_bayer1 = src_bayer0 + src_stride_bayer;
|
|
||||||
uint8 g = src_bayer0[1];
|
|
||||||
uint8 b = src_bayer1[1];
|
|
||||||
int x;
|
|
||||||
for (x = 0; x < pix - 2; x += 2) {
|
|
||||||
dst_argb[0] = AVG(b, src_bayer1[1]);
|
|
||||||
dst_argb[1] = AVG(g, src_bayer0[1]);
|
|
||||||
dst_argb[2] = src_bayer0[0];
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
dst_argb[4] = src_bayer1[1];
|
|
||||||
dst_argb[5] = src_bayer0[1];
|
|
||||||
dst_argb[6] = AVG(src_bayer0[0], src_bayer0[2]);
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
g = src_bayer0[1];
|
|
||||||
b = src_bayer1[1];
|
|
||||||
src_bayer0 += 2;
|
|
||||||
src_bayer1 += 2;
|
|
||||||
dst_argb += 8;
|
|
||||||
}
|
|
||||||
dst_argb[0] = AVG(b, src_bayer1[1]);
|
|
||||||
dst_argb[1] = AVG(g, src_bayer0[1]);
|
|
||||||
dst_argb[2] = src_bayer0[0];
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
if (!(pix & 1)) {
|
|
||||||
dst_argb[4] = src_bayer1[1];
|
|
||||||
dst_argb[5] = src_bayer0[1];
|
|
||||||
dst_argb[6] = src_bayer0[0];
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void BayerRowGB(const uint8* src_bayer0, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix) {
|
|
||||||
const uint8* src_bayer1 = src_bayer0 + src_stride_bayer;
|
|
||||||
uint8 b = src_bayer0[1];
|
|
||||||
int x;
|
|
||||||
for (x = 0; x < pix - 2; x += 2) {
|
|
||||||
dst_argb[0] = AVG(b, src_bayer0[1]);
|
|
||||||
dst_argb[1] = src_bayer0[0];
|
|
||||||
dst_argb[2] = src_bayer1[0];
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
dst_argb[4] = src_bayer0[1];
|
|
||||||
dst_argb[5] = AVG(src_bayer0[0], src_bayer0[2]);
|
|
||||||
dst_argb[6] = AVG(src_bayer1[0], src_bayer1[2]);
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
b = src_bayer0[1];
|
|
||||||
src_bayer0 += 2;
|
|
||||||
src_bayer1 += 2;
|
|
||||||
dst_argb += 8;
|
|
||||||
}
|
|
||||||
dst_argb[0] = AVG(b, src_bayer0[1]);
|
|
||||||
dst_argb[1] = src_bayer0[0];
|
|
||||||
dst_argb[2] = src_bayer1[0];
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
if (!(pix & 1)) {
|
|
||||||
dst_argb[4] = src_bayer0[1];
|
|
||||||
dst_argb[5] = src_bayer0[0];
|
|
||||||
dst_argb[6] = src_bayer1[0];
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void BayerRowGR(const uint8* src_bayer0, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix) {
|
|
||||||
const uint8* src_bayer1 = src_bayer0 + src_stride_bayer;
|
|
||||||
uint8 r = src_bayer0[1];
|
|
||||||
int x;
|
|
||||||
for (x = 0; x < pix - 2; x += 2) {
|
|
||||||
dst_argb[0] = src_bayer1[0];
|
|
||||||
dst_argb[1] = src_bayer0[0];
|
|
||||||
dst_argb[2] = AVG(r, src_bayer0[1]);
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
dst_argb[4] = AVG(src_bayer1[0], src_bayer1[2]);
|
|
||||||
dst_argb[5] = AVG(src_bayer0[0], src_bayer0[2]);
|
|
||||||
dst_argb[6] = src_bayer0[1];
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
r = src_bayer0[1];
|
|
||||||
src_bayer0 += 2;
|
|
||||||
src_bayer1 += 2;
|
|
||||||
dst_argb += 8;
|
|
||||||
}
|
|
||||||
dst_argb[0] = src_bayer1[0];
|
|
||||||
dst_argb[1] = src_bayer0[0];
|
|
||||||
dst_argb[2] = AVG(r, src_bayer0[1]);
|
|
||||||
dst_argb[3] = 255U;
|
|
||||||
if (!(pix & 1)) {
|
|
||||||
dst_argb[4] = src_bayer1[0];
|
|
||||||
dst_argb[5] = src_bayer0[0];
|
|
||||||
dst_argb[6] = src_bayer0[1];
|
|
||||||
dst_argb[7] = 255U;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Converts any Bayer RGB format to ARGB.
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerToARGB(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int dst_stride_argb,
|
|
||||||
int width, int height,
|
|
||||||
uint32 src_fourcc_bayer) {
|
|
||||||
int y;
|
|
||||||
void (*BayerRow0)(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix);
|
|
||||||
void (*BayerRow1)(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix);
|
|
||||||
if (height < 0) {
|
|
||||||
height = -height;
|
|
||||||
dst_argb = dst_argb + (height - 1) * dst_stride_argb;
|
|
||||||
dst_stride_argb = -dst_stride_argb;
|
|
||||||
}
|
|
||||||
switch (src_fourcc_bayer) {
|
|
||||||
case FOURCC_BGGR:
|
|
||||||
BayerRow0 = BayerRowBG;
|
|
||||||
BayerRow1 = BayerRowGR;
|
|
||||||
break;
|
|
||||||
case FOURCC_GBRG:
|
|
||||||
BayerRow0 = BayerRowGB;
|
|
||||||
BayerRow1 = BayerRowRG;
|
|
||||||
break;
|
|
||||||
case FOURCC_GRBG:
|
|
||||||
BayerRow0 = BayerRowGR;
|
|
||||||
BayerRow1 = BayerRowBG;
|
|
||||||
break;
|
|
||||||
case FOURCC_RGGB:
|
|
||||||
BayerRow0 = BayerRowRG;
|
|
||||||
BayerRow1 = BayerRowGB;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -1; // Bad FourCC
|
|
||||||
}
|
|
||||||
|
|
||||||
for (y = 0; y < height - 1; y += 2) {
|
|
||||||
BayerRow0(src_bayer, src_stride_bayer, dst_argb, width);
|
|
||||||
BayerRow1(src_bayer + src_stride_bayer, -src_stride_bayer,
|
|
||||||
dst_argb + dst_stride_argb, width);
|
|
||||||
src_bayer += src_stride_bayer * 2;
|
|
||||||
dst_argb += dst_stride_argb * 2;
|
|
||||||
}
|
|
||||||
if (height & 1) {
|
|
||||||
BayerRow0(src_bayer, src_stride_bayer, dst_argb, width);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Converts any Bayer RGB format to ARGB.
|
|
||||||
LIBYUV_API
|
|
||||||
int BayerToI420(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_y, int dst_stride_y,
|
|
||||||
uint8* dst_u, int dst_stride_u,
|
|
||||||
uint8* dst_v, int dst_stride_v,
|
|
||||||
int width, int height,
|
|
||||||
uint32 src_fourcc_bayer) {
|
|
||||||
void (*BayerRow0)(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix);
|
|
||||||
void (*BayerRow1)(const uint8* src_bayer, int src_stride_bayer,
|
|
||||||
uint8* dst_argb, int pix);
|
|
||||||
|
|
||||||
void (*ARGBToUVRow)(const uint8* src_argb0, int src_stride_argb,
|
|
||||||
uint8* dst_u, uint8* dst_v, int width) = ARGBToUVRow_C;
|
|
||||||
void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int pix) =
|
|
||||||
ARGBToYRow_C;
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
int halfheight;
|
|
||||||
height = -height;
|
|
||||||
halfheight = (height + 1) >> 1;
|
|
||||||
dst_y = dst_y + (height - 1) * dst_stride_y;
|
|
||||||
dst_u = dst_u + (halfheight - 1) * dst_stride_u;
|
|
||||||
dst_v = dst_v + (halfheight - 1) * dst_stride_v;
|
|
||||||
dst_stride_y = -dst_stride_y;
|
|
||||||
dst_stride_u = -dst_stride_u;
|
|
||||||
dst_stride_v = -dst_stride_v;
|
|
||||||
}
|
|
||||||
#if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
|
||||||
ARGBToUVRow = ARGBToUVRow_Any_SSSE3;
|
|
||||||
ARGBToYRow = ARGBToYRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
ARGBToYRow = ARGBToYRow_SSSE3;
|
|
||||||
ARGBToUVRow = ARGBToUVRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_ARGBTOYROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
ARGBToYRow = ARGBToYRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
ARGBToYRow = ARGBToYRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_ARGBTOUVROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
ARGBToUVRow = ARGBToUVRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
ARGBToUVRow = ARGBToUVRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (src_fourcc_bayer) {
|
|
||||||
case FOURCC_BGGR:
|
|
||||||
BayerRow0 = BayerRowBG;
|
|
||||||
BayerRow1 = BayerRowGR;
|
|
||||||
break;
|
|
||||||
case FOURCC_GBRG:
|
|
||||||
BayerRow0 = BayerRowGB;
|
|
||||||
BayerRow1 = BayerRowRG;
|
|
||||||
break;
|
|
||||||
case FOURCC_GRBG:
|
|
||||||
BayerRow0 = BayerRowGR;
|
|
||||||
BayerRow1 = BayerRowBG;
|
|
||||||
break;
|
|
||||||
case FOURCC_RGGB:
|
|
||||||
BayerRow0 = BayerRowRG;
|
|
||||||
BayerRow1 = BayerRowGB;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -1; // Bad FourCC
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
// Allocate 2 rows of ARGB.
|
|
||||||
const int kRowSize = (width * 4 + 15) & ~15;
|
|
||||||
align_buffer_64(row, kRowSize * 2);
|
|
||||||
int y;
|
|
||||||
for (y = 0; y < height - 1; y += 2) {
|
|
||||||
BayerRow0(src_bayer, src_stride_bayer, row, width);
|
|
||||||
BayerRow1(src_bayer + src_stride_bayer, -src_stride_bayer,
|
|
||||||
row + kRowSize, width);
|
|
||||||
ARGBToUVRow(row, kRowSize, dst_u, dst_v, width);
|
|
||||||
ARGBToYRow(row, dst_y, width);
|
|
||||||
ARGBToYRow(row + kRowSize, dst_y + dst_stride_y, width);
|
|
||||||
src_bayer += src_stride_bayer * 2;
|
|
||||||
dst_y += dst_stride_y * 2;
|
|
||||||
dst_u += dst_stride_u;
|
|
||||||
dst_v += dst_stride_v;
|
|
||||||
}
|
|
||||||
if (height & 1) {
|
|
||||||
BayerRow0(src_bayer, src_stride_bayer, row, width);
|
|
||||||
ARGBToUVRow(row, 0, dst_u, dst_v, width);
|
|
||||||
ARGBToYRow(row, dst_y, width);
|
|
||||||
}
|
|
||||||
free_aligned_buffer_64(row);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert I420 to Bayer.
|
|
||||||
LIBYUV_API
|
|
||||||
int I420ToBayer(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_bayer, int dst_stride_bayer,
|
|
||||||
int width, int height,
|
|
||||||
uint32 dst_fourcc_bayer) {
|
|
||||||
void (*I422ToARGBRow)(const uint8* y_buf,
|
|
||||||
const uint8* u_buf,
|
|
||||||
const uint8* v_buf,
|
|
||||||
uint8* rgb_buf,
|
|
||||||
int width) = I422ToARGBRow_C;
|
|
||||||
void (*ARGBToBayerRow)(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix) = ARGBToBayerRow_C;
|
|
||||||
const int blue_index = 0; // Offsets for ARGB format
|
|
||||||
const int green_index = 1;
|
|
||||||
const int red_index = 2;
|
|
||||||
uint32 index_map[2];
|
|
||||||
// Negative height means invert the image.
|
|
||||||
if (height < 0) {
|
|
||||||
int halfheight;
|
|
||||||
height = -height;
|
|
||||||
halfheight = (height + 1) >> 1;
|
|
||||||
src_y = src_y + (height - 1) * src_stride_y;
|
|
||||||
src_u = src_u + (halfheight - 1) * src_stride_u;
|
|
||||||
src_v = src_v + (halfheight - 1) * src_stride_v;
|
|
||||||
src_stride_y = -src_stride_y;
|
|
||||||
src_stride_u = -src_stride_u;
|
|
||||||
src_stride_v = -src_stride_v;
|
|
||||||
}
|
|
||||||
#if defined(HAS_I422TOARGBROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_I422TOARGBROW_AVX2)
|
|
||||||
if (TestCpuFlag(kCpuHasAVX2)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_AVX2;
|
|
||||||
if (IS_ALIGNED(width, 16)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_AVX2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_I422TOARGBROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_I422TOARGBROW_MIPS_DSPR2)
|
|
||||||
if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) &&
|
|
||||||
IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) &&
|
|
||||||
IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) &&
|
|
||||||
IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2)) {
|
|
||||||
I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HAS_ARGBTOBAYERROW_SSSE3)
|
|
||||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_Any_SSSE3;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_SSSE3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_ARGBTOBAYERROW_NEON)
|
|
||||||
if (TestCpuFlag(kCpuHasNEON)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_Any_NEON;
|
|
||||||
if (IS_ALIGNED(width, 8)) {
|
|
||||||
ARGBToBayerRow = ARGBToBayerRow_NEON;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (MakeSelectors(blue_index, green_index, red_index,
|
|
||||||
dst_fourcc_bayer, index_map)) {
|
|
||||||
return -1; // Bad FourCC
|
|
||||||
}
|
|
||||||
{
|
|
||||||
// Allocate a row of ARGB.
|
|
||||||
align_buffer_64(row, width * 4);
|
|
||||||
int y;
|
|
||||||
for (y = 0; y < height; ++y) {
|
|
||||||
I422ToARGBRow(src_y, src_u, src_v, row, width);
|
|
||||||
ARGBToBayerRow(row, dst_bayer, index_map[y & 1], width);
|
|
||||||
dst_bayer += dst_stride_bayer;
|
|
||||||
src_y += src_stride_y;
|
|
||||||
if (y & 1) {
|
|
||||||
src_u += src_stride_u;
|
|
||||||
src_v += src_stride_v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free_aligned_buffer_64(row);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MAKEBAYERFOURCC(BAYER) \
|
|
||||||
LIBYUV_API \
|
|
||||||
int Bayer##BAYER##ToI420(const uint8* src_bayer, int src_stride_bayer, \
|
|
||||||
uint8* dst_y, int dst_stride_y, \
|
|
||||||
uint8* dst_u, int dst_stride_u, \
|
|
||||||
uint8* dst_v, int dst_stride_v, \
|
|
||||||
int width, int height) { \
|
|
||||||
return BayerToI420(src_bayer, src_stride_bayer, \
|
|
||||||
dst_y, dst_stride_y, \
|
|
||||||
dst_u, dst_stride_u, \
|
|
||||||
dst_v, dst_stride_v, \
|
|
||||||
width, height, \
|
|
||||||
FOURCC_##BAYER); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
LIBYUV_API \
|
|
||||||
int I420ToBayer##BAYER(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_bayer, int dst_stride_bayer, \
|
|
||||||
int width, int height) { \
|
|
||||||
return I420ToBayer(src_y, src_stride_y, \
|
|
||||||
src_u, src_stride_u, \
|
|
||||||
src_v, src_stride_v, \
|
|
||||||
dst_bayer, dst_stride_bayer, \
|
|
||||||
width, height, \
|
|
||||||
FOURCC_##BAYER); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
LIBYUV_API \
|
|
||||||
int ARGBToBayer##BAYER(const uint8* src_argb, int src_stride_argb, \
|
|
||||||
uint8* dst_bayer, int dst_stride_bayer, \
|
|
||||||
int width, int height) { \
|
|
||||||
return ARGBToBayer(src_argb, src_stride_argb, \
|
|
||||||
dst_bayer, dst_stride_bayer, \
|
|
||||||
width, height, \
|
|
||||||
FOURCC_##BAYER); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
LIBYUV_API \
|
|
||||||
int Bayer##BAYER##ToARGB(const uint8* src_bayer, int src_stride_bayer, \
|
|
||||||
uint8* dst_argb, int dst_stride_argb, \
|
|
||||||
int width, int height) { \
|
|
||||||
return BayerToARGB(src_bayer, src_stride_bayer, \
|
|
||||||
dst_argb, dst_stride_argb, \
|
|
||||||
width, height, \
|
|
||||||
FOURCC_##BAYER); \
|
|
||||||
}
|
|
||||||
|
|
||||||
MAKEBAYERFOURCC(BGGR)
|
|
||||||
MAKEBAYERFOURCC(GBRG)
|
|
||||||
MAKEBAYERFOURCC(GRBG)
|
|
||||||
MAKEBAYERFOURCC(RGGB)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
} // namespace libyuv
|
|
||||||
#endif
|
|
||||||
@ -222,14 +222,6 @@ RGBANY(UYVYToARGBRow_Any_NEON, UYVYToARGBRow_NEON, UYVYToARGBRow_C,
|
|||||||
ARGBTORGB_C(src + n * SBPP, dst + n * BPP, selector, width & MASK); \
|
ARGBTORGB_C(src + n * SBPP, dst + n * BPP, selector, width & MASK); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAS_ARGBTOBAYERROW_SSSE3)
|
|
||||||
BAYERANY(ARGBToBayerRow_Any_SSSE3, ARGBToBayerRow_SSSE3, ARGBToBayerRow_C,
|
|
||||||
7, 4, 1)
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_ARGBTOBAYERROW_NEON)
|
|
||||||
BAYERANY(ARGBToBayerRow_Any_NEON, ARGBToBayerRow_NEON, ARGBToBayerRow_C,
|
|
||||||
7, 4, 1)
|
|
||||||
#endif
|
|
||||||
#if defined(HAS_ARGBTOBAYERGGROW_SSE2)
|
#if defined(HAS_ARGBTOBAYERGGROW_SSE2)
|
||||||
BAYERANY(ARGBToBayerGGRow_Any_SSE2, ARGBToBayerGGRow_SSE2, ARGBToBayerGGRow_C,
|
BAYERANY(ARGBToBayerGGRow_Any_SSE2, ARGBToBayerGGRow_SSE2, ARGBToBayerGGRow_C,
|
||||||
7, 4, 1)
|
7, 4, 1)
|
||||||
|
|||||||
@ -975,7 +975,7 @@ void I400ToARGBRow_C(const uint8* src_y, uint8* dst_argb, int width) {
|
|||||||
// Bias values to subtract 16 from Y and 128 from U and V.
|
// Bias values to subtract 16 from Y and 128 from U and V.
|
||||||
#define BB (UB * 128 - YGB)
|
#define BB (UB * 128 - YGB)
|
||||||
#define BG (UG * 128 + VG * 128 - YGB)
|
#define BG (UG * 128 + VG * 128 - YGB)
|
||||||
#define BR ( VR * 128 - YGB)
|
#define BR (VR * 128 - YGB)
|
||||||
|
|
||||||
// C reference code that mimics the YUV assembly.
|
// C reference code that mimics the YUV assembly.
|
||||||
static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
|
static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
|
||||||
@ -2036,24 +2036,6 @@ void InterpolateRow_16_C(uint16* dst_ptr, const uint16* src_ptr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select 2 channels from ARGB on alternating pixels. e.g. BGBGBGBG
|
|
||||||
void ARGBToBayerRow_C(const uint8* src_argb,
|
|
||||||
uint8* dst_bayer, uint32 selector, int pix) {
|
|
||||||
int index0 = selector & 0xff;
|
|
||||||
int index1 = (selector >> 8) & 0xff;
|
|
||||||
// Copy a row of Bayer.
|
|
||||||
int x;
|
|
||||||
for (x = 0; x < pix - 1; x += 2) {
|
|
||||||
dst_bayer[0] = src_argb[index0];
|
|
||||||
dst_bayer[1] = src_argb[index1];
|
|
||||||
src_argb += 8;
|
|
||||||
dst_bayer += 2;
|
|
||||||
}
|
|
||||||
if (pix & 1) {
|
|
||||||
dst_bayer[0] = src_argb[index0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select G channel from ARGB. e.g. GGGGGGGG
|
// Select G channel from ARGB. e.g. GGGGGGGG
|
||||||
void ARGBToBayerGGRow_C(const uint8* src_argb,
|
void ARGBToBayerGGRow_C(const uint8* src_argb,
|
||||||
uint8* dst_bayer, uint32 selector, int pix) {
|
uint8* dst_bayer, uint32 selector, int pix) {
|
||||||
|
|||||||
@ -1280,29 +1280,6 @@ void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select 2 channels from ARGB on alternating pixels. e.g. BGBGBGBG
|
|
||||||
void ARGBToBayerRow_NEON(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix) {
|
|
||||||
asm volatile (
|
|
||||||
"vmov.u32 d6[0], %3 \n" // selector
|
|
||||||
"1: \n"
|
|
||||||
MEMACCESS(0)
|
|
||||||
"vld1.8 {q0, q1}, [%0]! \n" // load row 8 pixels.
|
|
||||||
"subs %2, %2, #8 \n" // 8 processed per loop
|
|
||||||
"vtbl.8 d4, {d0, d1}, d6 \n" // look up 4 pixels
|
|
||||||
"vtbl.8 d5, {d2, d3}, d6 \n" // look up 4 pixels
|
|
||||||
"vtrn.u32 d4, d5 \n" // combine 8 pixels
|
|
||||||
MEMACCESS(1)
|
|
||||||
"vst1.8 {d4}, [%1]! \n" // store 8.
|
|
||||||
"bgt 1b \n"
|
|
||||||
: "+r"(src_argb), // %0
|
|
||||||
"+r"(dst_bayer), // %1
|
|
||||||
"+r"(pix) // %2
|
|
||||||
: "r"(selector) // %3
|
|
||||||
: "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select G channels from ARGB. e.g. GGGGGGGG
|
// Select G channels from ARGB. e.g. GGGGGGGG
|
||||||
void ARGBToBayerGGRow_NEON(const uint8* src_argb, uint8* dst_bayer,
|
void ARGBToBayerGGRow_NEON(const uint8* src_argb, uint8* dst_bayer,
|
||||||
uint32 /*selector*/, int pix) {
|
uint32 /*selector*/, int pix) {
|
||||||
|
|||||||
@ -1199,31 +1199,6 @@ void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy,
|
|||||||
}
|
}
|
||||||
#endif // HAS_UYVYTOUVROW_NEON
|
#endif // HAS_UYVYTOUVROW_NEON
|
||||||
|
|
||||||
// Select 2 channels from ARGB on alternating pixels. e.g. BGBGBGBG
|
|
||||||
#ifdef HAS_ARGBTOBAYERROW_NEON
|
|
||||||
void ARGBToBayerRow_NEON(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix) {
|
|
||||||
asm volatile (
|
|
||||||
"mov v2.s[0], %w3 \n" // selector
|
|
||||||
"1: \n"
|
|
||||||
MEMACCESS(0)
|
|
||||||
"ld1 {v0.16b,v1.16b}, [%0], 32 \n" // load row 8 pixels.
|
|
||||||
"subs %2, %2, #8 \n" // 8 processed per loop
|
|
||||||
"tbl v4.8b, {v0.16b}, v2.8b \n" // look up 4 pixels
|
|
||||||
"tbl v5.8b, {v1.16b}, v2.8b \n" // look up 4 pixels
|
|
||||||
"trn1 v4.4s, v4.4s, v5.4s \n" // combine 8 pixels
|
|
||||||
MEMACCESS(1)
|
|
||||||
"st1 {v4.8b}, [%1], #8 \n" // store 8.
|
|
||||||
"b.gt 1b \n"
|
|
||||||
: "+r"(src_argb), // %0
|
|
||||||
"+r"(dst_bayer), // %1
|
|
||||||
"+r"(pix) // %2
|
|
||||||
: "r"(selector) // %3
|
|
||||||
: "cc", "memory", "v0", "v1", "v2", "v4", "v5" // Clobber List
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif // HAS_ARGBTOBAYERROW_NEON
|
|
||||||
|
|
||||||
// Select G channels from ARGB. e.g. GGGGGGGG
|
// Select G channels from ARGB. e.g. GGGGGGGG
|
||||||
#ifdef HAS_ARGBTOBAYERGGROW_NEON
|
#ifdef HAS_ARGBTOBAYERGGROW_NEON
|
||||||
void ARGBToBayerGGRow_NEON(const uint8* src_argb, uint8* dst_bayer,
|
void ARGBToBayerGGRow_NEON(const uint8* src_argb, uint8* dst_bayer,
|
||||||
|
|||||||
@ -1428,7 +1428,7 @@ void RGBAToUVRow_SSSE3(const uint8* src_rgba0, int src_stride_rgba,
|
|||||||
// Bias values to subtract 16 from Y and 128 from U and V.
|
// Bias values to subtract 16 from Y and 128 from U and V.
|
||||||
#define BB (UB * 128 - YGB)
|
#define BB (UB * 128 - YGB)
|
||||||
#define BG (UG * 128 + VG * 128 - YGB)
|
#define BG (UG * 128 + VG * 128 - YGB)
|
||||||
#define BR ( VR * 128 - YGB)
|
#define BR (VR * 128 - YGB)
|
||||||
|
|
||||||
struct YuvConstants {
|
struct YuvConstants {
|
||||||
lvec8 kUVToB; // 0
|
lvec8 kUVToB; // 0
|
||||||
@ -4907,35 +4907,6 @@ void InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
}
|
}
|
||||||
#endif // HAS_INTERPOLATEROW_SSE2
|
#endif // HAS_INTERPOLATEROW_SSE2
|
||||||
|
|
||||||
#ifdef HAS_ARGBTOBAYERROW_SSSE3
|
|
||||||
void ARGBToBayerRow_SSSE3(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix) {
|
|
||||||
asm volatile (
|
|
||||||
// NaCL caveat - assumes movd is from GPR
|
|
||||||
"movd %3,%%xmm5 \n"
|
|
||||||
"pshufd $0x0,%%xmm5,%%xmm5 \n"
|
|
||||||
LABELALIGN
|
|
||||||
"1: \n"
|
|
||||||
"movdqu " MEMACCESS(0) ",%%xmm0 \n"
|
|
||||||
"movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n"
|
|
||||||
"lea " MEMLEA(0x20,0) ",%0 \n"
|
|
||||||
"pshufb %%xmm5,%%xmm0 \n"
|
|
||||||
"pshufb %%xmm5,%%xmm1 \n"
|
|
||||||
"punpckldq %%xmm1,%%xmm0 \n"
|
|
||||||
"movq %%xmm0," MEMACCESS(1) " \n"
|
|
||||||
"lea " MEMLEA(0x8,1) ",%1 \n"
|
|
||||||
"sub $0x8,%2 \n"
|
|
||||||
"jg 1b \n"
|
|
||||||
: "+r"(src_argb), // %0
|
|
||||||
"+r"(dst_bayer), // %1
|
|
||||||
"+r"(pix) // %2
|
|
||||||
: "g"(selector) // %3
|
|
||||||
: "memory", "cc"
|
|
||||||
, "xmm0", "xmm1", "xmm5"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif // HAS_ARGBTOBAYERROW_SSSE3
|
|
||||||
|
|
||||||
#ifdef HAS_ARGBTOBAYERGGROW_SSE2
|
#ifdef HAS_ARGBTOBAYERGGROW_SSE2
|
||||||
void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
|
void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
|
||||||
uint32 selector, int pix) {
|
uint32 selector, int pix) {
|
||||||
|
|||||||
@ -38,7 +38,7 @@ extern "C" {
|
|||||||
// Bias values to subtract 16 from Y and 128 from U and V.
|
// Bias values to subtract 16 from Y and 128 from U and V.
|
||||||
#define BB (UB * 128 - YGB)
|
#define BB (UB * 128 - YGB)
|
||||||
#define BG (UG * 128 + VG * 128 - YGB)
|
#define BG (UG * 128 + VG * 128 - YGB)
|
||||||
#define BR ( VR * 128 - YGB)
|
#define BR (VR * 128 - YGB)
|
||||||
|
|
||||||
static const vec8 kUVToB = {
|
static const vec8 kUVToB = {
|
||||||
UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0
|
UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0
|
||||||
@ -5242,31 +5242,6 @@ void InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr,
|
|||||||
}
|
}
|
||||||
#endif // HAS_INTERPOLATEROW_SSE2
|
#endif // HAS_INTERPOLATEROW_SSE2
|
||||||
|
|
||||||
__declspec(naked) __declspec(align(16))
|
|
||||||
void ARGBToBayerRow_SSSE3(const uint8* src_argb, uint8* dst_bayer,
|
|
||||||
uint32 selector, int pix) {
|
|
||||||
__asm {
|
|
||||||
mov eax, [esp + 4] // src_argb
|
|
||||||
mov edx, [esp + 8] // dst_bayer
|
|
||||||
movd xmm5, [esp + 12] // selector
|
|
||||||
mov ecx, [esp + 16] // pix
|
|
||||||
pshufd xmm5, xmm5, 0
|
|
||||||
|
|
||||||
wloop:
|
|
||||||
movdqu xmm0, [eax]
|
|
||||||
movdqu xmm1, [eax + 16]
|
|
||||||
lea eax, [eax + 32]
|
|
||||||
pshufb xmm0, xmm5
|
|
||||||
pshufb xmm1, xmm5
|
|
||||||
punpckldq xmm0, xmm1
|
|
||||||
movq qword ptr [edx], xmm0
|
|
||||||
lea edx, [edx + 8]
|
|
||||||
sub ecx, 8
|
|
||||||
jg wloop
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specialized ARGB to Bayer that just isolates G channel.
|
// Specialized ARGB to Bayer that just isolates G channel.
|
||||||
__declspec(naked) __declspec(align(16))
|
__declspec(naked) __declspec(align(16))
|
||||||
void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
|
void ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer,
|
||||||
|
|||||||
@ -33,7 +33,7 @@ static const struct FourCCAliasEntry kFourCCAliases[] = {
|
|||||||
{FOURCC_2VUY, FOURCC_UYVY}, // kCMPixelFormat_422YpCbCr8
|
{FOURCC_2VUY, FOURCC_UYVY}, // kCMPixelFormat_422YpCbCr8
|
||||||
{FOURCC_JPEG, FOURCC_MJPG}, // Note: JPEG has DHT while MJPG does not.
|
{FOURCC_JPEG, FOURCC_MJPG}, // Note: JPEG has DHT while MJPG does not.
|
||||||
{FOURCC_DMB1, FOURCC_MJPG},
|
{FOURCC_DMB1, FOURCC_MJPG},
|
||||||
{FOURCC_BA81, FOURCC_BGGR},
|
{FOURCC_BA81, FOURCC_BGGR}, // deprecated.
|
||||||
{FOURCC_RGB3, FOURCC_RAW },
|
{FOURCC_RGB3, FOURCC_RAW },
|
||||||
{FOURCC_BGR3, FOURCC_24BG},
|
{FOURCC_BGR3, FOURCC_24BG},
|
||||||
{FOURCC_CM32, FOURCC_BGRA}, // kCMPixelFormat_32ARGB
|
{FOURCC_CM32, FOURCC_BGRA}, // kCMPixelFormat_32ARGB
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
#include "libyuv/convert_from.h"
|
#include "libyuv/convert_from.h"
|
||||||
#include "libyuv/convert_from_argb.h"
|
#include "libyuv/convert_from_argb.h"
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#ifdef HAVE_JPEG
|
#ifdef HAVE_JPEG
|
||||||
#include "libyuv/mjpeg_decoder.h"
|
#include "libyuv/mjpeg_decoder.h"
|
||||||
#endif
|
#endif
|
||||||
@ -521,10 +520,6 @@ TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1, 1, ARGB, 4)
|
|||||||
TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1, 0, ARGB, 4)
|
TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1, 0, ARGB, 4)
|
||||||
TESTPLANARTOB(I422, 2, 1, UYVY, 2, 4, 1, 0, ARGB, 4)
|
TESTPLANARTOB(I422, 2, 1, UYVY, 2, 4, 1, 0, ARGB, 4)
|
||||||
TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1, 0, ARGB, 4)
|
TESTPLANARTOB(I420, 2, 2, I400, 1, 1, 1, 0, ARGB, 4)
|
||||||
TESTPLANARTOB(I420, 2, 2, BayerBGGR, 1, 2, 2, 2, ARGB, 4)
|
|
||||||
TESTPLANARTOB(I420, 2, 2, BayerRGGB, 1, 2, 2, 2, ARGB, 4)
|
|
||||||
TESTPLANARTOB(I420, 2, 2, BayerGBRG, 1, 2, 2, 2, ARGB, 4)
|
|
||||||
TESTPLANARTOB(I420, 2, 2, BayerGRBG, 1, 2, 2, 2, ARGB, 4)
|
|
||||||
|
|
||||||
#define TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
|
#define TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \
|
||||||
W1280, DIFF, N, NEG, OFF) \
|
W1280, DIFF, N, NEG, OFF) \
|
||||||
@ -723,10 +718,6 @@ TESTATOPLANAR(UYVY, 2, 1, I420, 2, 2, 2)
|
|||||||
TESTATOPLANAR(YUY2, 2, 1, I422, 2, 1, 2)
|
TESTATOPLANAR(YUY2, 2, 1, I422, 2, 1, 2)
|
||||||
TESTATOPLANAR(UYVY, 2, 1, I422, 2, 1, 2)
|
TESTATOPLANAR(UYVY, 2, 1, I422, 2, 1, 2)
|
||||||
TESTATOPLANAR(I400, 1, 1, I420, 2, 2, 2)
|
TESTATOPLANAR(I400, 1, 1, I420, 2, 2, 2)
|
||||||
TESTATOPLANAR(BayerBGGR, 1, 2, I420, 2, 2, 4)
|
|
||||||
TESTATOPLANAR(BayerRGGB, 1, 2, I420, 2, 2, 4)
|
|
||||||
TESTATOPLANAR(BayerGBRG, 1, 2, I420, 2, 2, 4)
|
|
||||||
TESTATOPLANAR(BayerGRBG, 1, 2, I420, 2, 2, 4)
|
|
||||||
|
|
||||||
#define TESTATOBIPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \
|
#define TESTATOBIPLANARI(FMT_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \
|
||||||
W1280, N, NEG, OFF) \
|
W1280, N, NEG, OFF) \
|
||||||
@ -923,10 +914,6 @@ TESTATOB(ARGB, 4, 4, 1, RGB24, 3, 3, 1, 0)
|
|||||||
TESTATOB(ARGB, 4, 4, 1, RGB565, 2, 2, 1, 0)
|
TESTATOB(ARGB, 4, 4, 1, RGB565, 2, 2, 1, 0)
|
||||||
TESTATOB(ARGB, 4, 4, 1, ARGB1555, 2, 2, 1, 0)
|
TESTATOB(ARGB, 4, 4, 1, ARGB1555, 2, 2, 1, 0)
|
||||||
TESTATOB(ARGB, 4, 4, 1, ARGB4444, 2, 2, 1, 0)
|
TESTATOB(ARGB, 4, 4, 1, ARGB4444, 2, 2, 1, 0)
|
||||||
TESTATOB(ARGB, 4, 4, 1, BayerBGGR, 1, 1, 1, 0)
|
|
||||||
TESTATOB(ARGB, 4, 4, 1, BayerRGGB, 1, 1, 1, 0)
|
|
||||||
TESTATOB(ARGB, 4, 4, 1, BayerGBRG, 1, 1, 1, 0)
|
|
||||||
TESTATOB(ARGB, 4, 4, 1, BayerGRBG, 1, 1, 1, 0)
|
|
||||||
TESTATOB(ARGB, 4, 4, 1, YUY2, 2, 4, 1, 4)
|
TESTATOB(ARGB, 4, 4, 1, YUY2, 2, 4, 1, 4)
|
||||||
TESTATOB(ARGB, 4, 4, 1, UYVY, 2, 4, 1, 4)
|
TESTATOB(ARGB, 4, 4, 1, UYVY, 2, 4, 1, 4)
|
||||||
TESTATOB(ARGB, 4, 4, 1, I400, 1, 1, 1, 2)
|
TESTATOB(ARGB, 4, 4, 1, I400, 1, 1, 1, 2)
|
||||||
@ -941,10 +928,6 @@ TESTATOB(ARGB1555, 2, 2, 1, ARGB, 4, 4, 1, 0)
|
|||||||
TESTATOB(ARGB4444, 2, 2, 1, ARGB, 4, 4, 1, 0)
|
TESTATOB(ARGB4444, 2, 2, 1, ARGB, 4, 4, 1, 0)
|
||||||
TESTATOB(YUY2, 2, 4, 1, ARGB, 4, 4, 1, 4)
|
TESTATOB(YUY2, 2, 4, 1, ARGB, 4, 4, 1, 4)
|
||||||
TESTATOB(UYVY, 2, 4, 1, ARGB, 4, 4, 1, 4)
|
TESTATOB(UYVY, 2, 4, 1, ARGB, 4, 4, 1, 4)
|
||||||
TESTATOB(BayerBGGR, 1, 2, 2, ARGB, 4, 4, 1, 0)
|
|
||||||
TESTATOB(BayerRGGB, 1, 2, 2, ARGB, 4, 4, 1, 0)
|
|
||||||
TESTATOB(BayerGBRG, 1, 2, 2, ARGB, 4, 4, 1, 0)
|
|
||||||
TESTATOB(BayerGRBG, 1, 2, 2, ARGB, 4, 4, 1, 0)
|
|
||||||
TESTATOB(I400, 1, 1, 1, ARGB, 4, 4, 1, 0)
|
TESTATOB(I400, 1, 1, 1, ARGB, 4, 4, 1, 0)
|
||||||
TESTATOB(I400, 1, 1, 1, I400, 1, 1, 1, 0)
|
TESTATOB(I400, 1, 1, 1, I400, 1, 1, 1, 0)
|
||||||
TESTATOB(I400, 1, 1, 1, I400Mirror, 1, 1, 1, 0)
|
TESTATOB(I400, 1, 1, 1, I400Mirror, 1, 1, 1, 0)
|
||||||
|
|||||||
@ -17,7 +17,6 @@
|
|||||||
#include "libyuv/convert_from.h"
|
#include "libyuv/convert_from.h"
|
||||||
#include "libyuv/convert_from_argb.h"
|
#include "libyuv/convert_from_argb.h"
|
||||||
#include "libyuv/cpu_id.h"
|
#include "libyuv/cpu_id.h"
|
||||||
#include "libyuv/format_conversion.h"
|
|
||||||
#include "libyuv/planar_functions.h"
|
#include "libyuv/planar_functions.h"
|
||||||
#include "libyuv/rotate.h"
|
#include "libyuv/rotate.h"
|
||||||
#include "libyuv/row.h" // For Sobel
|
#include "libyuv/row.h" // For Sobel
|
||||||
|
|||||||
@ -51,7 +51,6 @@ TEST_F(libyuvTest, TestCanonicalFourCC) {
|
|||||||
EXPECT_EQ(FOURCC_UYVY, CanonicalFourCC(FOURCC_2VUY));
|
EXPECT_EQ(FOURCC_UYVY, CanonicalFourCC(FOURCC_2VUY));
|
||||||
EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_JPEG));
|
EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_JPEG));
|
||||||
EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_DMB1));
|
EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_DMB1));
|
||||||
EXPECT_EQ(FOURCC_BGGR, CanonicalFourCC(FOURCC_BA81));
|
|
||||||
EXPECT_EQ(FOURCC_RAW, CanonicalFourCC(FOURCC_RGB3));
|
EXPECT_EQ(FOURCC_RAW, CanonicalFourCC(FOURCC_RGB3));
|
||||||
EXPECT_EQ(FOURCC_24BG, CanonicalFourCC(FOURCC_BGR3));
|
EXPECT_EQ(FOURCC_24BG, CanonicalFourCC(FOURCC_BGR3));
|
||||||
EXPECT_EQ(FOURCC_BGRA, CanonicalFourCC(FOURCC_CM32));
|
EXPECT_EQ(FOURCC_BGRA, CanonicalFourCC(FOURCC_CM32));
|
||||||
@ -83,10 +82,6 @@ TEST_F(libyuvTest, TestFourCC) {
|
|||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_RGBP, FOURCC_BPP_RGBP));
|
EXPECT_TRUE(TestValidFourCC(FOURCC_RGBP, FOURCC_BPP_RGBP));
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_RGBO, FOURCC_BPP_RGBO));
|
EXPECT_TRUE(TestValidFourCC(FOURCC_RGBO, FOURCC_BPP_RGBO));
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_R444, FOURCC_BPP_R444));
|
EXPECT_TRUE(TestValidFourCC(FOURCC_R444, FOURCC_BPP_R444));
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_RGGB, FOURCC_BPP_RGGB));
|
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_BGGR, FOURCC_BPP_BGGR));
|
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_GRBG, FOURCC_BPP_GRBG));
|
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_GBRG, FOURCC_BPP_GBRG));
|
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_MJPG, FOURCC_BPP_MJPG));
|
EXPECT_TRUE(TestValidFourCC(FOURCC_MJPG, FOURCC_BPP_MJPG));
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_YV12, FOURCC_BPP_YV12));
|
EXPECT_TRUE(TestValidFourCC(FOURCC_YV12, FOURCC_BPP_YV12));
|
||||||
EXPECT_TRUE(TestValidFourCC(FOURCC_YV16, FOURCC_BPP_YV16));
|
EXPECT_TRUE(TestValidFourCC(FOURCC_YV16, FOURCC_BPP_YV16));
|
||||||
|
|||||||
@ -19,7 +19,6 @@ LOCAL_OBJ_FILES = \
|
|||||||
source/convert_to_argb.o\
|
source/convert_to_argb.o\
|
||||||
source/convert_to_i420.o\
|
source/convert_to_i420.o\
|
||||||
source/cpu_id.o\
|
source/cpu_id.o\
|
||||||
source/format_conversion.o\
|
|
||||||
source/planar_functions.o\
|
source/planar_functions.o\
|
||||||
source/rotate.o\
|
source/rotate.o\
|
||||||
source/rotate_argb.o\
|
source/rotate_argb.o\
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user