Android13 MediaCodec stop流程分析

下面通过代码分析MediaCodec的stop流程:

//frameworks/base/media/java/android/meida/MediaCodec.java
final public class MediaCodec {
    public final void stop() {
        native_stop();
        freeAllTrackedBuffers();


        synchronized (mListenerLock) {
            if (mCallbackHandler != null) {
                mCallbackHandler.removeMessages(EVENT_SET_CALLBACK);
                mCallbackHandler.removeMessages(EVENT_CALLBACK);
            }
            if (mOnFirstTunnelFrameReadyHandler != null) {
                mOnFirstTunnelFrameReadyHandler.removeMessages(EVENT_FIRST_TUNNEL_FRAME_READY);
            }
            if (mOnFrameRenderedHandler != null) {
                mOnFrameRenderedHandler.removeMessages(EVENT_FRAME_RENDERED);
            }
        }
    }
}

调用native_stop方法,native_stop是一个native方法,通过查询调用android_media_MediaCodec_stop方法:

//frameworks/base/media/jni/android_media_MediaCodec.cpp
static void android_media_MediaCodec_stop(JNIEnv *env, jobject thiz) {
    ALOGV("android_media_MediaCodec_stop");


    sp<JMediaCodec> codec = getMediaCodec(env, thiz);


    if (codec == NULL || codec->initCheck() != OK) {
        throwExceptionAsNecessary(env, INVALID_OPERATION);
        return;
    }


    status_t err = codec->stop();


    throwExceptionAsNecessary(env, err);
}

调用JMediaCodec的stop方法:

sp<MediaCodec> mCodec;
//frameworks/base/media/jni/android_media_MediaCodec.cpp
status_t JMediaCodec::stop() {
    mSurfaceTextureClient.clear();


    return mCodec->stop();
}

调用MediaCodec的stop方法:

//frameworks/av/media/libstagefright/MediaCodec.cpp
status_t MediaCodec::stop() {
    sp<AMessage> msg = new AMessage(kWhatStop, this);


    sp<AMessage> response;
    return PostAndAwaitResponse(msg, &response);
}

发送kWhatStop消息,发送的消息在onMessageReceived中处理:

sp<CodecBase> mCodec;
//frameworks/av/media/libstagefright/MediaCodec.cpp
void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
    switch (msg->what()) {
        case kWhatStop: {
            if (mReplyID) {
                mDeferredMessages.push_back(msg);
                break;
            }
            [[fallthrough]];
        }
    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值