libyuv笔记
官方网址
以下网址需要科学上网哦
- https://chromium.googlesource.com/libyuv/libyuv/
- https://chromium.googlesource.com/libyuv/libyuv/+/master/docs/
下载好资源后可以参照文档进行编译
这里提供一个android版本的libyuv-android
示例
由于官方的接口基本没注释,可能他们觉得太简单了,或者我们太蠢了,不管如何,我这里根据实验结果对其注释一下,加深理解
//以I420为例,假设源图数据为sdata[],目标图数据为ddata[]
//假设这里有源图sw*sh=200*100的图片,要对其旋转90度,变成目标图dw*dh=100*200的图片,那么sw=dh,sh=dw.
//源图的y分量的长度sySize=sw*sh=20000,u或v分量的长度suvSize=suSize=svSize=((sw+1)/2)*((sh+1)/2)=5000
//目标图的y分量的长度dySize=dw*dh=20000,u或v分量的长度duvSize=duSize=dvSize=((dw+1)/2)*((dh+1)/2)=5000,与源图是一致的
//至于stride,src_stride_y=sw=200,src_stride_u=src_stride_v=(sw+1)/2=100
// dst_stride_y=dw=100,dst_stride_u=dst_stride_v=(dw+1)/2=50
// Rotate I420 frame.
// 返回0表示成功,其他则为失败
LIBYUV_API
int I420Rotate(const uint8_t* src_y, //在此例即为sdata
int src_stride_y, //在此例即为sw
const uint8_t* src_u, //在此例即为sdata+sySize
int src_stride_u, //在此例即为(sw+1)/2
const uint8_t* src_v, //在此例即为sdata+sySize+suvSize
int src_stride_v, //在此例即为(sw+1)/2
uint8_t* dst_y, //在此例即为ddata
int dst_stride_y, //在此例即为dw
uint8_t* dst_u, //在此例即为ddata+dySize
int dst_stride_u, //在此例即为(dw+1)/2
uint8_t* dst_v, //在此例即为ddata+dySize+duvSize
int dst_stride_v, //在此例即为(dw+1)/2
int width, //这里指源图,即sw
int height, //这里指源图,即dw
enum RotationMode mode //旋转角度
);
资源下载
由于访问libyuv需要科学上网,这里顺便提供资源,方便不能访问的小伙伴。