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

酒厂网站源码工作时做网站使用软件

酒厂网站源码,工作时做网站使用软件,长沙域名注册公司,自贡网站制作文章目录 输入端的内存管理输入数据包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.tj-hxxt.cn/news/222861.html

相关文章:

  • go语言有啥好的网站开发框架汕头企业建站模板
  • 谢岗网站建设廊坊免费推广
  • 网站如何实现微信登录界面学校网站首页设计图片
  • 网站开发电脑配置要求那个网站可以看高速的建设情况
  • 上海网站设计公司联系方式公司简介怎么写吸引人
  • 制作响应式网站wordpress 文章形式
  • 南宁优化网站网络服务长沙专业网站建设公司
  • 网站开发用什么写得比较好google谷歌搜索
  • 代码高亮网站wordpress公众号推送
  • wordpress线报主题seo发外链工具
  • 网站开发可行性研究报告湖州网站开发区火炬手
  • wordpress网站如何清理jswordpress导入网站模板
  • 长沙网站优化推广网络推广费计入什么科目
  • 网站怎么做维护龙游建设局网站
  • 地方网站发展方向西部数码上传网站
  • 网站建设有哪些知识点八爪鱼 wordpress
  • 临海网站开发公司电话链接点开网页表白的网站怎么做的
  • 网站建设实训意见和建议网站开发集
  • 网站搭建的网站设计案例欣赏
  • 开发软件下载网站网站开发设计过程
  • 如何做网站视频模板瓷砖网站源码
  • 如何把网站做的和别人一样吗智慧团建电脑版登录入口官网
  • 昆明快速建站模板网站提交入口百度
  • 网站怎么维护更新srcache缓存wordpress
  • 网站推广做哪个比较好建设网站人员
  • 成都建设网站平台传奇世界网页版星装
  • 建设官方网站怎么修改预留手机培训报名
  • 微信网站开发制作公司南阳网站seo推广公司
  • filetype ppt 网站建设织梦网站发布的哪些产品和文章放在a文件可以吗
  • 创意上海专业网站建设网站建设完整版