当前位置:网站首页>openh264解码数据流向分析
openh264解码数据流向分析
2022-07-05 19:34:00 【HUI的技術筆記】
openh264dec中finish_frame的逻辑和avviddec比起来比较简单,在handle_frame中,buffer先送给解码器解码(DecodeFrameNoDelay
),然后调用gst_video_decoder_finish_frame
将解码后的buffer发到downstream。
DecodeFrameNoDelay解码,返回yuvdata,完成后unmap input_buffer:
openh264dec->decoder->DecodeFrameNoDelay (map_info.data, map_info.size,
yuvdata, &dst_buf_info);
gst_buffer_unmap (frame->input_buffer, &map_info);
gst_video_frame_map的功能
gst_video_frame_map()将在GstVideoFrame结构中填入buffer的像素以及所需的各种视频信息。
gboolean
gst_video_frame_map (GstVideoFrame * frame, GstVideoInfo * info, GstBuffer * buffer, GstMapFlags flags)
使用@info和@buffer来填入到@frame,地址会被传给分配在堆栈中的#GstVideoFrame结构。
可以使用访问器宏访问,如:
GST_VIDEO_FRAME_COMP_DATA()
GST_VIDEO_FRAME_PLANE_DATA()
GST_VIDEO_FRAME_COMP_STRIDE()
GST_VIDEO_FRAME_PLANE_STRIDE()
这个功能的目的是使你能够很容易地获得视频像素,而不需要担心太多细节问题。
比如视频数据是被分配在一个连续的内存块中还是多个内存块(例如,对于每一个plane都有一个内存块),或者是否使用自定义strides和自定义plane偏移(由每个缓冲区上的GstVideoMeta记录)。
这个函数只是用正确的值填充#GstVideoFrame结构
,使用访问器宏,可以很容易地访问数据。它还会为你映射底层的内存块。
gst_video_frame_map的使用从ffmpeg avviddec和openh264dec的实现也可以看到,能方便的把解码器解码的数据放到plane内存块中。
GstVideoFrame的定义
/** * GstVideoFrame: * @info: the #GstVideoInfo * @flags: #GstVideoFrameFlags for the frame * @buffer: the mapped GstBuffer's buffer * @meta: pointer to metadata if any * @id: id of the mapped frame. the id can for example be used to * identify the frame in case of multiview video. * @data: pointers to the plane data * @map: mappings of the planes * * A video frame obtained from gst_video_frame_map() */
struct _GstVideoFrame {
GstVideoInfo info;
GstVideoFrameFlags flags;
GstBuffer *buffer;
gpointer meta;
gint id;
gpointer data[GST_VIDEO_MAX_PLANES];
GstMapInfo map[GST_VIDEO_MAX_PLANES];
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
gst_video_decoder_allocate_output_frame
辅助函数,为@decoder当前的#GstVideoCodecState分配一个缓冲区来容纳一个视频帧。子类应该已经配置了视频状态并设置了src pad caps。从openH264dec和avdec_h264中都可以看到,最后解码的数据要先allocate_output_frame,然后copy数据到这个里面,avviddec里面的处理需要看get_output_buffer函数的实现。
gst_video_decoder_finish_frame
在openh264dec中,通过gst_video_decoder_finish_frame
将解码后的数据push到downstream,如果没有提供输出数据,frame被视为skipped。在任何情况下,frame都被视为finished和released。
gst_openh264dec_handle_frame
- 收到frame后先交给openh264dec解码->DecodeFrameNoDelay
- gst_video_frame_map:映射frame->output_buffer,将解码的yuvdata填进去。
- gst_video_decoder_set_output_state:在srcpad上创建新的codec state作为解码器的输出状态
- gst_video_decoder_finish_frame发送给downstream
因为output state部分配置的是I420,所以在进行数据copy的时候,是yuv依次copy:
// i = 0; Y plane
// i = 1; U plane
// i = 2; V plane
for (i = 0; i < 3; i++) {
p = GST_VIDEO_FRAME_COMP_DATA (&video_frame, i);
row_stride = GST_VIDEO_FRAME_COMP_STRIDE (&video_frame, i);
component_width = GST_VIDEO_FRAME_COMP_WIDTH (&video_frame, i);
component_height = GST_VIDEO_FRAME_COMP_HEIGHT (&video_frame, i);
src_width =
i <
1 ? dst_buf_info.UsrData.sSystemBuffer.
iStride[0] : dst_buf_info.UsrData.sSystemBuffer.iStride[1];
for (row = 0; row < component_height; row++) {
memcpy (p, yuvdata[i], component_width);
p += row_stride;
yuvdata[i] += src_width;
}
}
边栏推荐
- 2022 the latest big company Android interview real problem analysis, Android development will be able to technology
- What are general items
- MMO項目學習一:預熱
- C#应用程序界面开发基础——窗体控制(5)——分组类控件
- Advanced application of C # language
- 四万字长文说operator new & operator delete
- 城链科技数字化创新战略峰会圆满召开
- XaaS 陷阱:万物皆服务(可能)并不是IT真正需要的东西
- Microwave radar induction module technology, real-time intelligent detection of human existence, static micro motion and static perception
- redis集群模拟消息队列
猜你喜欢
Worthy of being a boss, byte Daniel spent eight months on another masterpiece
四万字长文说operator new & operator delete
完爆面试官,一线互联网企业高级Android工程师面试题大全
HiEngine:可媲美本地的云原生内存数据库引擎
测试外包公司怎么样?
Postman core function analysis - parameterization and test report
Summer Challenge database Xueba notes, quick review of exams / interviews~
集合
Mariadb root用户及普通用户的密码 重置
强化学习-学习笔记4 | Actor-Critic
随机推荐
Django使用mysqlclient服务连接并写入数据库的操作过程
Do you know several assertion methods commonly used by JMeter?
C#应用程序界面开发基础——窗体控制(5)——分组类控件
面试官:Redis中集合数据类型的内部实现方式是什么?
【C语言】字符串函数及模拟实现strlen&&strcpy&&strcat&&strcmp
手机股票开户安全吗?靠不靠谱啊?
【obs】libobs-winrt :CreateDispatcherQueueController
Ultrasonic ranging based on FPGA
Go语言 | 01 WSL+VSCode环境搭建避坑指南
Go语言学习教程(十六)
微波雷达感应模块技术,实时智能检测人体存在,静止微小动静感知
Force buckle 729 My schedule I
aggregate
Hiengine: comparable to the local cloud native memory database engine
安卓面试宝典,2022Android面试笔试总结
测试的核心价值到底是什么?
JAD installation, configuration and integration idea
100million single men and women supported an IPO with a valuation of 13billion
How to apply smart contracts more wisely in 2022?
PG基础篇--逻辑结构管理(用户及权限管理)