LINUX.ORG.RU

Соотнести FourCC и форматы mplayer.

 ,


0

1

Есть камера, которая может выдавать в следующих форматах:

# v4l2-ctl --list-formats -d /dev/video3
        [0]: 'NV16' (Y/CbCr 4:2:2)
        [1]: 'NV61' (Y/CrCb 4:2:2)
        [2]: 'NV12' (Y/CbCr 4:2:0)
        [3]: 'NV21' (Y/CrCb 4:2:0)
        [4]: 'YUYV' (YUYV 4:2:2)
        [5]: 'YVYU' (YVYU 4:2:2)
        [6]: 'UYVY' (UYVY 4:2:2)
        [7]: 'VYUY' (VYUY 4:2:2)
        [8]: 'RGB3' (24-bit RGB 8-8-8)
        [9]: 'RGBP' (16-bit RGB 5-6-5)
        [10]: 'BGRH' (18-bit BGRX 6-6-6-14)
        [11]: 'RGGB' (8-bit Bayer RGRG/GBGB)
        [12]: 'GRBG' (8-bit Bayer GRGR/BGBG)
        [13]: 'GBRG' (8-bit Bayer GBGB/RGRG)
        [14]: 'BA81' (8-bit Bayer BGBG/GRGR)
        [15]: 'RG10' (10-bit Bayer RGRG/GBGB)
        [16]: 'BA10' (10-bit Bayer GRGR/BGBG)
        [17]: 'GB10' (10-bit Bayer GBGB/RGRG)
        [18]: 'BG10' (10-bit Bayer BGBG/GRGR)
        [19]: 'RG12' (12-bit Bayer RGRG/GBGB)
        [20]: 'BA12' (12-bit Bayer GRGR/BGBG)
        [21]: 'GB12' (12-bit Bayer GBGB/RGRG)
        [22]: 'BG12' (12-bit Bayer BGBG/GRGR)
        [23]: 'BYR2' (16-bit Bayer BGBG/GRGR)
        [24]: 'Y16 ' (16-bit Greyscale)
        [25]: 'GREY' (8-bit Greyscale)
        [26]: 'EBD8' (Embedded data 8-bit, compressed)
        [27]: 'SPD6' (Shield pix data 16-bit, compressed)

Есть mplayer, который умеет в такие форматы:

$ mplayer -rawvideo format=help
Available formats: 444p16le 444p16be 444p14le 444p14be 444p12le 444p12be 444p10le 444p10be 444p9le 444p9be 422p16le 422p16be 422p14le 422p14be 422p12le 422p12be 422p10le 422p10be 422p9le 422p9be 440p12le 440p12be 440p10le 440p10be 420p16le 420p16be 420p14le 420p14be 420p12le 420p12be 420p10le 420p10be 420p9le 420p9be 444p16 422p16 422p10 420p16 420p10 420p9 444a 422a 420a 444p 422p 411p 440p yuy2 yvyu uyvy yvu9 if09 yv12 i420 iyuv clpl hm12 y800 y8 y8a y16be y16le nv12 nv21 bgr48le bgr48be bgr24 bgr32 bgr16 bgr15 bgr12 bgr8 bgr4 bg4b bgr1 rgb64be rgb64le rgb48be rgb48le rgb48ne rgb24 rgb32 rgb16 rgb15 rgb12 rgb8 rgb4 rg4b rgb1 rgba argb bgra abgr xyz12be xyz12le gbr14pbe gbr14ple gbr12pbe gbr12ple gbr10pbe gbr10ple gbr24p mjpeg mjpg

Как они друг с другом соотносятся?..

Я не совсем понял, ты предлагаешь нам поиграть в игру «найди похожие буковки в нумерованном списке и в выводе в одну строку?»

Возможно, «[8]: ‘RGB3’ (24-bit RGB 8-8-8)» соответствует «rgb24».

Может как-то иначе вопрос задать? Тогда знающие люди может и подтянутся.

VIT ★★
()
Ответ на: комментарий от VIT

Возможно, «[8]: ‘RGB3’ (24-bit RGB 8-8-8)» соответствует «rgb24».

