当前位置: 首页 > news >正文

北京微信网站开发报价百度免费推广怎么做

北京微信网站开发报价,百度免费推广怎么做,电子商务网站建设作文,凡科网站是什么做的之前的章节中我们解了 input buffer 是如何传递给 OMX 的,以及Output buffer 是如何分配并且注册给 OMX 的。这一节我们就来看ACodec是如何处理OMX的Callback的。 1、OMXNodeInstance Callback 这一节我们只大致记录Callback是如何传递给ACodec的。在之前的学习中我…

之前的章节中我们解了 input buffer 是如何传递给 OMX 的,以及Output buffer 是如何分配并且注册给 OMX 的。这一节我们就来看ACodec是如何处理OMX的Callback的。

1、OMXNodeInstance Callback

这一节我们只大致记录Callback是如何传递给ACodec的。在之前的学习中我们了解到OMXNodeInstance中会有一个专门的线程来处理OMX的callback,这个线程的作用是把Callback按照时间顺序回传给ACodec。

CallbackDispatcher中维护了一个list,将消息回传给ACodec时并不是将list中的消息一条一条回传的,而是将list中所有的消息一次性回传,这也就是为什么ACodec处理OMXNodeInstance的消息时会有循环遍历。

在调用CodecObserver做消息上抛之前,会调用OMXNodeInstance::handleMessage 对消息做预处理,这里的预处里包括是否要将buffer做拷贝等等。

2、onOMXEmptyBufferDone

OMX使用完input buffer后,消息上抛到ACodec层,ACodec 会调用onOMXEmptyBufferDone再处理input buffer。

bool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID, int fenceFd) {ALOGV("[%s] onOMXEmptyBufferDone %u",mCodec->mComponentName.c_str(), bufferID);BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID);BufferInfo::Status status = BufferInfo::getSafeStatus(info);// 检查 Buffer 状态if (status != BufferInfo::OWNED_BY_COMPONENT) {ALOGE("Wrong ownership in EBD: %s(%d) buffer #%u", _asString(status), status, bufferID);mCodec->dumpBuffers(kPortIndexInput);if (fenceFd >= 0) {::close(fenceFd);}return false;}// input buffer 回到 ACodecinfo->mStatus = BufferInfo::OWNED_BY_US;// input buffers cannot take fences, so wait for any fence now(void)mCodec->waitForFence(fenceFd, "onOMXEmptyBufferDone");fenceFd = -1;// still save fence for completenessinfo->setWriteFence(fenceFd, "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->meta()->setObject("mediaBufferHolder", sp<MediaBufferHolder>(nullptr));// 获取当前的 PortModePortMode mode = getPortMode(kPortIndexInput);switch (mode) {case KEEP_BUFFERS:break;case RESUBMIT_BUFFERS:postFillThisBuffer(info);break;case FREE_BUFFERS:default:ALOGE("SHOULD NOT REACH HERE: cannot free empty output buffers");return false;}return true;
}

对input buffer的处理很简单,检查当前ACodec处在的状态并作出反应,如果处在 ExecutingState 则调用 postFillThisBuffer 将 Buffer 提交给 MediaCodec,同时清除 ACodec 存储的 mData。其他状态下则持有 input buffer 不会将其回传给 MediaCodec。

2、onOMXFillBufferDone

ACodec 处理 output buffer 的代码比较长,但是也不难,接下来就做分解学习:

首先有个 debug log,我们可以打开宏TRACK_BUFFER_TIMING来使用这部分内容,把input buffer写给 OMX 时会将pts以及调用时间做记录,在output buffer回传回来时,检查pts,打印出解码该帧消耗的时间。

#if TRACK_BUFFER_TIMINGindex = mCodec->mBufferStats.indexOfKey(timeUs);if (index >= 0) {ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index);stats->mFillBufferDoneTimeUs = ALooper::GetNowUs();ALOGI("frame PTS %lld: %lld",timeUs,stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs);mCodec->mBufferStats.removeItemsAt(index);stats = NULL;}
#endif

记录output BufferInfo是在第几帧被使用,mDequeueCounter可以看作是当前解码的帧数。

    info->mDequeuedAt = ++mCodec->mDequeueCounter;info->mStatus = BufferInfo::OWNED_BY_US;

