2014-02-20 9 views
0

Я пытаюсь декодировать видео h264 с использованием HW с помощью библиотеки Stagefright.H264 HW ускоренное декодирование в Android с использованием библиотеки stagefright

Я использовал пример в here. Im получение декодированных данных в MedaBuffer. Для рендеринга MediaBuffer->data() я попробовал AwesomeLocalRenderer в AwesomePlayer.cpp.

но картинка в экране искажены

Здесь представлена ​​Link оригинала и разбилась картина.

А также попытался это в example`

sp<MetaData> metaData = mVideoBuffer->meta_data(); 
int64_t timeUs = 0; 
metaData->findInt64(kKeyTime, &timeUs); 
native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000); 
err = mNativeWindow->queueBuffer(mNativeWindow.get(), 
mVideoBuffer->graphicBuffer().get(), -1);` 

Но мои родные аварии кода. Я не могу получить реальную картину, ее или поврежденный или черный экран.

Спасибо заранее.

+0

FWIW, для Android 4.1+ существуют общедоступные API. Плохое изображение выглядит как проблема шага/выравнивания в буфере YUV. – fadden

+0

Большое спасибо за ваш ответ. Но я хочу работать с Android 4.0+. Вот почему я использую Android NDK. –

ответ

0

Если вы используете ускоренный декодер HW, то распределение на выходном порту вашего компонента было бы основано на Native Window. Другими словами, выходной буфер в основном представляет собой дескриптор gralloc, который был передан каркасом Stagefright. (Ref: OMXCodec::allocateOutputBuffersFromNativeWindow). Следовательно, возвращаемый MediaBuffer не должен интерпретироваться как простой буфер YUV.

В случае AwesomeLocalRenderer каркас выполняет преобразование цвета программного обеспечения, когда вызывается mTarget->render, как показано здесь. Если вы отслеживаете поток кода, вы обнаружите, что содержимое MediaBuffer напрямую интерпретируется как буфер YUV.

Для ускоренных кодеков HW вы должны использовать AwesomeNativeWindowRenderer. Если у вас есть особые условия для использования AwesomeLocalRenderer, пожалуйста, выделите их. Я могу усовершенствовать этот ответ соответствующим образом.

P.S: Для целей отладки вы также можете обратиться к this question, который захватил методы, чтобы сбрасывать данные YUV и анализировать их.

+0

Большое спасибо за ваш ответ. Сначала, когда я попробовал AwesomeNativeWindowRenderer, сбой собственного кода. Вот как я его использовал. mVideoRenderer = новый AwesomeNativeWindowRenderer (mNativeWindow, 0); mVideoRenderer-> render (mVideoBuffer); // In while Loop. Это задний ход. # 00 шт 00000000 # 01 шт 00005678 mylib.so (AwesomeNativeWindowRenderer :: визуализации (андроида :: MediaBuffer *) + 260) И когда им с помощью addr2line, ошибка в этой строке этого status_t ERR = mNativeWindow- > queueBuffer (mNativeWindow.get(), buffer-> graphicBuffer(). get(), -1); Ошибка, вероятно, в -1. –

+0

@ user3215358 .. В вашем коде, как вы создали 'mNativeWindow'? -1 присутствует в коде AOSP и, следовательно, я не буду в этом сомневаться. Можете ли вы поделиться своим кодом для обзора? 'mNativeWindow' должен указывать на' Surface' или 'SurfaceTextureClient', который внутри имеет« SurfaceTexture », прикрепленный к тому же. Мое сомнение - «mNativeWindow», возможно, не заполнено должным образом. – Ganesh

+0

@Ganesh .. Im получает mNativeWindow от SurfaceView. Вот код, как им получить его [ссылка] (http://pastebin.com/ZefHRW2z). –