Git Product home page Git Product logo

showmewebcam's Introduction

Show-me webcam: An open source, trustable and high quality webcam

Build/Release License Last Release Total Downloads Discord Chat

This firmware transforms your Raspberry Pi into a high quality webcam. It works reliably, boots quickly, and gets out of your way.

Show-me webcam is proudly powered by peterbay's uvc-gadget.

What you need

  • Raspberry Pi Zero with or without Wifi
  • Raspberry Pi Zero Camera Adapter/Ribbon (The one that comes with the camera may not fit)
  • Raspberry Pi Camera or Raspberry Pi High-Quality Camera
  • A compatible lens if you use the HQ Camera sensor
  • Micro SD card (at least 64MB)
  • A case or mounting plate (optional)

What works and what doesn't

  • The camera is known to work on Linux, Windows 10 and Mac OS
  • The camera is known to work with Zoom, Teams, Skype, Jitsi, Firefox and Chrome
  • Here's a compatibility matrix as far as we could test. Let us know if you had the chance to test other variants:
Raspberry Pi \ Camera version v1 5MP v2 8MP High Quality 12MP
Pi Zero v1.3 (without Wifi)
Pi Zero W (with Wifi)
Pi 4+

Instructions

Stable releases

We release new versions of this firmware regularly at the release tab: https://github.com/showmewebcam/showmewebcam/releases

LED indicator

After booting, the built-in LED will blink three times quickly to show you it's ready.

When the camera is in use the LED will be lit. In addition, GPIO 21 pin is set to HIGH, so an external LED or another payload can be triggered with this pin to indicate that the camera is in use.

Debugging

For debugging, a 115200 baud serial interface is provided as a ttyACM device:

  • Use screen, minicom, picocom or the included smwc-expect script to connect to it
  • Use username: root, password root

Also, there is a serial interface on the 40-pin header: https://pinout.xyz/pinout/uart

Linux example:

$ ls -l /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 sep 25 14:03 /dev/ttyACM0
$ sudo screen /dev/ttyACM0 115200

Mac OS example:

$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel    9,  18 Dec  7 13:14 /dev/tty.usbmodem13103
$ screen /dev/tty.usbmodem13103 115200

If the terminal is blank try pressing enter to see the login prompt. To exit the session, use Ctrl-A \ (screen) or Ctrl-A X (minicom & picocom).

Warning: This serial debug interface is automatically enabled and is controlled by the file called enable-serial-debug in the /boot folder. This is a potential security issue. For now, you should strongly consider disabling this feature by removing the file after you have finished customizing the webcam.

My camera doesn't show up on my host computer! What to do?

From version 1.80, on Linux, you can see what happens by watching dmesg before you plug in the webcam:

$ sudo dmesg -w

If you only see the ttyACM device show up, but not the webcam, it's likely you have not plugged in the camera cable correctly, or the camera cable has gone bad.

If you see nothing, maybe your USB cable is bad, or you have plugged in the cable to the wrong port.

Customizing camera settings

Automatic

Log in to the debug interface and execute:

/usr/bin/camera-ctl

This tool will allow you to show and tweak all available camera parameters. Additionally it will save your settings to /boot/camera.txt if you choose to do so. This will handle remounting /boot automatically.

Manual

Overriding camera settings temporarily

Log in to the debug interface. Then list all tweakable parameters:

/usr/bin/v4l2-ctl -L | less

Then you can apply parameters on the fly, e.g.

/usr/bin/v4l2-ctl -c auto_exposure_bias=15
/usr/bin/v4l2-ctl -c contrast=3

Overriding camera settings permanently

Mount the SD card on your computer, edit a file called camera.txt in /boot and put all parameters you want overridden, e.g:

# Tweak the auto exposure bias
auto_exposure_bias=15
# Tweak the contrast
contrast=3

You can edit camera.txt on-target by remounting /boot read-write:

mount -o remount,rw /boot

Overriding the controls available to the host computer

Since version 1.80 we try to expose as many controls as possible via the UVC standard, which are then translated back to the controls that are available on your specific camera module. Some host operating systems may be confused by controls that are advertised via USB, but don't turn out to work, due to not being available for your specific camera module.

You can therefore customize the controls advertised to the computer via the USB device descriptor. Warning: This is an advanced user feature only. You should probably consult the UVC controls bitmap documentation on GitHub.

You can add the parameters to cmdline.txt on the boot volume as follows:

usb_f_uvc.camera_terminal_controls=0,0,0 usb_f_uvc.processing_unit_controls=0,0

The above example disables all controls and should thus be safe. The parameters directly correspond to the bmControls bitfields in the descriptor. Please, again, read the documentation linked above.

An example for enabling all the available controls for the 8 Mpixel (v2) camera for the Raspberry Pi 4B is given below:

usb_f_uvc.camera_terminal_controls=10,0,0 usb_f_uvc.processing_unit_controls=219,4

Configure available camera resolutions and streaming format

The camera advertises the available resolutions and streaming formats to the connected host PC. Usually the best suitable resolution is chosen. The available resolutions can be reduced to enforce a specific setting.

By default the camera uses the Motion JPEG codec to stream the video signal. For the host PC it offers several video resolutions up to 1080p HD video to choose from.

These settings can be overwritten by copying the file video_formats.txt into the /boot folder and editing it.

cp /etc/video_formats.txt /boot

