工具/软件:
您好!
我有定制板。 我没有屏幕。 我有 imx390摄像头、该摄像头由 R5F 内核上的 RTOS 管理。 为了测试我的设置、我使用 vx_app_single_camera 演示。 我知道它是有效的、因为我捕获了图像、但我想使用 GStreamer 流式传输视频。 我知道 TI 提供了 GST_Wrapper、但我不知道如何将其与 Vx_image 一起使用。 是否有任何使用 vx_image 数据作为 gst_wrapper 参数的示例应用程序?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:
您好!
我有定制板。 我没有屏幕。 我有 imx390摄像头、该摄像头由 R5F 内核上的 RTOS 管理。 为了测试我的设置、我使用 vx_app_single_camera 演示。 我知道它是有效的、因为我捕获了图像、但我想使用 GStreamer 流式传输视频。 我知道 TI 提供了 GST_Wrapper、但我不知道如何将其与 Vx_image 一起使用。 是否有任何使用 vx_image 数据作为 gst_wrapper 参数的示例应用程序?
尊敬的 Lukasz:
Unknown 说:我有 imx390摄像头、该摄像头由 R5F 内核上的 RTOS 管理。
Unknown 说:、但我想使用 GStreamer 流式传输视频。 [/报价]在 TI S/W 平台上、它通常是 RTOS (单摄像头应用)或 edgeai (gstreamer)、但不能同时是两者。
通过 edgeai、Linux 端的传感器驱动程序。Unknown 说:我有定制电路板。 我没有屏幕。复制我的朋友 Fabiana Jaimes 为她的评论。
[/quote]
您知道、我的摄像头由 RTOS 管理、但使用单摄像头演示时、指向图像的指针可从 A72内核获得。 因此、我的理解是、我可以以某种方式使用这些可用数据通过 gstreamer 发送它们。 现在,我想我可以创建新节点,并重复使用函数-经过一些修改-将 YUV420映像写入文件。
vx_int32 write_output_image_fp(FILE * fp, vx_image out_image)
{
vx_uint32 width, height;
vx_df_image df;
vx_imagepatch_addressing_t image_addr;
vx_rectangle_t rect;
vx_map_id map_id1, map_id2;
void *data_ptr1, *data_ptr2;
vx_uint32 num_bytes_per_4pixels;
vx_uint32 num_luma_bytes_written_to_file=0;
vx_uint32 num_chroma_bytes_written_to_file=0;
vx_uint32 num_bytes_written_to_file=0;
vx_uint32 imgaddr_width, imgaddr_height, imgaddr_stride;
int i;
vxQueryImage(out_image, VX_IMAGE_WIDTH, &width, sizeof(vx_uint32));
vxQueryImage(out_image, VX_IMAGE_HEIGHT, &height, sizeof(vx_uint32));
vxQueryImage(out_image, VX_IMAGE_FORMAT, &df, sizeof(vx_df_image));
if(VX_DF_IMAGE_NV12 == df)
{
num_bytes_per_4pixels = 4;
}
else if(TIVX_DF_IMAGE_NV12_P12 == df)
{
num_bytes_per_4pixels = 6;
}
else
{
num_bytes_per_4pixels = 8;
}
rect.start_x = 0;
rect.start_y = 0;
rect.end_x = width;
rect.end_y = height;
vxMapImagePatch(out_image,
&rect,
0,
&map_id1,
&image_addr,
&data_ptr1,
VX_WRITE_ONLY,
VX_MEMORY_TYPE_HOST,
VX_NOGAP_X
);
if(!data_ptr1)
{
printf("data_ptr1 is NULL \n");
return -1;
}
imgaddr_width = image_addr.dim_x;
imgaddr_height = image_addr.dim_y;
imgaddr_stride = image_addr.stride_y;
printf("imgaddr_width = %d \n", imgaddr_width);
printf("imgaddr_height = %d \n", imgaddr_height);
printf("imgaddr_stride = %d \n", imgaddr_stride);
printf("width = %d \n", width);
printf("height = %d \n", height);
num_luma_bytes_written_to_file = 0;
for(i=0;i<height;i++)
{
num_luma_bytes_written_to_file += fwrite(data_ptr1, 1, width*num_bytes_per_4pixels/4, fp);
data_ptr1 += imgaddr_stride;
}
vxUnmapImagePatch(out_image, map_id1);
fflush(fp);
if(VX_DF_IMAGE_NV12 == df || TIVX_DF_IMAGE_NV12_P12 == df)
{
vxMapImagePatch(out_image,
&rect,
1,
&map_id2,
&image_addr,
&data_ptr2,
VX_WRITE_ONLY,
VX_MEMORY_TYPE_HOST,
VX_NOGAP_X
);
if(!data_ptr2)
{
printf("data_ptr2 is NULL \n");
return -1;
}
imgaddr_width = image_addr.dim_x;
imgaddr_height = image_addr.dim_y;
imgaddr_stride = image_addr.stride_y;
num_chroma_bytes_written_to_file = 0;
for(i=0;i<imgaddr_height/2;i++)
{
num_chroma_bytes_written_to_file += fwrite(data_ptr2, 1, imgaddr_width*num_bytes_per_4pixels/4, fp);
data_ptr2 += imgaddr_stride;
}
fflush(fp);
vxUnmapImagePatch(out_image, map_id2);
}
num_bytes_written_to_file = num_luma_bytes_written_to_file + num_chroma_bytes_written_to_file;
printf("Written %d bytes \n", num_bytes_written_to_file);
return num_bytes_written_to_file;
}
我认为接下来我可以使用该缓冲区作为 appGstSrcInit / appCodecSrcInit 函数的输入。
Lukasz,
您知道、我的摄像头由 RTOS 管理、但使用单摄像头演示时、可以从 A72内核获取指向图像的指针。 因此、我的理解是、我可以以某种方式使用这些可用数据通过 gstreamer 发送它们。 [/报价]我认为 TI SDK 没有实施/测试过这个功能。
gstreamer 模块/插件级别可能需要进行相当多的软件更改、但我不熟悉这些软件详细信息。复制我的朋友 Rahul Ravikumar 和 Fabiana Jaimes 的评论。