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消息。

videobuf处理流程

videobuf是应用程序和v4l2驱动程序的一个中间层,用它来进行视频数据缓冲区的分配和管理。 它根据应用程序的需求(缓冲区的数量的大小),分配相应的视频缓冲区,这个缓冲区是在内核空间分配的,并通...
  • zoe6553
  • zoe6553
  • 2013年12月31日 15:17
  • 2579

ACodec和OMXCodec的比较

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

Android ACodec消息机制一

ACodec有一个BaseState和派生出来的其他State. FlushingState,ExecutingState等。     当有消息来的时候,如果派生类有重写,则会调到重写的方法里,如果没...
  • bencharluo
  • bencharluo
  • 2015年09月19日 14:35
  • 2213

android 多媒体框架服务之StagefrightPlayer和OMXCodec实现原理学习

android 多媒体框架服务之StagefrightPlayer和OMXCodec实现原理学习 2016-08-30 08:01 来源:互联网 1.1StageFright和openCore和...
  • zds05
  • zds05
  • 2016年10月17日 13:25
  • 288

Android ACodec学习

enum PortMode {     KEEP_BUFFERS,     RESUBMIT_BUFFERS,     FREE_BUFFERS, } Android ACodec会根据当前处于哪个s...
  • bencharluo
  • bencharluo
  • 2016年03月03日 10:20
  • 2019

MediaCodec与ACodec通知分析

NuPlayer框架中的通知分析
  • coolcary
  • coolcary
  • 2016年07月18日 09:17
  • 5241

NuPlayer的处理流程

http://wangshh03.blog.163.com/blog/static/49103415201282611152692/ ICS4.0.3中播放RTSP流媒体使用的播放器框架...
  • sunjing_
  • sunjing_
  • 2016年05月19日 14:28
  • 3055

OMXCodec与OMX事件处理流程

学习了解Mutilmedia Framework有一段时间了,今天闲下来稍微整理整理。OMXCodec.cpp类属于libstagefright,在整个MM PF 相当OMX的适配层,供awesome...
  • tjy1985
  • tjy1985
  • 2012年03月27日 11:12
  • 30773

__v7_setup

.arm __HEAD ENTRY(stext) ARM_BE8(setend be ) @ ensure we are in BE8 mode THUMB( adr r9, BSYM(...
  • coldsnow33
  • coldsnow33
  • 2014年07月21日 18:23
  • 1607

setup.s

1 !  2 ! setup.s (C) 1991 Linus Torvalds  3 !  4 ! setup.s is responsible for getting the system ...
  • qq308845474
  • qq308845474
  • 2015年09月25日 20:23
  • 395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:rtsp流媒体buffer填充的处理过程
举报原因:
原因补充:

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