建大型网站公司360网站托管

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

建大型网站公司,360网站托管,企业为什么融资难,android 开发wordpress上一节我们了解了 OMXNodeInstance 的创建过程#xff0c;以及 IOmx 服务和 OMXNodeInstance、OMX组件之间的联系。接下来我们将一起了解 ACodec 是如何通过 OMXNodeInstance 这个中间层进行端口定义设置#xff0c;以及端口Buffer分配的。 OMXNodeInstance 的代码还是比较长… 上一节我们了解了 OMXNodeInstance 的创建过程以及 IOmx 服务和 OMXNodeInstance、OMX组件之间的联系。接下来我们将一起了解 ACodec 是如何通过 OMXNodeInstance 这个中间层进行端口定义设置以及端口Buffer分配的。 OMXNodeInstance 的代码还是比较长的我们需要重点抓住和 Buffer 相关的内容也就是端口定义、Buffer分配以及 Buffer 传递了解了 Buffer 那我们对 OpenMax 的学习就会很轻松了。 1、setPortMode 我们之前在学习 ACodec configureCodec 流程时看到有很多 portMode端口类型确定之后就会调用 setPortMode 方法将端口模式设定给 OMXNode最终设置给 OMX 组件。 status_t ACodec::setPortMode(int32_t portIndex, IOMX::PortMode mode) {status_t err mOMXNode-setPortMode(portIndex, mode);if (err ! OK) {ALOGE([%s] setPortMode on %s to %s failed w/ err %d,mComponentName.c_str(),portIndex kPortIndexInput ? input : output,asString(mode),err);return err;}mPortMode[portIndex] mode;return OK; }OMXNodeInstance 会根据设定的内容对 OMX 组件进行配置我们这里暂时只研究解码的情况一般解码流程可能会涉及到如下几种 port Mode in Port non-securekPortModePresetByteBuffer上层可以直接读写buffersecurekPortModePresetSecureBuffer上层需要用特殊的方式读写buffer out Port has native window tunnel mode上层不需要接收 output buffernon tunnel modekPortModeDynamicANWBuffer使用动态的native window no native window non-secure kPortModePresetByteBuffer上层可以直接读写buffersecureerror不允许这种情况。
1.1、kPortModePresetByteBuffer 之前我们讲过Preset 是预设的意思表示这块buffer是预先分配好的之后使用过程中就不会发生变化了ByteBuffer 指的是普通的buffer我们通过指针就可以读写buffer中的内容。 kPortModePresetByteBuffer 会在两个情况下使用 普通解码的 input buffer普通解码且无surface的 output buffer 这两种情况下是可以通过指针读写 buffer 中内容的也就意味着内容是不受保护的。 status_t OMXNodeInstance::setPortMode(OMX_U32 portIndex, IOMX::PortMode mode) {case IOMX::kPortModePresetByteBuffer:{// Disable secure buffer, native buffer and metadata.(void)enableNativeBuffers_l(portIndex, OMX_TRUE /graphic/, OMX_FALSE);(void)enableNativeBuffers_l(portIndex, OMX_FALSE /graphic/, OMX_FALSE);(void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL);break;} }从注释中我们可以看出来需要关闭端口的 secure buffernative buffer以及metadata功能这里的native buffer指的应该就是graphic buffer。 从这里我们可以猜测OMX 组件端口使用的buffer可能有3种默认使用普通buffer 普通buffersecure buffergraphic buffer 1.1.1、enableNativeBuffers_l 使用普通 buffer 就要把另外两个配置关闭这里可以通过enableNativeBuffers_l方法来完成之所以通过一个方法(并且方法名为 native buffer)是因为这些buffer本身都应该是由 native 层分配。由于OMXNodeInstance 把 secure buffer, graphic buffer的设置放到一起了所以enableNativeBuffers_l容易把人看晕把他拆成两部分 先看 native buffergraphic buffer的配置部分除了调用OMX_SetParameter对组件进行设定外还将 mGraphicBufferEnabled 数组置为了 true/false用于标记端口是否使用graphic buffer如果使用了就置为true没有使用就置为false。 OMX_STRING name OMX.google.android.index.enableAndroidNativeBuffersEnableAndroidNativeBuffersParams params;InitOMXParams(params);params.nPortIndex portIndex;params.enable enable;err OMX_SetParameter(mHandle, index, params);CLOG_IF_ERROR(setParameter, err, %s(%#x): %s:%u en%d, name, index,portString(portIndex), portIndex, enable);if (err OMX_ErrorNone) {mGraphicBufferEnabled[portIndex] enable;} else if (enable) {mGraphicBufferEnabled[portIndex] false;}再看 secure buffer 的配置部分secure buffer 对应的配置名称为 native handle这是因为native层分配的buffer会以handle的形式回传上层从而保护buffer。 OMX_STRING name OMX.google.android.index.allocateNativeHandleEnableAndroidNativeBuffersParams params;InitOMXParams(params);params.nPortIndex portIndex;params.enable enable;err OMX_SetParameter(mHandle, index, params);CLOG_IF_ERROR(setParameter, err, %s(%#x): %s:%u en%d, name, index,portString(portIndex), portIndex, enable);if (!graphic) {if (err OMX_ErrorNone) {mSecureBufferType[portIndex] enable ? kSecureBufferTypeNativeHandle : kSecureBufferTypeOpaque;} else if (mSecureBufferType[portIndex] kSecureBufferTypeUnknown) {mSecureBufferType[portIndex] kSecureBufferTypeOpaque;}}如果 secure buffer 设置成功那么 mSecureBufferType 会被设置为 kSecureBufferTypeNativeHandle否则置为 kSecureBufferTypeOpaque。 我们这里大概知道 secure buffer - Native Handlegraphic buffer - Native Buffer 1.1.2、storeMetaDataInBuffers_l 除了以上两项配置外还有额外的meta data type需要配置我们前面了解过graphic buffer需要和metadata 搭配使用但是metadata也有不同的类型我们需要告知 OMX 组件使用哪一种 metaData运行过程中OMX组件就会根据类型来解析metaData了 status_t OMXNodeInstance::storeMetaDataInBuffers_l(OMX_U32 portIndex, OMX_BOOL enable, MetadataBufferType *type) {OMX_INDEXTYPE index;OMX_STRING name const_castOMX_STRING(OMX.google.android.index.storeMetaDataInBuffers);OMX_STRING nativeBufferName const_castOMX_STRING(OMX.google.android.index.storeANWBufferInMetadata);MetadataBufferType negotiatedType;// 如果参数type不指定具体类型那么默认使用kMetadataBufferTypeANWBufferMetadataBufferType requestedType type ! NULL ? *type : kMetadataBufferTypeANWBuffer;StoreMetaDataInBuffersParams params;InitOMXParams(params);params.nPortIndex portIndex;params.bStoreMetaData enable;// 接下来是尝试设置 meta data type如果设置不成功就设置另外一种OMX_ERRORTYPE err requestedType kMetadataBufferTypeANWBuffer? OMX_GetExtensionIndex(mHandle, nativeBufferName, index): OMX_ErrorUnsupportedIndex;OMX_ERRORTYPE xerr err;if (err OMX_ErrorNone) {err OMX_SetParameter(mHandle, index, params);if (err OMX_ErrorNone) {name nativeBufferName; // set name for debuggingnegotiatedType requestedType;}}if (err ! OMX_ErrorNone) {err OMX_GetExtensionIndex(mHandle, name, index);xerr err;if (err OMX_ErrorNone) {negotiatedType requestedType kMetadataBufferTypeANWBuffer? kMetadataBufferTypeGrallocSource : requestedType;err OMX_SetParameter(mHandle, index, params);}if (err OMX_ErrorBadParameter) {err OMX_ErrorUnsupportedIndex;}} …else {if (!enable) {negotiatedType kMetadataBufferTypeInvalid;}mMetadataType[portIndex] negotiatedType;}if (type ! NULL) {*type negotiatedType;}return StatusFromOMXError(err); }storeMetaDataInBuffers_l 的代码比较长主要是因为由两种meta data一种是 kMetadataBufferTypeANWBuffer另一种是kMetadataBufferTypeGrallocSource 。 默认情况下storeMetaDataInBuffers_l的第三个参数不填类型默认使用 kMetadataBufferTypeANWBuffer也就是于 graphic buffer 搭配使用的 meta data类型。设置的 meta data类型会被记录到 mMetadataType 中后续还会使用到。 如果是用的普通 buffer Byte Buffer那么就不需要meta data了mMetadataType会被设置为 kMetadataBufferTypeInvalid。 1.1.3、总结 综上 当使用 Byte Buffer时端口定义设置如下 native handlesecuredisablednative buffergraphicdisabled meta datainvaild
1.2、kPortModeDynamicANWBuffer 有了上面内容的学习设定端口为DynamicANWBuffer就很简单了 case IOMX::kPortModeDynamicANWBuffer:{if (portIndex kPortIndexOutput) {if (mLegacyAdaptiveExperiment) {CLOG_INTERNAL(setPortMode, Legacy adaptive experiment: not setting port mode to %s(%d) on output,asString(mode), mode);err StatusFromOMXError(OMX_ErrorUnsupportedIndex);break;}err enableNativeBuffers_l(portIndex, OMX_TRUE /graphic/, OMX_TRUE);if (err ! OK) {break;}}(void)enableNativeBuffers_l(portIndex, OMX_FALSE /graphic/, OMX_FALSE);err storeMetaDataInBuffers_l(portIndex, OMX_TRUE, NULL);break;}需要开启 grapihc buffer关闭 secure buffer使用 meta data具体的端口设定如下 native handlesecuredisablednative buffergraphicenabled meta datakMetadataBufferTypeANWBuffer
1.3、kPortModePresetSecureBuffer secure buffer的设定同样很简单需要关闭 grapihc buffer开启 secure buffer不使用 meta data具体的端口设定如下 native handlesecureenablednative buffergraphicdisabled meta datainvaild 这里我们要注意的是secure buffer是不需要meta data的。 case IOMX::kPortModePresetSecureBuffer:{// Allow on both input and output.(void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL);(void)enableNativeBuffers_l(portIndex, OMX_TRUE /graphic/, OMX_FALSE);err enableNativeBuffers_l(portIndex, OMX_FALSE /graphic/, OMX_TRUE);break;}