6. Android(安卓)MultiMedia框架完全解析 - NuPlayerDriver与NuPlayer的通信
先解决NuPlayer与NuPlayerDriver的通信过程,在之前的文章中,都说了NuPlayerDriver是NuPlayer的一个Wrapper,上层的指令发送给NuPlayerDriver后,NuPlayer作为NuPlayerDriver的一个成员变量,NuPlayerDriver想调用NuPlayer的话,就相当简单。当NuPlayer完成一个指令后,如何通知NuPlayerDriver呢?下面我们就以setVideoSurfaceTexture为例来讲解一下(虽然这个函数的历程还没有追过,但是不影响这里的讨论):
当上层调用setVideoSurfaceTexture()时,根据之前的分析,最终会传递到NuPlayerDriver这里,来看看NuPlayerDriver是如何实现的:
status_t NuPlayerDriver::setVideoSurfaceTexture( const sp &bufferProducer) {...... mPlayer->setVideoSurfaceTextureAsync(bufferProducer); while (mSetSurfaceInProgress) { mCondition.wait(mLock); } return OK;}
在这里,sp
我们再到NuPlayer中看看setVideoSurfaceTextureAsync这个函数:
void NuPlayer::setVideoSurfaceTextureAsync( const sp &bufferProducer) { sp msg = new AMessage(kWhatSetVideoSurface, this); if (bufferProducer == NULL) { msg->setObject("surface", NULL); } else { msg->setObject("surface", new Surface(bufferProducer, true /* controlledByApp */)); } msg->post();}
它使用了AHanlder-ALooper-AMessage机制(NuPlayer中使用的一种机制,在7.中讲解),最终就会执行到NuPlayer::onMessageReceived函数的kWhatSetVideoSurface case中:
void NuPlayer::onMessageReceived(const sp &msg) {case kWhatSetVideoSurface: {......if (mSource == NULL || !mStarted || mSource->getFormat(false /* audio */) == NULL || (mVideoDecoder != NULL && mVideoDecoder->setVideoSurface(surface) == OK)) { performSetSurface(surface); break; }
看看这个performSetSurface函数的过程:
void NuPlayer::performSetSurface(const sp &surface) { ALOGV("performSetSurface"); mSurface = surface; // XXX - ignore error from setVideoScalingMode for now setVideoScalingMode(mVideoScalingMode); if (mDriver != NULL) { sp driver = mDriver.promote(); if (driver != NULL) { driver->notifySetSurfaceComplete(); } }}
看到这里,应该就有点概念了,NuPlayer以mPlayer这个成员变量存在于NuPlayerDriver结构体中,同样的,NuPlayerDriver以 wp
void NuPlayerDriver::notifySetSurfaceComplete() { ALOGV("notifySetSurfaceComplete(%p)", this); Mutex::Autolock autoLock(mLock); CHECK(mSetSurfaceInProgress); mSetSurfaceInProgress = false; mCondition.broadcast();}
通过发送广播,来通知NuPlayerDriver::setVideoSurfaceTexture()函数,NuPlayer执行完SetVideoSurfaceTexture了。
更多相关文章
- Android程序设计逻辑分析之用户事件响应-回调函数的使用
- 关于android应用--内存的优化
- Android入门 在ListView中如何进行精确的定位
- Python String 的replace()与List的remove()
- Timer、TimerTask的简单应用及如何解决多次调度相同任务。
- Android在子线程更新UI主线程的6种方法
- 在ubuntu下安装android studio完整版 吐血整理
- 从Android到IOS,IOS应用生命周期函数
- 2_android studio工具用法积累