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

重庆规模最大的建网站公司计算机做网站难吗

重庆规模最大的建网站公司,计算机做网站难吗,口碑营销的产品,安徽省公共资源交易中心网站上一节我们了解到 ACodec 执行完 start 流程后#xff0c;会把所有的 input buffer 都提交给 MediaCodec 层#xff0c;MediaCodec 是如何处理传上来的 buffer 呢#xff1f;这一节我们就来了解一下这部分内容。 1、ACodecBufferChannel::fillThisBuffer ACodec 通过调用 A… 上一节我们了解到 ACodec 执行完 start 流程后会把所有的 input buffer 都提交给 MediaCodec 层MediaCodec 是如何处理传上来的 buffer 呢这一节我们就来了解一下这部分内容。 1、ACodecBufferChannel::fillThisBuffer ACodec 通过调用 ACodecBufferChannel::fillThisBuffer 把input buffer传递给 MediaCodc传入参数为 buffer id void ACodecBufferChannel::fillThisBuffer(IOMX::buffer_id bufferId) {ALOGV(fillThisBuffer #%d, bufferId);std::shared_ptrconst std::vectorconst BufferInfo array(std::atomic_load(mInputBuffers));// 遍历buffer数组查找对应ACodecBufferChannel::BufferInfoBufferInfoIterator it findBufferId(array, bufferId);if (it array-end()) {ALOGE(fillThisBuffer: unrecognized buffer #%d, bufferId);return;}// 如果存在解密/解扰那么需要设置input formatif (it-mClientBuffer ! it-mCodecBuffer) {it-mClientBuffer-setFormat(it-mCodecBuffer-format());}// 调用callbackmCallback-onInputBufferAvailable(std::distance(array-begin(), it),it-mClientBuffer); }fillThisBuffer 很简单主要步骤如下 遍历buffer数组根据bufferid查找对应ACodecBufferChannel::BufferInfo从而获得mClientBuffer我们这里再回顾一下在不用解密/解扰的模式下mClientBuffer和mCodecBuffer其实是指向同一个MediaCodecBuffer的解密/解扰的模式那么mClientBuffer和mCodecBuffer指向的则不是同一块MediaCodecBuffer了如果mClientBuffer和mCodecBuffer不是指向同一块MediaCodecBuffer那么需要给 mClientBuffer 设置默认的 input format调用 onInputBufferAvailable 将消息回传给 MediaCodec 这里有一点很容易让人忽略为什么调用onInputBufferAvailable时传递的index要用std::distance来计算呢 std::distance应该计算的是 ACodecBufferChannel::BufferInfo 在数组中的位置也就是数组索引所以传递给 MediaCodec 用的 index 其实是 ACodecBufferChannel 的buffer数组索引它和buffer id是两码事。 2、BufferCallback::onInputBufferAvailable void BufferCallback::onInputBufferAvailable(size_t index, const spMediaCodecBuffer buffer) {spAMessage notify(mNotify-dup());notify-setInt32(what, kWhatFillThisBuffer);notify-setSize(index, index);notify-setObject(buffer, buffer);notify-post(); }onInputBufferAvailable 会把回传的数组索引 以及 MediaCodecBuffer 重新封装到 AMessage中最后交由 MediaCodec Handler 处理。 2、kWhatFillThisBuffer case kWhatFillThisBuffer:{// 将拿到的 MediaCodec 加入到列表当中/* size_t index */updateBuffers(kPortIndexInput, msg);// 如果正在处理以下事件则直接将所有的buffer返回给Codecif (mState FLUSHING|| mState STOPPING|| mState RELEASING) {returnBuffersToCodecOnPort(kPortIndexInput);break;}// 如果 csd buffer 不为空则先写入csd bufferif (!mCSD.empty()) {ssize_t index dequeuePortBuffer(kPortIndexInput);CHECK_GE(index, 0);// If codec specific data had been specified as// part of the format in the call to configure and// if theres more csd left, we submit it here// clients only get access to input buffers once// this data has been exhausted.status_t err queueCSDInputBuffer(index);if (err ! OK) {ALOGE(queueCSDInputBuffer failed w/ error %d,err);setStickyError(err);postActivityNotificationIfPossible();cancelPendingDequeueOperations();}break;}// CCodec 使用的暂时略过if (!mLeftover.empty()) {ssize_t index dequeuePortBuffer(kPortIndexInput);CHECK_GE(index, 0);status_t err handleLeftover(index);if (err ! OK) {setStickyError(err);postActivityNotificationIfPossible();cancelPendingDequeueOperations();}break;}// 如果使用的是异步模式if (mFlags kFlagIsAsync) {// 并且输入不是surface输入是surface的情况我们暂时不看if (!mHaveInputSurface) {// 状态是 flushed则暂时不处理该input buffer等待重新启动if (mState FLUSHED) {mHavePendingInputBuffers true;} else {// 调用onInputBufferAvailable将input buffer返回给上层onInputBufferAvailable();}}} else if (mFlags kFlagDequeueInputPending) {// 如果是同步模式并且处在阻塞等待的状态收到input buffer发送消息结束阻塞CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));// 增加阻塞等待计数使得kWhatDequeueInputTimedOut无效mDequeueInputTimeoutGeneration;mFlags ~kFlagDequeueInputPending;mDequeueInputReplyID 0;} else {postActivityNotificationIfPossible();}break;}kWhatFillThisBuffer 消息处理流程中的内容稍有一点多我们有选择的对内容进行展开 将拿到的 MediaCodec 加入到列表当中这里的列表有两个一个是用来记录 ACodecBufferChannel 中所有的 buffer分为input / output 两个数组mPortBuffers第二个列表是用来记录可用的input/output buffer的 mAvailPortBuffers同样分为input / output 两个数组这里面记录的是可用的索引。 size_t MediaCodec::updateBuffers(int32_t portIndex, const spAMessage msg) {CHECK(portIndex kPortIndexInput || portIndex kPortIndexOutput);size_t index;CHECK(msg-findSize(index, index));spRefBase obj;CHECK(msg-findObject(buffer, obj));spMediaCodecBuffer buffer static_castMediaCodecBuffer *(obj.get());{Mutex::Autolock al(mBufferLock);if (mPortBuffers[portIndex].size() index) {mPortBuffers[portIndex].resize(align(index 1, kNumBuffersAlign));}mPortBuffers[portIndex][index].mData buffer;}mAvailPortBuffers[portIndex].push_back(index);return index; }这里有一点非常重要如果没看懂很容易对接下来的内容产生疑惑将传来的MediaCodecBuffer记录到 mPortBuffers 中时这里会有一个隐式转换用 MediaCodecBuffer 创建了一个 MediaCodec::BufferInfo好家伙人手一个bufferinfo是吧。 struct BufferInfo {BufferInfo();spMediaCodecBuffer mData;bool mOwnedByClient;};MediaCodec::BufferInfo::BufferInfo() : mOwnedByClient(false) {}用一张图表示一下 buffer之间的关系 如果正在处理release/stop/release则直接将所有的buffer返回给CodecMediaCodec 不会持有任何 buffer void MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex, bool isReclaim) {CHECK(portIndex kPortIndexInput || portIndex kPortIndexOutput);Mutex::Autolock al(mBufferLock);if (portIndex kPortIndexInput) {mLeftover.clear();}for (size_t i 0; i mPortBuffers[portIndex].size(); i) {BufferInfo *info mPortBuffers[portIndex][i];if (info-mData ! nullptr) {spMediaCodecBuffer buffer info-mData;if (isReclaim info-mOwnedByClient) {ALOGD(port %d buffer %zu still owned by client when codec is reclaimed,portIndex, i);} else {info-mOwnedByClient false;info-mData.clear();}mBufferChannel-discardBuffer(buffer);}}mAvailPortBuffers[portIndex].clear(); }returnBuffersToCodecOnPort 会遍历所有 MediaCodec 记录的 BufferChannel 中的 buffer这里之所以要遍历记录的buffer是因为可能刚开始解码还有buffer没有传给MediaCodec流程就结束了MediaCodecBuffer 的 mOwnedByClient 指的是 buffer 是否被上层 app 所持有
http://www.w-s-a.com/news/742584/

