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

定制型网站开发哪家公司做网站建设比较好

定制型网站开发,哪家公司做网站建设比较好,建设一个asp网站,百度投广告怎么收费上一节我们了解了OMXNodeInstance中的端口定义#xff0c;这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的#xff0c;以及如何关联起来的。#xff08;我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创… 上一节我们了解了OMXNodeInstance中的端口定义这一节我们一起来学习ACodec、OMXNode、OMX 组件使用的 buffer 到底是怎么分配出来的以及如何关联起来的。我们只会去了解 graphic buffer的创建、input bytebuffer的创建、secure buffer的创建 1、ACodec::allocateOutputMetadataBuffers 我们先一起来回忆一下ACodec在使用surface的情况下给ouput port分配buffer使用的是allocateOutputMetadataBuffers方法这时候真正的graphic buffer还未分配出来BufferInfo的状态还是OWNED_BY_NATIVE_WINDOW意为 buffer 还在 native 中。 for (OMX_U32 i 0; i bufferCount; i) {BufferInfo info;info.mStatus BufferInfo::OWNED_BY_NATIVE_WINDOW;info.mFenceFd -1;info.mRenderInfo NULL;info.mGraphicBuffer NULL;info.mNewGraphicBuffer false;info.mDequeuedAt mDequeueCounter;// 创建 meta datainfo.mData new MediaCodecBuffer(mOutputFormat, new ABuffer(bufferSize));// Initialize fence fd to -1 to avoid warning in freeBuffer().((VideoNativeMetadata *)info.mData-base())-nFenceFd -1;info.mCodecData info.mData;err mOMXNode-useBuffer(kPortIndexOutput, OMXBuffer::sPreset, info.mBufferID);mBuffers[kPortIndexOutput].push(info);ALOGV([%s] allocated meta buffer with ID %u,mComponentName.c_str(), info.mBufferID);}这里BufferInfo是作为分配出来的buffer的索引分配的 mCodecData Meta data 没有任何作用仅仅是起着占位的作用。 ACodec 需要给这个 BufferInfo 打上索引调用useBuffer时传入的OMXBuffer类型是kBufferTypePreset这个内容可以到 OMXBuffer.cpp 中查询。 1.1、useBuffer 进入到 OMXNodeInstance 中首先就会检查 port mode我们可以看到如果port mode不是dynamic的类型会直接报错。 status_t OMXNodeInstance::useBuffer(OMX_U32 portIndex, const OMXBuffer omxBuffer, IOMX::buffer_id *buffer) {switch (omxBuffer.mBufferType) {case OMXBuffer::kBufferTypePreset: {if (mPortMode[portIndex] ! IOMX::kPortModeDynamicANWBuffer mPortMode[portIndex] ! IOMX::kPortModeDynamicNativeHandle) {break;}return useBuffer_l(portIndex, NULL, NULL, buffer);}}kBufferTypePreset 在这里应该表示的是占位的意思。 我们不要被 useBuffer 的参数 buffer 迷惑了它其实是一个 int 类型。判断完成后就会进入到 useBuffer_l 中。 1.2、useBuffer_l 进入下面的内容之前我们首先要了解的是之所以方法名为 use buffer指的是 OMX 组件端口使用的 buffer 是在其他地方分配的OMX 组件仅仅只是使用。 useBuffer_l 的设计思路其实和之前的一篇文章中的 enableNativeBuffers_l 类似它是把几个不同的设定写到一个函数体当中用入参来判断当前走的是什么设定。useBuffer_l 有两个参数但是它其实有三种可能的设定一种是IMemory另一种是 IHidlMemory最后一个是两个参数都为 NULL表示是一个占位。 status_t OMXNodeInstance::useBuffer_l(OMX_U32 portIndex, const spIMemory params,const spIHidlMemory hParams, IOMX::buffer_id *buffer) {BufferMeta *buffer_meta;OMX_BUFFERHEADERTYPE *header;OMX_ERRORTYPE err OMX_ErrorNone;// 判断是否使用 meta databool isMetadata mMetadataType[portIndex] ! kMetadataBufferTypeInvalid;// 如果使用graphic buffer但是不用meta data则直接报错if (!isMetadata mGraphicBufferEnabled[portIndex]) {ALOGE(b/62948670);android_errorWriteLog(0x534e4554, 62948670);return INVALID_OPERATION;}// 检查参数不能同时设定两个参数size_t paramsSize;void* paramsPointer;if (params ! NULL hParams ! NULL) {return BAD_VALUE;}// 解析传递的buffer的指针以及buffer的大小如果什么都没有传那么指针为NULLif (params ! NULL) {// TODO: Using unsecurePointer() has some associated security pitfalls// (see declaration for details).// Either document why it is safe in this case or address the// issue (e.g. by copying).paramsPointer params-unsecurePointer();paramsSize params-size();} else if (hParams ! NULL) {paramsPointer hParams-getPointer();paramsSize hParams-getSize();} else {paramsPointer nullptr;}// 使用的buffer的大小OMX_U32 allottedSize;// metadata mode下设定的是占位符OMXNode 与 OMX 组件之间通过 metadata交流metadata buffer由 OMXNode分配// 这里需要根据不同的类型分配不同类型的meta data确定metadata sizeif (isMetadata) {if (mMetadataType[portIndex] kMetadataBufferTypeGrallocSource) {allottedSize sizeof(VideoGrallocMetadata);} else if (mMetadataType[portIndex] kMetadataBufferTypeANWBuffer) {// allottedSize sizeof(VideoNativeMetadata);} else if (mMetadataType[portIndex] kMetadataBufferTypeNativeHandleSource) {allottedSize sizeof(VideoNativeHandleMetadata);} else {return BAD_VALUE;}} else {// NULL 只允许出现在 meta mode 当中// 如果不使用meta data 并且 没有传 buffer下来那么直接报错// NULL params is allowed only in metadata mode.if (paramsPointer nullptr) {ALOGE(b/25884056);return BAD_VALUE;}allottedSize paramsSize;}// 是否是与graphic搭配使用的metadatabool isOutputGraphicMetadata (portIndex kPortIndexOutput) (mMetadataType[portIndex] kMetadataBufferTypeGrallocSource ||mMetadataType[portIndex] kMetadataBufferTypeANWBuffer);// 是否需要分配bufferuint32_t requiresAllocateBufferBit (portIndex kPortIndexInput)? kRequiresAllocateBufferOnInputPorts: kRequiresAllocateBufferOnOutputPorts;// quirks 模式下如果不是使用的 meta data mode则需要让 OMX 组件分配buffer// we use useBuffer for output metadata regardless of quirksif (!isOutputGraphicMetadata (mQuirks requiresAllocateBufferBit)) {// metadata buffers are not connected cross process; only copy if not meta.// quirks 模式下将 OMX 组件分配的buffer 和 上层 buffer相关绑定进行数据拷贝// 这应该是很没有效率的一种行为buffer_meta new BufferMeta(params, hParams, portIndex, !isMetadata /* copy */, NULL /* data */);err OMX_AllocateBuffer(mHandle, header, portIndex, buffer_meta, allottedSize);if (err ! OMX_ErrorNone) {CLOG_ERROR(allocateBuffer, err,SIMPLE_BUFFER(portIndex, (size_t)allottedSize,paramsPointer));}} else {OMX_U8 *data NULL;// metadata buffers are not connected cross process// use a backup buffer instead of the actual bufferif (isMetadata) {// 为 meta data buffer 分配空间data new (std::nothrow) OMX_U8[allottedSize];if (data NULL) {return NO_MEMORY;}memset(data, 0, allottedSize);// 将 meta data buffer 封装到 BufferMeta 当中buffer_meta new BufferMeta(params, hParams, portIndex, false /* copy */, data);} else {// 如果不是 meta data mode直接使用buffer指针data static_castOMX_U8 *(paramsPointer);// 将 buffer 封装到 BufferMeta 当中buffer_meta new BufferMeta(params, hParams, portIndex, false /* copy */, NULL);}// 直接把创建的 BufferMeta 传递给 OMX 组件使用不需要进行buffer拷贝err OMX_UseBuffer(mHandle, header, portIndex, buffer_meta,allottedSize, data);if (err ! OMX_ErrorNone) {CLOG_ERROR(useBuffer, err, SIMPLE_BUFFER(portIndex, (size_t)allottedSize, data));}}if (err ! OMX_ErrorNone) {delete buffer_meta;buffer_meta NULL;*buffer 0;return StatusFromOMXError(err);}// 检查创建的buffer header中的上层数据是否和 创建的 buffer meta 相同CHECK_EQ(header-pAppPrivate, buffer_meta);// 为 buffer header 创建 index*buffer makeBufferID(header);addActiveBuffer(portIndex, *buffer);spIOMXBufferSource bufferSource(getBufferSource());if (bufferSource ! NULL portIndex kPortIndexInput) {bufferSource-onInputBufferAdded(*buffer);}CLOG_BUFFER(useBuffer, NEW_BUFFER_FMT(*buffer, portIndex, %u(%zu)%p, allottedSize, paramsSize, paramsPointer));return OK; } useBuffer 的内容很长里面有很多判断很多同学可能读不太明白里面到底想干什么这里我们就来解析一下 首先它会判断configure阶段配置的一些内容 比如说metadata mode需要和graphic buffer共同使用IMemory 参数和 IHidlMemory 参数不能同时设定 接下来会分为两种情况 metadata mode也就是我们上面讨论的传下来的buffer类型是kBufferTypePreset的情况占位这种情况上层没有真正传buffer下来OMX组件和上层通过metadata进行数据传递所以usebuffer中会根据configure的配置获取需要传递的metadata类型计算metadata所需的sizepreset byte buffer这种就是普通的non secure buffer可以通过指针读写buffer中的数据use buffer需要获取buffer的地址以及大小 判断是否用quirks这个东西我们在创建OMXNodeInstance时有看见过它是在xml中配置的一旦有了这个配置那么只要端口不是metadata mode则需要让OMX组件分配buffer上层传下来的buffer会与OMX分配的buffer做绑定创建一个BufferMeta上层传的数据会在这里做拷贝写入到OMX组件分配的buffer当中。这里是调用OMX_AllocateBuffer的地方之一 如果不使用quirks那么数据就不需要在OMXNodeInstance层做中转了。 metadata mode分配meta data大小的buffer创建出BufferMetapreset byte buffer直接用上层传的buffer创建BufferMeta调用OMX_UseBuffer将 BufferMeta 和 metadata/buffer 注册到 OMX 组件当中并且创建出 OMX_BUFFERHEADERTYPE 为创建出的 OMX_BUFFERHEADERTYPE 分配 id 到这里useBuffer_l 的分析就完成了之所以要在 OMXNodeInstance 这一层创建 BufferMeta可能就是为了记录上层传下来的所有buffer或者是做数据中转用的。 quirks模式会在 OMXNodeInstance 层多做一次数据拷贝现在已经被弃用了。 再放上两张示意图 一张是 preset byte buffer 另一张是meta data可以看到 meta data 模式下output buffer 不会有任何东西回传给上层。
http://wiki.neutronadmin.com/news/95627/

