Android多媒体开发【7】-- AwesomePlayer中TimedEventQueue-event事件调度器
来源:互联网 发布:sql 多个 with as 编辑:程序博客网 时间:2024/05/17 18:41
Android多媒体开发【7】-- AwesomePlayer中TimedEventQueue-event事件调度器
分类: 【多媒体技术】 【Android】2012-10-17 16:18 2323人阅读 评论(2) 收藏 举报
上文已经大概介绍了播放器的几大主要部分,但是有了这些功能组件也不能叫做播放器。需要某种方式将这些单独的功能组件驱动起来,形成一个整体的功能。
视频处理过程中有很多都是十分耗时的,如果都放在一个大的线程空间中。用户体验的效果可想而知。所以通常都是做异步操作。
AwesomePlayer是通过event事件调度来实现这些功能之间的驱动和调用的。
AwesomePlayer中的内部变量
- TimedEventQueue mQueue;
这个mQueue就是AwesomePlayer的事件队列,也是事件调度器。从他类型的名字上就能很清楚的看出他是以时间为基础事件队列。接下来看看它是怎么玩转的。
1.先来看TimedEventQueue的内部结构,TimedEventQueue内部有一个 List<QueueItem>,每个QueueItem包含enent和时间
- struct QueueItem {
- sp<Event> event;
- int64_t realtime_us;
- };
- void TimedEventQueue::start() {
- if (mRunning) {
- return;
- }
- mStopped = false;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
- pthread_create(&mThread, &attr, ThreadWrapper, this);
- pthread_attr_destroy(&attr);
- mRunning = true;
- }
- void TimedEventQueue::stop(bool flush) {
- if (!mRunning) {
- return;
- }
- if (flush) {
- postEventToBack(new StopEvent);
- } else {
- postTimedEvent(new StopEvent, INT64_MIN);
- }
- void *dummy;
- pthread_join(mThread, &dummy);
- mQueue.clear();
- mRunning = false;
- }
2.List<QueueItem>目的就是按照延时时间维护一个event事件队列,threadEntry线程就是不断的从队列的头取出一个event,然后通过 event->fire(this, now_us); 回调到这个event事件提前注册好的相对应功能函数。
3.然后看看AwesomePlayer是怎么用TimedEventQueue,AwesomePlayer会定义很多类型的event事件,并把和这些事件相关的功能函数一定绑定起来。
- 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);
4.之前也介绍过mediaPlayer大致流程就是
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
mediaPlayer.start();
在AwesomePlayer 也是这种流程,在AwesomePlayer prepare()相关函数中。
- status_t AwesomePlayer::prepareAsync_l() {
- if (mFlags & PREPARING) {
- return UNKNOWN_ERROR; // async prepare already pending
- }
- if (!mQueueStarted) {
- mQueue.start();
- mQueueStarted = true;
- }
- modifyFlags(PREPARING, SET);
- mAsyncPrepareEvent = new AwesomeEvent(
- this, &AwesomePlayer::onPrepareAsyncEvent);
- mQueue.postEvent(mAsyncPrepareEvent);
- return OK;
- }
他并没有实际的调用onPrepareAsyncEvent()真正的功能函数,他只是把mQueue start之后,然后创建个mAsyncPrepareEvent事件,把它插入到mQueue之中就不管了,具体调用是由mQueue中的threadEntry线程来做。
0 0
- Android多媒体开发【7】-- AwesomePlayer中TimedEventQueue-event事件调度器
- Android多媒体开发【7】-- AwesomePlayer中TimedEventQueue-event事件调度器
- Android多媒体开发【7】-- AwesomePlayer中TimedEventQueue-event事件调度器
- AwesomePlayer中TimedEventQueue的实现
- Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
- Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
- Android多媒体开发【11】-- android中OpenMax的实现【2】AwesomePlayer中openmax的入口
- Android多媒体开发【8】-- AwesomePlayer基本框架及播放流程
- Android多媒体开发【8】-- AwesomePlayer基本框架及播放流程
- Android多媒体开发【8】-- AwesomePlayer基本框架及播放流程
- Android多媒体开发笔记-- AwesomePlayer基本框架及播放流程
- Android多媒体开发-stagefright及AwesomePlayer相关知识梳理
- MySQL 事件调度器(Event Scheduler)
- MySQL 事件调度器(Event Scheduler)
- MySQL事件调度器Event Scheduler
- MySQL事件调度器 CREATE EVENT
- MySQL事件调度器 CREATE EVENT
- MySQL事件调度器Event Scheduler
- java.lang.UnsatisfiedLinkError: Native method not found: com.baidu.platform.comjni.map.basemap.JNIBa
- OpenGL入门学习
- 一步步学习SPD2010--第十章节--SP网站品牌化(1)--设置CSS和颜色编码页面编辑器选项
- Linux内核编码规范
- Android提示软件更新下载
- Android多媒体开发【7】-- AwesomePlayer中TimedEventQueue-event事件调度器
- java的Random类的使用
- 黄班长2014-3-17-下午2点。
- VC# TMSChart图形绘制
- Tomcat: IOException while loading persisted sessions: java.io.EOFException
- poj 2299 Ultra-QuickSort
- mfc与win32区别
- Fedora的帮助网页--详细的哟
- 程序出现Access violation - code c0000005 (first chance)的解决方法