相关文章:

  • 网站建设能用手机制作吗网站建设所需物资
  • 阜阳做网站的公司阳江招聘网最新消息
  • 织梦可以做哪些类型型网站wordpress 融资
  • 建设银行手机银行官方网站下载安装腾讯企点账户中心
  • 品牌设计网站有哪些商务网站建设平台
  • 新增网站备案时间什么是软件外包产业
  • 张家界做网站买了网站模版怎么做
  • 六安品牌网站建设怎么样知名商城网站建设报价
  • 怎么上传自己做的网站杭州网站建设公司平台
  • 网站开发程序是什么知名的电子商务网站
  • 做pc端网站好么平台推广是什么意思
  • 农业信息网站建设意义淘宝官网首页网址
  • 重庆网站设计公司价格贵阳网站建设app开发
  • dw做网站怎么换图片编写网页所用的语言是
  • 外贸网站收录工具个人网站的备案
  • 正规的网站建设工作室海外高延迟服务器做网站
  • 网站设计确认函合肥做网站维护的公司
  • 小说网站推荐网站开发语言怎么查
  • 网页制作基础教程慕课版电子版那种登录才能查看的网站怎么做优化
  • 制作网站用的域名网站域名注册信息查询
  • 公司域名查询官方网站女教师遭网课入侵直播录屏曝
  • 网站开发社交网络功能的作用腾讯公司网站
  • 网站建设需要微信账号和密码网站建设工作汇报
  • 国家城乡住房和建设部网站西安私人网站
  • 天津高端网站定制seo实战教程
  • 网站文章怎么做才能被快速收录网站备案核验系统
  • 子网站建设方案l建设银行网站
  • 免费看舆情网站网站备案用户名忘了怎么办
  • 地方门户网站的分类网站的方案
  • 沧州哪里做网站网站的建设是什么