相关文章:

  • html在线记账网站模板湖北专业网站建设产品介绍
  • 合肥做网站的企业做网站需要先学什么
  • 西安淘宝网站建设公司排名栾川有做网站的吗
  • 做淘宝网站需要多少钱个人网站做音乐网要备文化
  • 上海做网站的公司电话上海买二手房做哪个网站好
  • 彩票网站开发制作平台软件wordpress head文件夹
  • 郓城网站建设费用织梦做中英文网站详细步骤
  • 深圳市城乡住房和建设局网站首页建设信息网的网站或平台登陆
  • 百度有哪些网站可免费做软件推广wordpress内存高
  • 青岛网站建设莫道网络wordpress 首页
  • jq网站登录记住密码怎么做宁波商城网站建设
  • 网站同时做竞价和优化可以建行网站用户名是什么
  • 企业营销型网站推广方法昆明做公司官网的公司
  • 网站购买流程动画片是怎么制作出来的
  • 珠海营销营网站建设射击官网
  • 网站开发搭建成都网站建设服务
  • 哪个网站能买到做披萨的芝士正宗wild合成版是哪个网站做的
  • 奖券世界推广网站wordpress edd支付宝
  • 西安自助建站系统别人用我的备案信息做网站
  • 微信支付 网站备案票务网站做酒店推荐的目的
  • 烟台免费做网站dw制作电商网页
  • 网站设计说明范文北京软件开发年薪
  • 做网站域名备案需要多久wordpress 谷歌地图
  • php做视频分享网站成都百度百科推广
  • js网站效果东莞建站网站
  • 鲜花网站建设文档网站缩略图制作
  • 购物网站建设的思路中铁四局建筑公司网站
  • 宁波网站建设制作公司排名安庆网站优化
  • 网站开发在哪个科目核算长春seo结算
  • 做整个网站静态页面多少钱兰州专业网站建设公司哪家好