안드로이드에서 그리고 특히 MediaCodec
을 사용하여 카메라의 프레임 인코딩과 관련하여 그래픽 메모리 사용/흐름을 이해하려고합니다. 이를 위해서는 그래픽, OpenGL 및 안드로이드 용어/개념에 대해 잘 모르는 부분을 이해해야합니다. 나는 안드로이드 그래픽 아키텍처 자료, SO 질문 및 많은 소스를 읽었지 만 용어가 다른 맥락에서 다른 의미를 가지고있는 것 같기 때문에 여전히 혼란 스럽다.안드로이드 카메라 SurfaceTexture 및 MediaCodec 서피스 사용법 이해
나는 fadden의 사이트 here에서 CameraToMpegTest를 보았습니다. 내 구체적인 질문은 이 Camera::setPreviewTexture()
과 함께 작동하는 방법입니다. OpenGL 텍스처가 생성 된 다음 SurfaceTexture
인 안드로이드를 생성하는 데 사용되어 setPreviewTexture()
으로 전달 될 수 있습니다. 내 특정 질문 :
setPreviewTexture()
은 카메라에서 프레임이 이동하는 메모리 버퍼의 관점에서 실제로 무엇을합니까?- 내 이해에서 OpenGL 텍스처는 GPU가 액세스 할 수있는 메모리 덩어리입니다. Android에서는 올바른 사용 플래그가있는 gralloc을 사용하여 할당해야합니다.
SurfaceTexture
의 Android 설명에 따르면 "주어진 OpenGL 텍스처로 이미지 스트리밍"을 할 수 있습니다 : https://developer.android.com/reference/android/graphics/SurfaceTexture.html#SurfaceTexture(int).SurfaceTexture
은 OpenGL 텍스처 위에 무엇을합니까? MediaCodec::createInputSurface()
은 AndroidSurface
을 반환합니다. 내가 이해하기 때문에 안드로이드Surface
은 버퍼 대기열의 생산자 측을 나타내므로 다중 버퍼가 될 수 있습니다. API reference은 "서피스는 OpenGL ES와 같은 하드웨어 가속 API로 렌더링되어야합니다"라고 언급합니다. 카메라에서 캡처 한 프레임은SurfaceTexture
에서 인코더로 입력되는Surface
으로 어떻게 변환됩니까? CameraToMpegTest가Surface
을 사용하여EGLSurface
을 생성하지만 EGL에 대해 많이 알지 못해서이 부분을 얻지 못합니다.- 누군가 "렌더링"사용법을 명확히 할 수 있습니까? "표면에 렌더링", "화면에 렌더링"등과 같은 것들을 볼 수 있습니다.
편집 : 나는 시도하고 더 나은 Camera::setPreviewTexture()
의 내부 동작을 이해하고 좀 더 질문이 몇 가지 더 CameraService
에 SurfaceTexture
및 CameraClient::setPreviewTarget()
의 코드로 파고
- : mstorsjo의 답변에 업을 따르십시오.
SurfaceTexture
은BufferQueue
을 만들고CameraService
은IGraphicBufferProducer
을 플랫폼 카메라 HAL 구현에 전달합니다. 그런 다음 카메라 HAL은 grloc 사용 플래그를 적절히 설정하고 (예 :GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_NEVER | GRALLOC_USAGE_HW_TEXTURE
)이BufferQueue
에서 버퍼를 대기열에서 제외 할 수 있습니다. 따라서 카메라가 프레임을 캡쳐하는 버퍼는 grockoc 할당 된 버퍼이며 특별한 사용 플래그는GRALLOC_USAGE_HW_TEXTURE
입니다. GPU와 CPU가 동일한 메모리에 액세스 할 수 있도록 통합 메모리 아키텍처로 ARM 플랫폼에서 작업하므로GRALLOC_USAGE_HW_TEXTURE
플래그가 버퍼가 할당되는 방식에 어떤 영향을 미칩니 까? SurfaceTexture
의 OpenGL (ES) 부분은 주로GLConsumer
의 일부로 구현 된 것으로 보이며 마법은updateTexImage()
인 것으로 보입니다. OpenGL (ES) 텍스처에 추가 버퍼가 할당되어 있습니까? 아니면 사용할 수있는 카메라로 채워진 동일한 gralloc 버퍼입니까? 카메라 픽셀 데이터를 gralloc 버퍼에서 OpenGL (ES) 텍스처로 가져 오기 위해 여기에서 발생해야하는 메모리 복사가 있습니까?나는updateTexImage()
이 무엇을하는지 이해하지 못한다.
답변을 바탕으로 본래의 질문에 대한 후속 조치를 추가했습니다. –
그 추가 질문에 대해서는 거의 논평 할 수 없습니다. 원래 질문은 API가 공개 안드로이드 API 관점에서 (내가 아는 것) 무엇을하는지에 대한 것이 었습니다. 후자의 질문은 플랫폼 구현 방법과 세부 사항에 관한 것입니다 플랫폼 구현 자와 관련이 있습니다. – mstorsjo
마지막 질문에, 저는 SurfaceTexture가 실제로 하나 이상의 버퍼 세트가되어 소비자 (GL 컨텍스트)가 이전 프레임 렌더링을 유지하면서 생산자 (카메라)가 한 프레임을 쓸 수 있다고 예상합니다 . 'updateTexImage()'에서, 나는이 버퍼를 바꿀 것으로 예상한다. 그게 내 인상과 사용자의 관점에서 가정이지만, 나는 실제 구현을 모르겠습니다. – mstorsjo