Android MediaPlayer / Stagefright崩溃从RTSP服务器读取SDP

时间:2014-04-05 01:40:37

标签: c++ android-mediaplayer gstreamer rtsp stagefright

我正在尝试使用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

以下是来自Android 4.4源代码的APacketSource.cpp的相关摘录:

// 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()可能会返回一些不寻常的东西。

我可以提供打印到日志中的堆栈跟踪,但它非常大,我不确定它是否相关。为什么这个断言失败了?

0 个答案:

没有答案