In this file one line corresponds to one video resolution and streaming format. Until now, only mjpeg and uncompressed video are supported. If you want to make certain resolutions unavailable, comment them out by prepending a # to that line or removing them altogether.

Please note that you have to reboot your piwebcam (power cycle it) for changes to take effect.

Development & building

Clone or download this repository. Then inside it:

  • Clone the repository with submodules:
    • git clone --recurse-submodules https://github.com/showmewebcam/showmewebcam.git
  • Run build command:
    • ./build-showmewebcam.sh raspberrypi0w to build Raspberry Pi Zero W (with Wifi) image.
    • ./build-showmewebcam.sh raspberrypi0 to build Raspberry Pi Zero (without Wifi) image.
    • ./build-showmewebcam.sh raspberrypi4 to build Raspberry Pi 4 image.
  • The resulting image sdcard.img will be in the output/$BOARDNAME/images folder
  • If you add a camera.txt file to the root of this repository, the contents will be automatically added to /boot/camera.txt

Note: If you want to use external Buildroot directory you need to set the Buildroot path manually, e.g. BUILDROOT_DIR=../buildroot ./build-showmewebcam.sh raspberrypi0

Credits

showmewebcam's People

Contributors

antoneliasson avatar arongergely avatar calebccff avatar channelbeta avatar dgsiegel avatar emiellec avatar friissoren avatar gdgood avatar htruong avatar leonti avatar mspacek avatar msurguy avatar sftim avatar towolf avatar tuyenld avatar volfyd avatar westfeld avatar wherget avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

showmewebcam's Issues

Low resolution with Camera module V2

I installed the OS on my Raspberry Pi Zero W with Raspberry Camera module V2. The resolution II got when I open the camera settings is 640x360. I know the camera module V2 is capable of more than that. How to change the resolution?

Missing V4L2 settings

Compared to MMAL/raspistill/raspivid, v4l2-ctl is missing the following settings:

Exposure mode (scene_mode)

Only 3 values available:

  • 0: None
  • 8: Night
  • 11: Sports

Whereas raspistill offers:

  • auto: use automatic exposure mode
  • night: select setting for night shooting
  • nightpreview:
  • backlight: select setting for backlit subject
  • spotlight:
  • sports: select setting for sports (fast shutter etc.)
  • snow: select setting optimised for snowy scenery
  • beach: select setting optimised for beach
  • verylong: select setting for long exposures
  • fixedfps: constrain fps to a fixed value
  • antishake: antishake mode
  • fireworks: select setting optimised for fireworks

Color effects (color_effects)

The following effects don't work:

  • 4: Emboss
  • 5: Sketch
  • 6: Sky Blue (pastel)
  • 7: Grass Green (watercolour)
  • 9: Vivid (saturation)
  • 11: Art Freeze (hatch)
  • 12: Silhouette

The following effects are missing:

  • posterise: posterise the image
  • whiteboard: whiteboard effect
  • blackboard: blackboard effect
  • denoise: denoise the image
  • hatch: hatch sketch effect
  • gpen: graphite sketch effect
  • watercolour: watercolour effect
  • blur: blur the image

Colour effect (color_effects_cbcr)

Does not seem to have any effect

JPEG Quality (compression_quality)

Does not have any effect on MJPEG stream

Video stabilisation (image_stabilization)

Does not seem to have any effect

Metering (exposure_metering_mode)

Matrix metering is missing

Exposure mode (auto_exposure)

The following setting are missing:

  • night: select setting for night shooting
  • nightpreview:
  • backlight: select setting for backlit subject
  • spotlight:
  • sports: select setting for sports (fast shutter etc.)
  • snow: select setting optimised for snowy scenery
  • beach: select setting optimised for beach
  • verylong: select setting for long exposures
  • fixedfps: constrain fps to a fixed value
  • antishake: antishake mode
  • fireworks: select setting optimised for fireworks

Shutter speed (exposure_time_absolute)

Doesn't seem to have any effect above 800

Dynamic range compression

Does not exist in V4L2

Analog gain

Does not exist in V4L2

Digital gain

Does not exist in V4L2

Sensor mode

Does not exist in V4L2. Could be interesting for higher resolutions than 1080p with 2x2 binning

Other

I left out IMHO not relevant parameters and settings

Issue with Raspberry Pi 0 w/o wifi

After following the installation steps, the usb gadget is not returning images. 5MP image sensor

Built with buildroot-2020.02.9:

BUILDROOT_DIR=~/build/buildroot-2020.02.9 ./build-showmewebcam.sh raspberrypi0
$ lsusb
Bus 001 Device 012: ID 1d6b:0104 Linux Foundation Multifunction Composite Gadget

When the Pi0 is attached to Ubuntu, here's the dmesg output:

