Próbuję zrozumieć, w jaki sposób MediaCodec jest używany do dekodowania sprzętowego.W jaki sposób MediaCodec znajduje kodek wewnątrz struktury w systemie Android?
Moja wiedza na temat Androida jest bardzo ograniczona.
Oto moje wnioski:
znajduje się plik XML, który reprezentuje dane kodeka w systemie Android.
device/ti/omap3evm/media_codecs.xml for an example.
Co oznacza, że jeśli stworzymy kodek z aplikacji Java z Media Codec
MediaCodec codec = MediaCodec.createDecoderByType(type);
Należy dowiedzieć się odpowiedni koder z pomocą pliku xml.
Co ja robię?
Próbuję dowiedzieć się, która część kodu czyta xml i znaleźć kodek na podstawie danego "typu".
1) Zastosowanie warstwy:
MediaCodec codec = MediaCodec.createDecoderByType(type);
2) MediaCodec.java -> [ramy/zasada/nośnik/Java/Android/nośnik/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 Wykonanie -> [ram/base/media/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
}
z ramami/Base/media/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
}
uderza mnie z tego przepływu. Jeśli ktoś wskaże, jak to zrobić, bardzo by pomógł.
dzięki.
Imponująca Ganesh !!. Dzięki za pomoc. – Whoami