这个子模块是一个死循环,在循环中,先通过一个标志进行判断,如果需要处理数据,首先读取一帧数据,如果没有数据,则阻塞在这儿。然后对这帧数据进行分析,分别放入音频,视频,其他数据的缓冲区,最后,调用回调函数对各种数据进行处理,将音视频数据发送给音视频播放模块来播放。
另一个子模块,信号控制模块主要是提供控制接口让上层调用,以完成对CMMB信号的处理。该子模块主要包含以下功能接口函数:引擎的初始化:创建读数据线程,启动初始化;引擎的打开:对电视芯片初始化;设置频点:设置当前频点;得到ESG信息:从信号中提取ESG信息并分析;关闭引擎:清除用到的资源,硬件重置位;得到频道信息列表:发送请求,分析频道信号;设置频道:设置当前频道;得到参数:能得到信号强度,当前频道等参数。
2.3 音视频播放模块
音视频播放由3个线程来完成。这3个线程分别为视频处理线程、音频处理线程、数据接收线程。
视频处理线程:
(1)先判断缓冲区队列有没有视频数据,如果没有,休眠10 ms;
(2)有数据的话,因为视频数据是根据时间戳顺序作为队列放在缓冲区的,取出第一帧,判断是否已经过时,如果是很老的数据,已经错过了播放时间,则判断帧类型,如果是关键帧,则解码并显示,否则,丢掉这一帧,然后转到第(1)步;
(3)否则,判断这一帧是否到了播放时间,如果是,则将这帧数据解码并显示,然后转到第(1)步;
(4)如果没有到播放时间,则休眠10 ms。然后转到第(1)步。
音频处理线程:
(1)先判断缓冲区队列有没有音频数据,如果没有,休眠10 ms;
(2)有数据的话,因为音频数据是根据时间戳顺序作为队列放在缓冲区的,取出第一帧,判断是否已经过时,如果是很老的数据,已经错过了播放时间,则丢弃,然后转到第(1)步;
(3)否则,判断是否到了播放时间,如果是,则将这帧数据解码并播放,然后转到第(1)步;
(4)如果没有到播放时间,则休眠10 ms。然后转到第(1)步。
数据接收线程:数据接收线程不属于播放器模块,它是电视接收模块的一部分。
(1)如果有数据到来,判断有没有视频数据,如果有,将它们全部插入到视频缓冲区;