我想了解MediaCodec如何用於硬件解碼。MediaCodec如何在Android框架內找到編解碼器?
我在android內部的知識非常有限。
這裏是我的發現:
有代表在Android系統的編解碼器詳細信息的XML文件。
device/ti/omap3evm/media_codecs.xml for an example.
這意味着,如果我們創建Java應用程序的編解碼器與媒體編解碼器
MediaCodec codec = MediaCodec.createDecoderByType(type);
應該找出與xml文件的幫助下各自的編碼器。
我在做什麼?
我試圖找出我們的這部分代碼正在讀取XML和查找基於給定的「類型」的編解碼器。
1)應用層:
MediaCodec codec = MediaCodec.createDecoderByType(type);
2)MediaCodec.java - > [框架/鹼/媒體/ JAVA /機器人/媒體/ MediaCodec.java]
public static MediaCodec createDecoderByType(String type) {
return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
}
3 )
private MediaCodec(
String name, boolean nameIsType, boolean encoder) {
native_setup(name, nameIsType, encoder); --> JNI Call.
}
4) JNI實現 - > [框架/基/媒體/ JNI/android_media_MediaCodec.cpp]
static void android_media_MediaCodec_native_setup (..) {
.......
const char *tmp = env->GetStringUTFChars(name, NULL);
sp<JMediaCodec> codec = new JMediaCodec(env, thiz, tmp, nameIsType, encoder); ---> Here
}
從框架/基/媒體/ JNI/android_media_MediaCodec.cpp
JMediaCodec::JMediaCodec(..) {
....
mCodec = MediaCodec::CreateByType(mLooper, name, encoder); //Call goes to libstagefright
.... }
sp<MediaCodec> MediaCodec::CreateByType(
const sp<ALooper> &looper, const char *mime, bool encoder) {
sp<MediaCodec> codec = new MediaCodec(looper);
if (codec->init(mime, true /* nameIsType */, encoder) != OK) { --> HERE.
return NULL;
}
return codec;
}
status_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) {
// MediaCodec
}
我觸動了這個流程。如果有人指出如何採取這種做法會有很大幫助。
謝謝。
令人印象深刻的Ganesh !!。感謝幫助。 – Whoami