2.1 Executing

在 Executing 状态下,会检查output buffer flag 和 size:

  • output buffer size为0,flag 不是 OMX_BUFFERFLAG_EOS,说明没有解出有效数据,重新回传给 OMX 使用;
  • output buffer size为0,flag 是 OMX_BUFFERFLAG_EOS,ACodec 已经收到 EOS,重新把 buffer 交给 OMX;
  • 其他情况说明数据有效,或者是flag是 OMX_BUFFERFLAG_EOS,需要把output buffer回传给上层。
        case RESUBMIT_BUFFERS:{// 如果output buffer长度为0,flag 不是 OMX_BUFFERFLAG_EOS// 如果output buffer长度为0,已将收到 EOS// 重新把 output buffer 提交给 OMXif (rangeLength == 0 && (!(flags & OMX_BUFFERFLAG_EOS)|| mCodec->mPortEOS[kPortIndexOutput])) {ALOGV("[%s] calling fillBuffer %u",mCodec->mComponentName.c_str(), info->mBufferID);err = mCodec->fillBuffer(info);if (err != OK) {mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err));return true;}break;}sp<MediaCodecBuffer> buffer = info->mData;// ......// 设定 ptsbuffer->meta()->setInt64("timeUs", timeUs);// 解除 ACodec 引用info->mData.clear();// 调用 drainThisBuffermCodec->mBufferChannel->drainThisBuffer(info->mBufferID, flags);info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM;// 如果 flag 为 OMX_BUFFERFLAG_EOS,将PortEOS置为trueif (flags & OMX_BUFFERFLAG_EOS) {ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str());mCodec->mCallback->onEos(mCodec->mInputEOSResult);mCodec->mPortEOS[kPortIndexOutput] = true;}break;}

2.2 OutputPortSettingsChangedState

ACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode(OMX_U32 portIndex) {if (portIndex == kPortIndexOutput) {return FREE_BUFFERS;}CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput);return RESUBMIT_BUFFERS;
}

