Tistory View

Android Develop/camera

NV21을 쓸까... YV12를 쓸까....

What should I do? 2017. 10. 30. 00:26
반응형

카메라api를 이용하여 preview를 받아오는 중에..


NV21은 모든 기기에서 지원하고, setPreviewFormat을 쓰지 않을 경우에 NV21이 기본 값이다.


하지만 필자가 가지고 있는 기기들을 살펴본 결과 YV12형식을 대부분 지원(+1)하였다.


NV21은 V와 U값이 1byte씩 교차하면서 저장되어 있는 데 반해, YV12는 전체V(V-Plane)와 전체U(U-Plane)이 따로 저장이 된다.


필자는 Preview를 OpenGLES에 Texture를 만들어야 했기 때문에, NV21보다는 YV12를 사용하기로 했다.

(물론 NV21를 Y와U와 V로 분리하는 코드를 넣기로 했다. )


 shader에서 YUV각각의 값을 RGB로 변환하는 코드를 두고, texture의 YUV위치를 vertext shader에서 계산하면 

더 효율적으로 동작할 것으로 생각했다.


각각 3개의 YUV를 따로 texture를 만들 수도 있겠지만, 필자는 다음의 모양으로 만들었다.



YY YY YY YY

YY YY YY YY

YY YY YY YY

YY YY YY YY

UU UU VV VV

UU UU VV VV



NV21이든 YV12든 Y의 위치는 onPreviewFrame(?) 으로 넘어온 값의 처음에 위치하며, 

위 Texture에서 U와 V를 glTexSubImage2D를 이용하면 YV12가 더 효율적이었다.


NV21의 경우 Texture를 만들기 위해 U와 V를 분리하는 코드가 미친듯이 돌면서 속도를 떨어드리지만 YV12는 그런 문제없이 바로 쓸 수 있다는 것이다.

(

물론 YV12에서도 16byte-align문제로 분리하는 코드가 필요할 때가 있지만, 카메라의 preview형식의 대부분은 align이 잘 맞게 가져와 이런 문제로 속도 저하는 거의 존재하지 않았다. 실제 cpu를 거의 안 쓰는 방식이라 frame 저하도 없었다.

)


아싸 좋아라하는 데.... 문제는 NV21로 동작시키면, 카메라가 빠른 속도로 이미지를 가져다 줬지만, YV12는 preview의 속도가 현저히 떨어지는 문제가 발생했다. 모든 기기는 아니었지만, 대부분의 기기에서 preview를 가져오는 속도는 NV21이 YV12에 비해 훨씬 빨랐다.





좀 빠른 기기에서 테스트를 해본결과는 좀 달랐다.

YV12와 NV21의 속도 차이가 나지 않았다. 이 경우 YV12를 사용하는 것이 더 이득이다.


결론은


느린 기기를 타겟으로 한다면 -> NV21

고사양의 기기를 타겟으로 한다면 -> YV12


필자의 경우 테스트기기 중에 galaxy S2[gingerbread]가 있다..

이 녀석에서도 돌아하게 하고 픈 쓸 데 없는 욕심이 있어서.. NV21를 사용하고 있다.



확실하지는 않지만 NV21를 사용하면 stride를 고민해야 하는 문제는 없었다. 

또한, Y는 텍스쳐를 만들 경우 복사없이 그냥 glTexSubImage2D로 전송해주면 된다.(GL_LUMINANCE로)

U와 V를 분리하여 이 것도 glTexSubImage2D로 전송해주면 된다.(GL_LUMINANCE로)






+1 : YV12는 API12(허니콤)부터 무조건 지원이 된다.

반응형
Replies
NOTICE
RECENT ARTICLES
RECENT REPLIES
Total
Today
Yesterday
LINK
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Article Box