Ускоренное декодирование H264 HW в Android с использованием библиотеки stagefright

Я пытаюсь декодировать видео h264, используя HW с библиотекой Stagefright.

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

но картинка на экране искажается

Вот Ссылка на оригинальную и разбитую картинку .

А также попробовал это в примере`

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);`

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

Заранее спасибо.


person Arsen Davtyan    schedule 20.02.2014    source источник
comment
FWIW, для этого в Android 4.1+ есть общедоступные API. Плохое изображение выглядит как проблема с шагом/выравниванием в буфере YUV.   -  person fadden    schedule 20.02.2014
comment
Большое спасибо за ваш ответ. Но я хочу работать с Android 4.0+. Вот почему я использую Android NDK.   -  person Arsen Davtyan    schedule 21.02.2014


Ответы (1)


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

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

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

P.S. В целях отладки вы также можете обратиться к этот вопрос, в котором описаны методы вывода данных YUV и их анализа.

person Ganesh    schedule 21.02.2014
comment
Большое спасибо за ваш ответ. Сначала, когда я попробовал AwesomeNativeWindowRenderer, родной код вылетел. Вот как я его использовал. mVideoRenderer = новый AwesomeNativeWindowRenderer (mNativeWindow, 0); mVideoRenderer-›render(mVideoBuffer); //В цикле while. Это обратная связь. #00 pc 00000000 ‹unknown› #01 pc 00005678 mylib.so (AwesomeNativeWindowRenderer::render (android::MediaBuffer*)+260) И когда я использую addr2line, ошибка в этой строке этого status_t err = mNativeWindow-›queueBuffer( mNativeWindow.get(), buffer-›graphicBuffer().get(), -1); Ошибка наверное в -1. - person Arsen Davtyan; 21.02.2014
comment
@ user3215358 .. Как в вашем коде вы создали mNativeWindow? -1 присутствует в коде AOSP и, следовательно, я не сомневаюсь в этом. Можете ли вы поделиться своим кодом для обзора? mNativeWindow должен указывать на Surface или SurfaceTextureClient, к которым внутри прикреплен SurfaceTexture. Я сомневаюсь, что mNativeWindow может быть заполнен неправильно. - person Ganesh; 21.02.2014
comment
@Ganesh.. Я получаю mNativeWindow из SurfaceView. Вот код, как я получаю ссылку. - person Arsen Davtyan; 21.02.2014
comment
@Ganesh.. Я использую Это Учебное пособие И я меняю часть чтения и декодирования. - person Arsen Davtyan; 21.02.2014
comment
@ user3215358 .. Мне потребуется некоторое время на проверку .. но не могли бы вы быстро включить журналы в BufferQueue и проверить? - person Ganesh; 21.02.2014
comment
@ Ганеш .. Как включить журналы? открыть комментарий //#определить LOG_NDEBUG 0 и перекомпилировать его? - person Arsen Davtyan; 21.02.2014
comment
@ user3215358.. Да, это правильно.. Если вы включаете BufferQueue, подумайте о том, чтобы сделать это также для SurfaceTextureClient и SurfaceTexture - person Ganesh; 21.02.2014
comment
@Ganesh.. я добавил #defind LOG_NDEBUG 0 Но ничего не изменилось. Что еще я должен был сделать, чтобы увидеть проблему??? - person Arsen Davtyan; 21.02.2014
comment
@ user3215358.. Вы записали журналы в logcat? Если да, то можете ли вы поделиться тем же? - person Ganesh; 21.02.2014
comment
@Ganesh.. Вот вставка logcat, но я не вижу журналов о BufferQueue. И у меня есть вопрос, я делаю что-то не так в моем коде??? - person Arsen Davtyan; 21.02.2014
comment
@ Ганеш .. в queueBuffer второй параметр - NULL. buffer->graphicBuffer() это NULL. В чем может быть проблема? - person Arsen Davtyan; 25.02.2014
comment
@ user3215358 .. Извините, я не смог прочитать ваш код. Не могли бы вы поделиться своим кодом и logcat? могу быстро посмотреть - person Ganesh; 25.02.2014
comment
@Ganesh.. Теперь я использую это пример. Для рендеринга я могу использовать либо локальный рендеринг, либо собственный оконный рендеринг. что посоветуете? Это основная часть моего кода. Это средства визуализации. - person Arsen Davtyan; 25.02.2014