libyuv库实现裁剪和缩放

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);
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值