rtsp流媒体buffer填充的处理过程

原创 2012年03月23日 16:53:32

NuPlayer流媒体播放器中从网络上取得的rtp包在解码和显示时所用buffer的填充和清空的机制,与stagefright框架播放本地视频时的处理流程类似。

都是通过回调函数fillbuffer及emptybuffer来实现的。

NuPlayer中的ACodec与Stagefright中的OMXCodec的作用相似。

以下是rtsp流媒体中填充待解码的buffer,以及把解码后的buffer送给显示并清空的处理过程:

1.ACodec::UninitializedState::onSetup

调用status_t err = omx->allocateNode(componentName.c_str(), observer, &node);

2.OMX::allocateNode
status_t OMX::allocateNode(
        const char *name, const sp<IOMXObserver> &observer, node_id *node) {
    Mutex::Autolock autoLock(mLock);

    *node = 0;

    OMXNodeInstance *instance = new OMXNodeInstance(this, observer); // OMXNodeInstance是在OMX类中创建的

    OMX_COMPONENTTYPE *handle;
    OMX_ERRORTYPE err = mMaster->makeComponentInstance(
            name, &OMXNodeInstance::kCallbacks, // 注册了kCallbacks回调函数,
            instance, &handle);
3.OMXNodeInstance::kCallbacks
// static
OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone // 回调函数OnEmptyBufferDone,OnFillBufferDone
};
4.OMXNodeInstance::OnEmptyBufferDone // 数据解码完,可以取走数据用于显示了,然后清空buffer
调用instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer)  // owner()返回的是OMX指针对象mOwner
处理过程如下:
(1)在OMX::OnEmptyBufferDone中发送omx_message::EMPTY_BUFFER_DONE消息,并设置了解码后的buffer
(2)首先ACodec.cpp文件中的CodecObserver结构体的onMessage方法接收到omx_message::EMPTY_BUFFER_DONE消息。
(3)然后ACodec::BaseState::onOMXMessage再接收到omx_message::EMPTY_BUFFER_DONE消息,调用onOMXEmptyBufferDone继续处理。
(4)在ACodec::BaseState::onOMXEmptyBufferDone 函数中,PortMode为的值为RESUBMIT_BUFFERS,则调用postFillThisBuffer函数
(5)在ACodec::BaseState::postFillThisBuffer 函数中,发送了kWhatInputBufferFilled消息,设置"what"参数为ACodec::kWhatFillThisBuffer
(6)接收到kWhatInputBufferFilled消息后,调用onInputBufferFilled 函数
(7)在ACodec::BaseState::onInputBufferFilled 函数中
   1)PortMode为的值为RESUBMIT_BUFFERS,并且buffer != info->mData,则执行内存拷贝,把解码后的数据从buffer->data()拷贝到info->mData->data()中
   memcpy(info->mData->data(), buffer->data(), buffer->size());
   2)然后调用mCodec->mOMX->emptyBuffer函数,最终调用的是OMXNodeInstance::emptyBuffer 函数
   3)再调用getMoreInputDataIfPossible函数,取得下一个解码完的数据。但在执行到eligible == NULL时,执行了返回动作,没有调用postFillThisBuffer(eligible)函数继续处理。

5.OMXNodeInstance::OnFillBufferDone // 数据已经准备好,可以送给解码器解码
调用instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer)

---------------------------------------------------------------------------------

在OMX::allocateNode函数中,创建了CallbackDispatcher对象,即
在CallbackDispatcher构造函数中创建了CallbackDispatcherThread对象,并调用了run函数,在run中会调用Thread::_threadLoop,又调用threadLoop
->
bool OMX::CallbackDispatcherThread::threadLoop() {
    return mDispatcher->loop();
}
->
OMX::CallbackDispatcher::loop()
->
OMX::CallbackDispatcher::dispatch
->
OMXNodeInstance::onMessage
 mObserver->onMessage(msg);// IOMXObserver是构造函数OMXNodeInstance中传递过来的,即OMX::allocateNode中传递的参数observer,
// 而OMX::allocateNode又是在ACodec::UninitializedState::onSetup函数中被调用的,即observer的类型是CodecObserver。
CodecObserver继承自BnOMXObserver类,而BnOMXObserver又是IOMXObserver的子类。
所以,OMX::CallbackDispatcher::dispatch中执行mOwner->onMessage(msg),
最终是调用的CodecObserver的onMessage方法,在CodecObserver的onMessage方法中发送ACodec::kWhatOMXMessage消息。

相关文章推荐

Android ACodec学习

enum PortMode {     KEEP_BUFFERS,     RESUBMIT_BUFFERS,     FREE_BUFFERS, } Android ACodec会根据当前处于哪个s...

ACodec和OMXCodec的比较

要掌握的内容: 1. ACodec中omx组件的创建过程 2. buffer的操作 3. 和OMXCodec的区别 组件的创建基本上和OMXCodec的相同。 1. 在ACodec::Exe...
  • cathuzi
  • cathuzi
  • 2016年11月09日 19:10
  • 1635

MediaCodec与ACodec通知分析

NuPlayer框架中的通知分析

Android ACodec消息机制一

ACodec有一个BaseState和派生出来的其他State. FlushingState,ExecutingState等。     当有消息来的时候,如果派生类有重写,则会调到重写的方法里,如果没...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...

CT图像重建技术

由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串  find .|xargs grep -ri "IBM"  查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名  find .|xargs g...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:rtsp流媒体buffer填充的处理过程
举报原因:
原因补充:

(最多只允许输入30个字)