[ 4584.005208] usb 1-1.5.4: new high-speed USB device number 11 using dwc_otg
[ 4584.393219] usb 1-1.5.4: device descriptor read/64, error -71
[ 4587.605259] usb 1-1.5.4: device descriptor read/64, error -71
[ 4587.893256] usb 1-1.5.4: new high-speed USB device number 12 using dwc_otg
[ 4588.094977] usb 1-1.5.4: New USB device found, idVendor=1d6b, idProduct=0104, bcdDevice= 1.00
[ 4588.095003] usb 1-1.5.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 4588.095022] usb 1-1.5.4: Product: Piwebcam
[ 4588.095040] usb 1-1.5.4: Manufacturer: Show-me Webcam Project
[ 4588.095058] usb 1-1.5.4: SerialNumber: 100000000dxxxxdb
[ 4588.097808] uvcvideo: Found UVC 1.00 device Piwebcam (1d6b:0104)
[ 4588.102131] uvcvideo: Failed to query (GET_INFO) UVC control 6 on unit 2: -32 (exp. 1).
[ 4588.111439] uvcvideo: Failed to query (GET_INFO) UVC control 9 on unit 2: -32 (exp. 1).
[ 4588.114764] uvcvideo: Failed to query (GET_INFO) UVC control 10 on unit 2: -32 (exp. 1).
[ 4588.119585] uvcvideo: Failed to query (GET_INFO) UVC control 4 on unit 2: -32 (exp. 1).
[ 4588.130254] input: Piwebcam: UVC Camera as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.4/1-1.5.4:2.0/input/input3

Trying to capture a video frame results in a pitch black image:

fswebcam -d /dev/video0 -v --jpeg 95 -r 2592x1944 -save test.jpg -F 1
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
src_v4l2_get_capability,87: /dev/video0 information:
src_v4l2_get_capability,88: cap.driver: "uvcvideo"
src_v4l2_get_capability,89: cap.card: "Piwebcam: UVC Camera"
src_v4l2_get_capability,90: cap.bus_info: "usb-3f980000.usb-1.5.4"
src_v4l2_get_capability,91: cap.capabilities=0x84A00001
src_v4l2_get_capability,92: - VIDEO_CAPTURE
src_v4l2_get_capability,103: - STREAMING
No input was specified, using the first.
src_v4l2_set_input,181: /dev/video0: Input 0 information:
src_v4l2_set_input,182: name = "Camera 1"
src_v4l2_set_input,183: type = 00000002
src_v4l2_set_input,185: - CAMERA
src_v4l2_set_input,186: audioset = 00000000
src_v4l2_set_input,187: tuner = 00000000
src_v4l2_set_input,188: status = 00000000
src_v4l2_set_pix_format,520: Device offers the following V4L2 pixel formats:
src_v4l2_set_pix_format,533: 0: [0x47504A4D] 'MJPG' (Motion-JPEG)
Using palette MJPEG
Adjusting resolution from 2592x1944 to 1920x1080.
src_v4l2_set_mmap,672: mmap information:
src_v4l2_set_mmap,673: frames=4
src_v4l2_set_mmap,722: 0 length=2073600
src_v4l2_set_mmap,722: 1 length=2073600
src_v4l2_set_mmap,722: 2 length=2073600
src_v4l2_set_mmap,722: 3 length=2073600
--- Capturing frame...
verify_jpeg_dht,94: Inserting DHT segment into JPEG frame.
GD Warning: gd-jpeg: JPEG library reports unrecoverable error: Not a JPEG file: starts with 0x0b 0x8aCaptured frame in 0.00 seconds.
--- Processing captured image...
Setting output format to JPEG, quality 95
Writing JPEG image to 'test.jpg'.

Any ideas?
There was an irq-related "[Firmware bug]" message in the Pi0's console output with latest master (I'm assuming 1.80) so I downgraded to v1.70, but still no joy.

Webcam settings

Hi, thx by this great project : )

I'm using this with a pi zero w and an old 5mp pi cam.

With ShowMeWebcam the video is dark, when I test the cam with RaspOS I can see the picture ok.

I tried to use a Windows app to set it, but I only can adjust brightness. The default value, 55, is dark, but 80 is all white.
Other settings, like contrast, is not enabled.

imagen

It's possible to enable other settings?

[bug] black on linux

Video is shown my MacBook, but on my Linux machine i get only a black videostream. I use V1.21.

video_setup
setup

Not recognized out of the box as webcam on Windows 10

Figured I'd open this as a quality of life issue, but on my Windows 10 box the pi cam was not initially treated as a webcam. In the device manager it showed up as a "Linux USB Ethernet/RNDIS Gadget" but with an initialize error. I managed to fix it by choosing "Update drivers" and forcing Windows to use USB camera drivers (and have confirmed the camera working now!), but it would've been nice to not need this step.

Without knowing a whole lot, I suspect an issue in the USB descriptor data. I used a tool to capture a dump of the USB descriptor data, but I don't know quite enough about device descriptors to know what might be causing Windows to not treat it as a webcam. I've attached the dump from the utility, perhaps somebody else can take a look?

DescriptorDump_Piwebcam_.txt

EDIT: I could also potentially capture and attach the output of a commercial webcam I own which is recognized out of the box as a webcam device if that helps?

Significant delay

There is a significant delay between image and audio when using it as a webcam in video meetings. Any way to fix this? What process is the bottleneck causing the delay?

Manual ISO changes do not take effect, but can be triggered by flipping image

Using the new camera-ctl tool (on release 1.70) with ISO Sensitivity, Auto set to Manual, changes to ISO Sensitivity do not take effect. However, doing a Horizontal Flip of the image (and back again) is sufficient to make the ISO change take effect.

I am running the 1.70 release on a Raspberry Pi Zero with the HQ camera.

Raspi Zero W 1.1 not booting

Using the sdcard-raspberrypi0w-v1.70.img image a Raspi Zero W 1.1 is not booting.
After the rainbow square it prints the following 2 lines and is then stuck:

brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43430-sdio for chip BCM43430/1
brcmfmac: brcmf_sdio_htclk: HT Avail timeout (1000000): clkctl 0x50

Official Raspberry Pi images are booting fine.

Proposed Text Based Interface Control App

Attached is a proposed lightweight app for adjusting the webcam settings in the terminal before committing to /boot/camera.txt. The only dependency should be libcurses5. At present, the v4l2 control schema is hard-coded in the app based on my ZeroW and HD Sensor. I haven't handled the /boot filesystem remount or perhaps there's a better way? There may be a few bugs hiding in there but thought it was worth sharing for others to test. Please feel free to add to your repo if it's useful.

Thanks for all the great work on the wider project!

Alex

control.c.txt
screenshot

Build 1.5.0 questions

Hello,

Great work!

3 questions:

  • does the 1.5.0 build work on a pi4?
  • how do we access the wifi functionality for the pi0w build? i'm on the device via serial but ifconfig wifi shows no such device..
  • Can we achieve 2028x1520 / 4:3 / 50fps - Full FOV using 2x2 binning via the camera.txt file?

Error building for raspberry Pi Zero (without wifi)

I followed the steps in the readme for building an image for a raspberry pi zero (without wifi) and at some point I got this error:

/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of 'yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
make[3]: *** [scripts/Makefile.host:99: scripts/dtc/dtc] Error 1
make[2]: *** [scripts/Makefile.build:544: scripts/dtc] Error 2
make[2]: *** Waiting for unfinished jobs...
HOSTLD scripts/mod/modpost
make[1]: *** [Makefile:1068: scripts] Error 2
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory '/home/develop/buildroot/output/build/linux-custom'
make: *** [package/pkg-generic.mk:269: /home/develop/buildroot/output/build/linux-custom/.stamp_built] Error 2

Does anyone have any clue on what could be causing it, or have a working image for a raspberry pi zero (without wifi)?

boot without SD card and use rpiboot instead

This is a great project.

Maybe most use-cases are using an SD card and plugging the Pi in, I can see a use case for booting the piwebcam WITHOUT an SD-card but using usbboot/rpiboot, just like the RPI gpioexpander tool.

https://github.com/raspberrypi/usbboot
https://github.com/raspberrypi/usbbootgui

That will save the cost for an SD card, which is the most expensive part in a budget setup. More expensive then a Zero, or clone V1 camera.

Not sure how difficult that is.

My first thought: pack the root dir as an initramfs.cpio.gz and served it from the boot directory (initramfs rootfs.cpio.gz followkernel), but I have no real experience with it.

[HELP] Issues adding camera.txt to /boot.

First off, I apologize for what I believe to be a classic case of user error and feel free to ignore/close this whenever, but I seem to be unable to add a camera.txt or anything to the boot directory of the image file. I am not that well versed in Linux, but remounting the partition as read/write seems to fail saying that the directory is marked as read-only and cannot be changed. I am using Ubuntu 20.10 to attempt this and have tried many methods of writing to the directory, but I cannot seem to get it out of a read-only state. Again, sorry for this "issue", but I really have no clue what I'm doing wrong, maybe you fine folks here could provide some input? Thanks for the amazing project and any help provided in advance!

Serial interface on 40pin header requires enable_uart=1 in config.txt

Also, there is a untested serial interface on the serial 40-pin header: https://pinout.xyz/pinout/uart

It's not working with the default image.
To enable the serial port "enable_uart=1" needs to be added to /boot/config.txt.

After that both boot logs and logging in are working:

[    0.000000] Booting Linux on physical CPU 0x0                             
[    0.000000] Linux version 4.19.113 (wasabi@anna) (gcc version 8.4.0 (Buildroot 2020.02.3)) #1 Sun Jul 26 10:01:21 PDT 2020
[...]
Welcome to Buildroot 2020.02.3!

[    2.586816] systemd[1]: Set hostname to <showmepicam>.
[...]

Camera output grayed out

UVC camera and USB serial devices show up, serial interfacing works, but camera output is grayed out in OBS and Zoom crashes when the UVC camera is selected. I am using a third party camera module - could this be a compatibility issue?

Make piwebcam work on macOS

Currently, macOS shows a black screen for the camera. I suspect this is due to incompatible codec but it could be due to any reason.

Resolution with Teams on Windows 10 is too low

Hello everyone,

I am experiencing an issue when using the webcam on a Windows 10 PC with Teams. The resolution is not set to 1080p when using the camera. I checked this using the serial interface and camera-ctl.

After startup:
Resolution: 1024x768
Format: JPEG