Казалось бы да… Получаю изображение с камеры командой:

#!/bin/sh

W=1920
H=1080
P=RGB3
C=5

v4l2-ctl\
        --set-fmt-video=width=$W,height=$H,pixelformat=$P\
        --stream-mmap=3\
        --stream-skip=3\
        --stream-to=image3.rgb3
        --stream-count=$C\
        --stream-poll -d $1

Потом смотрю кадры:

mplayer image.rgb3 -loop 10 -demuxer rawvideo -fps 1 -rawvideo w=1920:h=1080:format=rgb24

И получается фигня.

Ещё и mplayer ошибку сыпет:

Frame too small! (6220800<8294400) Wrong format?
V:   2.0  35/ 35  0%  0%  0.0% 0 0 

С форматами yv12 и nv12 (и рядом других) ошибки не сыпет, но тоже показывает что-то сомнительное.

Jullyfish
() автор топика
Ответ на: комментарий от VIT

Камера, безусловно, рабочая.

Камера подключена к SoC с моей прошивкой. Есть та же SoC с китайской прошивкой, которая транслирует в интернет и изображение нормально показывает. Так что камера работает.

Единственное, проверял я на это прошлой неделе, а с китайской прошивкой сейчас SoC у меня нет. Так что не исключена вероятность, что действительно мог повредить.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

То есть камера рабочая, но в файл может быть записано что угодно. Ну тут два варианта, или, условно, rgb24 в mplayer - не rgb24, или надо определять, что именно выдает SoC. Посмотреть результат съемки «другим способом» есть возможность?

VIT ★★
()
Ответ на: комментарий от Jullyfish

Изображение я получаю с SoC с помощью v4l2-ctl, а просматриваю уже на другом устройстве.

Попробуй следующий алгоритм:

  1. Получить список кодеков с камеры:
v4l2-ctl --device /dev/video0 --list-formats-ext

Ответ может быть вот таким:

    [0]: 'YUYV' (YUYV 4:2:2)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 3840x2160
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
    [1]: 'MJPG' (Motion-JPEG, compressed)
        Size: Discrete 1920x1080
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 3840x2160
            Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 1280x720
            Interval: Discrete 0.033s (30.000 fps)
...
  1. Захватываешь первый кадр:
v4l2-ctl \
	--device /dev/video0 \
	--stream-mmap \
	--stream-count=1 \
	--set-fmt-video=width=1920,height=1080,pixelformat=YUYV \
	--stream-to=output.yuv

  1. Смотришь на результат:
mpv \
	--demuxer=rawvideo \
	--demuxer-rawvideo-mp-format=yuyv422 \
	--demuxer-rawvideo-w=1920 \
	--demuxer-rawvideo-h=1080 \
	--demuxer-rawvideo-fps=23.98 \
	output.yuv

Чтоб окошко mpv не закрылось сразу добавь опцию keep-open=yes.

Если у тебя первый формат в выводе MJPG, то pixelformat в захвате надо выставить соответственно и в итоге ты должен получить сразу готовый жпег.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Попробуй следующий алгоритм

Выполняю.

  1. Получить список кодеков с камеры:
