int cv2yuvNv21(const cv::Mat& cv_bgr, unsigned char *pbuf){
int W = cv_bgr.cols;
int H = cv_bgr.rows;
int stride = W;//align_size(W, 32);
cv::Mat cv_yuv;
cv::cvtColor(cv_bgr, cv_yuv, cv::COLOR_BGR2YUV_I420);
for(int i = 0; i < H; i++){
uint8_t * src_Y = cv_yuv.ptr<uint8_t >(i);
uint8_t * dst_Y = (uint8_t*)pbuf + i * stride;
memcpy(dst_Y, src_Y, W * sizeof(uint8_t));
}
bool next_U = false;
uint8_t * UV = (uint8_t*)pbuf + stride*H;
uint8_t * u = cv_yuv.ptr() + H * W;
uint8_t * v = u + H * W / 4;
for(int i = 0; i < H/2; i++){
uint8_t * uv = UV + i * stride;
for(int j = 0; j < W; j++){
if(next_U){
*uv++ = *u++;
}
else{
*uv++ = *v++;
}
next_U = !next_U;
}
}
return 0;
}