When using Teams (preview camera in Teams' settings and in an actual video meeting)
Resolution: 640x360
Format: MJPG

Right now my workaround is to use OBS and the virtual camera to loop the video through it and indeed I get a nice 1080p HD output from the camera. It would be easier to just do the right thing and not having to fiddle around with OBS.

Won’t boot on pi zero w(h)

Hello,
I really enjoyed your article however I am unable to get the image to boot.

Any ideas?

image

I have also tried to connect via ttyACM0 but I just get a blank page.

Many thanks,

puc

[Feature] Enable GPIO pin on webcam stream

One feature that was missing for me was the lack of LED to indicate that the camera is streaming.
I've done it locally and it works well, here is the picture of the camera when streaming:

I've modified my local copy of https://github.com/showmewebcam/uvc-gadget to do that (enable pin 21 when streaming starts and disable when streaming ends) and was about to make a PR, but it seems like the project will be moving to https://github.com/peterbay/uvc-gadget soon.

Which repo would be best to submit a PR?

Design a simple laser cut sandwich piece for the HQ camera and Pi0

Would any kind soul with some CAD skill design a acrylic piece to sandwich between the camera and the raspberry pi board so they don't move?

I'm thinking of the following simple requirements:

  • Has 4 holes to hold the pi and 4 holes to hold the HQ camera. Camera is in the front of the Pi like picture attached. Works for the short ribbon cable.
  • Allows the HQ camera to be mounted with a camera tripod piece, so the Pi cannot be too low because that will bend the flex cable.

sandwich

(If you have one and can send my way, that'd be extra appreciated!)

FPS Control

I'm using a Pi Zero (No W) with HQ Camera. Hypothetically, this device should support 720p60fps. How can I enable this setting?

Requesting an LED heartbeat when video is not being transmitted

After the initial showmewebcam boot sequence that terminates with the three Pi Zero LED flashes, showmewebcam illuminates the Pi Zero LED when video is being USB transmitted. That signal confirmation is great.

Depending on how the system is being used there can be times when video is not being requested by the connected computer. During those times there is no external evidence the showmecam system is functioning in the ready state. A double LED flash every four seconds or so would be helpful.

Seamless firmware upgrade from host

One of the ways we can achieve seamless firmware upgrade is to have the following scheme:

  • Enable networking-over-USB via the composite USB interface.
  • Have a firmware upgrade daemon listening on a fixed port.
  • Have two firmware partitions, A and B, one is active.
  • At end of upgrade, switch the active partitions in cmdline.txt.

Serial console output is garbled after boot

When connecting to the pi after a reboot, the serial console output seems to be garbled. When connecting again, everything seems to be fine. You can press enter twice and then log in without problems.

# picocom -b 115200 /dev/ttyACM0
picocom v3.1

port is        : /dev/ttyACM0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
stopbits are   : 1
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
hangup is      : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv -E
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,
logfile is     : none
initstring     : none
exit_after is  : not set
exit is        : no

Type [C-a] [C-h] to see available commands
Terminal ready
login: 


       piwebcam login: 


                       piwebcam login: 


                                       piwebcam login: 


                                                       piwebcam login: 


                                                                       piwebcam login: 


                                                                                       piwebcam login: Your webcam at
Password: 

Webcam no longer shows up

Hi, thanks for your great work on this repo.

It was working perfectly for me, but today after a reboot the webcam doesn't show up anymore. I've tried reflashing the firmware (both versions), but it doesn't change anything. The microSD card seems to be working correctly.

In case that's helpful: when I plug the raspberri pi zero, I see the green LED flashing a few times, then nothing.

Thanks in advance for your help!

Microphone support?

Any chance of supporting a Mic? there's a few cheap boards that would work with the GPIO ports on the Pi

[Feature] Buttons on GPIO header

I would be nice to have a a default setup for some simple buttons on the GPIO header to control some of the camera functions.
e.g. a button to disable/enable auto-exposure or disable/enable the video feed.

It could also be interesting to use usb_f_hid and expose buttons to the host via HID (e.g. a hangup button).

Coil whining and strange artifacts

Hi, thanks for this awesome project!
It was really easy to set it up on an Pi Zero W.

Is it normal that the Pi is whining as soon as the camera is active?

Also, after a couple of seconds I receive artifacts like these.
Screen Shot 2020-11-26 at 17 01 24

Any ideas what could be the reason for that or how to debug it?

Field of views problems

I'm using the raspberry pi v2 camera module. When testing the camera with raspistill, I get to see the full field of view. However, when I load the showmewebcam image on the Pi, the video is cropped. Some sample images:

raspistill
raspistill

showmewebcam
showmewebcam

I forgot to mention on my other thread: Thanks for making this! Trully awesome!

Auto Exposure Mode UVC Setting not standard-conform

On v1.70, CT_AE_MODE_CONTROL 0x02 does not conform to UVC 1.5.

It shows up as

autoExposureMode = {
    current = <00>;
    default = <00>;
    flags = 3;
    max = <03>;
    min = <00>;
    resolution = <01>;
}

though resolution is supposed to be a bitmap of modes available:
image

I am not sure where this is handled, yet, it might be a uvc-gadget or kernel problem.

kernel uvcvideo errors on master: Failed to query (GET_INFO) UVC control

8ba054b introduced kernel errors that are printed when the device is plugged in and queried:

dec 20 11:51:54 miramis kernel: usb 1-1.3: new full-speed USB device number 11 using ehci-pci
dec 20 11:51:58 miramis kernel: usb 1-1.3: new high-speed USB device number 12 using ehci-pci
dec 20 11:51:58 miramis kernel: usb 1-1.3: New USB device found, idVendor=1d6b, idProduct=0104, bcdDevice= 1.00
dec 20 11:51:58 miramis kernel: usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
dec 20 11:51:58 miramis kernel: usb 1-1.3: Product: Piwebcam
dec 20 11:51:58 miramis kernel: usb 1-1.3: Manufacturer: Show-me Webcam Project
dec 20 11:51:58 miramis kernel: usb 1-1.3: SerialNumber: 100000000d2386db
dec 20 11:51:58 miramis kernel: uvcvideo: Found UVC 1.00 device Piwebcam (1d6b:0104)
dec 20 11:51:58 miramis kernel: uvcvideo: Failed to query (GET_INFO) UVC control 6 on unit 2: -32 (exp. 1).
dec 20 11:51:58 miramis kernel: uvcvideo: Failed to query (GET_INFO) UVC control 9 on unit 2: -32 (exp. 1).
dec 20 11:51:58 miramis kernel: uvcvideo: Failed to query (GET_INFO) UVC control 10 on unit 2: -32 (exp. 1).
dec 20 11:51:58 miramis kernel: uvcvideo: Failed to query (GET_INFO) UVC control 4 on unit 2: -32 (exp. 1).
dec 20 11:51:58 miramis kernel: input: Piwebcam : UVC Camera as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.3/1-1.3:2.0/input/input31
dec 20 11:51:58 miramis kernel: cdc_acm 1-1.3:2.2: ttyACM0: USB ACM device

The lines marked in bold are printk's at KERN_ERR level. They were not shown when plugging in a device with firmware built from tag v1.7.0.

I'm using a RPi 0 and my host system is Ubuntu 20.04 (kernel 5.4).

Corrupted video stream followed by crash (Pi Zero W)

I've been running a previous version of uvc-gadget (this one: https://github.com/climberhunt/uvc-gadget) on my Pi Zero W for a few months now without problems. I decided to upgrade to the latest and greatest, particularly since some apps don't support 1080p webcams so it would be nice to have support for multiple resolutions.

I wrote the image to the SD card with sudo dd if=~/Downloads/sdcard-raspberrypi0w-v1.70.img of=/dev/sdb and booted it up. It came up quickly and flashed the LED three times so I tested it with ffplay:

$ ffplay /dev/video0
ffplay version 4.3.1 Copyright (c) 2003-2020 the FFmpeg developers
  built with gcc 10 (GCC)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection' --extra-ldflags='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-liblensfun --enable-libmp3lame --enable-libmysofa --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-vulkan --enable-libglslang --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-lto --enable-libmfx --enable-runtime-cpudetect
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
[mjpeg @ 0x7f12180022c0] Found EOI before any SOF, ignoring f=0/0   
[mjpeg @ 0x7f12180022c0] No JPEG data found in image
Input #0, video4linux2,v4l2, from '/dev/video0':B sq=    0B f=0/0   
  Duration: N/A, start: 5378.438004, bitrate: N/A
    Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 640x360, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
[mjpeg @ 0x7f121800ab40] Found EOI before any SOF, ignoring
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[swscaler @ 0x7f121406f2c0] deprecated pixel format used, make sure you did set range correctly
[mjpeg @ 0x7f121800ab40] Found EOI before any SOF, ignoring f=0/0   
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] overread 80KB vq=    0KB sq=    0B f=0/0   
[mjpeg @ 0x7f121800ab40] EOI missing, emulating
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] Found EOI before any SOF, ignoring
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] overread 80KB vq=    0KB sq=    0B f=0/0   
[mjpeg @ 0x7f121800ab40] EOI missing, emulating
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] Found EOI before any SOF, ignoring f=0/0   
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] Found EOI before any SOF, ignoring f=0/0   
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] overread 80KB vq=    0KB sq=    0B f=0/0   
[mjpeg @ 0x7f121800ab40] EOI missing, emulating
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] Found EOI before any SOF, ignoring
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] overread 80KB vq=    0KB sq=    0B f=0/0   
[mjpeg @ 0x7f121800ab40] EOI missing, emulating
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] Found EOI before any SOF, ignoring
[mjpeg @ 0x7f121800ab40] No JPEG data found in image
[mjpeg @ 0x7f121800ab40] overread 80KB vq=    0KB sq=    0B f=0/0   
[mjpeg @ 0x7f121800ab40] EOI missing, emulating
[mjpeg @ 0x7f121800ab40] No JPEG data found in image

