stagefright 架构分析(二) TimedEventQueue
来源:互联网 发布:阴阳家和道家知乎 编辑:程序博客网 时间:2024/05/03 14:28
在stagefright中,所有操作,实际都是调用AwesomePlayer完成的。
AwesomePlayer中的触发事件,是通过TimedEventQueue完成的。
TimedEventQueue是一个事件触发器,当给定的时间到达后,触发TimedEventQueue::Event
Event是以queue进行管理的
TimedEventQueue::TimedEventQueue()
: mNextEventID(1),
mRunning(false), //标志queue已经开始run了
mStopped(false) { //标志queue还在stop
}
void TimedEventQueue::start() {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&mThread, &attr, ThreadWrapper, this); //创建queue线程
pthread_attr_destroy(&attr);
}
void TimedEventQueue::stop(bool flush) {
if (flush) {
postEventToBack(new StopEvent);
} else {
postTimedEvent(new StopEvent, INT64_MIN); //清空queue中的event
}
void *dummy;
pthread_join(mThread, &dummy);
mQueue.clear();
}
//下面是event的控制函数
// Posts an event to the front of the queue (after all events that
// have previously been posted to the front but before timed events).
event_id postEvent(const sp<Event> &event);
event_id postEventToBack(const sp<Event> &event);
// It is an error to post an event with a negative delay.
event_id postEventWithDelay(const sp<Event> &event, int64_t delay_us);
// If the event is to be posted at a time that has already passed,
// it will fire as soon as possible.
event_id postTimedEvent(const sp<Event> &event, int64_t realtime_us);
// Returns true iff event is currently in the queue and has been
// successfully cancelled. In this case the event will have been
// removed from the queue and won't fire.
bool cancelEvent(event_id id);
// Cancel any pending event that satisfies the predicate.
// If stopAfterFirstMatch is true, only cancels the first event
// satisfying the predicate (if any).
void cancelEvents(
bool (*predicate)(void *cookie, const sp<Event> &event),
void *cookie,
bool stopAfterFirstMatch = false);
void TimedEventQueue::threadEntry() {
........
if (event != NULL) {
// Fire event with the lock NOT held.
event->fire(this, now_us); //当达到触发时间后,event->fire
}
}
//在AwesomePlayer中的成员mQueue,所有event都是由其管理
TimedEventQueue mQueue;
//在AwesomePlayer中Event事件被封装了一层:
struct AwesomeEvent : public TimedEventQueue::Event {
}
// 触发时,通过调用注册的方法实现,其不关心是哪样的方法,只是去触发这个方法
virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
(mPlayer->*mMethod)();
}
AwesomePlayer::AwesomePlayer() {
mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
mVideoEventPending = false;
mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
mStreamDoneEventPending = false;
mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
mBufferingEventPending = false;
mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate);
mVideoEventPending = false;
mCheckAudioStatusEvent = new AwesomeEvent(
this, &AwesomePlayer::onCheckAudioStatus);
mAudioStatusEventPending = false;
}
//以mVideoEvent为例:
mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
AwesomePlayer::onVideoEvent()是其触发的method
- stagefright 架构分析(二) TimedEventQueue
- TimedEventQueue分析
- TimedEventQueue分析
- [StageFright分析] StageFright的总体架构
- stagefright 架构分析(一) stagefright 介绍
- stagefright 架构分析(四) MediaExtractor
- stagefright 架构分析(三) stagefright 功能和调用流程
- stagefright 架构分析(五) 初始化 VideoDecoder
- stagefright架构
- stagefright 架构分析(六) 创建一个 Soft Decoder
- stagefright 架构分析(七) 动态加载libstagefrighthw.so
- stagefright extactor 分析
- Android Stagefright MPEG4Extractor分析
- Android Stagefright MPEG4Extractor分析
- Android Stagefright MPEG4Writer分析
- stagefright 源码分析
- Android Stagefright MPEG4Writer分析
- Android Stagefright MPEG4Extractor分析
- sharepoint 2010建立一个feedback工作流
- 基于ArcGIS Server对ShapeFile文件的编辑功能实现 .
- MFC位图加载
- 配置shutdown.sh -s jnp://localhost:1299关闭指定jboss
- hive 创建表和导入数据
- stagefright 架构分析(二) TimedEventQueue
- ftp 命令
- ActiveMQ使用笔记
- ubuntu 12.04 解决txt文件中中文乱码问题
- MFC消息反射机制
- 【iOS-cocos2d-X 游戏开发之四】Cocos2dX创建Android NDK新项目并编译导入Eclipse中正常运行!
- C# C/S模式下实现软件自动在线升级
- Fedora17环境无视频编译linphone3.5.2
- Eclipse快捷键