#pragma once
#ifndef CCAP_CONVERT_NEON_H
#define CCAP_CONVERT_NEON_H
#include "ccap_convert.h"
#include <cstdint>
#if (defined(__aarch64__) || defined(_M_ARM64)) && \
(defined(__APPLE__) || defined(_WIN32) || defined(__ANDROID__) || defined(__linux__))
#define ENABLE_NEON_IMP 1
#else
#define ENABLE_NEON_IMP 0
#endif
#if ENABLE_NEON_IMP
#include <arm_neon.h>
#if defined(__APPLE__)
inline bool hasNEON_() { return true; }
#elif defined(_WIN32)
#include <intrin.h>
inline bool hasNEON_() {
return true;
}
#elif defined(__ANDROID__) || defined(__linux__)
#include <sys/auxv.h>
inline bool hasNEON_() {
#ifdef __aarch64__
return true;
#else
return (getauxval(AT_HWCAP) & HWCAP_NEON) != 0;
#endif
}
#else
inline bool hasNEON_() { return false; }
#endif
#endif
namespace ccap {
#if ENABLE_NEON_IMP
template <int inputChannels, int outputChannels, int swapRB>
void colorShuffle_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height);
void nv12ToBgra32_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcUV, int srcUVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void nv12ToRgba32_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcUV, int srcUVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void nv12ToBgr24_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcUV, int srcUVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void nv12ToRgb24_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcUV, int srcUVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void i420ToBgra32_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcU, int srcUStride,
const uint8_t* srcV, int srcVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void i420ToRgba32_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcU, int srcUStride,
const uint8_t* srcV, int srcVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void i420ToBgr24_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcU, int srcUStride,
const uint8_t* srcV, int srcVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void i420ToRgb24_neon(const uint8_t* srcY, int srcYStride,
const uint8_t* srcU, int srcUStride,
const uint8_t* srcV, int srcVStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void yuyvToBgr24_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void yuyvToRgb24_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void yuyvToBgra32_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void yuyvToRgba32_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void uyvyToBgr24_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void uyvyToRgb24_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void uyvyToBgra32_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
void uyvyToRgba32_neon(const uint8_t* src, int srcStride,
uint8_t* dst, int dstStride,
int width, int height, ConvertFlag flag);
#else
#define nv12ToBgr24_neon(...) assert(0 && "NEON not supported")
#define nv12ToRgb24_neon(...) assert(0 && "NEON not supported")
#define nv12ToBgra32_neon(...) assert(0 && "NEON not supported")
#define nv12ToRgba32_neon(...) assert(0 && "NEON not supported")
#define i420ToBgra32_neon(...) assert(0 && "NEON not supported")
#define i420ToRgba32_neon(...) assert(0 && "NEON not supported")
#define i420ToBgr24_neon(...) assert(0 && "NEON not supported")
#define i420ToRgb24_neon(...) assert(0 && "NEON not supported")
#define yuyvToBgr24_neon(...) assert(0 && "NEON not supported")
#define yuyvToRgb24_neon(...) assert(0 && "NEON not supported")
#define yuyvToBgra32_neon(...) assert(0 && "NEON not supported")
#define yuyvToRgba32_neon(...) assert(0 && "NEON not supported")
#define uyvyToBgr24_neon(...) assert(0 && "NEON not supported")
#define uyvyToRgb24_neon(...) assert(0 && "NEON not supported")
#define uyvyToBgra32_neon(...) assert(0 && "NEON not supported")
#define uyvyToRgba32_neon(...) assert(0 && "NEON not supported")
#endif
}
#endif