Android の MediaPlayer クラスを使用して RTSP ストリームを再生しようとしています。これを実現するために、MediaPlayer は stagefright というネイティブ ライブラリを呼び出します。このライブラリとメディア フレームワーク全体が、次のエラーでクラッシュします。
15988-23172/? A/APacketSource﹕ frameworks/av/media/libstagefright/rtsp/APacketSource.cpp:143 CHECK_EQ( (unsigned)nalType,7u) failed: 22 vs. 7
したがって、エラーが何であるかは明らかですnalType
.7であるはずのときにアサートが失敗しますが、代わりに22に評価されます.なぜこれが理解できません. コンテキストとして、RTSP ストリームの SDP にsprop-parameter-sets
は、base64 でエンコードされた一連のバイトである属性が含まれています。nalType
base64-decoding の結果の最初のバイトを参照しているようsprop-parameter-sets
です。この場合、これは base64 でエンコードされたバージョンです。
NjdkMDAxNmRhMDI4MGY2YzA1NTIwMDAwMDAzMDA0MDAwMDAwNzhjMDgwMDNlODAwMDBhOGMzN2JkZjBiYzIy
デコードすると、次のようになります。
67d0016da0280f6c0552000000300400000078c08003e80000a8c37bdf0bc22
APacketSource.cpp
以下は、Android 4.4 ソース コードからの関連する抜粋です。
// Appears to assign value of "sprop-parameter-sets" from SDP to 'val'
if (!GetAttribute(params, "sprop-parameter-sets", &val)) {
return NULL;
}
size_t start = 0;
for (;;) {
ssize_t commaPos = val.find(",", start);
size_t end = (commaPos < 0) ? val.size() : commaPos;
AString nalString(val, start, end - start);
sp<ABuffer> nal = decodeBase64(nalString);
CHECK(nal != NULL);
CHECK_GT(nal->size(), 0u);
CHECK_LE(nal->size(), 65535u);
// Mask away everything but 0001 1111 from the first byte
uint8_t nalType = nal->data()[0] & 0x1f;
if (numSeqParameterSets == 0) {
// Line 143, where the failure happens.
CHECK_EQ((unsigned)nalType, 7u);
}
...
}
マスクされた後の最初のバイト 0x67 は、0x07 に評価されます。どういうわけか、0x16 に評価されます。これがなぜなのかはわかりませんが、nal->data()
.
ログに出力されるスタックトレースを提供できますが、それは非常に大きく、関連性があるかどうかわかりません。このアサートが失敗するのはなぜですか?