mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-02-06 01:39:49 +08:00
Convert planar 8 bit formats to planar 16 bit formats. Includes msan fix for Convert8To16Row_Opt unittest. I420 is YUV bt.601 8 bits per channel with 420 subsampling. I010 is YUV bt.601 10 bits per channel with 420 subsampling. I is color space - bt.601. The function does no color space conversion so H420ToI010 is aliased to this function as well. 0 = 420 subsampling. The chroma channels are half width / height. 10 = 10 bits per channel, stored in low 10 bits of 16 bit samples. For SSSE3 version: out/Release/libyuv_unittest --gtest_filter=*LibYUVConvertTest.I420ToI010_Opt --libyuv_width=1280 --libyuv_height=720 --libyuv_repeat=999 --libyuv_flags=-1 --libyuv_cpu_info=-1 [ RUN ] LibYUVConvertTest.I420ToI010_Opt [ OK ] LibYUVConvertTest.I420ToI010_Opt (276 ms) Bug: libyuv:751 Test: LibYUVConvertTest.I420ToI010_Opt Change-Id: I072876ee4fd74a2b74f459b628838bc808f9bdd2 Reviewed-on: https://chromium-review.googlesource.com/846421 Reviewed-by: Miguel Casas <mcasas@chromium.org> Commit-Queue: Frank Barchard <fbarchard@chromium.org>
329 lines
9.5 KiB
C++
329 lines
9.5 KiB
C++
/*
|
|
* 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_CONVERT_FROM_H_
|
|
#define INCLUDE_LIBYUV_CONVERT_FROM_H_
|
|
|
|
#include "libyuv/basic_types.h"
|
|
#include "libyuv/rotate.h"
|
|
|
|
#ifdef __cplusplus
|
|
namespace libyuv {
|
|
extern "C" {
|
|
#endif
|
|
|
|
// See Also convert.h for conversions from formats to I420.
|
|
|
|
// Convert 8 bit YUV to 10 bit.
|
|
#define H420ToH010 I420ToI010
|
|
int I420ToI010(const uint8* src_y,
|
|
int src_stride_y,
|
|
const uint8* src_u,
|
|
int src_stride_u,
|
|
const uint8* src_v,
|
|
int src_stride_v,
|
|
uint16* dst_y,
|
|
int dst_stride_y,
|
|
uint16* dst_u,
|
|
int dst_stride_u,
|
|
uint16* dst_v,
|
|
int dst_stride_v,
|
|
int width,
|
|
int height);
|
|
|
|
LIBYUV_API
|
|
int I420ToI422(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_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 I420ToI444(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_y,
|
|
int dst_stride_y,
|
|
uint8* dst_u,
|
|
int dst_stride_u,
|
|
uint8* dst_v,
|
|
int dst_stride_v,
|
|
int width,
|
|
int height);
|
|
|
|
// Copy to I400. Source can be I420, I422, I444, I400, NV12 or NV21.
|
|
LIBYUV_API
|
|
int I400Copy(const uint8* src_y,
|
|
int src_stride_y,
|
|
uint8* dst_y,
|
|
int dst_stride_y,
|
|
int width,
|
|
int height);
|
|
|
|
LIBYUV_API
|
|
int I420ToNV12(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_y,
|
|
int dst_stride_y,
|
|
uint8* dst_uv,
|
|
int dst_stride_uv,
|
|
int width,
|
|
int height);
|
|
|
|
LIBYUV_API
|
|
int I420ToNV21(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_y,
|
|
int dst_stride_y,
|
|
uint8* dst_vu,
|
|
int dst_stride_vu,
|
|
int width,
|
|
int height);
|
|
|
|
LIBYUV_API
|
|
int I420ToYUY2(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 I420ToUYVY(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 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);
|
|
|
|
LIBYUV_API
|
|
int I420ToBGRA(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);
|
|
|
|
LIBYUV_API
|
|
int I420ToABGR(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);
|
|
|
|
LIBYUV_API
|
|
int I420ToRGBA(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_rgba,
|
|
int dst_stride_rgba,
|
|
int width,
|
|
int height);
|
|
|
|
LIBYUV_API
|
|
int I420ToRGB24(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 I420ToRAW(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 H420ToRGB24(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 H420ToRAW(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 I420ToRGB565(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 I422ToRGB565(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);
|
|
|
|
// Convert I420 To RGB565 with 4x4 dither matrix (16 bytes).
|
|
// Values in dither matrix from 0 to 7 recommended.
|
|
// The order of the dither matrix is first byte is upper left.
|
|
|
|
LIBYUV_API
|
|
int I420ToRGB565Dither(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,
|
|
const uint8* dither4x4,
|
|
int width,
|
|
int height);
|
|
|
|
LIBYUV_API
|
|
int I420ToARGB1555(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 I420ToARGB4444(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);
|
|
// Convert I420 to AR30.
|
|
LIBYUV_API
|
|
int I420ToAR30(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_ar30,
|
|
int dst_stride_ar30,
|
|
int width,
|
|
int height);
|
|
|
|
// Convert I420 to specified format.
|
|
// "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.
|
|
LIBYUV_API
|
|
int ConvertFromI420(const uint8* y,
|
|
int y_stride,
|
|
const uint8* u,
|
|
int u_stride,
|
|
const uint8* v,
|
|
int v_stride,
|
|
uint8* dst_sample,
|
|
int dst_sample_stride,
|
|
int width,
|
|
int height,
|
|
uint32 format);
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
} // namespace libyuv
|
|
#endif
|
|
|
|
#endif // INCLUDE_LIBYUV_CONVERT_FROM_H_
|