2013-03-18 4 views
4

안드로이드 장치에서 프레임 버퍼를 캡처하고 있지만 정확한 해상도로 디코딩이 작동하지 않습니다.android에서 프레임 버퍼 너비를 찾는 방법은 무엇입니까?

ioctl -rl 28 /dev/graphics/fb0 17920 

이 명령 반환 :

반환 버피 : F0 00 00 00 40 01 00 00 F0 00 00 00

나는 내가 사용 BBP와 화면 resoution를 얻을 수 있습니다 발견 80 02 00 00 00 00 00 00 00 00 00

littl 전자 - 엔디안 포맷 제가 가지고

  • 마지막 4 바이트 (20)는 BBP 32의 수이다.
  • 처음 4 바이트
  • 은을 사용하여 I는 FB를 디코딩하려 스크린 높이 0x0140 = 320

(갤럭시 5) 스크린 폭의 0xF0 = 240

  • 바이트 5~8이다 folowing 명령을

    ./ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 240x320 -i fb0 -f image2 -vcodec png image%d.png 
    

    그리고 난이 경고를 가지고 :

    잘못된 버퍼 크기, 패킷 크기 40960 < 예상 길이 307200 오류 동안 스트림 # 0 디코딩 : 0 : 유효하지 않은 인수

    이 두 이미지 :

    enter image description here enter image description here

    내 원시 파일 655.360 바이트를 갖지만이 값을 사용하여 예상 값은 614.400 바이트입니다.

    ,363,210

    이는 파일 크기 = XRES * yres *이 BPP/8 * numberOfFrames가

    이는 파일 크기 = 240 * 320 * 8분의 32 * 2 (로이드 사용 두 프레임 버퍼) = 놀랍게도 들어 614.400

    내가 변경 너비가 ffmpeg에서 256으로 655.360 바이트와 일치하고 일종의 (일종의, 오른쪽에 16 개의 엑스트라 px가 있습니다! 나는 다음과 같은 이미지를 가지고 :

    enter image description here enter image description here

    그래서 내 질문에 내 화면 해상도가 240 어떻게 발견 다른 해상도에 대해이 매직 넘버를하는 경우, 내가 256 폭을 사용해야하는 이유입니다.

  • +0

    내 LG400 (Android 2.3.6)에서 동일한 문제가 발견되었습니다. 이상한 점은 모니터 도구 (android-sdk/tools/monitor)가 좋은 256px 스크린 샷을 찍는 것입니다. 따라서이 모니터 도구는 실제 프레임 버퍼 너비를 결정하는 방법을 알고 있지만 여전히 방법을 찾지 못했습니다. – Giacomo

    답변

    6

    줄의 크기를 계산하려면 line_length을 사용해야합니다.

    +-------------------------+----+ 
    |       | | 
    |       | | 
    |<-------- XRES --------->| | = Xres is display resolution 
    |       | | 
    |       | | 
    |<------- LINE LENGTH -------->| = Memory Size per line 
    |       | | 
    |       | | 
    +-------------------------+----+ 
            ^ ^
             |  | 
        display on screen --+  +----> This is stride 
    

    올바른 패딩 "스트라이드"(- 폭 화소 스트라이드 (line_length))라고한다. 디스플레이 해상도는 8

    의 곱하지 않은 경우 대부분의 장치는 그래서 공식은 프레임 버퍼에서이 걸음을했다 :

    이는 파일 크기 = line_length * yres * numberOfFrames

    하지 마십시오 line_length가 메모리 크기 (픽셀 크기 아님)이므로 bpp/8으로 곱하십시오.

    입출력 제어 -rl (50)는/dev/그래픽/FB0 :이 같은 -보다는 FBIOGET_VSCREENINFO (17,922 0x4600) -

    당신은 FBIOGET_FSCREENINFO (17,922 0x4602)를 사용한다 line_length를 가져 오지하려면 17,922

    이 같은

    내 갤럭시 넥서스 반환 :

    return buf: 6f 6d 61 70 66 62 00 00 00 00 00 00 00 00 00 00 00 00 a0 ac 00 00 00 
    01 00 00 00 00 00 00 00 00 02 00 00 00 01 00 01 00 00 00 00 00 80 0b 00 00 00 00 
                       ^_________^ 
    

    내 Galaxy Nexus의 line_length : 2944 (0xb80)입니다.

    관련 문제