Android MediaPlayer / Stagefright дает сбой при чтении SDP с сервера RTSP

Я пытаюсь использовать класс 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. Я не понимаю, почему это так. Для контекста SDP потока RTSP содержит атрибут sprop-parameter-sets, который является base64-закодированным набором байтов. nalType похоже, ссылается на первый байт результата base64-декодирования 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(),

Я могу предоставить трассировку стека, которая будет напечатана в журнале, но она довольно большая, и я не уверен, что она уместна. Почему это утверждение не удается?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]