codec编码传输流程是怎么样的(codec,移动开发)

时间:2024-05-05 15:56:34 作者 : 石家庄SEO 分类 : 移动开发
  • TAG :

    codec%E7%BC%96%E7%A0%81%E4%BC%A0%E8%BE%93%E6%B5%81%E7%A8%8B%E6%98%AF%E6%80%8E%E4%B9%88%E6%A0%B7%E7%9A%84

SurfaceMediaSource::read()锁控制从IGraphicBufferConsumer处读取buffer,当graphic产生数据
Overrun时等待

while (mStarted && mNumPendingBuffers == mMaxAcquiredBufferCount) {

mMediaBuffersAvailableCondition.wait(mMutex);

}

MediaPuller拿到该buffer后
status_t err = mSource->read(&mbuf);

notify->setInt32("what", kWhatAccessUnit);

notify->setBuffer("accessUnit", accessUnit);

notify->post();


Converter 接收CHECK_EQ(what, MediaPuller::kWhatAccessUnit);

mInputBufferQueue.push_back(accessUnit);

feedEncoderInputBuffers();


Converter::feedEncoderInputBuffers() 中拷贝buffer数据到codec的mEncoderInputBuffers
通过这个while循环来等待拷贝

while (!mInputBufferQueue.empty()&& !mAvailEncoderInputIndices.empty()){


memcpy(mEncoderInputBuffers.itemAt(bufferIndex)->data(),

buffer->data(),

buffer->size());

status_t err = mEncoder->queueInputBuffer(

bufferIndex, 0, (buffer == NULL) ? 0 : buffer->size(),

timeUs, flags);

5. 上面流程传递的是主要是共享内存buffer_handle_t,当codec 完成ACodec::BaseState::onOMXEmptyBufferDone后

// We're in "store-metadata-in-buffers" mode, the underlying

// OMX component had access to data that's implicitly refcounted

// by this "MediaBuffer" object. Now that the OMX component has

// told us that it's done with the input buffer, we can decrement

// the mediaBuffer's reference count.

info->mData->setMediaBufferBase(NULL);

才通知SurfaceMediaSource::signalBufferReturned()让graphic consumer来真正释放

mConsumer->releaseBuffer();

Stack 信息

#06 pc 000f4583 /system/lib/libstagefright.so (android::SurfaceMediaSource::signalBufferReturned(android::MediaBuffer*)+38)

#07 pc 000f45a5 /system/lib/libstagefright.so (non-virtual thunk to android::SurfaceMediaSource::signalBufferReturned(android::MediaBuffer*)+4)

#08 pc 0000b011 /system/lib/libstagefright_foundation.so (android::ABuffer::setMediaBufferBase(android::MediaBufferBase*)+16)

#09 pc 0008adeb /system/lib/libstagefright.so (android::ACodec::BaseState::onOMXEmptyBufferDone(unsigned int, int)+78)

#10 pc 0008aab5 /system/lib/libstagefright.so (android::ACodec::BaseState::onOMXMessage(android::sp<android::AMessage> const&)+228)

#11 pc 0008a731 /system/lib/libstagefright.so (android::ACodec::BaseState::onMessageReceived(android::sp<android::AMessage> const&)+744)

#12 pc 0008e779 /system/lib/libstagefright.so (android::ACodec::ExecutingState::onMessageReceived(android::sp<android::AMessage> const&)+508)

#13 pc 0000b5a1 /system/lib/libstagefright_foundation.so (android::AHierarchicalStateMachine::handleMessage(android::sp<android::AMessage> const&)+64)

#14 pc 0008a917 /system/lib/libstagefright.so (android::ACodec::BaseState::onOMXMessageList(android::sp<android::AMessage> const&)+106)

#15 pc 0008a5e7 /system/lib/libstagefright.so (android::ACodec::BaseState::onMessageReceived(android::sp<android::AMessage> const&)+414)

#16 pc 0008e779 /system/lib/libstagefright.so (android::ACodec::ExecutingState::onMessageReceived(android::sp<android::AMessage> const&)+508)

本文:codec编码传输流程是怎么样的的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:JNI与NDK的原理是什么下一篇:

3 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18