# v4l2-ctl --device /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture Multiplanar

        [0]: 'NV16' (Y/CbCr 4:2:2)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [1]: 'NV61' (Y/CrCb 4:2:2)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [2]: 'NV12' (Y/CbCr 4:2:0)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [3]: 'NV21' (Y/CrCb 4:2:0)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [4]: 'YUYV' (YUYV 4:2:2)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [5]: 'YVYU' (YVYU 4:2:2)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [6]: 'UYVY' (UYVY 4:2:2)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [7]: 'VYUY' (VYUY 4:2:2)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [8]: 'RGB3' (24-bit RGB 8-8-8)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [9]: 'RGBP' (16-bit RGB 5-6-5)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [10]: 'BGRH' (18-bit BGRX 6-6-6-14)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [11]: 'RGGB' (8-bit Bayer RGRG/GBGB)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [12]: 'GRBG' (8-bit Bayer GRGR/BGBG)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [13]: 'GBRG' (8-bit Bayer GBGB/RGRG)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [14]: 'BA81' (8-bit Bayer BGBG/GRGR)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [15]: 'RG10' (10-bit Bayer RGRG/GBGB)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [16]: 'BA10' (10-bit Bayer GRGR/BGBG)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [17]: 'GB10' (10-bit Bayer GBGB/RGRG)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [18]: 'BG10' (10-bit Bayer BGBG/GRGR)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [19]: 'RG12' (12-bit Bayer RGRG/GBGB)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [20]: 'BA12' (12-bit Bayer GRGR/BGBG)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [21]: 'GB12' (12-bit Bayer GBGB/RGRG)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [22]: 'BG12' (12-bit Bayer BGBG/GRGR)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [23]: 'BYR2' (16-bit Bayer BGBG/GRGR)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [24]: 'Y16 ' (16-bit Greyscale)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [25]: 'GREY' (8-bit Greyscale)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [26]: 'EBD8' (Embedded data 8-bit, compressed)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
        [27]: 'SPD6' (Shield pix data 16-bit, compressed)
                Size: Stepwise 64x64 - 1948x1110 with step 8/8
  1. Захватываешь первый кадр

Сделал, но чуть изменил разрешение:

W=1948
H=1110

v4l2-ctl\
        --set-fmt-video=width=$W,height=$H,pixelformat=YUYV\
        --verbose\
        --stream-mmap\
        --stream-to=/tmp/nv12.bin\
        --stream-count=1\
        --stream-poll -d $1

  1. Смотришь на результат

Поменял только разрешение на 1948x1110, получилась опять фигня.

Jullyfish
() автор топика
Ответ на: комментарий от LamerOk

Согласно твоему выхлопу сработать должен

Почему вы так думаете?

сработать должен

Увы, получилось такое.

Вообще, лучшее что получалось, кажется с nv12.

Выше в переписке ещё с RGB3 вариант.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Почему вы так думаете?

Потому что это так работает у меня.

Увы, получилось такое.

Ты можешь выложить вместо жипега сам оригинальный файл и команду, который его получил?

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

оригинальный файл

Хотел в base64 сюда прикрепить, но как-то слишком большой получается. Так что так.

команду, который его получил

#!/bin/sh

W=1948
H=1110
P=NV16
C=1

v4l2-ctl\
        --set-fmt-video=width=$W,height=$H,pixelformat=$P\
        --verbose\
        --stream-mmap=3\
        --stream-to=/tmp/nv12.bin\
        --stream-count=$C\
        --stream-poll -d /dev/video0
Jullyfish
() автор топика
Ответ на: комментарий от LamerOk

У меня стоит флажок --verbose, меня немного смущает размер файла и Bytes per line.

VIDIOC_QUERYCAP: ok
VIDIOC_G_FMT: ok
VIDIOC_S_FMT: ok
Format Video Capture Multiplanar:
        Width/Height      : 640/480
        Pixel Format      : 'NV16' (Y/CbCr 4:2:2)
        Field             : None
        Number of planes  : 1
        Flags             : 
        Colorspace        : Default
        Transfer Function : Default
        YCbCr/HSV Encoding: Default
        Quantization      : Default
        Plane 0           :
           Bytes per Line : 1920
           Size Image     : 4147200
Jullyfish
() автор топика
Ответ на: комментарий от LamerOk

Самые чёткие (открываются в правильно разрешении, самая понятная картинка) кадры в NV12 получаются.

Вот снято 5 кадров. 1920x1080.

В интернете у кого-то с OBS тоже получалось зелёное изображение, там решили проблему выставлением параметра соответствующего colormatrix для mpv. Я поигрался, как-то не помогло (но прикольные фиолетовые и бирюзовые картинки получил).

Jullyfish
() автор топика
Ответ на: комментарий от LamerOk

У меня получилось получить более менее адекватные изображения с цветопередачей RGGB. При том, как показали эксперементы, v4l2-ctl как-то словно игнорирует параметры ширины и высоты --set-fmt-video=width=$W,height=$H. Так что разрешение как-то высчитывается скорее из Bytes per Line и Size Image.

Jullyfish
() автор топика