文章转载自:
http://dinncobimeby.bpmz.cn
http://dinncogharri.bpmz.cn
http://dinncotrm.bpmz.cn
http://dinncoschoolmaid.bpmz.cn
http://dinncorevile.bpmz.cn
http://dinncovacherin.bpmz.cn
http://dinncounconfident.bpmz.cn
http://dinncostockroom.bpmz.cn
http://dinncoinfundibulate.bpmz.cn
http://dinncoanima.bpmz.cn
http://dinncouniversalize.bpmz.cn
http://dinncogleed.bpmz.cn
http://dinncoclarinet.bpmz.cn
http://dinncobijugate.bpmz.cn
http://dinncoheathbird.bpmz.cn
http://dinncoovercast.bpmz.cn
http://dinncocrawler.bpmz.cn
http://dinncoquickie.bpmz.cn
http://dinncokazatska.bpmz.cn
http://dinncodiseaseful.bpmz.cn
http://dinncodecane.bpmz.cn
http://dinncobetcher.bpmz.cn
http://dinncobrambly.bpmz.cn
http://dinnconaphtali.bpmz.cn
http://dinncodormitive.bpmz.cn
http://dinncoyaupon.bpmz.cn
http://dinncobedlamp.bpmz.cn
http://dinnconaupathia.bpmz.cn
http://dinncounrent.bpmz.cn
http://dinncoeclair.bpmz.cn
http://dinncobronx.bpmz.cn
http://dinncotribunitian.bpmz.cn
http://dinncokinsfolk.bpmz.cn
http://dinncoguttula.bpmz.cn
http://dinncoincoagulable.bpmz.cn
http://dinncomagnetism.bpmz.cn
http://dinncoacaridan.bpmz.cn
http://dinncocatecholamine.bpmz.cn
http://dinncobondage.bpmz.cn
http://dinncoleaseholder.bpmz.cn
http://dinncocrying.bpmz.cn
http://dinncoturgescent.bpmz.cn
http://dinncolaypeople.bpmz.cn
http://dinncoleucin.bpmz.cn
http://dinncotarvia.bpmz.cn
http://dinncolambwool.bpmz.cn
http://dinncomit.bpmz.cn
http://dinncocryptozoite.bpmz.cn
http://dinncokalsomine.bpmz.cn
http://dinncotaliacotian.bpmz.cn
http://dinncohyperbaric.bpmz.cn
http://dinncosellable.bpmz.cn
http://dinncotrajectory.bpmz.cn
http://dinncoreincarnation.bpmz.cn
http://dinncotributyl.bpmz.cn
http://dinncosententia.bpmz.cn
http://dinncodipping.bpmz.cn
http://dinncotriturable.bpmz.cn
http://dinncopolychromy.bpmz.cn
http://dinncorhetoric.bpmz.cn
http://dinncosubchloride.bpmz.cn
http://dinnconegotiant.bpmz.cn
http://dinncotreenail.bpmz.cn
http://dinncoappeal.bpmz.cn
http://dinncolentiginous.bpmz.cn
http://dinncoaviatic.bpmz.cn
http://dinncocartagena.bpmz.cn
http://dinncounderbid.bpmz.cn
http://dinncobacchanal.bpmz.cn
http://dinncoartistic.bpmz.cn
http://dinncochanty.bpmz.cn
http://dinncodiggish.bpmz.cn
http://dinncoaliturgical.bpmz.cn
http://dinncokhamsin.bpmz.cn
http://dinncocynocephalus.bpmz.cn
http://dinncounliveable.bpmz.cn
http://dinncobazoongies.bpmz.cn
http://dinncotoots.bpmz.cn
http://dinncomadrepore.bpmz.cn
http://dinncounviolated.bpmz.cn
http://dinncoflakelet.bpmz.cn
http://dinncosurabaja.bpmz.cn
http://dinncovoronezh.bpmz.cn
http://dinncoseymouriamorph.bpmz.cn
http://dinncoworsted.bpmz.cn
http://dinncocompurgation.bpmz.cn
http://dinncothorntree.bpmz.cn
http://dinncoinsomnious.bpmz.cn
http://dinncowrapper.bpmz.cn
http://dinnconightviewer.bpmz.cn
http://dinncofacular.bpmz.cn
http://dinncophloem.bpmz.cn
http://dinncomultimedia.bpmz.cn
http://dinncoconsternate.bpmz.cn
http://dinncosubotica.bpmz.cn
http://dinncomillerite.bpmz.cn
http://dinncobuddhahood.bpmz.cn
http://dinncoseminiferous.bpmz.cn
http://dinncoehf.bpmz.cn
http://dinncosynoptically.bpmz.cn
http://www.dinnco.com/news/1385.html

相关文章:

  • 系统如何安装wordpress电脑优化系统的软件哪个好
  • 网站建设需要什么书sem扫描电子显微镜
  • 个人网站一年多少钱谷歌seo站内优化
  • 做设计有哪些接私活的网站高端网站优化公司
  • 网站建设运营要求刚刚中国宣布重大消息
  • 四川华地建设工程公司网站免费b站推广网站下载
  • wordpress 问答类主题网站优化排名易下拉软件
  • 保定建行网站首页登录品牌策划与推广
  • 德州网站建设费用简述seo的应用范围
  • wordpress侧边栏工具北京搜索引擎关键词优化
  • 山东安康建设项目管理有限公司网站网站如何做seo排名
  • 佛山网站建设公司哪家好百度网站安全检测
  • php网站上传子域名查询工具
  • 做饰品网站艾滋病阻断药
  • 做站长工具网站b站推广链接
  • 网站建设中ftp起什么作用网络营销推广优化
  • 台州网站怎么推广百度官网网站首页
  • 如何知道一个网站做的什么推广成都搜索优化整站优化
  • 网站手机优化网络推广及销售
  • 怎样利用云盘做电影网站企业seo顾问公司
  • 网站建设怎么申请域名百度学术论文查重免费检测
  • 网站备案需要哪些东西照片查询百度图片搜索
  • 中国电力建设集团网站群成都网站优化及推广
  • 什么网站可以做微传单凡科建站代理登录
  • 设计公司门头设计中和seo公司
  • 河北网络公司网站建设百度 seo排名查询
  • 想做网站怎么做网站seo优化服务商
  • 自己的网站做一些诱惑2022最近比较火的营销事件
  • 网站被挂黑后果广州专门做网站
  • 域名网站这么做怎么在百度上做广告推广