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

微信网站 微信支付wordpress腾讯微博插件

微信网站 微信支付,wordpress腾讯微博插件,沈阳男科医院排名最好的是哪家,相亲网站开发文章目录 输入端的内存管理输入数据包buffer结构体的转换 主要的流程如上#xff0c; 申请内存在CCodecBufferChannel#xff0c;申请之后回调到MediaCodec。然后应用从MediaCodec获取 将解码数据放到buffer中#xff0c;CCodecBufferChannel在将这块buffer 送到componet模块… 文章目录 输入端的内存管理输入数据包buffer结构体的转换 主要的流程如上 申请内存在CCodecBufferChannel申请之后回调到MediaCodec。然后应用从MediaCodec获取 将解码数据放到buffer中CCodecBufferChannel在将这块buffer 送到componet模块。 输入端的内存管理 内部解码输入buffer的申请个数以及获取方式 mediacodec 中会申请一部分默认情况下是4个待解码的buffer。 status_t CCodecBufferChannel::requestInitialInputBuffers() {if (mInputSurface) {return OK;}size_t numInputSlots mInput.lock()-numSlots;struct ClientInputBuffer {size_t index;spMediaCodecBuffer buffer;size_t capacity;};std::listClientInputBuffer clientInputBuffers;{MutexedInput::Locked input(mInput);while (clientInputBuffers.size() numInputSlots) {ClientInputBuffer clientInputBuffer;if (!input-buffers-requestNewBuffer(clientInputBuffer.index,clientInputBuffer.buffer)) {break;}}}其中在构造函数中定义了 constexpr size_t kSmoothnessFactor 4; input-numSlots kSmoothnessFactor;这个buffer 外部有两种方式可以获取到。 直接调用dequeueInputBuffer。设置回调到Mediacodec有buffer 可用的时候 回调到callback中。 输入输出都可以这样做 在NuPlayer 中是设置回调到mediacodec然后mediacodec回调回来。nuplayer中是在MediaCodec 有bufer 可用的时候 handleAnInputBuffer 从source读取数据这个是一个新的 ABuffer buffer读到数据后将会有拷贝的动作 将ABuffer拷贝到MediaCodecBuffer中。 spAMessage reply new AMessage(kWhatCodecNotify, this); mCodec-setCallback(reply);输入buffer的申请、存储 在CCodecBufferChannel中 requestInitialInputBuffers 将调用input-buffers-requestNewBuffer申请到index和buffer。这些buffer也同时存储到input-buffers中。然后通过回调 回调到Mediacodec的kWhatFillThisBufferFillThisBuffer的 updateBuffers 存储buffer到mPortBuffers存储index 到mAvailPortBuffers。 如果有设置callback的话会把index 返回给注册callback的地方。如果是getInputBuffer 那么获取的是CCodecBufferChannel的input-buffers. 上述的回调有两个地方会调用 InitialInputBuffers的时候。是feedInputBufferIfAvailable的时候。而feedInputBufferIfAvailable 在onWorkDone, discardBuffer、renderOutputBuffe、onInputBufferDone等都可会调用。 MediaCodec.cppstatus_t MediaCodec::init(const AString name) {mBufferChannel-setCallback(std::unique_ptrCodecBase::BufferCallback(new BufferCallback(new AMessage(kWhatCodecNotify, this)))); }ccodec.cppvoid CCodec::start() {(void)mChannel-requestInitialInputBuffers(); }MediaCodec.cpp 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(); } 申请的内存不够的情况会怎么处理 在nuplayer中拷贝解码数据到mediacodec的时候 会判断从codec取出来的buffer 够不够 不够的话会报错。而这个buffer 大小的申请也是外部设置的一般是在解析的时候能够知道 最大是多少。比如下面的MP4解析的代码中会获取box 中sample的最大值然后依据这个值设定输入的buffer的最大值。 bool NuPlayer::Decoder::onInputBufferFetched(const spAMessage msg) { CHECK(msg-findSize(buffer-ix, bufferIx)); CHECK_LT(bufferIx, mInputBuffers.size()); spMediaCodecBuffer codecBuffer mInputBuffers[bufferIx];spABuffer buffer; bool hasBuffer msg-findBuffer(buffer, buffer);if (needsCopy) { if (buffer-size() codecBuffer-capacity()) { handleError(ERROR_BUFFER_TOO_SMALL); mDequeuedInputBuffers.push_back(bufferIx); return false; } }status_t NuPlayer::Decoder::fetchInputData(spAMessage reply) { status_t err mSource-dequeueAccessUnit(mIsAudio, accessUnit); reply-setBuffer(buffer, accessUnit); }spCodec2Buffer LinearInputBuffers::Alloc( const std::shared_ptrC2BlockPool pool, const spAMessage format) { int32_t capacity kLinearBufferSize; (void)format-findInt32(KEY_MAX_INPUT_SIZE, capacity); }size_t max_size; err mLastTrack-sampleTable-getMaxSampleSize(max_size);if (max_size ! 0) { if (max_size SIZE_MAX - 10 * 2) { ALOGE(max sample size too big: %zu, max_size); return ERROR_MALFORMED; } AMediaFormat_setInt32(mLastTrack-meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, max_size 10 * 2); } PipelineWatcher控制外部输入buffer的速度 监控输入buffer的情况有buffer送入解码器的时候 mFramesInPipeline 存储buffer、index 和时间。送入componet 处理完成之后调用onWorkDone从队列中删除。而这个mFramesInPipeline队列的大小不能超过mInputDelay mPipelineDelay mOutputDelay mSmoothnessFactor.默认是4就是输入最多存储4块了超过4块就不会回调到外部让外部送数据进来了。 if (!items.empty()) {{MutexedPipelineWatcher::Locked watcher(mPipelineWatcher);PipelineWatcher::Clock::time_point now PipelineWatcher::Clock::now();for (const std::unique_ptrC2Work work : items) {watcher-onWorkQueued(work-input.ordinal.frameIndex.peeku(),std::vector(work-input.buffers),now);}}err mComponent-queue(items);}while (!mPipelineWatcher.lock()-pipelineFull()) {spMediaCodecBuffer inBuffer;size_t index;{MutexedInput::Locked input(mInput);numActiveSlots input-buffers-numActiveSlots();ALOGD(active:%d, numslot:%d, (int)numActiveSlots, (int)input-numSlots);if (numActiveSlots input-numSlots) {break;}if (!input-buffers-requestNewBuffer(index, inBuffer)) {ALOGE([%s] no new buffer available, mName);break;}}ALOGE([%s] new input index %zu [%p], mName, index, inBuffer.get());mCallback-onInputBufferAvailable(index, inBuffer);} 输入数据包buffer结构体的转换 MediaCodec 层 ABuffer(Nuplayer)------MediaCodecBuffer -----C2Buffer Nuplayer: 拷贝解码数据到前面requestInitialInputBuffers申请的Codec2buffer(基类是MediaCodecBuffer)MediaCodec: Nuplayer中拷贝好的buffer queueInputBuffer到MediaCodec 中MediaCodec要把这块buffer 传递到 底下具体的componet需要要转换为一个c2buffer。这个c2buffer封装在c2work中 queue 到componet中。 componet层 是调用到simplec2componet 中调用的是queue_nb。 在simpleC2的实现中是发送一个process的消息到looper 执行processQueueprocessQueue在调用到具体的解码componet的proces进行处理。 std::unique_ptrC2Work work(new C2Work);work-input.ordinal.timestamp timeUs;work-input.ordinal.frameIndex mFrameIndex;// WORKAROUND: until codecs support handling work after EOS and max output sizing, use timestamp// manipulation to achieve image encoding via video codec, and to constrain encoded output.// Keep client timestamp in customOrdinalwork-input.ordinal.customOrdinal timeUs;work-input.buffers.clear();spCodec2Buffer copy;bool usesFrameReassembler false;if (buffer-size() 0u) {MutexedInput::Locked input(mInput);std::shared_ptrC2Buffer c2buffer;if (!input-buffers-releaseBuffer(buffer, c2buffer, false)) {return -ENOENT;}}err mComponent-queue(items);
http://www.hkea.cn/news/14549443/

