mediacodec流程学习

void ACodec::LoadedState::onStart() {
    ALOGV("onStart");

    status_t err = mCodec->mOMXNode->sendCommand(OMX_CommandStateSet, OMX_StateIdle);
    if (err != OK) {
        mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err));
    } else {
        mCodec->changeState(mCodec->mLoadedToIdleState);
    }
}
mCodec->mOMXNode->sendCommand 调用到  sendCommand 设置OMX node 状态为StateIdle
status_t OMXNodeInstance::sendCommand(
        OMX_COMMANDTYPE cmd, OMX_S32 param) {
    const sp<IOMXBufferSource> bufferSource(getBufferSource());
    if (bufferSource != NULL && cmd == OMX_CommandStateSet) {
        if (param == OMX_StateIdle) {
            // Initiating transition from Executing -> Idle
            // ACodec is waiting for all buffers to be returned, do NOT
            // submit any more buffers to the codec.
            bufferSource->onOmxIdle();
        } else if (param == OMX_StateLoaded) {
            // Initiating transition from Idle/Executing -> Loaded
            // Buffers are about to be freed.
            bufferSource->onOmxLoaded();
            setBufferSource(NULL);
        }

        // fall through
    }

    Mutex::Autolock autoLock(mLock);

    if (cmd == OMX_CommandStateSet) {
        // There are no configurations past first StateSet command.
        mSailed = true;
    }

    // bump internal-state debug level for 2 input and output frames past a command
    {
        Mutex::Autolock _l(mDebugLock);
        bumpDebugLevel_l(2 /* numInputBuffers */, 2 /* numOutputBuffers */);
    }

    const char *paramString =
        cmd 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
视频 MediaCodec 解码流程通常分为以下几个步骤: 1. 创建 MediaCodec 对象:使用相应的解码器名称创建 MediaCodec 对象,例如 H.264 视频解码可以创建 MediaCodec 对象 `MediaCodec.createDecoderByType("video/avc")`。 2. 配置解码器:设置解码器的输入格式和输出格式,输入格式可以是容器格式(如 mp4、flv 等)或者裸流格式(如 H.264、H.265 等),输出格式可以是 Surface、ByteBuffer 等。 3. 启动解码器:调用 MediaCodec 的 start() 方法启动解码器,此时解码器进入执行状态。 4. 推送数据:将需要解码的数据输入到解码器中,可以是视频流、音频流等。对于视频流,通常是将 H.264 等压缩格式的数据进行解码,得到原始的 YUV 数据。 5. 获取解码数据:调用 MediaCodec 的 dequeueOutputBuffer() 方法获取解码后的数据,返回一个输出缓冲区的索引,通过该索引可以获取输出缓冲区中的数据。 6. 处理解码数据:根据输出缓冲区的格式,将数据转化为可显示的格式,如将 YUV 数据转化为 Bitmap 或者 Surface 中的图像。 7. 释放输出缓冲区:使用完输出缓冲区后,需要调用 MediaCodec 的 releaseOutputBuffer() 方法释放输出缓冲区。 8. 停止解码器:当解码完成或者需要停止解码器时,调用 MediaCodec 的 stop() 方法停止解码器。 以上是 MediaCodec 解码流程的主要步骤,具体实现时需要根据不同的需求和情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值