lib实现缩放功能
/*
* @Description:
* @Author: xxx
* @Date: 2022-07-13 17:44:57
* @LastEditTime: 2022-07-13 20:31:08
* @LastEditors: xxx
*/
#include <stdio.h>
#include <stdint.h>
#include "libyuv.h"
#include <time.h>
#include <sys/time.h>
void scale(uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height, int dstWidth, int dstHeight) {
libyuv::I420Scale(
srcYuvData,
width,
srcYuvData+width*height,
(width+1)/2,
srcYuvData+width*height+((width+1)/2)*((height+1)/2),
(width+1)/2,
width,
height,
dstYuvData,
dstWidth,
dstYuvData+dstWidth*dstWidth,
(dstWidth+1)/2,
dstYuvData+dstWidth*dstHeight+((dstWidth+1)/2)*((dstHeight+1)/2),
(dstWidth+1)/2,
dstWidth,
dstHeight,
0
);
}
long NBGetSysTimeUs() //测试过转换时间
{
struct timeval tv;
struct timezone tz;
gettimeofday(&tv , &tz);
return tv.tv_usec;
}
int main() {
uint32_t width = 500, height = 400;
uint32_t dstWidth = 720, dstHeight = 576;
uint8_t YUV[width*height*3/2];
uint8_t YUV_SCALE[dstWidth*dstHeight*3/2];
printf("*****enter \n");
FILE *yuv420pFile = fopen("/opt/doctor.nv12", "rb");
fread(YUV, sizeof(YUV), 1, yuv420pFile);
printf("Today's date start time: %u\n", NBGetSysTimeUs());
scale(YUV, YUV_SCALE, width, height, dstWidth, dstHeight);
printf("Today's date end time: %u\n", NBGetSysTimeUs());
printf("*****enter1 \n");
FILE *yuvScaleFile = fopen("/opt/scale-6.nv12", "wb");
fwrite(YUV_SCALE, sizeof(YUV_SCALE), 1, yuvScaleFile);
fclose(yuvScaleFile);
fclose(yuv420pFile);
return 0;
}
lib实现裁剪功能
void clip(uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height, int cropX, int cropY, int cropWidth, int cropHeight) {
libyuv::ConvertToI420(
srcYuvData,
width*height*3/2,
dstYuvData,
cropWidth,
dstYuvData+cropWidth*cropHeight,
(cropWidth+1)/2,
dstYuvData+cropWidth*cropHeight+((cropWidth+1)/2)*((cropHeight+1)/2),
(cropWidth+1)/2,
cropX,
cropY,
width,
height,
cropWidth,
cropHeight,
0,
FOURCC('Y', 'U', '1', '2'));
}
int main() {
uint32_t width = 1000, height = 940;
uint32_t clipWidth = 720, clipHeight = 576;
uint8_t YUV[width*height*3/2];
uint8_t YUV_CLIP[clipWidth*clipHeight*3/2];
// printf("*****enter \n");
FILE *yuv420pFile = fopen("/opt/doctor.nv12", "rb");
fread(YUV, sizeof(YUV), 1, yuv420pFile);
// printf("*****enter2 \n");
clip(YUV, YUV_CLIP, width, height, 0, 0, clipWidth, clipHeight);
// printf("*****enter3 \n");
FILE *yuvClipFile = fopen("/opt/rainbow.yuv", "wb");
fwrite(YUV_CLIP, sizeof(YUV_CLIP), 1, yuvClipFile);
printf("*****enter4 \n");
fclose(yuvClipFile);
fclose(yuv420pFile);
return 0;
}
当时测试完后做了个静态库Makefile和函数如下
CONFIG_UCLIBC_BUILD=y
CROSS_COMPILE ?= mips-linux-uclibc-gnu-
CC = $(CROSS_COMPILE)gcc
CPLUSPLUS = $(CROSS_COMPILE)g++
LD = $(CROSS_COMPILE)ld
AR = $(CROSS_COMPILE)ar
STRIP = $(CROSS_COMPILE)strip
CFLAGS = $(INCLUDES) -O2 -Wall -march=mips32r2
ifeq ($(CONFIG_UCLIBC_BUILD), y)
CFLAGS += -muclibc
LDFLAG += -muclibc
endif
CFLAGS += -fpermissive
CXXFLAGS += -fpermissive
SDK_LIB_DIR = ${PWD}/include
INCLUDES = -I$(SDK_LIB_DIR)
INCLUDES += -I$(SDK_LIB_DIR)/libyuv/
LDFLAG = -Wl,-gc-sections
YUV_LIB_DIR = -L.
LIBS = $(YUV_LIB_DIR)/libyuv.a
C_SRCS=$(wildcard *.c)
C_OBJS=${C_SRCS:%.c=%.o}
CXX_SRCS=$(wildcard *.cpp)
CXX_OBJS=${CXX_SRCS:%.cpp=%.o}
SAMPLES = libyuvsample.a
all: $(SAMPLES)
$(SAMPLES): $(HISILIBS) $(C_OBJS) $(CXX_OBJS)
$(AR) -rcs $@ $^
%.o : %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
%.o : %.cpp
$(CPLUSPLUS) $(CXXFLAGS) -c $< -o $@ $(INCLUDES)
clean:
rm -f *.o *~
distclean: clean
rm -f $(SAMPLES)
库封装接口函数:
/*
* @Description:
* @Author: xxx
* @Date: 2022-07-13 17:44:57
* @LastEditTime: 2022-07-13 20:31:08
* @LastEditors: xxx
*/
#include <stdio.h>
#include <stdint.h>
#include "libyuv.h"
extern "C" {
void send_data_scale_affine(int scale_w, int scale_h, uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height);
void send_data_clip_affine(int clip_w, int clip_h, uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height, int cropX, int cropY);
}
void scale(uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height, int dstWidth, int dstHeight) {
libyuv::I420Scale(
srcYuvData,
width,
srcYuvData+width*height,
(width+1)/2,
srcYuvData+width*height+((width+1)/2)*((height+1)/2),
(width+1)/2,
width,
height,
dstYuvData,
dstWidth,
dstYuvData+dstWidth*dstWidth,
(dstWidth+1)/2,
dstYuvData+dstWidth*dstHeight+((dstWidth+1)/2)*((dstHeight+1)/2),
(dstWidth+1)/2,
dstWidth,
dstHeight,
0
);
}
void clip(uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height, int cropX, int cropY, int cropWidth, int cropHeight) {
libyuv::ConvertToI420(
srcYuvData,
width*height*3/2,
dstYuvData,
cropWidth,
dstYuvData+cropWidth*cropHeight,
(cropWidth+1)/2,
dstYuvData+cropWidth*cropHeight+((cropWidth+1)/2)*((cropHeight+1)/2),
(cropWidth+1)/2,
cropX,
cropY,
width,
height,
cropWidth,
cropHeight,
0,
FOURCC('Y', 'U', '1', '2'));
}
void send_data_scale_affine(int scale_w, int scale_h, uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height)
{
scale(srcYuvData, dstYuvData, width, height, scale_w, scale_h);
}
void send_data_clip_affine(int clip_w, int clip_h, uint8_t *srcYuvData, uint8_t *dstYuvData, int width, int height, int cropX, int cropY)
{
clip(srcYuvData, dstYuvData, width, height, cropX, cropY, clip_w, clip_h);
}