YUV420sp旋转90度
大家可以参考、使用libyuv库,基本的YUV旋转、缩放等功能都有,github上有googlesource的镜像。交叉编译介绍。
下面函数可以作为参考。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
void RotateYUV420sp90(uint8_t *src, int width, int height, uint8_t *dst) {
int wh;
int hald_h;
int i;
int j;
int dst_position;
int tmp_position;
wh = width * height;
hald_h = height >> 1;
dst_position = 0;
for (i = 0; i < width; ++ i) {
tmp_position = 0;
for (j = 0; j < height; ++ j) {
dst[dst_position] = src[tmp_position + i];
++ dst_position;
tmp_position += width;
}
}
for (i = 0; i < width; i += 2) {
tmp_position = wh;
for (j = 0; j < hald_h; ++ j) {
dst[dst_position] = src[tmp_position + i];
dst[dst_position + 1] = src[tmp_position + i + 1];
dst_position += 2;
tmp_position += width;
}
}
}
YUV420sp旋转负90度
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
void RotateYUV420spNegative90(uint8_t *src, int width, int height, uint8_t *dst) {
int wh;
int hald_h;
int i;
int j;
int dst_position;
int tmp_position;
wh = width * height;
hald_h = height >> 1;
dst_position = 0;
for (i = 0; i < width; ++ i) {
tmp_position = width - 1;
for (j = 0; j < height; ++ j) {
dst[dst_position] = src[tmp_position - i];
++ dst_position;
tmp_position += width;
}
}
for (i = 0; i < width; i += 2) {
tmp_position = wh + width - 1;
for (j = 0; j < hald_h; ++ j) {
dst[dst_position] = src[tmp_position + i - 1];
dst[dst_position + 1] = src[tmp_position - i];
dst_position += 2;
tmp_position += width;
}
}
}
YUV420p转YUV420sp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
void YUV420p2YUV420sp(uint8_t *src, int width, int height, uint8_t *dst) {
uint8_t *src_u;
uint8_t *src_v;
uint8_t *dst_uv;
int y_size;
int half_y_zise;
int i;
int j;
y_size = width * height;
half_y_zise = y_size >> 1;
src_u = src + y_size;
src_v = src_u + (half_y_zise >> 1);
memcpy(dst, src, y_size);
dst_uv = dst + y_size;
for (i = 0, j = 0; j < half_y_zise; i ++, j += 2) {
dst_uv[j] = src_u[i];
dst_uv[j + 1] = src_v[i];
}
}
YUV420p转YUV420sp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
void YUV420sp2YUV420p(uint8_t *src, int width, int height, uint8_t *dst) {
uint8_t *dst_u;
uint8_t *dst_v;
uint8_t *src_uv;
int y_size;
int half_y_zise;
int i;
int j;
y_size = width * height;
half_y_zise = y_size >> 1;
src_uv = src + y_size;
dst_u = dst + y_size;
dst_v = dst_u + (half_y_zise >> 1);
memcpy(dst, src, y_size);
for (i = 0, j = 0; j < half_y_zise; i ++, j += 2) {
dst_u[i] = src_uv[j];
dst_v[i] = src_uv[j + 1];
}
}
YUV400裁剪
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
int YUV400Crop(uint32_t width_src, uint32_t height_src, uint8_t *yuv400_src,
uint32_t x, uint32_t y, uint32_t width_dst, uint32_t height_dst, uint8_t *yuv400_dst) {
int rtn;
int h;
int src_offset;
int dst_offset;
if ((x + width_dst) > width_src || (y + height_dst) > height_src) {
return -1;
}
src_offset = 0;
dst_offset = 0;
yuv400_src = yuv400_src + y * width_src + x;
for (h = 0; h < height_dst; ++ h) {
memcpy(yuv400_dst + dst_offset, yuv400_src + src_offset, width_dst);
src_offset += width_src;
dst_offset += width_dst;
}
return 0;
}