yuv444_to_yuv420p 实现代码
时间: 2023-08-24 16:03:54 浏览: 104
以下是一个简单的 C++ 实现代码,用于将 YUV444 格式的视频转换为 YUV420P 格式的视频:
```c++
void yuv444_to_yuv420p(unsigned char* src, unsigned char* dst, int width, int height) {
int y_size = width * height;
int u_size = y_size / 4;
int v_size = y_size / 4;
// Copy Y component
memcpy(dst, src, y_size);
// Downsample U component
for (int i = 0; i < height / 2; i++) {
for (int j = 0; j < width / 2; j++) {
int src_idx = i * 2 * width + j * 2;
int dst_idx = y_size + i * width / 2 + j;
int u_val = 0;
for (int k = 0; k < 2; k++) {
for (int l = 0; l < 2; l++) {
u_val += src[src_idx + k * width + l];
}
}
dst[dst_idx] = u_val / 4;
}
}
// Downsample V component
for (int i = 0; i < height / 2; i++) {
for (int j = 0; j < width / 2; j++) {
int src_idx = i * 2 * width + j * 2;
int dst_idx = y_size + u_size + i * width / 2 + j;
int v_val = 0;
for (int k = 0; k < 2; k++) {
for (int l = 0; l < 2; l++) {
v_val += src[src_idx + k * width + l];
}
}
dst[dst_idx] = v_val / 4;
}
}
}
```
其中,`src` 是输入的 YUV444 数据,`dst` 是输出的 YUV420P 数据,`width` 和 `height` 是视频的宽度和高度。函数中首先将 Y 分量直接复制到输出中,然后对 U、V 分量进行下采样,最终得到 YUV420P 格式的视频。注意,这里的下采样算法是简单地对每个 2x2 像素块的 U、V 值取平均值,实际的算法中可能会有更加复杂的采样方法。
阅读全文