OBS源码分析set_gpu_converted_data
/* * Function Name: set_gpu_converted_data
* Description: 拷贝一帧
* Parameters: width 视频宽
height 视频高
linesize_input 输入数据的每行对齐长度
linesize_output 输出数据每行对齐长度
in 输入数据
out 输出数据
* Return Type : 返回输入数据的尾部指针
******************************************************************************/
static void set_gpu_converted_data(struct obs_core_video *video,
struct video_frame *output,
const struct video_data *input,
const struct video_output_info *info)
{
if (video->using_nv12_tex) {
//使用了NV12纹理 NV12: data[0]是YYYYYYYYYYYYYYY data[1]是 UVUUVUVUVUVUVUVUVUV
//所以只需要拷贝data[0]和data[1]就行了
const uint32_t width = info->width;
const uint32_t height = info->height;
const uint8_t *const in_uv = set_gpu_converted_plane(
width, height, input->linesize[0], output->linesize[0],
input->data[0], output->data[0]);
const uint32_t height_d2 = height / 2;
set_gpu_converted_plane(width, height_d2, input->linesize[0],
output->linesize[1], in_uv,
output->data[1]);
} else {
switch (info->format) {
case VIDEO_FORMAT_I420: {
//使用的是YUV420P YUV420P: data[0]是YYYYYYYYYYYYYYY data[1]是UUUUUUUUUUUUUUUUUUU data[2]VVVVVVVVVVVVVVVVVVVVVVVVV
//所以要拷贝三块数据
const uint32_t width = info->width;
const uint32_t height = info->height;
set_gpu_converted_plane(width, height,
input->linesize[0],
output->linesize[0],
input->data[0],
output->data[0]);
const uint32_t width_d2 = width / 2;
const uint32_t height_d2 = height / 2;
set_gpu_converted_plane(width_d2, height_d2,
input->linesize[1],
output->linesize[1],
input->data[1],
output->data[1]);
set_gpu_converted_plane(width_d2, height_d2,
input->linesize[2],
output->linesize[2],
input->data[2],
output->data[2]);
break;
}
case VIDEO_FORMAT_NV12: {
//NV12 NV12: data[0]是YYYYYYYYYYYYYYY data[1]是 UVUUVUVUVUVUVUVUVUV
//所以只需要拷贝data[0] 和data[1] 就行了
const uint32_t width = info->width;
const uint32_t height = info->height;
set_gpu_converted_plane(width, height,
input->linesize[0],
output->linesize[0],
input->data[0],
output->data[0]);
const uint32_t height_d2 = height / 2;
set_gpu_converted_plane(width, height_d2,
input->linesize[1],
output->linesize[1],
input->data[1],
output->data[1]);
break;
}
case VIDEO_FORMAT_I444: {
const uint32_t width = info->width;
const uint32_t height = info->height;
set_gpu_converted_plane(width, height,
input->linesize[0],
output->linesize[0],
input->data[0],
output->data[0]);
set_gpu_converted_plane(width, height,
input->linesize[1],
output->linesize[1],
input->data[1],
output->data[1]);
set_gpu_converted_plane(width, height,
input->linesize[2],
output->linesize[2],
input->data[2],
output->data[2]);
break;
}
case VIDEO_FORMAT_NONE:
case VIDEO_FORMAT_YVYU:
case VIDEO_FORMAT_YUY2:
case VIDEO_FORMAT_UYVY:
case VIDEO_FORMAT_RGBA:
case VIDEO_FORMAT_BGRA:
case VIDEO_FORMAT_BGRX:
case VIDEO_FORMAT_Y800:
case VIDEO_FORMAT_BGR3:
case VIDEO_FORMAT_I422:
case VIDEO_FORMAT_I40A:
case VIDEO_FORMAT_I42A:
case VIDEO_FORMAT_YUVA:
case VIDEO_FORMAT_AYUV:
/* unimplemented */
;
}
}
}

浙公网安备 33010602011771号