The above errors are repeated hundreds of times, accompanied by visible corruption in the video stream (blocks of incorrect or mangled pixels). I tested it a few times and always after 5-10 seconds or so the video stream freezes and the Pi's LED goes out. I also tried with mpv and got the same result.

One test ended with these messages:

[mjpeg @ 0x7fa11800ab40] Found EOI before any SOF, ignoring
[mjpeg @ 0x7fa11800ab40] No JPEG data found in image
[mjpeg @ 0x7fa11800ab40] No JPEG data found in image=    0B f=0/0   
[mjpeg @ 0x7fa11800ab40] No JPEG data found in image=    0B f=0/0   
[mjpeg @ 0x7fa11800ab40] Found EOI before any SOF, ignoring
[mjpeg @ 0x7fa11800ab40] No JPEG data found in image
[mjpeg @ 0x7fa11800ab40] overread 80KB vq=    0KB sq=    0B f=0/0   
[mjpeg @ 0x7fa11800ab40] EOI missing, emulating
[mjpeg @ 0x7fa11800ab40] No JPEG data found in image
[video4linux2,v4l2 @ 0x7fa118000bc0] Dequeued v4l2 buffer contains corrupted data (0 bytes).
[video4linux2,v4l2 @ 0x7fa118000bc0] ioctl(VIDIOC_DQBUF): No such device
ioctl(VIDIOC_QBUF): No such device
[video4linux2,v4l2 @ 0x7fa118000bc0] ioctl(VIDIOC_DQBUF): No such device
    Last message repeated 2 times
