Tistory View

Android Develop/camera

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

God Dangchy 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
  • Profile photo pietoro 요즘 구글카메라 (개발자버젼)으로 카메라를 찍고 있는데요.. 언제가 부터..기존에 없던 옵션항목이 생기면서..
    설정 하나하나 찾는게 너무 일인듯 합니다.
    일단 사진 찍고 한40배 확대해서 보니 yv12쪽이 nv21쪽보다 빛번짐 덜하게 나오는군요..
    뭐랄까 찍고 나면 전체적으로 좀더 선명한 편입니다.
    이런정보들이 일반사이에선 찾기가 어려워..결국 계속 찍어보고.. 찾는 방법밖엔 없더라구요..
    갠적으로 지극히 일반인입니다.
    카메라 (제조사 앱)이아닌 개발자 버젼으로 쓰다보니. (거진4년째) 분명 설정여부에 따라..기본캠과 비교불가 수준의 퀄리티를 뽑아주는건 분한데.. 이게..cpu? 스냅드래곤, 엑시노스 이런특성도 심하게 타고.. 예를 들어.. 스냅드래곤을 쓰는 엘지모델경우는 특이한 에러현상이 없습니다.
    반면, 엑시노스 (노트10) 예를 들어 밝은빛(흰색부분,반사)등 부분이 노이즈라고 할까요? 그냥 하얗게 처리되는게 아니라.. 깨진다 랄까요? 무튼..
    확실히 퀄리티 처리는 엑시노스 모델이 (삼성)이 좋은데.. 그냥 에러없이 쓰기엔 엘지가 낫고..
    이게 결국 다 프로그램적인거라.. 옵션 항목(세부설정)이 수백이상이라.. 정말 어렵습니다..
    이점은..잘만지면..놀라운 퀄리티를 한번씩 보여주구요..
    무튼..어렵습니다..
    글 잘보고 갑니다..여담이 길어진점 양해바랍니다..
    jb2019@naver.com
    혹 조언 주실게 있으심 요쪽으로 부탁드립니다.
    2021.07.14 13:26
Reply Write