2014-02-20 4 views
0

Hf를 Stagefright 라이브러리와 함께 사용하여 h264 비디오를 디코딩하려고합니다.H264 HW는 스테이지 플라이트 라이브러리를 사용하여 안드로이드에서 디코딩을 가속화했습니다.

나는 here에서 예를 사용했다. 임 MedaBuffer에서 디코딩 된 데이터를 받고 있습니다. 렌더링을 위해 MediaBuffer->data() 나는 AwesomePlayer.cpp에서 AwesomeLocalRenderer을 시도했습니다.

하지만 화면의 영상이 여기

왜곡 된 원고의 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 이상에서 작업하고 싶습니다. 그게 왜 내가 안드로이드 NDK를 사용하고 있습니다. –

답변

0

HW 가속화 된 디코더를 사용하는 경우 구성 요소의 출력 포트에 대한 할당은 Native Window을 기반으로합니다. 즉, 출력 버퍼는 Stagefright 프레임 워크에 의해 전달 된 기본적으로 gralloc 핸들입니다. (Ref : OMXCodec::allocateOutputBuffersFromNativeWindow). 따라서 반환되는 MediaBuffer은 일반 YUV 버퍼로 해석되어서는 안됩니다.

AwesomeLocalRenderer의 경우 여기에 표시된대로 mTarget->render을 호출하면 프레임 워크에서 소프트웨어 색상 변환을 수행합니다. 코드 흐름을 추적하면 MediaBuffer 내용이 YUV 버퍼로 직접 해석됩니다.

HW 가속 코덱의 경우 AwesomeNativeWindowRenderer을 사용해야합니다. AwesomeLocalRenderer을 고용하기위한 특별한 조건이있는 경우 같은 것을 강조 표시하십시오. 나는이 반응을 적절하게 다듬을 수있다.

P.S : 디버그 목적으로 YYV 데이터를 덤프하고 분석하는 방법을 캡처 한 this question을 참조 할 수도 있습니다.

+0

답장을 보내 주셔서 대단히 감사드립니다. 처음 AwesomeNativeWindowRenderer 시도했을 때 네이티브 코드가 충돌합니다. 여기 내가 어떻게 사용 했나. mVideoRenderer = new AwesomeNativeWindowRenderer (mNativeWindow, 0); mVideoRenderer-> render (mVideoBuffer); // while 루프. 이것은 백 트레이스입니다. # 00 PC 00000000 # 01 PC 00,005,678 mylib.so (AwesomeNativeWindowRenderer가 :: 렌더링 (로이드 매체 버퍼 :: *) + 260) 은 addr2line 메신저를 사용하는 경우,이 라인이 에러 status_t ERR = mNativeWindow- > queueBuffer (mNativeWindow.get(), buffer-> graphicBuffer(). get(), -1); 아마도 -1의 오류입니다. –

+0

@ user3215358 .. 코드에서 어떻게'mNativeWindow'를 만들었습니까? -1은'AOSP' 코드에 존재하므로 의심하지 않을 것입니다. 코드를 공유하여 검토 할 수 있습니까? 'mNativeWindow'는 내부적으로 'SurfaceTexture'가 붙어있는'Surface' 또는'SurfaceTextureClient'를 가리켜 야합니다. 내 의심의 여지가'mNativeWindow' 제대로 채워지지 않을 수 있습니다. – Ganesh

+0

@ 가네시 .. 임씨는 SurfaceView에서 mNativeWindow를 얻고 있습니다. 여기에 그것을 얻는 방법은 코드입니다 [link] (http://pastebin.com/ZefHRW2z). –