rtsp流媒体buffer填充的处理过程
来源:互联网 发布:java mongodb3 连接池 编辑:程序博客网 时间:2024/05/24 03:53
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
// staticOMX_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消息。
- rtsp流媒体buffer填充的处理过程
- rtsp流媒体buffer填充的处理过程
- rtsp流媒体buffer填充的处理过程
- rtsp流媒体buffer填充的处理过程
- Darwin Streaming Server中RTSP请求的处理过程(Darwin流媒体服务器解析2)
- Android rtsp流媒体音视频帧的处理流程
- Android rtsp 流媒体音视频帧的处理流程
- Android rtsp 流媒体音视频帧的处理流程
- Android rtsp流媒体音视频帧的处理流程
- live555中rtsp客户端对于buffer的处理方法介绍
- rtsp流媒体服务器的搭建
- rtsp流媒体服务器的搭建
- rtsp流媒体服务器的搭建
- 流媒体-RTSP
- 分析的rtsp流媒体的问题
- 【RTSP/RTP流媒体】9、编写简单的RTSP服务器
- 【RTSP/RTP流媒体】10、编写简单的RTSP客户端
- 基于RTSP协议流媒体服务器的实现
- LCD驱动实例(一)
- Tomcat启动报错:IOException while loading persisted sessions: java.io.EOFException
- java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher
- 适合于流式播放的DirectShow客户服的编写
- Oracle异常知识
- rtsp流媒体buffer填充的处理过程
- 大数乘法和大数除法模板
- LCD驱动实例(二)
- excel 表數據導入到 數據庫表
- VS工具打开高版本的解决方案
- GYP(Generate Your Project)一个很有价值的构建系统
- WPF的UI更新方式
- 闪回(Flashback)
- 晒晒自己刚刚写的大学生创新工作室阶段性总结