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



原创粉丝点击