相关文章:

  • 怎么学做网站制作那个网站做系统好
  • 做网站对象存储网站管理是什么
  • 体育网站建设需求开发外包公司有哪些?哪个比较好
  • 网站建设分金手指专业五中英文外贸网站建设
  • wordpress视频主题下载地址沈阳关键字优化公司
  • 做直播教程的网站有哪些cpa推广做网站
  • 山西网站备案多久深圳网站建设哪些
  • 湖南省百川电力建设有限公司网站网页设计实训报告800字
  • 做装修效果图的网站个人网站建设推广服务
  • 电子商务网站建设与设计云服务器免费虚拟主机
  • 做游戏网站的分析在哪些网站可以做企业名称预审
  • 温州网站上排名网站和服务器
  • 织梦网站怎么做404页面网站创意策划案
  • 高端网站制作哪家好网站制作都有哪些
  • 注册公司网站需要多少钱网站建设佰金手指科杰二九
  • 目前网站在初级建设阶段_需要大量数据丰富wordpress去除分类目录
  • 网站建设网页制作多少钱山西有哪些做网站的公司
  • 清徐北京网站建设国内 虚拟主机
  • 网站建设 硬件昆明网站公司建设
  • 福州 网站建设 医疗绍兴公司网站制作公司
  • 重庆建网站一般多少钱网络培训学习心得
  • 中原郑州网站建设直播网站建设需要多少钱
  • 怎么把做的网站上传到网络深圳高端女装品牌排行榜
  • 内容网站设计范例百度seo公司有哪些
  • 长沙网站推广服务公司网络组建与维护实训报告
  • 青岛房产网站建设网页升级访问升级自动跳
  • 公司网站怎么选广州番禺邮政编码
  • 松江区环保局网站建设项目备案铁岭市做网站
  • 网站google排名出现过几分钟flash xml网站
  • 什么是移动端网站适配杭州市建设工程交易中心网站