[video4linux2,v4l2 @ 0x7fa118000bc0] ioctl(VIDIOC_DQBUF): No such device
    Last message repeated 2 times
[video4linux2,v4l2 @ 0x7fa118000bc0] ioctl(VIDIOC_DQBUF): No such device
    Last message repeated 2 times

Here's my dmesg output:

[ 5358.630000] usb 1-1: new full-speed USB device number 6 using xhci_hcd
[ 5362.602915] usb 1-1: new high-speed USB device number 7 using xhci_hcd
[ 5362.832210] usb 1-1: New USB device found, idVendor=1d6b, idProduct=0104, bcdDevice= 1.00
[ 5362.832212] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5362.832213] usb 1-1: Product: Piwebcam 
[ 5362.832214] usb 1-1: Manufacturer: Show-me Webcam Project
[ 5362.832214] usb 1-1: SerialNumber: 100000000d2386db
[ 5362.862087] uvcvideo: Found UVC 1.00 device Piwebcam  (1d6b:0104)
[ 5362.886241] input: Piwebcam : UVC Camera as /devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-1/1-1:2.0/input/input31
[ 5362.895120] cdc_acm 1-1:2.2: ttyACM0: USB ACM device
[ 5439.898716] usb 1-1: USB disconnect, device number 7
[ 5439.902500] uvcvideo: Failed to resubmit video URB (-19).
[ 5439.906500] uvcvideo: Failed to resubmit video URB (-19).
[ 5439.910500] uvcvideo: Failed to resubmit video URB (-19).
[ 5439.914500] uvcvideo: Failed to resubmit video URB (-19).
[ 5439.918499] uvcvideo: Failed to resubmit video URB (-19).

/usr/bin/camera-ctl missing in sdcard-raspberrypi0w-v1.60.img.gz

Hi all,
First time user, impressively convenient solution!
Following README.md, I found /usr/bin/camera-ctl to be missing in sdcard-raspberrypi0w-v1.60.img.gz

"evidence":

find / -name camera

/boot/camera.txt
/run/udev/data/+platform:bcm2835-camera
/sys/kernel/config/usb_gadget/piwebcam/functions/uvc.usb0/control/terminal/camera
/sys/devices/platform/soc/2000b840.mailbox/bcm2835-camera
/sys/bus/platform/devices/bcm2835-camera
/sys/bus/platform/drivers/bcm2835-camera
/sys/bus/platform/drivers/bcm2835-camera/bcm2835-camera
/sys/module/bcm2835_v4l2/drivers/platform:bcm2835-camera
/usr/lib/modules/5.4.73/kernel/drivers/leds/trigger/ledtrig-camera.ko
/usr/lib/modules/5.4.73/kernel/drivers/staging/vc04_services/bcm2835-camera

Unable to change camera parameters

Hello,

First of all thanks for your work on this great repo! I had no issue getting the webcam up and running, it was very easy.

Hopefully the image I get is quite dark, so I'd like to mess with the camera settings to improve the quality of the output.

I tried connecting the microsd card to my laptop to create "camera.txt" in /boot, but I get an error message telling me that the partition is read-only. By the way, I get two partitions when I connect the microsd card, and the one in which /boot is shows up as a squashfs partition which - as I understand it - is always read-only.

Would you be able to help me?

Many thanks in advance!

The file is read-only

I need to test some ideas and I want to edit or add some files and services in /etc/systemd/... but I can't.
how can I:

  1. add/edit/remove some files in the directions except /boot ???
  2. If it is a hardware lock, what should I change in commands before building a new version from your code and buildroot?

Add camera.txt to /boot during build

It would be awesome if an existing camera.txt could be copied to /boot when building an image yourself. With that in place, we could also remove

/usr/bin/v4l2-ctl -c auto_exposure_bias=3
/usr/bin/v4l2-ctl -c video_bitrate=25000000

from package/piwebcam/start-webcam.sh. The only solution I found would be to add the camera.txt file to board/raspberrypi0cam/genimage-raspberrypi0.cfg and add these lines to board/raspberrypi0cam/post-image.sh:

# Copy camera.txt if it exists in build dir
if [ -f "${BR2_EXTERNAL_PICAM_PATH}/camera.txt" ]; then
  cp "${BR2_EXTERNAL_PICAM_PATH}/camera.txt" "${BINARIES_DIR}/rpi-firmware/camera.txt"
fi

But that requires an existing camera.txt in the root folder or the build will fail.

Cannot compile piwebcam: it includes header files of the host kernel

Hello,

Im trying to build this for the first time with 2020.02.9 on my Gentoo system (amd64 running vanilla kernel 5.9.9). The compilation goes on for a while but then it fails during building the piwebcam package:

