首先感谢阅读,如果您也对TDA4相关的开发感兴趣,我们这边有个学习交流微信群,可以入群和大家一起交流学习。
资历较浅,水平有限,如遇错误,请大家多指正!
保持开源精神,共同分享、进步!
博主WX : AIR_12 我会拉你入群。
链接:TDA4 相关专栏 链接:TDA4 Demo Gitee开源库
欢迎大家加入,一起维护这个开源库,给更多的朋友提供帮助。
上一篇文章完成了YUV NV12 编码encode H264视频的功能。
[TI TDA4 J721E]USB摄像头 YUV图像视频编码生成h264 encode节点的使用_AIRKernel的博客-优快云博客
这一篇博客将尝试逆向decode,将H264视频流,解码为YUV NV12格式的图像序列。同样基于版本是0703,原因请查看上一篇博客。
一、H264简介
在进行decode解码之前,首先要了解什么是H264。
详细的文章可以参考这个博客(转载):H264--2--语法及结构_杨重选的专栏-优快云博客_h264 结构
其中最重要也是最基础的部分就是 I帧、P帧、B帧。
一个I帧+若干P帧+若干B帧,形成GOP(group of pictures)。
视频以GOP形式,流式发送,每一次发送的数据都是单独的帧(I、P、B)。
I帧是关键帧,只有收到I帧以后,这个GOP才能有效的被解码,否则此GOP无效,将被丢弃。
在程序里,为了方便,我将encode节点作为一个graph;decode作为一个graph;分开单独运行。
流程如下:(大家在走读代码的时候,一定要细心一点,读懂代码才能理解。)
1、encode node 产生 bitStream(H264视频流)
2、decode node 对此bitStream进行解码。
二、pipeline的应用及相关说明
tiovx为了提高硬件的使用效率和整体的执行速度,有一个流水线pipeline的相关操作。
官方资料入口:

比较关键的几个函数如下:
1、vxGraphParameterEnqueueReadyRef //入队参数
2、vxGraphParameterDequeueDoneRef //出队参数,执行此函数,则默认graph已经被执行。(这里具体要去看tiovx里面的pipeline理解一下,理解了这里,基本上pipeline就理解了一半了)。
3、tivxSetUserDataObjectAttribute //设置入队的用户数据对象的大小。
这几个核心函数主要在如下的程序段内使用:
vx_status app_run_decodeGraph(vx_graph graph, DecodeObj *decodeObj, vx_user_data_object *bitStream)
{
vx_status status = VX_SUCCESS;
if (decodeObj->pipeline < 0)
{
/* Enqueue output */
vxGraphParameterEnqueueReadyRef(graph, decodeObj->output_image_graph_parameter_index, (vx_reference *)&decodeObj->output_image[decodeObj->enqueueCnt], 1);
app_copy_encodeBitStream_to_decodeBitStream(&decodeObj->bitstream_obj[decodeObj->enqueueCnt], bitStream);
/* Enqueue input - start execution */
vxGraphParameterEnqueueReadyRef(graph, decodeObj->input_bitstream_graph_parameter_index, (vx_reference *)&decodeObj->bitstream_obj[decodeObj->enqueueCnt], 1);
decodeObj->enqueueCnt++;
decodeObj->enqueueCnt = (decodeObj->enqueueCnt >= decodeObj->num_buf) ? 0 : decodeObj->enqueueCnt;
decodeObj->pipeline++;
}
else if (decodeObj->pipeline >= 0)
{
vx_int32 array_idx = -1, img_array_idx = -1;
vx_image out_image;
vx_user_data_object in_bitstream;
uint32_t num_refs;
/* Dequeue & Save output */
//参数说明:要出队的参数索引、被出队的对象填充该区域、最大的出队个数、实际的出队个数
vxGraphParameterDequeueDoneRef(graph, decodeObj->output_image_graph_parameter_index, (vx_reference *)&out_image, 1, &num_refs);
app_find_image_array_index(decodeObj->output_image, (vx_reference)out_image,
5558



被折叠的 条评论
为什么被折叠?



