Initial commit
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
#ifndef BUFFER_CONVERTER_H
|
||||
#define BUFFER_CONVERTER_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
|
||||
// Buffer format conversion utilities for HAL compatibility.
|
||||
// Converts between decoder output formats and HAL-expected formats.
|
||||
// Uses ARM NEON intrinsics for performance on Pixel 9a (arm64-v8a).
|
||||
|
||||
namespace buffer_converter {
|
||||
|
||||
// Convert YUV420 planar (I420) to NV21 (semi-planar, VU interleaved)
|
||||
// YUV420 planar: Y plane, U plane, V plane (separate)
|
||||
// NV21: Y plane, VU interleaved plane
|
||||
//
|
||||
// src_y, src_u, src_v: source plane pointers
|
||||
// src_y_stride, src_uv_stride: source plane strides (bytes per row)
|
||||
// dst_nv21: destination buffer (Y plane followed by VU interleaved)
|
||||
// dst_y_stride, dst_uv_stride: destination strides
|
||||
// width, height: frame dimensions
|
||||
//
|
||||
// Returns true on success, false on error
|
||||
bool yuv420_planar_to_nv21(
|
||||
const uint8_t* src_y, int src_y_stride,
|
||||
const uint8_t* src_u, int src_u_stride,
|
||||
const uint8_t* src_v, int src_v_stride,
|
||||
uint8_t* dst_nv21, int dst_y_stride, int dst_uv_stride,
|
||||
int width, int height);
|
||||
|
||||
// Convert YUV420 planar (I420) to YUV420 planar with different stride
|
||||
// Handles stride mismatch between decoder output and HAL buffer.
|
||||
// Copies Y plane with stride adjustment, then U and V planes.
|
||||
//
|
||||
// Returns true on success
|
||||
bool yuv420_planar_copy_with_stride(
|
||||
const uint8_t* src_y, int src_y_stride,
|
||||
const uint8_t* src_u, int src_u_stride,
|
||||
const uint8_t* src_v, int src_v_stride,
|
||||
uint8_t* dst_y, int dst_y_stride,
|
||||
uint8_t* dst_u, int dst_u_stride,
|
||||
uint8_t* dst_v, int dst_v_stride,
|
||||
int width, int height);
|
||||
|
||||
// Convert NV21 (semi-planar) to YUV420 planar (I420)
|
||||
// Used when decoder outputs NV21 but HAL expects planar.
|
||||
//
|
||||
// Returns true on success
|
||||
bool nv21_to_yuv420_planar(
|
||||
const uint8_t* src_nv21, int src_y_stride, int src_uv_stride,
|
||||
uint8_t* dst_y, int dst_y_stride,
|
||||
uint8_t* dst_u, int dst_u_stride,
|
||||
uint8_t* dst_v, int dst_v_stride,
|
||||
int width, int height);
|
||||
|
||||
// Fast Y plane copy with NEON (handles stride mismatch)
|
||||
// Copies width bytes per row, advancing by stride each row.
|
||||
void copy_plane_neon(
|
||||
const uint8_t* src, int src_stride,
|
||||
uint8_t* dst, int dst_stride,
|
||||
int width, int height);
|
||||
|
||||
// Interleave U and V planes into NV21 format (VU order) using NEON
|
||||
void interleave_uv_to_nv21_neon(
|
||||
const uint8_t* src_u, int src_u_stride,
|
||||
const uint8_t* src_v, int src_v_stride,
|
||||
uint8_t* dst_vu, int dst_vu_stride,
|
||||
int width, int height);
|
||||
|
||||
} // namespace buffer_converter
|
||||
|
||||
#endif // BUFFER_CONVERTER_H
|
||||
Reference in New Issue
Block a user