>>> piwebcam 28605a4f79fe6bb9de9a3e2babfa0ce22c668e5f Building
/usr/bin/make -j9 CXX="/home/oskar/Downloads/showmewebcam/output/raspberrypi0/host/bin/arm-buildroot-linux-gnueabihf-g++" CC="/home/oskar/Downloads/showmewebcam/output/raspberrypi0/host/bin/arm-buildroot-linux-gnueabihf-gcc" LD="/home/oskar/Downloads/showmewebcam/output/raspberrypi0/host/bin/arm-buildroot-linux-gnueabihf-ld" -C /home/oskar/Downloads/showmewebcam/output/raspberrypi0/build/piwebcam-28605a4f79fe6bb9de9a3e2babfa0ce22c668e5f
/home/oskar/Downloads/showmewebcam/output/raspberrypi0/host/bin/arm-buildroot-linux-gnueabihf-gcc -W -Wall -g -I/usr/src/linux/include -I/usr/src/linux/arch/x86/include   -c -o uvc-gadget.o uvc-gadget.c
In file included from /usr/src/linux/arch/x86/include/uapi/asm/sigcontext.h:18,
                 from /usr/src/linux/arch/x86/include/asm/sigcontext.h:7,
                 from /home/oskar/Downloads/showmewebcam/output/raspberrypi0/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/bits/sigcontext.h:30,
                 from /home/oskar/Downloads/showmewebcam/output/raspberrypi0/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include/signal.h:291,
                 from uvc-gadget.c:50:
/usr/src/linux/include/linux/compiler.h:232:10: fatal error: asm/rwonce.h: No such file or directory
 #include <asm/rwonce.h>
          ^~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [<builtin>: uvc-gadget.o] Error 1
make[1]: *** [package/pkg-generic.mk:269: /home/oskar/Downloads/showmewebcam/output/raspberrypi0/build/piwebcam-28605a4f79fe6bb9de9a3e2babfa0ce22c668e5f/.stamp_built] Error 2
make: *** [Makefile:23: _all] Error 2

From the Makefile in the output/raspberrypi0/build/piwebcam-28605a4f79fe6bb9de9a3e2babfa0ce22c668e5f, it is obvious that it is actually trying to include host kernel header files from /usr/src/linux and architecture x86. I'm not sure how to fix this since I haven't find similar header files anywhere inside the buildroot output directory.

Any help would be appreciated.

brightness setting in camera.txt is being ignored

After writing /boot/camera.txt with

#Tweak the auto exposure bias
auto_exposure_bias=15
#Tweak the brightness
brightness=55

the auto_expose_bias value is being honoured, but not the brightness value.

# /usr/bin/v4l2-ctl -L

User Controls

             brightness 0x00980900 (int)    : min=0 max=100 step=1 default=50 value=50 flags=slider
[...]          
             auto_exposure_bias 0x009a0913 (intmenu): min=0 max=24 default=12 value=15
                                0: -4000 (0xfffffffffffff060)
                                1: -3667 (0xfffffffffffff1ad)
                                2: -3333 (0xfffffffffffff2fb)
                                3: -3000 (0xfffffffffffff448)
                                4: -2667 (0xfffffffffffff595)
                                5: -2333 (0xfffffffffffff6e3)
                                6: -2000 (0xfffffffffffff830)
                                7: -1667 (0xfffffffffffff97d)
                                8: -1333 (0xfffffffffffffacb)
                                9: -1000 (0xfffffffffffffc18)
                                10: -667 (0xfffffffffffffd65)
                                11: -333 (0xfffffffffffffeb3)
                                12: 0 (0x0)
                                13: 333 (0x14d)
                                14: 667 (0x29b)
                                15: 1000 (0x3e8)
                                16: 1333 (0x535)
                                17: 1667 (0x683)
                                18: 2000 (0x7d0)
                                19: 2333 (0x91d)
                                20: 2667 (0xa6b)
                                21: 3000 (0xbb8)
                                22: 3333 (0xd05)
                                23: 3667 (0xe53)
                                24: 4000 (0xfa0)
[...]

Any idea how to fix this problem?
In order to have the brightness at 55 after a reboot, I have to set it manually via /usr/bin/v4l2-ctl -c brightness=55 which seems to work until the next reboot.

How to improve Image Quality

Is it possible to improve the image quality?
I think the mjpg compression is very bad at the highest setting. The lowest setting is absolute not usable. Is it possible to change the range of the compression setting.
Sometimes low framerate and high image quality is better than high framerate and low image quality.
Is it possible to use uncompressed yuv mode?

Poor performance on Cisco Webex (macOS Catalina)

Even thought the perforce of the camera is excellent in FaceTime or capturing videos from QuickTime, when I try to use it on Webex it falls drastically. Lots of dropped frames (only id say it only captures at 2-4 fps). Also, the quality of the video on the other end of the call is terrible.

I also noticed that Skype won't let me set this device as the default camera. When I select it from the menu the preferences window crashes.

Any idea how I can troubleshoot this?

Camera-ctl Exposure Bias not working properly

When trying to change Exposure Bias in the camera-ctl application using arrow keys, it changes by a step of 333 instead of 1. Therefore I am unable to set any meaningful value. Also the default value is 0, while it says it should be 12.

I am doing this on version v1.70 using Windows 10 and PuTTY. Connected through USB cable. Other options work fine.

[Feature] IP camera

It would be awesome if the device could also function as an IP camera as wel as a webcam.

We could expose a settings file through the usb connection, in which we could set the IP camera settings as wel as the ability to configure wifi settings.

Possible to use HDMI output?

First of all, thanks for your great work! I am looking into building a Raspberry webcam. However, I use an HDMI grabber/mixer device for my setup and thus, it would be nice if the HDMI output of the Pi would output the camera picture (and "only the picture", so no status bar or similar). Is this possible? Thanks and best, Florian

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.