mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-31 11:06:35 +08:00 
			
		
		
		
	Compare commits
	
		
			28 Commits
		
	
	
		
			release_wo
			...
			v0.10.0-be
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | a3301e0347 | ||
|   | 3d556cc2cb | ||
|   | 585efe1a0f | ||
|   | c7d47439dd | ||
|   | 19a6978228 | ||
|   | 1ebb8a54bf | ||
|   | ae968044d6 | ||
|   | b912851e49 | ||
|   | 14c74e4361 | ||
|   | 51fb532e1a | ||
|   | 3541f966e3 | ||
|   | c7faef8faa | ||
|   | cdd3000315 | ||
|   | 1c1c28d0e5 | ||
|   | 4422e86907 | ||
|   | 8f43a2d109 | ||
|   | bd7755fdd3 | ||
|   | d554175631 | ||
|   | ff667b019a | ||
|   | 57dcb29f8b | ||
|   | 9dc6c423b7 | ||
|   | 58117e2a3e | ||
|   | 5bec438f9c | ||
|   | 24cc63d6d3 | ||
|   | d17bd74c9a | ||
|   | 8f101ccca8 | ||
|   | b63c56d810 | ||
|   | 61c62d4685 | 
| @@ -1,97 +1,27 @@ | |||||||
| { | { | ||||||
|   "name": "Frigate Devcontainer", |   "name": "Frigate Dev", | ||||||
|   "dockerComposeFile": "../docker-compose.yml", |   "dockerComposeFile": "../docker-compose.yml", | ||||||
|   "service": "devcontainer", |   "service": "dev", | ||||||
|   "workspaceFolder": "/workspace/frigate", |   "workspaceFolder": "/lab/frigate", | ||||||
|   "initializeCommand": ".devcontainer/initialize.sh", |  | ||||||
|   "postCreateCommand": ".devcontainer/post_create.sh", |  | ||||||
|   "overrideCommand": false, |  | ||||||
|   "remoteUser": "vscode", |  | ||||||
|   "features": { |  | ||||||
|     "ghcr.io/devcontainers/features/common-utils:1": {} |  | ||||||
|   }, |  | ||||||
|   "forwardPorts": [5000, 5001, 5173, 1935, 8554, 8555], |  | ||||||
|   "portsAttributes": { |  | ||||||
|     "5000": { |  | ||||||
|       "label": "NGINX", |  | ||||||
|       "onAutoForward": "silent" |  | ||||||
|     }, |  | ||||||
|     "5001": { |  | ||||||
|       "label": "Frigate API", |  | ||||||
|       "onAutoForward": "silent" |  | ||||||
|     }, |  | ||||||
|     "5173": { |  | ||||||
|       "label": "Vite Server", |  | ||||||
|       "onAutoForward": "silent" |  | ||||||
|     }, |  | ||||||
|     "1935": { |  | ||||||
|       "label": "RTMP", |  | ||||||
|       "onAutoForward": "silent" |  | ||||||
|     }, |  | ||||||
|     "8554": { |  | ||||||
|       "label": "gortc RTSP", |  | ||||||
|       "onAutoForward": "silent" |  | ||||||
|     }, |  | ||||||
|     "8555": { |  | ||||||
|       "label": "go2rtc WebRTC", |  | ||||||
|       "onAutoForward": "silent" |  | ||||||
|     } |  | ||||||
|   }, |  | ||||||
|   "customizations": { |  | ||||||
|     "vscode": { |  | ||||||
|   "extensions": [ |   "extensions": [ | ||||||
|     "ms-python.python", |     "ms-python.python", | ||||||
|         "ms-python.vscode-pylance", |  | ||||||
|         "ms-python.black-formatter", |  | ||||||
|     "visualstudioexptteam.vscodeintellicode", |     "visualstudioexptteam.vscodeintellicode", | ||||||
|     "mhutchie.git-graph", |     "mhutchie.git-graph", | ||||||
|     "ms-azuretools.vscode-docker", |     "ms-azuretools.vscode-docker", | ||||||
|     "streetsidesoftware.code-spell-checker", |     "streetsidesoftware.code-spell-checker", | ||||||
|  |     "eamodio.gitlens", | ||||||
|     "esbenp.prettier-vscode", |     "esbenp.prettier-vscode", | ||||||
|         "dbaeumer.vscode-eslint", |     "ms-python.vscode-pylance" | ||||||
|         "mikestead.dotenv", |  | ||||||
|         "csstools.postcss", |  | ||||||
|         "blanu.vscode-styled-jsx", |  | ||||||
|         "bradlc.vscode-tailwindcss", |  | ||||||
|         "ms-python.isort", |  | ||||||
|         "charliermarsh.ruff" |  | ||||||
|   ], |   ], | ||||||
|   "settings": { |   "settings": { | ||||||
|         "remote.autoForwardPorts": false, |     "python.pythonPath": "/usr/bin/python3", | ||||||
|     "python.linting.pylintEnabled": true, |     "python.linting.pylintEnabled": true, | ||||||
|     "python.linting.enabled": true, |     "python.linting.enabled": true, | ||||||
|         "python.formatting.provider": "none", |     "python.formatting.provider": "black", | ||||||
|         "python.languageServer": "Pylance", |  | ||||||
|     "editor.formatOnPaste": false, |     "editor.formatOnPaste": false, | ||||||
|     "editor.formatOnSave": true, |     "editor.formatOnSave": true, | ||||||
|     "editor.formatOnType": true, |     "editor.formatOnType": true, | ||||||
|         "python.testing.pytestEnabled": false, |  | ||||||
|         "python.testing.unittestEnabled": true, |  | ||||||
|         "python.testing.unittestArgs": ["-v", "-s", "./frigate/test"], |  | ||||||
|     "files.trimTrailingWhitespace": true, |     "files.trimTrailingWhitespace": true, | ||||||
|         "eslint.workingDirectories": ["./web"], |     "terminal.integrated.shell.linux": "/bin/bash" | ||||||
|         "isort.args": ["--settings-path=./pyproject.toml"], |  | ||||||
|         "[python]": { |  | ||||||
|           "editor.defaultFormatter": "ms-python.black-formatter", |  | ||||||
|           "editor.formatOnSave": true, |  | ||||||
|           "editor.codeActionsOnSave": { |  | ||||||
|             "source.fixAll": true, |  | ||||||
|             "source.organizeImports": true |  | ||||||
|           } |  | ||||||
|         }, |  | ||||||
|         "[json][jsonc]": { |  | ||||||
|           "editor.defaultFormatter": "esbenp.prettier-vscode" |  | ||||||
|         }, |  | ||||||
|         "[jsx][js][tsx][ts]": { |  | ||||||
|           "editor.codeActionsOnSave": [ |  | ||||||
|             "source.addMissingImports", |  | ||||||
|             "source.fixAll" |  | ||||||
|           ], |  | ||||||
|           "editor.tabSize": 2 |  | ||||||
|         }, |  | ||||||
|         "cSpell.ignoreWords": ["rtmp"], |  | ||||||
|         "cSpell.words": ["preact", "astype", "hwaccel", "mqtt"] |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,13 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -euo pipefail |  | ||||||
|  |  | ||||||
| # These folders needs to be created and owned by the host user |  | ||||||
| mkdir -p debug web/dist |  | ||||||
|  |  | ||||||
| if [[ -f "config/config.yml" ]]; then |  | ||||||
|   echo "config/config.yml already exists, skipping initialization" >&2 |  | ||||||
| else |  | ||||||
|   echo "initializing config/config.yml" >&2 |  | ||||||
|   cp -fv config/config.yml.example config/config.yml |  | ||||||
| fi |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -euxo pipefail |  | ||||||
|  |  | ||||||
| # Cleanup the old github host key |  | ||||||
| sed -i -e '/AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31\/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi\/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==/d' ~/.ssh/known_hosts |  | ||||||
| # Add new github host key |  | ||||||
| curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | \ |  | ||||||
|   sed -e 's/^/github.com /' >> ~/.ssh/known_hosts |  | ||||||
|  |  | ||||||
| # Frigate normal container runs as root, so it have permission to create |  | ||||||
| # the folders. But the devcontainer runs as the host user, so we need to |  | ||||||
| # create the folders and give the host user permission to write to them. |  | ||||||
| sudo mkdir -p /media/frigate |  | ||||||
| sudo chown -R "$(id -u):$(id -g)" /media/frigate |  | ||||||
|  |  | ||||||
| # When started as a service, LIBAVFORMAT_VERSION_MAJOR is defined in the |  | ||||||
| # s6 service file. For dev, where frigate is started from an interactive |  | ||||||
| # shell, we define it in .bashrc instead. |  | ||||||
| echo 'export LIBAVFORMAT_VERSION_MAJOR=$(ffmpeg -version | grep -Po "libavformat\W+\K\d+")' >> $HOME/.bashrc |  | ||||||
|  |  | ||||||
| make version |  | ||||||
|  |  | ||||||
| cd web |  | ||||||
|  |  | ||||||
| npm install |  | ||||||
|  |  | ||||||
| npm run build |  | ||||||
| @@ -7,10 +7,5 @@ config/ | |||||||
| .git | .git | ||||||
| core | core | ||||||
| *.mp4 | *.mp4 | ||||||
| *.jpg |  | ||||||
| *.db | *.db | ||||||
| *.ts | *.ts | ||||||
|  |  | ||||||
| web/dist/ |  | ||||||
| web/node_modules/ |  | ||||||
| web/.npm |  | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,3 @@ | |||||||
| github: | github: | ||||||
|   - blakeblackshear |   - blakeblackshear | ||||||
|   - NickM-27 |   - paularmstrong | ||||||
|   | |||||||
							
								
								
									
										107
									
								
								.github/ISSUE_TEMPLATE/camera_support_request.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										107
									
								
								.github/ISSUE_TEMPLATE/camera_support_request.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,107 +0,0 @@ | |||||||
| name: Camera Support Request |  | ||||||
| description: Support for setting up cameras in Frigate |  | ||||||
| title: "[Camera Support]: " |  | ||||||
| labels: ["support", "triage"] |  | ||||||
| assignees: [] |  | ||||||
| body: |  | ||||||
|   - type: textarea |  | ||||||
|     id: description |  | ||||||
|     attributes: |  | ||||||
|       label: Describe the problem you are having |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: input |  | ||||||
|     id: version |  | ||||||
|     attributes: |  | ||||||
|       label: Version |  | ||||||
|       description: Visible on the Debug page in the Web UI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: config |  | ||||||
|     attributes: |  | ||||||
|       label: Frigate config file |  | ||||||
|       description: This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: yaml |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: logs |  | ||||||
|     attributes: |  | ||||||
|       label: Relevant log output |  | ||||||
|       description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: shell |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: ffprobe |  | ||||||
|     attributes: |  | ||||||
|       label: FFprobe output from your camera |  | ||||||
|       description: Run `ffprobe <camera_url>` and provide output below |  | ||||||
|       render: shell |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: stats |  | ||||||
|     attributes: |  | ||||||
|       label: Frigate stats |  | ||||||
|       description: Output from frigate's /api/stats endpoint |  | ||||||
|       render: json |  | ||||||
|   - type: dropdown |  | ||||||
|     id: os |  | ||||||
|     attributes: |  | ||||||
|       label: Operating system |  | ||||||
|       options: |  | ||||||
|         - HassOS |  | ||||||
|         - Debian |  | ||||||
|         - Other Linux |  | ||||||
|         - Proxmox |  | ||||||
|         - UNRAID |  | ||||||
|         - Windows |  | ||||||
|         - Other |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: install-method |  | ||||||
|     attributes: |  | ||||||
|       label: Install method |  | ||||||
|       options: |  | ||||||
|         - HassOS Addon |  | ||||||
|         - Docker Compose |  | ||||||
|         - Docker CLI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: coral |  | ||||||
|     attributes: |  | ||||||
|       label: Coral version |  | ||||||
|       options: |  | ||||||
|         - USB |  | ||||||
|         - PCIe |  | ||||||
|         - M.2 |  | ||||||
|         - Dev Board |  | ||||||
|         - Other |  | ||||||
|         - CPU (no coral) |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: network |  | ||||||
|     attributes: |  | ||||||
|       label: Network connection |  | ||||||
|       options: |  | ||||||
|         - Wired |  | ||||||
|         - Wireless |  | ||||||
|         - Mixed |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: input |  | ||||||
|     id: camera |  | ||||||
|     attributes: |  | ||||||
|       label: Camera make and model |  | ||||||
|       description: Dahua, hikvision, amcrest, reolink, etc and model number |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: other |  | ||||||
|     attributes: |  | ||||||
|       label: Any other information that may be helpful |  | ||||||
| @@ -1,82 +0,0 @@ | |||||||
| name: Config Support Request |  | ||||||
| description: Support for Frigate configuration |  | ||||||
| title: "[Config Support]: " |  | ||||||
| labels: ["support", "triage"] |  | ||||||
| assignees: [] |  | ||||||
| body: |  | ||||||
|   - type: textarea |  | ||||||
|     id: description |  | ||||||
|     attributes: |  | ||||||
|       label: Describe the problem you are having |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: input |  | ||||||
|     id: version |  | ||||||
|     attributes: |  | ||||||
|       label: Version |  | ||||||
|       description: Visible on the Debug page in the Web UI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: config |  | ||||||
|     attributes: |  | ||||||
|       label: Frigate config file |  | ||||||
|       description: This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: yaml |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: logs |  | ||||||
|     attributes: |  | ||||||
|       label: Relevant log output |  | ||||||
|       description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: shell |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: stats |  | ||||||
|     attributes: |  | ||||||
|       label: Frigate stats |  | ||||||
|       description: Output from frigate's /api/stats endpoint |  | ||||||
|       render: json |  | ||||||
|   - type: dropdown |  | ||||||
|     id: os |  | ||||||
|     attributes: |  | ||||||
|       label: Operating system |  | ||||||
|       options: |  | ||||||
|         - HassOS |  | ||||||
|         - Debian |  | ||||||
|         - Other Linux |  | ||||||
|         - Proxmox |  | ||||||
|         - UNRAID |  | ||||||
|         - Windows |  | ||||||
|         - Other |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: install-method |  | ||||||
|     attributes: |  | ||||||
|       label: Install method |  | ||||||
|       options: |  | ||||||
|         - HassOS Addon |  | ||||||
|         - Docker Compose |  | ||||||
|         - Docker CLI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: coral |  | ||||||
|     attributes: |  | ||||||
|       label: Coral version |  | ||||||
|       options: |  | ||||||
|         - USB |  | ||||||
|         - PCIe |  | ||||||
|         - M.2 |  | ||||||
|         - Dev Board |  | ||||||
|         - Other |  | ||||||
|         - CPU (no coral) |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: other |  | ||||||
|     attributes: |  | ||||||
|       label: Any other information that may be helpful |  | ||||||
| @@ -1,84 +0,0 @@ | |||||||
| name: Detector Support Request |  | ||||||
| description: Support for setting up object detector in Frigate (Coral, OpenVINO, TensorRT, etc.) |  | ||||||
| title: "[Detector Support]: " |  | ||||||
| labels: ["support", "triage"] |  | ||||||
| assignees: [] |  | ||||||
| body: |  | ||||||
|   - type: textarea |  | ||||||
|     id: description |  | ||||||
|     attributes: |  | ||||||
|       label: Describe the problem you are having |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: input |  | ||||||
|     id: version |  | ||||||
|     attributes: |  | ||||||
|       label: Version |  | ||||||
|       description: Visible on the Debug page in the Web UI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: config |  | ||||||
|     attributes: |  | ||||||
|       label: Frigate config file |  | ||||||
|       description: This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: yaml |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: docker |  | ||||||
|     attributes: |  | ||||||
|       label: docker-compose file or Docker CLI command |  | ||||||
|       description: This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: yaml |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: logs |  | ||||||
|     attributes: |  | ||||||
|       label: Relevant log output |  | ||||||
|       description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: shell |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: os |  | ||||||
|     attributes: |  | ||||||
|       label: Operating system |  | ||||||
|       options: |  | ||||||
|         - HassOS |  | ||||||
|         - Debian |  | ||||||
|         - Other Linux |  | ||||||
|         - Proxmox |  | ||||||
|         - UNRAID |  | ||||||
|         - Windows |  | ||||||
|         - Other |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: install-method |  | ||||||
|     attributes: |  | ||||||
|       label: Install method |  | ||||||
|       options: |  | ||||||
|         - HassOS Addon |  | ||||||
|         - Docker Compose |  | ||||||
|         - Docker CLI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: coral |  | ||||||
|     attributes: |  | ||||||
|       label: Coral version |  | ||||||
|       options: |  | ||||||
|         - USB |  | ||||||
|         - PCIe |  | ||||||
|         - M.2 |  | ||||||
|         - Dev Board |  | ||||||
|         - Other |  | ||||||
|         - CPU (no coral) |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: other |  | ||||||
|     attributes: |  | ||||||
|       label: Any other information that may be helpful |  | ||||||
| @@ -1,96 +0,0 @@ | |||||||
| name: Hardware Acceleration Support Request |  | ||||||
| description: Support for setting up GPU hardware acceleration in Frigate |  | ||||||
| title: "[HW Accel Support]: " |  | ||||||
| labels: ["support", "triage"] |  | ||||||
| assignees: [] |  | ||||||
| body: |  | ||||||
|   - type: textarea |  | ||||||
|     id: description |  | ||||||
|     attributes: |  | ||||||
|       label: Describe the problem you are having |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: input |  | ||||||
|     id: version |  | ||||||
|     attributes: |  | ||||||
|       label: Version |  | ||||||
|       description: Visible on the Debug page in the Web UI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: config |  | ||||||
|     attributes: |  | ||||||
|       label: Frigate config file |  | ||||||
|       description: This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: yaml |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: docker |  | ||||||
|     attributes: |  | ||||||
|       label: docker-compose file or Docker CLI command |  | ||||||
|       description: This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: yaml |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: logs |  | ||||||
|     attributes: |  | ||||||
|       label: Relevant log output |  | ||||||
|       description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. |  | ||||||
|       render: shell |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: ffprobe |  | ||||||
|     attributes: |  | ||||||
|       label: FFprobe output from your camera |  | ||||||
|       description: Run `ffprobe <camera_url>` and provide output below |  | ||||||
|       render: shell |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: os |  | ||||||
|     attributes: |  | ||||||
|       label: Operating system |  | ||||||
|       options: |  | ||||||
|         - HassOS |  | ||||||
|         - Debian |  | ||||||
|         - Other Linux |  | ||||||
|         - Proxmox |  | ||||||
|         - UNRAID |  | ||||||
|         - Windows |  | ||||||
|         - Other |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: install-method |  | ||||||
|     attributes: |  | ||||||
|       label: Install method |  | ||||||
|       options: |  | ||||||
|         - HassOS Addon |  | ||||||
|         - Docker Compose |  | ||||||
|         - Docker CLI |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: dropdown |  | ||||||
|     id: network |  | ||||||
|     attributes: |  | ||||||
|       label: Network connection |  | ||||||
|       options: |  | ||||||
|         - Wired |  | ||||||
|         - Wireless |  | ||||||
|         - Mixed |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: input |  | ||||||
|     id: camera |  | ||||||
|     attributes: |  | ||||||
|       label: Camera make and model |  | ||||||
|       description: Dahua, hikvision, amcrest, reolink, etc and model number |  | ||||||
|     validations: |  | ||||||
|       required: true |  | ||||||
|   - type: textarea |  | ||||||
|     id: other |  | ||||||
|     attributes: |  | ||||||
|       label: Any other information that may be helpful |  | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| name: General Support Request | name: Support Request | ||||||
| description: General support request for Frigate | description: Support for Frigate setup or configuration | ||||||
| title: "[Support]: " | title: "[Support]: " | ||||||
| labels: ["support", "triage"] | labels: ["support", "triage"] | ||||||
| assignees: [] | assignees: [] | ||||||
							
								
								
									
										39
									
								
								.github/actions/setup/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								.github/actions/setup/action.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,39 +0,0 @@ | |||||||
| name: 'Setup' |  | ||||||
| description: 'Set up QEMU and Buildx' |  | ||||||
| inputs: |  | ||||||
|   GITHUB_TOKEN: |  | ||||||
|     required: true |  | ||||||
| outputs: |  | ||||||
|   image-name: |  | ||||||
|     value: ghcr.io/${{ steps.lowercaseRepo.outputs.lowercase }}:${{ github.ref_name }}-${{ steps.create-short-sha.outputs.SHORT_SHA }} |  | ||||||
|   cache-name: |  | ||||||
|     value: ghcr.io/${{ steps.lowercaseRepo.outputs.lowercase }}:cache |  | ||||||
| runs: |  | ||||||
|   using: "composite" |  | ||||||
|   steps: |  | ||||||
|     - name: Remove unnecessary files |  | ||||||
|       run: | |  | ||||||
|         sudo rm -rf /usr/share/dotnet |  | ||||||
|         sudo rm -rf /usr/local/lib/android |  | ||||||
|         sudo rm -rf /opt/ghc |  | ||||||
|       shell: bash |  | ||||||
|     - id: lowercaseRepo |  | ||||||
|       uses: ASzc/change-string-case-action@v5 |  | ||||||
|       with: |  | ||||||
|         string: ${{ github.repository }} |  | ||||||
|     - name: Set up QEMU |  | ||||||
|       uses: docker/setup-qemu-action@v2 |  | ||||||
|     - name: Set up Docker Buildx |  | ||||||
|       uses: docker/setup-buildx-action@v2 |  | ||||||
|     - name: Log in to the Container registry |  | ||||||
|       uses: docker/login-action@465a07811f14bebb1938fbed4728c6a1ff8901fc |  | ||||||
|       with: |  | ||||||
|         registry: ghcr.io |  | ||||||
|         username: ${{ github.actor }} |  | ||||||
|         password: ${{ inputs.GITHUB_TOKEN }} |  | ||||||
|     - name: Create version file |  | ||||||
|       run: make version |  | ||||||
|       shell: bash |  | ||||||
|     - id: create-short-sha |  | ||||||
|       run: echo "SHORT_SHA=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT |  | ||||||
|       shell: bash |  | ||||||
							
								
								
									
										32
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,32 +0,0 @@ | |||||||
| version: 2 |  | ||||||
| updates: |  | ||||||
|   - package-ecosystem: "github-actions" |  | ||||||
|     directory: "/" |  | ||||||
|     schedule: |  | ||||||
|       interval: daily |  | ||||||
|     open-pull-requests-limit: 10 |  | ||||||
|     target-branch: dev |  | ||||||
|   - package-ecosystem: "docker" |  | ||||||
|     directory: "/docker" |  | ||||||
|     schedule: |  | ||||||
|       interval: daily |  | ||||||
|     open-pull-requests-limit: 10 |  | ||||||
|     target-branch: dev |  | ||||||
|   - package-ecosystem: "pip" |  | ||||||
|     directory: "/docker/main" |  | ||||||
|     schedule: |  | ||||||
|       interval: daily |  | ||||||
|     open-pull-requests-limit: 10 |  | ||||||
|     target-branch: dev |  | ||||||
|   - package-ecosystem: "npm" |  | ||||||
|     directory: "/web" |  | ||||||
|     schedule: |  | ||||||
|       interval: daily |  | ||||||
|     open-pull-requests-limit: 10 |  | ||||||
|     target-branch: dev |  | ||||||
|   - package-ecosystem: "npm" |  | ||||||
|     directory: "/docs" |  | ||||||
|     schedule: |  | ||||||
|       interval: daily |  | ||||||
|     open-pull-requests-limit: 10 |  | ||||||
|     target-branch: dev |  | ||||||
							
								
								
									
										17
									
								
								.github/stale.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.github/stale.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | # Number of days of inactivity before an issue becomes stale | ||||||
|  | daysUntilStale: 30 | ||||||
|  | # Number of days of inactivity before a stale issue is closed | ||||||
|  | daysUntilClose: 3 | ||||||
|  | # Issues with these labels will never be considered stale | ||||||
|  | exemptLabels: | ||||||
|  |   - pinned | ||||||
|  |   - security | ||||||
|  | # Label to use when marking an issue as stale | ||||||
|  | staleLabel: stale | ||||||
|  | # Comment to post when marking an issue as stale. Set to `false` to disable | ||||||
|  | markComment: > | ||||||
|  |   This issue has been automatically marked as stale because it has not had | ||||||
|  |   recent activity. It will be closed if no further activity occurs. Thank you | ||||||
|  |   for your contributions. | ||||||
|  | # Comment to post when closing a stale issue. Set to `false` to disable | ||||||
|  | closeComment: false | ||||||
							
								
								
									
										160
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										160
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,160 +0,0 @@ | |||||||
| name: CI |  | ||||||
|  |  | ||||||
| on: |  | ||||||
|   workflow_dispatch: |  | ||||||
|   push: |  | ||||||
|     branches: |  | ||||||
|       - dev |  | ||||||
|       - master |  | ||||||
|  |  | ||||||
| # only run the latest commit to avoid cache overwrites |  | ||||||
| concurrency: |  | ||||||
|   group: ${{ github.ref }} |  | ||||||
|   cancel-in-progress: true |  | ||||||
|  |  | ||||||
| env: |  | ||||||
|   PYTHON_VERSION: 3.9 |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   amd64_build: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: AMD64 Build |  | ||||||
|     steps: |  | ||||||
|       - name: Check out code |  | ||||||
|         uses: actions/checkout@v4 |  | ||||||
|       - name: Set up QEMU and Buildx |  | ||||||
|         id: setup |  | ||||||
|         uses: ./.github/actions/setup |  | ||||||
|         with: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|       - name: Build and push amd64 standard build |  | ||||||
|         uses: docker/build-push-action@v5 |  | ||||||
|         with: |  | ||||||
|           context: . |  | ||||||
|           file: docker/main/Dockerfile |  | ||||||
|           push: true |  | ||||||
|           platforms: linux/amd64 |  | ||||||
|           target: frigate |  | ||||||
|           tags: ${{ steps.setup.outputs.image-name }}-amd64 |  | ||||||
|           cache-from: type=registry,ref=${{ steps.setup.outputs.cache-name }}-amd64 |  | ||||||
|       - name: Build and push TensorRT (x86 GPU) |  | ||||||
|         uses: docker/bake-action@v4 |  | ||||||
|         with: |  | ||||||
|           push: true |  | ||||||
|           targets: tensorrt |  | ||||||
|           files: docker/tensorrt/trt.hcl |  | ||||||
|           set: | |  | ||||||
|             tensorrt.tags=${{ steps.setup.outputs.image-name }}-tensorrt |  | ||||||
|             *.cache-from=type=registry,ref=${{ steps.setup.outputs.cache-name }}-amd64 |  | ||||||
|             *.cache-to=type=registry,ref=${{ steps.setup.outputs.cache-name }}-amd64,mode=max |  | ||||||
|   arm64_build: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: ARM Build |  | ||||||
|     steps: |  | ||||||
|       - name: Check out code |  | ||||||
|         uses: actions/checkout@v4 |  | ||||||
|       - name: Set up QEMU and Buildx |  | ||||||
|         id: setup |  | ||||||
|         uses: ./.github/actions/setup |  | ||||||
|         with: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|       - name: Build and push arm64 standard build |  | ||||||
|         uses: docker/build-push-action@v5 |  | ||||||
|         with: |  | ||||||
|           context: . |  | ||||||
|           file: docker/main/Dockerfile |  | ||||||
|           push: true |  | ||||||
|           platforms: linux/arm64 |  | ||||||
|           target: frigate |  | ||||||
|           tags: | |  | ||||||
|             ${{ steps.setup.outputs.image-name }}-standard-arm64 |  | ||||||
|           cache-from: type=registry,ref=${{ steps.setup.outputs.cache-name }}-arm64 |  | ||||||
|       - name: Build and push RPi build |  | ||||||
|         uses: docker/bake-action@v4 |  | ||||||
|         with: |  | ||||||
|           push: true |  | ||||||
|           targets: rpi |  | ||||||
|           files: docker/rpi/rpi.hcl |  | ||||||
|           set: | |  | ||||||
|             rpi.tags=${{ steps.setup.outputs.image-name }}-rpi |  | ||||||
|             *.cache-from=type=registry,ref=${{ steps.setup.outputs.cache-name }}-arm64 |  | ||||||
|             *.cache-to=type=registry,ref=${{ steps.setup.outputs.cache-name }}-arm64,mode=max |  | ||||||
|   jetson_jp4_build: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: Jetson Jetpack 4 |  | ||||||
|     steps: |  | ||||||
|       - name: Check out code |  | ||||||
|         uses: actions/checkout@v4 |  | ||||||
|       - name: Set up QEMU and Buildx |  | ||||||
|         id: setup |  | ||||||
|         uses: ./.github/actions/setup |  | ||||||
|         with: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|       - name: Build and push TensorRT (Jetson, Jetpack 4) |  | ||||||
|         env: |  | ||||||
|           ARCH: arm64 |  | ||||||
|           BASE_IMAGE: timongentzsch/l4t-ubuntu20-opencv:latest |  | ||||||
|           SLIM_BASE: timongentzsch/l4t-ubuntu20-opencv:latest |  | ||||||
|           TRT_BASE: timongentzsch/l4t-ubuntu20-opencv:latest |  | ||||||
|         uses: docker/bake-action@v4 |  | ||||||
|         with: |  | ||||||
|           push: true |  | ||||||
|           targets: tensorrt |  | ||||||
|           files: docker/tensorrt/trt.hcl |  | ||||||
|           set: | |  | ||||||
|             tensorrt.tags=${{ steps.setup.outputs.image-name }}-tensorrt-jp4 |  | ||||||
|             *.cache-from=type=registry,ref=${{ steps.setup.outputs.cache-name }}-jp4 |  | ||||||
|             *.cache-to=type=registry,ref=${{ steps.setup.outputs.cache-name }}-jp4,mode=max |  | ||||||
|   jetson_jp5_build: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: Jetson Jetpack 5 |  | ||||||
|     steps: |  | ||||||
|       - name: Check out code |  | ||||||
|         uses: actions/checkout@v4 |  | ||||||
|       - name: Set up QEMU and Buildx |  | ||||||
|         id: setup |  | ||||||
|         uses: ./.github/actions/setup |  | ||||||
|         with: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|       - name: Build and push TensorRT (Jetson, Jetpack 5) |  | ||||||
|         env: |  | ||||||
|           ARCH: arm64 |  | ||||||
|           BASE_IMAGE: nvcr.io/nvidia/l4t-tensorrt:r8.5.2-runtime |  | ||||||
|           SLIM_BASE: nvcr.io/nvidia/l4t-tensorrt:r8.5.2-runtime |  | ||||||
|           TRT_BASE: nvcr.io/nvidia/l4t-tensorrt:r8.5.2-runtime |  | ||||||
|         uses: docker/bake-action@v4 |  | ||||||
|         with: |  | ||||||
|           push: true |  | ||||||
|           targets: tensorrt |  | ||||||
|           files: docker/tensorrt/trt.hcl |  | ||||||
|           set: | |  | ||||||
|             tensorrt.tags=${{ steps.setup.outputs.image-name }}-tensorrt-jp5 |  | ||||||
|             *.cache-from=type=registry,ref=${{ steps.setup.outputs.cache-name }}-jp5 |  | ||||||
|             *.cache-to=type=registry,ref=${{ steps.setup.outputs.cache-name }}-jp5,mode=max |  | ||||||
|   # The majority of users running arm64 are rpi users, so the rpi |  | ||||||
|   # build should be the primary arm64 image |  | ||||||
|   assemble_default_build: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: Assemble and push default build |  | ||||||
|     needs: |  | ||||||
|       - amd64_build |  | ||||||
|       - arm64_build |  | ||||||
|     steps: |  | ||||||
|       - id: lowercaseRepo |  | ||||||
|         uses: ASzc/change-string-case-action@v5 |  | ||||||
|         with: |  | ||||||
|           string: ${{ github.repository }} |  | ||||||
|       - name: Log in to the Container registry |  | ||||||
|         uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d |  | ||||||
|         with: |  | ||||||
|           registry: ghcr.io |  | ||||||
|           username: ${{ github.actor }} |  | ||||||
|           password: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|       - name: Create short sha |  | ||||||
|         run: echo "SHORT_SHA=${GITHUB_SHA::7}" >> $GITHUB_ENV |  | ||||||
|       - uses: int128/docker-manifest-create-action@v1 |  | ||||||
|         with: |  | ||||||
|           tags: ghcr.io/${{ steps.lowercaseRepo.outputs.lowercase }}:${{ github.ref_name }}-${{ env.SHORT_SHA }} |  | ||||||
|           suffixes: | |  | ||||||
|             -amd64 |  | ||||||
|             -rpi |  | ||||||
							
								
								
									
										24
									
								
								.github/workflows/dependabot-auto-merge.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/dependabot-auto-merge.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -1,24 +0,0 @@ | |||||||
| name: dependabot-auto-merge |  | ||||||
| on: pull_request |  | ||||||
|  |  | ||||||
| permissions: |  | ||||||
|   contents: write |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   dependabot-auto-merge: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     if: github.actor == 'dependabot[bot]' |  | ||||||
|     steps: |  | ||||||
|       - name: Get Dependabot metadata |  | ||||||
|         id: metadata |  | ||||||
|         uses: dependabot/fetch-metadata@v1 |  | ||||||
|         with: |  | ||||||
|           github-token: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|       - name: Enable auto-merge for Dependabot PRs |  | ||||||
|         if: steps.metadata.outputs.dependency-type == 'direct:development' && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') |  | ||||||
|         run: | |  | ||||||
|           gh pr review --approve "$PR_URL" |  | ||||||
|           gh pr merge --auto --squash "$PR_URL" |  | ||||||
|         env: |  | ||||||
|           PR_URL: ${{ github.event.pull_request.html_url }} |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
							
								
								
									
										100
									
								
								.github/workflows/pull_request.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										100
									
								
								.github/workflows/pull_request.yml
									
									
									
									
										vendored
									
									
								
							| @@ -2,107 +2,45 @@ name: On pull request | |||||||
|  |  | ||||||
| on: pull_request | on: pull_request | ||||||
|  |  | ||||||
| env: |  | ||||||
|   DEFAULT_PYTHON: 3.9 |  | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   build_devcontainer: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: Build Devcontainer |  | ||||||
|     # The Dockerfile contains features that requires buildkit, and since the |  | ||||||
|     # devcontainer cli uses docker-compose to build the image, the only way to |  | ||||||
|     # ensure docker-compose uses buildkit is to explicitly enable it. |  | ||||||
|     env: |  | ||||||
|       DOCKER_BUILDKIT: "1" |  | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v4 |  | ||||||
|       - uses: actions/setup-node@master |  | ||||||
|         with: |  | ||||||
|           node-version: 16.x |  | ||||||
|       - name: Install devcontainer cli |  | ||||||
|         run: npm install --global @devcontainers/cli |  | ||||||
|       - name: Build devcontainer |  | ||||||
|         run: devcontainer build --workspace-folder . |  | ||||||
|       # It would be nice to also test the following commands, but for some |  | ||||||
|       # reason they don't work even though in VS Code devcontainer works. |  | ||||||
|       # - name: Start devcontainer |  | ||||||
|       #   run: devcontainer up --workspace-folder . |  | ||||||
|       # - name: Run devcontainer scripts |  | ||||||
|       #   run: devcontainer run-user-commands --workspace-folder . |  | ||||||
|  |  | ||||||
|   web_lint: |   web_lint: | ||||||
|     name: Web - Lint |     name: Web - Lint | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@master | ||||||
|       - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|         with: |         with: | ||||||
|           node-version: 16.x |           node-version: 14.x | ||||||
|       - run: npm install |       - run: npm install | ||||||
|         working-directory: ./web |         working-directory: ./web | ||||||
|       - name: Lint |       - name: Lint | ||||||
|         run: npm run lint |         run: npm run lint:cmd | ||||||
|  |         working-directory: ./web | ||||||
|  |  | ||||||
|  |   web_build: | ||||||
|  |     name: Web - Build | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     steps: | ||||||
|  |       - uses: actions/checkout@master | ||||||
|  |       - uses: actions/setup-node@master | ||||||
|  |         with: | ||||||
|  |           node-version: 14.x | ||||||
|  |       - run: npm install | ||||||
|  |         working-directory: ./web | ||||||
|  |       - name: Build | ||||||
|  |         run: npm run build | ||||||
|         working-directory: ./web |         working-directory: ./web | ||||||
|  |  | ||||||
|   web_test: |   web_test: | ||||||
|     name: Web - Test |     name: Web - Test | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - uses: actions/checkout@v4 |       - uses: actions/checkout@master | ||||||
|       - uses: actions/setup-node@master |       - uses: actions/setup-node@master | ||||||
|         with: |         with: | ||||||
|           node-version: 16.x |           node-version: 14.x | ||||||
|       - run: npm install |       - run: npm install | ||||||
|         working-directory: ./web |         working-directory: ./web | ||||||
|       - name: Test |       - name: Test | ||||||
|         run: npm run test |         run: npm run test | ||||||
|         working-directory: ./web |         working-directory: ./web | ||||||
|  |  | ||||||
|   python_checks: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: Python Checks |  | ||||||
|     steps: |  | ||||||
|       - name: Check out the repository |  | ||||||
|         uses: actions/checkout@v4 |  | ||||||
|       - name: Set up Python ${{ env.DEFAULT_PYTHON }} |  | ||||||
|         uses: actions/setup-python@v4.7.1 |  | ||||||
|         with: |  | ||||||
|           python-version: ${{ env.DEFAULT_PYTHON }} |  | ||||||
|       - name: Install requirements |  | ||||||
|         run: | |  | ||||||
|           python3 -m pip install -U pip |  | ||||||
|           python3 -m pip install -r docker/main/requirements-dev.txt |  | ||||||
|       - name: Check black |  | ||||||
|         run: | |  | ||||||
|           black --check --diff frigate migrations docker *.py |  | ||||||
|       - name: Check isort |  | ||||||
|         run: | |  | ||||||
|           isort --check --diff frigate migrations docker *.py |  | ||||||
|       - name: Check ruff |  | ||||||
|         run: | |  | ||||||
|           ruff check frigate migrations docker *.py |  | ||||||
|  |  | ||||||
|   python_tests: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     name: Python Tests |  | ||||||
|     steps: |  | ||||||
|       - name: Check out code |  | ||||||
|         uses: actions/checkout@v4 |  | ||||||
|       - uses: actions/setup-node@master |  | ||||||
|         with: |  | ||||||
|           node-version: 16.x |  | ||||||
|       - run: npm install |  | ||||||
|         working-directory: ./web |  | ||||||
|       - name: Build web |  | ||||||
|         run: npm run build |  | ||||||
|         working-directory: ./web |  | ||||||
|       - name: Set up QEMU |  | ||||||
|         uses: docker/setup-qemu-action@v3 |  | ||||||
|       - name: Set up Docker Buildx |  | ||||||
|         uses: docker/setup-buildx-action@v3 |  | ||||||
|       - name: Build |  | ||||||
|         run: make |  | ||||||
|       - name: Run mypy |  | ||||||
|         run: docker run --rm --entrypoint=python3 frigate:latest -u -m mypy --config-file frigate/mypy.ini frigate |  | ||||||
|       - name: Run tests |  | ||||||
|         run: docker run --rm --entrypoint=python3 frigate:latest -u -m unittest |  | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										62
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,62 +0,0 @@ | |||||||
| name: On release |  | ||||||
|  |  | ||||||
| on: |  | ||||||
|   release: |  | ||||||
|     types: [published] |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   release: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|  |  | ||||||
|     steps: |  | ||||||
|       - uses: actions/checkout@v4 |  | ||||||
|       - id: lowercaseRepo |  | ||||||
|         uses: ASzc/change-string-case-action@v5 |  | ||||||
|         with: |  | ||||||
|           string: ${{ github.repository }} |  | ||||||
|       - name: Log in to the Container registry |  | ||||||
|         uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d |  | ||||||
|         with: |  | ||||||
|           registry: ghcr.io |  | ||||||
|           username: ${{ github.actor }} |  | ||||||
|           password: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|       - name: Create tag variables |  | ||||||
|         run: | |  | ||||||
|           echo "BASE=ghcr.io/${{ steps.lowercaseRepo.outputs.lowercase }}" >> $GITHUB_ENV |  | ||||||
|           echo "BUILD_TAG=${{ github.ref_name }}-${GITHUB_SHA::7}" >> $GITHUB_ENV |  | ||||||
|           echo "CLEAN_VERSION=$(echo ${GITHUB_REF##*/} | tr '[:upper:]' '[:lower:]' | sed 's/^[v]//')" >> $GITHUB_ENV |  | ||||||
|       - name: Tag and push the main image |  | ||||||
|         run: | |  | ||||||
|           VERSION_TAG=${BASE}:${CLEAN_VERSION} |  | ||||||
|           PULL_TAG=${BASE}:${BUILD_TAG} |  | ||||||
|           docker pull ${PULL_TAG} |  | ||||||
|           docker tag ${PULL_TAG} ${VERSION_TAG} |  | ||||||
|           docker push ${VERSION_TAG} |  | ||||||
|       - name: Tag and push standard arm64 |  | ||||||
|         run: | |  | ||||||
|           VERSION_TAG=${BASE}:${CLEAN_VERSION}-standard-arm64 |  | ||||||
|           PULL_TAG=${BASE}:${BUILD_TAG}-standard-arm64 |  | ||||||
|           docker pull ${PULL_TAG} |  | ||||||
|           docker tag ${PULL_TAG} ${VERSION_TAG} |  | ||||||
|           docker push ${VERSION_TAG} |  | ||||||
|       - name: Tag and push tensorrt |  | ||||||
|         run: | |  | ||||||
|           VERSION_TAG=${BASE}:${CLEAN_VERSION}-tensorrt |  | ||||||
|           PULL_TAG=${BASE}:${BUILD_TAG}-tensorrt |  | ||||||
|           docker pull ${PULL_TAG} |  | ||||||
|           docker tag ${PULL_TAG} ${VERSION_TAG} |  | ||||||
|           docker push ${VERSION_TAG} |  | ||||||
|       - name: Tag and push tensorrt-jp4 |  | ||||||
|         run: | |  | ||||||
|           VERSION_TAG=${BASE}:${CLEAN_VERSION}-tensorrt-jp4 |  | ||||||
|           PULL_TAG=${BASE}:${BUILD_TAG}-tensorrt-jp4 |  | ||||||
|           docker pull ${PULL_TAG} |  | ||||||
|           docker tag ${PULL_TAG} ${VERSION_TAG} |  | ||||||
|           docker push ${VERSION_TAG} |  | ||||||
|       - name: Tag and push tensorrt-jp5 |  | ||||||
|         run: | |  | ||||||
|           VERSION_TAG=${BASE}:${CLEAN_VERSION}-tensorrt-jp5 |  | ||||||
|           PULL_TAG=${BASE}:${BUILD_TAG}-tensorrt-jp5 |  | ||||||
|           docker pull ${PULL_TAG} |  | ||||||
|           docker tag ${PULL_TAG} ${VERSION_TAG} |  | ||||||
|           docker push ${VERSION_TAG} |  | ||||||
							
								
								
									
										26
									
								
								.github/workflows/stale.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/workflows/stale.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,26 +0,0 @@ | |||||||
| # Close Stale Issues |  | ||||||
| # Warns and then closes issues and PRs that have had no activity for a specified amount of time. |  | ||||||
| # https://github.com/actions/stale |  | ||||||
|  |  | ||||||
| name: "Stalebot" |  | ||||||
| on: |  | ||||||
|   schedule: |  | ||||||
|     - cron: "0 0 * * *" # run stalebot once a day |  | ||||||
|  |  | ||||||
| jobs: |  | ||||||
|   stale: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     steps: |  | ||||||
|       - uses: actions/stale@main |  | ||||||
|         id: stale |  | ||||||
|         with: |  | ||||||
|           stale-issue-message: "This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions." |  | ||||||
|           close-issue-message: "" |  | ||||||
|           days-before-stale: 30 |  | ||||||
|           days-before-close: 3 |  | ||||||
|           exempt-draft-pr: true |  | ||||||
|           exempt-issue-labels: "pinned,security" |  | ||||||
|           exempt-pr-labels: "pinned,security,dependencies" |  | ||||||
|           operations-per-run: 120 |  | ||||||
|       - name: Print outputs |  | ||||||
|         run: echo ${{ join(steps.stale.outputs.*, ',') }} |  | ||||||
							
								
								
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -2,10 +2,8 @@ | |||||||
| *.pyc | *.pyc | ||||||
| *.swp | *.swp | ||||||
| debug | debug | ||||||
| .vscode/* | .vscode | ||||||
| !.vscode/launch.json | config/config.yml | ||||||
| config/* |  | ||||||
| !config/*.example |  | ||||||
| models | models | ||||||
| *.mp4 | *.mp4 | ||||||
| *.ts | *.ts | ||||||
| @@ -16,5 +14,3 @@ web/build | |||||||
| web/node_modules | web/node_modules | ||||||
| web/coverage | web/coverage | ||||||
| core | core | ||||||
| !/web/**/*.ts |  | ||||||
| .idea/* |  | ||||||
							
								
								
									
										12
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							| @@ -1,12 +0,0 @@ | |||||||
| { |  | ||||||
|   "version": "0.2.0", |  | ||||||
|   "configurations": [ |  | ||||||
|     { |  | ||||||
|       "name": "Python: Launch Frigate", |  | ||||||
|       "type": "python", |  | ||||||
|       "request": "launch", |  | ||||||
|       "module": "frigate", |  | ||||||
|       "justMyCode": true |  | ||||||
|     } |  | ||||||
|   ] |  | ||||||
| } |  | ||||||
| @@ -1,4 +0,0 @@ | |||||||
| # Community-supported boards |  | ||||||
| /docker/tensorrt/ @madsciencetist @NateMeyer |  | ||||||
| /docker/tensorrt/*arm64* @madsciencetist |  | ||||||
| /docker/tensorrt/*jetson* @madsciencetist |  | ||||||
							
								
								
									
										80
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,42 +1,62 @@ | |||||||
| default_target: local | default_target: amd64_frigate | ||||||
|  |  | ||||||
| COMMIT_HASH := $(shell git log -1 --pretty=format:"%h"|tail -1) | COMMIT_HASH := $(shell git log -1 --pretty=format:"%h"|tail -1) | ||||||
| VERSION = 0.13.0 |  | ||||||
| IMAGE_REPO ?= ghcr.io/blakeblackshear/frigate |  | ||||||
| GITHUB_REF_NAME ?= $(shell git rev-parse --abbrev-ref HEAD) |  | ||||||
| CURRENT_UID := $(shell id -u) |  | ||||||
| CURRENT_GID := $(shell id -g) |  | ||||||
| BOARDS= #Initialized empty |  | ||||||
|  |  | ||||||
| include docker/*/*.mk |  | ||||||
|  |  | ||||||
| build-boards: $(BOARDS:%=build-%) |  | ||||||
|  |  | ||||||
| push-boards: $(BOARDS:%=push-%) |  | ||||||
|  |  | ||||||
| version: | version: | ||||||
| 	echo 'VERSION = "$(VERSION)-$(COMMIT_HASH)"' > frigate/version.py | 	echo "VERSION='0.10.0-$(COMMIT_HASH)'" > frigate/version.py | ||||||
|  |  | ||||||
| local: version | web: | ||||||
| 	docker buildx build --target=frigate --tag frigate:latest --load --file docker/main/Dockerfile . | 	docker build --tag frigate-web --file docker/Dockerfile.web web/ | ||||||
|  |  | ||||||
| amd64: | amd64_wheels: | ||||||
| 	docker buildx build --platform linux/amd64 --target=frigate --tag $(IMAGE_REPO):$(VERSION)-$(COMMIT_HASH) --file docker/main/Dockerfile . | 	docker build --tag blakeblackshear/frigate-wheels:1.0.3-amd64 --file docker/Dockerfile.wheels . | ||||||
|  |  | ||||||
| arm64: | amd64_ffmpeg: | ||||||
| 	docker buildx build --platform linux/arm64 --target=frigate --tag $(IMAGE_REPO):$(VERSION)-$(COMMIT_HASH) --file docker/main/Dockerfile . | 	docker build --no-cache --pull --tag blakeblackshear/frigate-ffmpeg:1.2.0-amd64 --file docker/Dockerfile.ffmpeg.amd64 . | ||||||
|  |  | ||||||
| build: version amd64 arm64 | nginx_frigate: | ||||||
| 	docker buildx build --platform linux/arm64/v8,linux/amd64 --target=frigate --tag $(IMAGE_REPO):$(VERSION)-$(COMMIT_HASH) --file docker/main/Dockerfile . | 	docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 --tag blakeblackshear/frigate-nginx:1.0.2 --file docker/Dockerfile.nginx . | ||||||
|  |  | ||||||
| push: push-boards | amd64_frigate: version web | ||||||
| 	docker buildx build --push --platform linux/arm64/v8,linux/amd64 --target=frigate --tag $(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH) --file docker/main/Dockerfile . | 	docker build --no-cache --tag frigate-base --build-arg ARCH=amd64 --build-arg FFMPEG_VERSION=1.1.0 --build-arg WHEELS_VERSION=1.0.3 --build-arg NGINX_VERSION=1.0.2 --file docker/Dockerfile.base . | ||||||
|  | 	docker build --no-cache --tag frigate --file docker/Dockerfile.amd64 . | ||||||
|  |  | ||||||
| run: local | amd64_all: amd64_wheels amd64_ffmpeg amd64_frigate | ||||||
| 	docker run --rm --publish=5000:5000 --volume=${PWD}/config:/config frigate:latest |  | ||||||
|  |  | ||||||
| run_tests: local | amd64nvidia_wheels: | ||||||
| 	docker run --rm --workdir=/opt/frigate --entrypoint= frigate:latest python3 -u -m unittest | 	docker build --tag blakeblackshear/frigate-wheels:1.0.3-amd64nvidia --file docker/Dockerfile.wheels . | ||||||
| 	docker run --rm --workdir=/opt/frigate --entrypoint= frigate:latest python3 -u -m mypy --config-file frigate/mypy.ini frigate |  | ||||||
|  |  | ||||||
| .PHONY: run_tests | amd64nvidia_ffmpeg: | ||||||
|  | 	docker build --no-cache --pull --tag blakeblackshear/frigate-ffmpeg:1.2.0-amd64nvidia --file docker/Dockerfile.ffmpeg.amd64nvidia . | ||||||
|  |  | ||||||
|  | amd64nvidia_frigate: version web | ||||||
|  | 	docker build --no-cache --tag frigate-base --build-arg ARCH=amd64nvidia --build-arg FFMPEG_VERSION=1.0.0 --build-arg WHEELS_VERSION=1.0.3 --build-arg NGINX_VERSION=1.0.2 --file docker/Dockerfile.base . | ||||||
|  | 	docker build --no-cache --tag frigate --file docker/Dockerfile.amd64nvidia . | ||||||
|  |  | ||||||
|  | amd64nvidia_all: amd64nvidia_wheels amd64nvidia_ffmpeg amd64nvidia_frigate | ||||||
|  |  | ||||||
|  | aarch64_wheels: | ||||||
|  | 	docker build --tag blakeblackshear/frigate-wheels:1.0.3-aarch64 --file docker/Dockerfile.wheels . | ||||||
|  |  | ||||||
|  | aarch64_ffmpeg: | ||||||
|  | 	docker build --no-cache --pull --tag blakeblackshear/frigate-ffmpeg:1.3.0-aarch64 --file docker/Dockerfile.ffmpeg.aarch64 . | ||||||
|  |  | ||||||
|  | aarch64_frigate: version web | ||||||
|  | 	docker build --no-cache --tag frigate-base --build-arg ARCH=aarch64 --build-arg FFMPEG_VERSION=1.0.0 --build-arg WHEELS_VERSION=1.0.3 --build-arg NGINX_VERSION=1.0.2 --file docker/Dockerfile.base . | ||||||
|  | 	docker build --no-cache --tag frigate --file docker/Dockerfile.aarch64 . | ||||||
|  |  | ||||||
|  | aarch64_all: aarch64_wheels aarch64_ffmpeg aarch64_frigate | ||||||
|  |  | ||||||
|  | armv7_wheels: | ||||||
|  | 	docker build --tag blakeblackshear/frigate-wheels:1.0.3-armv7 --file docker/Dockerfile.wheels . | ||||||
|  |  | ||||||
|  | armv7_ffmpeg: | ||||||
|  | 	docker build --no-cache --pull --tag blakeblackshear/frigate-ffmpeg:1.2.0-armv7 --file docker/Dockerfile.ffmpeg.armv7 . | ||||||
|  |  | ||||||
|  | armv7_frigate: version web | ||||||
|  | 	docker build --no-cache --tag frigate-base --build-arg ARCH=armv7 --build-arg FFMPEG_VERSION=1.0.0 --build-arg WHEELS_VERSION=1.0.3 --build-arg NGINX_VERSION=1.0.2 --file docker/Dockerfile.base . | ||||||
|  | 	docker build --no-cache --tag frigate --file docker/Dockerfile.armv7 . | ||||||
|  |  | ||||||
|  | armv7_all: armv7_wheels armv7_ffmpeg armv7_frigate | ||||||
|  |  | ||||||
|  | .PHONY: web | ||||||
|   | |||||||
| @@ -16,8 +16,7 @@ Use of a [Google Coral Accelerator](https://coral.ai/products/) is optional, but | |||||||
| - Communicates over MQTT for easy integration into other systems | - Communicates over MQTT for easy integration into other systems | ||||||
| - Records video with retention settings based on detected objects | - Records video with retention settings based on detected objects | ||||||
| - 24/7 recording | - 24/7 recording | ||||||
| - Re-streaming via RTSP to reduce the number of connections to your camera | - Re-streaming via RTMP to reduce the number of connections to your camera | ||||||
| - WebRTC & MSE support for low-latency live view |  | ||||||
|  |  | ||||||
| ## Documentation | ## Documentation | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,521 +0,0 @@ | |||||||
| speech |  | ||||||
| speech |  | ||||||
| speech |  | ||||||
| speech |  | ||||||
| babbling |  | ||||||
| speech |  | ||||||
| yell |  | ||||||
| bellow |  | ||||||
| whoop |  | ||||||
| yell |  | ||||||
| yell |  | ||||||
| yell |  | ||||||
| whispering |  | ||||||
| laughter |  | ||||||
| laughter |  | ||||||
| laughter |  | ||||||
| snicker |  | ||||||
| laughter |  | ||||||
| laughter |  | ||||||
| crying |  | ||||||
| crying |  | ||||||
| crying |  | ||||||
| yell |  | ||||||
| sigh |  | ||||||
| singing |  | ||||||
| choir |  | ||||||
| sodeling |  | ||||||
| chant |  | ||||||
| mantra |  | ||||||
| child_singing |  | ||||||
| synthetic_singing |  | ||||||
| rapping |  | ||||||
| humming |  | ||||||
| groan |  | ||||||
| grunt |  | ||||||
| whistling |  | ||||||
| breathing |  | ||||||
| wheeze |  | ||||||
| snoring |  | ||||||
| gasp |  | ||||||
| pant |  | ||||||
| snort |  | ||||||
| cough |  | ||||||
| throat_clearing |  | ||||||
| sneeze |  | ||||||
| sniff |  | ||||||
| run |  | ||||||
| shuffle |  | ||||||
| footsteps |  | ||||||
| chewing |  | ||||||
| biting |  | ||||||
| gargling |  | ||||||
| stomach_rumble |  | ||||||
| burping |  | ||||||
| hiccup |  | ||||||
| fart |  | ||||||
| hands |  | ||||||
| finger_snapping |  | ||||||
| clapping |  | ||||||
| heartbeat |  | ||||||
| heart_murmur |  | ||||||
| cheering |  | ||||||
| applause |  | ||||||
| chatter |  | ||||||
| crowd |  | ||||||
| speech |  | ||||||
| children_playing |  | ||||||
| animal |  | ||||||
| pets |  | ||||||
| dog |  | ||||||
| bark |  | ||||||
| yip |  | ||||||
| howl |  | ||||||
| bow-wow |  | ||||||
| growling |  | ||||||
| whimper_dog |  | ||||||
| cat |  | ||||||
| purr |  | ||||||
| meow |  | ||||||
| hiss |  | ||||||
| caterwaul |  | ||||||
| livestock |  | ||||||
| horse |  | ||||||
| clip-clop |  | ||||||
| neigh |  | ||||||
| cattle |  | ||||||
| moo |  | ||||||
| cowbell |  | ||||||
| pig |  | ||||||
| oink |  | ||||||
| goat |  | ||||||
| bleat |  | ||||||
| sheep |  | ||||||
| fowl |  | ||||||
| chicken |  | ||||||
| cluck |  | ||||||
| cock-a-doodle-doo |  | ||||||
| turkey |  | ||||||
| gobble |  | ||||||
| duck |  | ||||||
| quack |  | ||||||
| goose |  | ||||||
| honk |  | ||||||
| wild_animals |  | ||||||
| roaring_cats |  | ||||||
| roar |  | ||||||
| bird |  | ||||||
| chird |  | ||||||
| chirp |  | ||||||
| squawk |  | ||||||
| pigeon |  | ||||||
| coo |  | ||||||
| crow |  | ||||||
| caw |  | ||||||
| owl |  | ||||||
| hoot |  | ||||||
| flapping_wings |  | ||||||
| dogs |  | ||||||
| rats |  | ||||||
| mouse |  | ||||||
| patter |  | ||||||
| insect |  | ||||||
| cricket |  | ||||||
| mosquito |  | ||||||
| fly |  | ||||||
| buzz |  | ||||||
| buzz |  | ||||||
| frog |  | ||||||
| croak |  | ||||||
| snake |  | ||||||
| rattle |  | ||||||
| whale_vocalization |  | ||||||
| music |  | ||||||
| musical_instrument |  | ||||||
| plucked_string_instrument |  | ||||||
| guitar |  | ||||||
| electric_guitar |  | ||||||
| bass_guitar |  | ||||||
| acoustic_guitar |  | ||||||
| steel_guitar |  | ||||||
| tapping |  | ||||||
| strum |  | ||||||
| banjo |  | ||||||
| sitar |  | ||||||
| mandolin |  | ||||||
| zither |  | ||||||
| ukulele |  | ||||||
| keyboard |  | ||||||
| piano |  | ||||||
| electric_piano |  | ||||||
| organ |  | ||||||
| electronic_organ |  | ||||||
| hammond_organ |  | ||||||
| synthesizer |  | ||||||
| sampler |  | ||||||
| harpsichord |  | ||||||
| percussion |  | ||||||
| drum_kit |  | ||||||
| drum_machine |  | ||||||
| drum |  | ||||||
| snare_drum |  | ||||||
| rimshot |  | ||||||
| drum_roll |  | ||||||
| bass_drum |  | ||||||
| timpani |  | ||||||
| tabla |  | ||||||
| cymbal |  | ||||||
| hi-hat |  | ||||||
| wood_block |  | ||||||
| tambourine |  | ||||||
| rattle |  | ||||||
| maraca |  | ||||||
| gong |  | ||||||
| tubular_bells |  | ||||||
| mallet_percussion |  | ||||||
| marimba |  | ||||||
| glockenspiel |  | ||||||
| vibraphone |  | ||||||
| steelpan |  | ||||||
| orchestra |  | ||||||
| brass_instrument |  | ||||||
| french_horn |  | ||||||
| trumpet |  | ||||||
| trombone |  | ||||||
| bowed_string_instrument |  | ||||||
| string_section |  | ||||||
| violin |  | ||||||
| pizzicato |  | ||||||
| cello |  | ||||||
| double_bass |  | ||||||
| wind_instrument |  | ||||||
| flute |  | ||||||
| saxophone |  | ||||||
| clarinet |  | ||||||
| harp |  | ||||||
| bell |  | ||||||
| church_bell |  | ||||||
| jingle_bell |  | ||||||
| bicycle_bell |  | ||||||
| tuning_fork |  | ||||||
| chime |  | ||||||
| wind_chime |  | ||||||
| change_ringing |  | ||||||
| harmonica |  | ||||||
| accordion |  | ||||||
| bagpipes |  | ||||||
| didgeridoo |  | ||||||
| shofar |  | ||||||
| theremin |  | ||||||
| singing_bowl |  | ||||||
| scratching |  | ||||||
| pop_music |  | ||||||
| hip_hop_music |  | ||||||
| beatboxing |  | ||||||
| rock_music |  | ||||||
| heavy_metal |  | ||||||
| punk_rock |  | ||||||
| grunge |  | ||||||
| progressive_rock |  | ||||||
| rock_and_roll |  | ||||||
| psychedelic_rock |  | ||||||
| rhythm_and_blues |  | ||||||
| soul_music |  | ||||||
| reggae |  | ||||||
| country |  | ||||||
| swing_music |  | ||||||
| bluegrass |  | ||||||
| funk |  | ||||||
| folk_music |  | ||||||
| middle_eastern_music |  | ||||||
| jazz |  | ||||||
| disco |  | ||||||
| classical_music |  | ||||||
| opera |  | ||||||
| electronic_music |  | ||||||
| house_music |  | ||||||
| techno |  | ||||||
| dubstep |  | ||||||
| drum_and_bass |  | ||||||
| electronica |  | ||||||
| electronic_dance_music |  | ||||||
| ambient_music |  | ||||||
| trance_music |  | ||||||
| music_of_latin_america |  | ||||||
| salsa_music |  | ||||||
| flamenco |  | ||||||
| blues |  | ||||||
| music_for_children |  | ||||||
| new-age_music |  | ||||||
| vocal_music |  | ||||||
| a_capella |  | ||||||
| music_of_africa |  | ||||||
| afrobeat |  | ||||||
| christian_music |  | ||||||
| gospel_music |  | ||||||
| music_of_asia |  | ||||||
| carnatic_music |  | ||||||
| music_of_bollywood |  | ||||||
| ska |  | ||||||
| traditional_music |  | ||||||
| independent_music |  | ||||||
| song |  | ||||||
| background_music |  | ||||||
| theme_music |  | ||||||
| jingle |  | ||||||
| soundtrack_music |  | ||||||
| lullaby |  | ||||||
| video_game_music |  | ||||||
| christmas_music |  | ||||||
| dance_music |  | ||||||
| wedding_music |  | ||||||
| happy_music |  | ||||||
| sad_music |  | ||||||
| tender_music |  | ||||||
| exciting_music |  | ||||||
| angry_music |  | ||||||
| scary_music |  | ||||||
| wind |  | ||||||
| rustling_leaves |  | ||||||
| wind_noise |  | ||||||
| thunderstorm |  | ||||||
| thunder |  | ||||||
| water |  | ||||||
| rain |  | ||||||
| raindrop |  | ||||||
| rain_on_surface |  | ||||||
| stream |  | ||||||
| waterfall |  | ||||||
| ocean |  | ||||||
| waves |  | ||||||
| steam |  | ||||||
| gurgling |  | ||||||
| fire |  | ||||||
| crackle |  | ||||||
| vehicle |  | ||||||
| boat |  | ||||||
| sailboat |  | ||||||
| rowboat |  | ||||||
| motorboat |  | ||||||
| ship |  | ||||||
| motor_vehicle |  | ||||||
| car |  | ||||||
| honk |  | ||||||
| toot |  | ||||||
| car_alarm |  | ||||||
| power_windows |  | ||||||
| skidding |  | ||||||
| tire_squeal |  | ||||||
| car_passing_by |  | ||||||
| race_car |  | ||||||
| truck |  | ||||||
| air_brake |  | ||||||
| air_horn |  | ||||||
| reversing_beeps |  | ||||||
| ice_cream_truck |  | ||||||
| bus |  | ||||||
| emergency_vehicle |  | ||||||
| police_car |  | ||||||
| ambulance |  | ||||||
| fire_engine |  | ||||||
| motorcycle |  | ||||||
| traffic_noise |  | ||||||
| rail_transport |  | ||||||
| train |  | ||||||
| train_whistle |  | ||||||
| train_horn |  | ||||||
| railroad_car |  | ||||||
| train_wheels_squealing |  | ||||||
| subway |  | ||||||
| aircraft |  | ||||||
| aircraft_engine |  | ||||||
| jet_engine |  | ||||||
| propeller |  | ||||||
| helicopter |  | ||||||
| fixed-wing_aircraft |  | ||||||
| bicycle |  | ||||||
| skateboard |  | ||||||
| engine |  | ||||||
| light_engine |  | ||||||
| dental_drill's_drill |  | ||||||
| lawn_mower |  | ||||||
| chainsaw |  | ||||||
| medium_engine |  | ||||||
| heavy_engine |  | ||||||
| engine_knocking |  | ||||||
| engine_starting |  | ||||||
| idling |  | ||||||
| accelerating |  | ||||||
| door |  | ||||||
| doorbell |  | ||||||
| ding-dong |  | ||||||
| sliding_door |  | ||||||
| slam |  | ||||||
| knock |  | ||||||
| tap |  | ||||||
| squeak |  | ||||||
| cupboard_open_or_close |  | ||||||
| drawer_open_or_close |  | ||||||
| dishes |  | ||||||
| cutlery |  | ||||||
| chopping |  | ||||||
| frying |  | ||||||
| microwave_oven |  | ||||||
| blender |  | ||||||
| water_tap |  | ||||||
| sink |  | ||||||
| bathtub |  | ||||||
| hair_dryer |  | ||||||
| toilet_flush |  | ||||||
| toothbrush |  | ||||||
| electric_toothbrush |  | ||||||
| vacuum_cleaner |  | ||||||
| zipper |  | ||||||
| keys_jangling |  | ||||||
| coin |  | ||||||
| scissors |  | ||||||
| electric_shaver |  | ||||||
| shuffling_cards |  | ||||||
| typing |  | ||||||
| typewriter |  | ||||||
| computer_keyboard |  | ||||||
| writing |  | ||||||
| alarm |  | ||||||
| telephone |  | ||||||
| telephone_bell_ringing |  | ||||||
| ringtone |  | ||||||
| telephone_dialing |  | ||||||
| dial_tone |  | ||||||
| busy_signal |  | ||||||
| alarm_clock |  | ||||||
| siren |  | ||||||
| civil_defense_siren |  | ||||||
| buzzer |  | ||||||
| smoke_detector |  | ||||||
| fire_alarm |  | ||||||
| foghorn |  | ||||||
| whistle |  | ||||||
| steam_whistle |  | ||||||
| mechanisms |  | ||||||
| ratchet |  | ||||||
| clock |  | ||||||
| tick |  | ||||||
| tick-tock |  | ||||||
| gears |  | ||||||
| pulleys |  | ||||||
| sewing_machine |  | ||||||
| mechanical_fan |  | ||||||
| air_conditioning |  | ||||||
| cash_register |  | ||||||
| printer |  | ||||||
| camera |  | ||||||
| single-lens_reflex_camera |  | ||||||
| tools |  | ||||||
| hammer |  | ||||||
| jackhammer |  | ||||||
| sawing |  | ||||||
| filing |  | ||||||
| sanding |  | ||||||
| power_tool |  | ||||||
| drill |  | ||||||
| explosion |  | ||||||
| gunshot |  | ||||||
| machine_gun |  | ||||||
| fusillade |  | ||||||
| artillery_fire |  | ||||||
| cap_gun |  | ||||||
| fireworks |  | ||||||
| firecracker |  | ||||||
| burst |  | ||||||
| eruption |  | ||||||
| boom |  | ||||||
| wood |  | ||||||
| chop |  | ||||||
| splinter |  | ||||||
| crack |  | ||||||
| glass |  | ||||||
| chink |  | ||||||
| shatter |  | ||||||
| liquid |  | ||||||
| splash |  | ||||||
| slosh |  | ||||||
| squish |  | ||||||
| drip |  | ||||||
| pour |  | ||||||
| trickle |  | ||||||
| gush |  | ||||||
| fill |  | ||||||
| spray |  | ||||||
| pump |  | ||||||
| stir |  | ||||||
| boiling |  | ||||||
| sonar |  | ||||||
| arrow |  | ||||||
| whoosh |  | ||||||
| thump |  | ||||||
| thunk |  | ||||||
| electronic_tuner |  | ||||||
| effects_unit |  | ||||||
| chorus_effect |  | ||||||
| basketball_bounce |  | ||||||
| bang |  | ||||||
| slap |  | ||||||
| whack |  | ||||||
| smash |  | ||||||
| breaking |  | ||||||
| bouncing |  | ||||||
| whip |  | ||||||
| flap |  | ||||||
| scratch |  | ||||||
| scrape |  | ||||||
| rub |  | ||||||
| roll |  | ||||||
| crushing |  | ||||||
| crumpling |  | ||||||
| tearing |  | ||||||
| beep |  | ||||||
| ping |  | ||||||
| ding |  | ||||||
| clang |  | ||||||
| squeal |  | ||||||
| creak |  | ||||||
| rustle |  | ||||||
| whir |  | ||||||
| clatter |  | ||||||
| sizzle |  | ||||||
| clicking |  | ||||||
| clickety-clack |  | ||||||
| rumble |  | ||||||
| plop |  | ||||||
| jingle |  | ||||||
| hum |  | ||||||
| zing |  | ||||||
| boing |  | ||||||
| crunch |  | ||||||
| silence |  | ||||||
| sine_wave |  | ||||||
| harmonic |  | ||||||
| chirp_tone |  | ||||||
| sound_effect |  | ||||||
| pulse |  | ||||||
| inside |  | ||||||
| inside |  | ||||||
| inside |  | ||||||
| outside |  | ||||||
| outside |  | ||||||
| reverberation |  | ||||||
| echo |  | ||||||
| noise |  | ||||||
| environmental_noise |  | ||||||
| static |  | ||||||
| mains_hum |  | ||||||
| distortion |  | ||||||
| sidetone |  | ||||||
| cacophony |  | ||||||
| white_noise |  | ||||||
| pink_noise |  | ||||||
| throbbing |  | ||||||
| vibration |  | ||||||
| television |  | ||||||
| radio |  | ||||||
| field_recording |  | ||||||
							
								
								
									
										43
									
								
								benchmark.py
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								benchmark.py
									
									
									
									
									
								
							| @@ -1,18 +1,12 @@ | |||||||
| import datetime | import os | ||||||
| import multiprocessing as mp |  | ||||||
| from statistics import mean | from statistics import mean | ||||||
|  | import multiprocessing as mp | ||||||
| import numpy as np | import numpy as np | ||||||
|  | import datetime | ||||||
|  | from frigate.edgetpu import LocalObjectDetector, EdgeTPUProcess, RemoteObjectDetector, load_labels | ||||||
|  |  | ||||||
| from frigate.config import DetectorTypeEnum | my_frame = np.expand_dims(np.full((300,300,3), 1, np.uint8), axis=0) | ||||||
| from frigate.object_detection import ( | labels = load_labels('/labelmap.txt') | ||||||
|     ObjectDetectProcess, |  | ||||||
|     RemoteObjectDetector, |  | ||||||
|     load_labels, |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| my_frame = np.expand_dims(np.full((300, 300, 3), 1, np.uint8), axis=0) |  | ||||||
| labels = load_labels("/labelmap.txt") |  | ||||||
|  |  | ||||||
| ###### | ###### | ||||||
| # Minimal same process runner | # Minimal same process runner | ||||||
| @@ -45,24 +39,21 @@ labels = load_labels("/labelmap.txt") | |||||||
|  |  | ||||||
|  |  | ||||||
| def start(id, num_detections, detection_queue, event): | def start(id, num_detections, detection_queue, event): | ||||||
|     object_detector = RemoteObjectDetector( |   object_detector = RemoteObjectDetector(str(id), '/labelmap.txt', detection_queue, event) | ||||||
|         str(id), "/labelmap.txt", detection_queue, event |  | ||||||
|     ) |  | ||||||
|   start = datetime.datetime.now().timestamp() |   start = datetime.datetime.now().timestamp() | ||||||
|  |  | ||||||
|   frame_times = [] |   frame_times = [] | ||||||
|   for x in range(0, num_detections): |   for x in range(0, num_detections): | ||||||
|     start_frame = datetime.datetime.now().timestamp() |     start_frame = datetime.datetime.now().timestamp() | ||||||
|         object_detector.detect(my_frame) |     detections = object_detector.detect(my_frame) | ||||||
|         frame_times.append(datetime.datetime.now().timestamp() - start_frame) |     frame_times.append(datetime.datetime.now().timestamp()-start_frame) | ||||||
|  |  | ||||||
|     duration = datetime.datetime.now().timestamp() - start |   duration = datetime.datetime.now().timestamp()-start | ||||||
|   object_detector.cleanup() |   object_detector.cleanup() | ||||||
|   print(f"{id} - Processed for {duration:.2f} seconds.") |   print(f"{id} - Processed for {duration:.2f} seconds.") | ||||||
|   print(f"{id} - FPS: {object_detector.fps.eps():.2f}") |   print(f"{id} - FPS: {object_detector.fps.eps():.2f}") | ||||||
|   print(f"{id} - Average frame processing time: {mean(frame_times)*1000:.2f}ms") |   print(f"{id} - Average frame processing time: {mean(frame_times)*1000:.2f}ms") | ||||||
|  |  | ||||||
|  |  | ||||||
| ###### | ###### | ||||||
| # Separate process runner | # Separate process runner | ||||||
| ###### | ###### | ||||||
| @@ -82,17 +73,11 @@ events = {} | |||||||
| for x in range(0, 10): | for x in range(0, 10): | ||||||
|   events[str(x)] = mp.Event() |   events[str(x)] = mp.Event() | ||||||
| detection_queue = mp.Queue() | detection_queue = mp.Queue() | ||||||
| edgetpu_process_1 = ObjectDetectProcess( | edgetpu_process_1 = EdgeTPUProcess(detection_queue, events, 'usb:0') | ||||||
|     detection_queue, events, DetectorTypeEnum.edgetpu, "usb:0" | edgetpu_process_2 = EdgeTPUProcess(detection_queue, events, 'usb:1') | ||||||
| ) |  | ||||||
| edgetpu_process_2 = ObjectDetectProcess( |  | ||||||
|     detection_queue, events, DetectorTypeEnum.edgetpu, "usb:1" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| for x in range(0, 10): | for x in range(0, 10): | ||||||
|     camera_process = mp.Process( |   camera_process = mp.Process(target=start, args=(x, 300, detection_queue, events[str(x)])) | ||||||
|         target=start, args=(x, 300, detection_queue, events[str(x)]) |  | ||||||
|     ) |  | ||||||
|   camera_process.daemon = True |   camera_process.daemon = True | ||||||
|   camera_processes.append(camera_process) |   camera_processes.append(camera_process) | ||||||
|  |  | ||||||
| @@ -104,5 +89,5 @@ for p in camera_processes: | |||||||
| for p in camera_processes: | for p in camera_processes: | ||||||
|   p.join() |   p.join() | ||||||
|  |  | ||||||
| duration = datetime.datetime.now().timestamp() - start_time | duration = datetime.datetime.now().timestamp()-start_time | ||||||
| print(f"Total - Processed for {duration:.2f} seconds.") | print(f"Total - Processed for {duration:.2f} seconds.") | ||||||
| @@ -1,118 +0,0 @@ | |||||||
| import datetime |  | ||||||
| import multiprocessing as mp |  | ||||||
| import os |  | ||||||
|  |  | ||||||
| import cv2 |  | ||||||
| import numpy as np |  | ||||||
|  |  | ||||||
| from frigate.config import MotionConfig |  | ||||||
| from frigate.motion.improved_motion import ImprovedMotionDetector |  | ||||||
| from frigate.util import create_mask |  | ||||||
|  |  | ||||||
| # get info on the video |  | ||||||
| # cap = cv2.VideoCapture("debug/front_cam_2023_05_23_08_41__2023_05_23_08_43.mp4") |  | ||||||
| # cap = cv2.VideoCapture("debug/motion_test_clips/rain_1.mp4") |  | ||||||
| cap = cv2.VideoCapture("debug/motion_test_clips/lawn_mower_night_1.mp4") |  | ||||||
| # cap = cv2.VideoCapture("airport.mp4") |  | ||||||
| width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |  | ||||||
| height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |  | ||||||
| fps = cap.get(cv2.CAP_PROP_FPS) |  | ||||||
| frame_shape = (height, width, 3) |  | ||||||
| # Nick back: |  | ||||||
| # "1280,0,1280,316,1170,216,1146,126,1016,127,979,82,839,0", |  | ||||||
| # "310,350,300,402,224,405,241,354", |  | ||||||
| # "378,0,375,26,0,23,0,0", |  | ||||||
| # Front door: |  | ||||||
| # "1080,0,1080,339,1010,280,1020,169,777,163,452,170,318,299,191,365,186,417,139,470,108,516,40,530,0,514,0,0", |  | ||||||
| # "336,833,438,1024,346,1093,103,1052,24,814", |  | ||||||
| # Back |  | ||||||
| # "1855,0,1851,100,1289,96,1105,161,1045,119,890,121,890,0", |  | ||||||
| # "505,95,506,138,388,153,384,114", |  | ||||||
| # "689,72,689,122,549,134,547,89", |  | ||||||
| # "261,134,264,176,169,195,167,158", |  | ||||||
| # "145,159,146,202,70,220,65,183", |  | ||||||
|  |  | ||||||
| mask = create_mask( |  | ||||||
|     (height, width), |  | ||||||
|     [ |  | ||||||
|         "1080,0,1080,339,1010,280,1020,169,777,163,452,170,318,299,191,365,186,417,139,470,108,516,40,530,0,514,0,0", |  | ||||||
|         "336,833,438,1024,346,1093,103,1052,24,814", |  | ||||||
|     ], |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| # create the motion config |  | ||||||
| motion_config_1 = MotionConfig() |  | ||||||
| motion_config_1.mask = np.zeros((height, width), np.uint8) |  | ||||||
| motion_config_1.mask[:] = mask |  | ||||||
| # motion_config_1.improve_contrast = 1 |  | ||||||
| motion_config_1.frame_height = 150 |  | ||||||
| # motion_config_1.frame_alpha = 0.02 |  | ||||||
| # motion_config_1.threshold = 30 |  | ||||||
| # motion_config_1.contour_area = 10 |  | ||||||
|  |  | ||||||
| motion_config_2 = MotionConfig() |  | ||||||
| motion_config_2.mask = np.zeros((height, width), np.uint8) |  | ||||||
| motion_config_2.mask[:] = mask |  | ||||||
| # motion_config_2.improve_contrast = 1 |  | ||||||
| motion_config_2.frame_height = 150 |  | ||||||
| # motion_config_2.frame_alpha = 0.01 |  | ||||||
| motion_config_2.threshold = 20 |  | ||||||
| # motion_config.contour_area = 10 |  | ||||||
|  |  | ||||||
| save_images = True |  | ||||||
|  |  | ||||||
| improved_motion_detector_1 = ImprovedMotionDetector( |  | ||||||
|     frame_shape=frame_shape, |  | ||||||
|     config=motion_config_1, |  | ||||||
|     fps=fps, |  | ||||||
|     improve_contrast=mp.Value("i", motion_config_1.improve_contrast), |  | ||||||
|     threshold=mp.Value("i", motion_config_1.threshold), |  | ||||||
|     contour_area=mp.Value("i", motion_config_1.contour_area), |  | ||||||
|     name="default", |  | ||||||
| ) |  | ||||||
| improved_motion_detector_1.save_images = save_images |  | ||||||
|  |  | ||||||
| improved_motion_detector_2 = ImprovedMotionDetector( |  | ||||||
|     frame_shape=frame_shape, |  | ||||||
|     config=motion_config_2, |  | ||||||
|     fps=fps, |  | ||||||
|     improve_contrast=mp.Value("i", motion_config_2.improve_contrast), |  | ||||||
|     threshold=mp.Value("i", motion_config_2.threshold), |  | ||||||
|     contour_area=mp.Value("i", motion_config_2.contour_area), |  | ||||||
|     name="compare", |  | ||||||
| ) |  | ||||||
| improved_motion_detector_2.save_images = save_images |  | ||||||
|  |  | ||||||
| # read and process frames |  | ||||||
| ret, frame = cap.read() |  | ||||||
| frame_counter = 1 |  | ||||||
| while ret: |  | ||||||
|     yuv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV_I420) |  | ||||||
|  |  | ||||||
|     start_frame = datetime.datetime.now().timestamp() |  | ||||||
|     improved_motion_detector_1.detect(yuv_frame) |  | ||||||
|  |  | ||||||
|     start_frame = datetime.datetime.now().timestamp() |  | ||||||
|     improved_motion_detector_2.detect(yuv_frame) |  | ||||||
|  |  | ||||||
|     default_frame = f"debug/frames/default-{frame_counter}.jpg" |  | ||||||
|     compare_frame = f"debug/frames/compare-{frame_counter}.jpg" |  | ||||||
|     if os.path.exists(default_frame) and os.path.exists(compare_frame): |  | ||||||
|         images = [ |  | ||||||
|             cv2.imread(default_frame), |  | ||||||
|             cv2.imread(compare_frame), |  | ||||||
|         ] |  | ||||||
|  |  | ||||||
|         cv2.imwrite( |  | ||||||
|             f"debug/frames/all-{frame_counter}.jpg", |  | ||||||
|             cv2.vconcat(images) |  | ||||||
|             if frame_shape[0] > frame_shape[1] |  | ||||||
|             else cv2.hconcat(images), |  | ||||||
|         ) |  | ||||||
|         os.unlink(default_frame) |  | ||||||
|         os.unlink(compare_frame) |  | ||||||
|     frame_counter += 1 |  | ||||||
|  |  | ||||||
|     ret, frame = cap.read() |  | ||||||
|  |  | ||||||
| cap.release() |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| mqtt: |  | ||||||
|   host: mqtt |  | ||||||
|  |  | ||||||
| cameras: |  | ||||||
|   test: |  | ||||||
|     ffmpeg: |  | ||||||
|       inputs: |  | ||||||
|         - path: /media/frigate/car-stopping.mp4 |  | ||||||
|           input_args: -re -stream_loop -1 -fflags +genpts |  | ||||||
|           roles: |  | ||||||
|             - detect |  | ||||||
|             - rtmp |  | ||||||
|     detect: |  | ||||||
|       height: 1080 |  | ||||||
|       width: 1920 |  | ||||||
|       fps: 5 |  | ||||||
| @@ -1,38 +1,27 @@ | |||||||
| version: "3" | version: "3" | ||||||
| services: | services: | ||||||
|   devcontainer: |   dev: | ||||||
|     container_name: frigate-devcontainer |     container_name: frigate-dev | ||||||
|     # add groups from host for render, plugdev, video |     user: vscode | ||||||
|     group_add: |     privileged: true | ||||||
|       - "109" # render |  | ||||||
|       - "110" # render |  | ||||||
|       - "44"  # video |  | ||||||
|       - "46"  # plugdev |  | ||||||
|     shm_size: "256mb" |     shm_size: "256mb" | ||||||
|     build: |     build: | ||||||
|       context: . |       context: . | ||||||
|       dockerfile: docker/main/Dockerfile |       dockerfile: docker/Dockerfile.dev | ||||||
|       # Use target devcontainer-trt for TensorRT dev |  | ||||||
|       target: devcontainer |  | ||||||
|     deploy: |  | ||||||
|           resources: |  | ||||||
|               reservations: |  | ||||||
|                   devices: |  | ||||||
|                       - driver: nvidia |  | ||||||
|                         count: 1 |  | ||||||
|                         capabilities: [gpu] |  | ||||||
|     environment: |  | ||||||
|       YOLO_MODELS: yolov7-320 |  | ||||||
|     devices: |  | ||||||
|       - /dev/bus/usb:/dev/bus/usb |  | ||||||
|       # - /dev/dri:/dev/dri # for intel hwaccel, needs to be updated for your hardware |  | ||||||
|     volumes: |     volumes: | ||||||
|       - .:/workspace/frigate:cached |  | ||||||
|       - ./web/dist:/opt/frigate/web:cached |  | ||||||
|       - /etc/localtime:/etc/localtime:ro |       - /etc/localtime:/etc/localtime:ro | ||||||
|       - ./config:/config |       - .:/lab/frigate:cached | ||||||
|  |       - ./config/config.yml:/config/config.yml:ro | ||||||
|       - ./debug:/media/frigate |       - ./debug:/media/frigate | ||||||
|       - /dev/bus/usb:/dev/bus/usb |       - /dev/bus/usb:/dev/bus/usb | ||||||
|  |       - /dev/dri:/dev/dri # for intel hwaccel, needs to be updated for your hardware | ||||||
|  |     ports: | ||||||
|  |       - "1935:1935" | ||||||
|  |       - "5000:5000" | ||||||
|  |       - "5001:5001" | ||||||
|  |       - "8080:8080" | ||||||
|  |     entrypoint: ["sudo", "/init"] | ||||||
|  |     command: /bin/sh -c "while sleep 1000; do :; done" | ||||||
|   mqtt: |   mqtt: | ||||||
|     container_name: mqtt |     container_name: mqtt | ||||||
|     image: eclipse-mosquitto:1.6 |     image: eclipse-mosquitto:1.6 | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								docker/Dockerfile.aarch64
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								docker/Dockerfile.aarch64
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | FROM frigate-base | ||||||
|  | LABEL maintainer "blakeb@blakeshome.com" | ||||||
|  |  | ||||||
|  | ENV DEBIAN_FRONTEND=noninteractive | ||||||
|  | # Install packages for apt repo | ||||||
|  | RUN apt-get -qq update \ | ||||||
|  |     && apt-get -qq install --no-install-recommends -y \ | ||||||
|  |     # ffmpeg runtime dependencies | ||||||
|  |     libgomp1 \ | ||||||
|  |     # runtime dependencies | ||||||
|  |     libopenexr24 \ | ||||||
|  |     libgstreamer1.0-0 \ | ||||||
|  |     libgstreamer-plugins-base1.0-0 \ | ||||||
|  |     libopenblas-base \ | ||||||
|  |     libjpeg-turbo8 \ | ||||||
|  |     libpng16-16 \ | ||||||
|  |     libtiff5 \ | ||||||
|  |     libdc1394-22 \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* \ | ||||||
|  |     && (apt-get autoremove -y; apt-get autoclean -y) | ||||||
|  |  | ||||||
|  | # s6-overlay | ||||||
|  | ADD https://github.com/just-containers/s6-overlay/releases/download/v2.2.0.3/s6-overlay-aarch64-installer /tmp/ | ||||||
|  | RUN chmod +x /tmp/s6-overlay-aarch64-installer && /tmp/s6-overlay-aarch64-installer / | ||||||
|  |  | ||||||
|  | ENTRYPOINT ["/init"] | ||||||
|  |  | ||||||
|  | CMD ["python3", "-u", "-m", "frigate"] | ||||||
							
								
								
									
										28
									
								
								docker/Dockerfile.amd64
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								docker/Dockerfile.amd64
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | FROM frigate-base | ||||||
|  | LABEL maintainer "blakeb@blakeshome.com" | ||||||
|  |  | ||||||
|  | # By default, use the i965 driver | ||||||
|  | ENV LIBVA_DRIVER_NAME=i965 | ||||||
|  | # Install packages for apt repo | ||||||
|  |  | ||||||
|  | RUN wget -qO - https://repositories.intel.com/graphics/intel-graphics.key | apt-key add - \ | ||||||
|  |     && echo 'deb [arch=amd64] https://repositories.intel.com/graphics/ubuntu focal main' > /etc/apt/sources.list.d/intel-graphics.list \ | ||||||
|  |     && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F63F0F2B90935439 \ | ||||||
|  |     && echo 'deb http://ppa.launchpad.net/kisak/kisak-mesa/ubuntu focal main' > /etc/apt/sources.list.d/kisak-mesa-focal.list | ||||||
|  |  | ||||||
|  | RUN apt-get -qq update \ | ||||||
|  |     && apt-get -qq install --no-install-recommends -y \ | ||||||
|  |     # ffmpeg dependencies | ||||||
|  |     libgomp1 \ | ||||||
|  |     # VAAPI drivers for Intel hardware accel | ||||||
|  |     libva-drm2 libva2 libmfx1 i965-va-driver vainfo intel-media-va-driver-non-free mesa-vdpau-drivers mesa-va-drivers mesa-vdpau-drivers libdrm-radeon1 \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* \ | ||||||
|  |     && (apt-get autoremove -y; apt-get autoclean -y) | ||||||
|  |  | ||||||
|  | # s6-overlay | ||||||
|  | ADD https://github.com/just-containers/s6-overlay/releases/download/v2.2.0.3/s6-overlay-amd64-installer /tmp/ | ||||||
|  | RUN chmod +x /tmp/s6-overlay-amd64-installer && /tmp/s6-overlay-amd64-installer / | ||||||
|  |  | ||||||
|  | ENTRYPOINT ["/init"] | ||||||
|  |  | ||||||
|  | CMD ["python3", "-u", "-m", "frigate"] | ||||||
							
								
								
									
										51
									
								
								docker/Dockerfile.amd64nvidia
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								docker/Dockerfile.amd64nvidia
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | |||||||
|  | FROM frigate-base | ||||||
|  | LABEL maintainer "blakeb@blakeshome.com" | ||||||
|  |  | ||||||
|  | # Install packages for apt repo | ||||||
|  | RUN apt-get -qq update \ | ||||||
|  |     && apt-get -qq install --no-install-recommends -y \ | ||||||
|  |     # ffmpeg dependencies | ||||||
|  |     libgomp1 \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* \ | ||||||
|  |     && (apt-get autoremove -y; apt-get autoclean -y) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # nvidia layer (see https://gitlab.com/nvidia/container-images/cuda/blob/master/dist/11.1/ubuntu20.04-x86_64/base/Dockerfile) | ||||||
|  | ENV	    NVIDIA_DRIVER_CAPABILITIES compute,utility,video | ||||||
|  |  | ||||||
|  | RUN apt-get update && apt-get install -y --no-install-recommends \ | ||||||
|  |     gnupg2 curl ca-certificates && \ | ||||||
|  |     curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub | apt-key add - && \ | ||||||
|  |     echo "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64 /" > /etc/apt/sources.list.d/cuda.list && \ | ||||||
|  |     echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list && \ | ||||||
|  |     apt-get purge --autoremove -y curl \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* | ||||||
|  |  | ||||||
|  | ENV CUDA_VERSION 11.1.1 | ||||||
|  |  | ||||||
|  | # For libraries in the cuda-compat-* package: https://docs.nvidia.com/cuda/eula/index.html#attachment-a | ||||||
|  | RUN apt-get update && apt-get install -y --no-install-recommends \ | ||||||
|  |     cuda-cudart-11-1=11.1.74-1 \ | ||||||
|  |     cuda-compat-11-1 \ | ||||||
|  |     && ln -s cuda-11.1 /usr/local/cuda && \ | ||||||
|  |     rm -rf /var/lib/apt/lists/* | ||||||
|  |  | ||||||
|  | # Required for nvidia-docker v1 | ||||||
|  | RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \ | ||||||
|  |     echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf | ||||||
|  |  | ||||||
|  | ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH} | ||||||
|  | ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64 | ||||||
|  |  | ||||||
|  | # nvidia-container-runtime | ||||||
|  | ENV NVIDIA_VISIBLE_DEVICES all | ||||||
|  | ENV NVIDIA_DRIVER_CAPABILITIES compute,utility,video | ||||||
|  | ENV NVIDIA_REQUIRE_CUDA "cuda>=11.1 brand=tesla,driver>=418,driver<419 brand=tesla,driver>=440,driver<441 brand=tesla,driver>=450,driver<451" | ||||||
|  |  | ||||||
|  | # s6-overlay | ||||||
|  | ADD https://github.com/just-containers/s6-overlay/releases/download/v2.2.0.3/s6-overlay-amd64-installer /tmp/ | ||||||
|  | RUN chmod +x /tmp/s6-overlay-amd64-installer && /tmp/s6-overlay-amd64-installer / | ||||||
|  |  | ||||||
|  | ENTRYPOINT ["/init"] | ||||||
|  |  | ||||||
|  | CMD ["python3", "-u", "-m", "frigate"] | ||||||
							
								
								
									
										30
									
								
								docker/Dockerfile.armv7
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								docker/Dockerfile.armv7
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | FROM frigate-base | ||||||
|  | LABEL maintainer "blakeb@blakeshome.com" | ||||||
|  |  | ||||||
|  | ENV DEBIAN_FRONTEND=noninteractive | ||||||
|  | # Install packages for apt repo | ||||||
|  | RUN apt-get -qq update \ | ||||||
|  |     && apt-get -qq install --no-install-recommends -y \ | ||||||
|  |     # ffmpeg runtime dependencies | ||||||
|  |     libgomp1 \ | ||||||
|  |     # runtime dependencies | ||||||
|  |     libopenexr24 \ | ||||||
|  |     libgstreamer1.0-0 \ | ||||||
|  |     libgstreamer-plugins-base1.0-0 \ | ||||||
|  |     libopenblas-base \ | ||||||
|  |     libjpeg-turbo8 \ | ||||||
|  |     libpng16-16 \ | ||||||
|  |     libtiff5 \ | ||||||
|  |     libdc1394-22 \ | ||||||
|  |     libaom0 \ | ||||||
|  |     libx265-179 \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* \ | ||||||
|  |     && (apt-get autoremove -y; apt-get autoclean -y) | ||||||
|  |  | ||||||
|  | # s6-overlay | ||||||
|  | ADD https://github.com/just-containers/s6-overlay/releases/download/v2.2.0.3/s6-overlay-armhf-installer /tmp/ | ||||||
|  | RUN chmod +x /tmp/s6-overlay-armhf-installer && /tmp/s6-overlay-armhf-installer / | ||||||
|  |  | ||||||
|  | ENTRYPOINT ["/init"] | ||||||
|  |  | ||||||
|  | CMD ["python3", "-u", "-m", "frigate"] | ||||||
							
								
								
									
										55
									
								
								docker/Dockerfile.base
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								docker/Dockerfile.base
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | ARG ARCH=amd64 | ||||||
|  | ARG WHEELS_VERSION | ||||||
|  | ARG FFMPEG_VERSION | ||||||
|  | ARG NGINX_VERSION | ||||||
|  | FROM blakeblackshear/frigate-wheels:${WHEELS_VERSION}-${ARCH} as wheels | ||||||
|  | FROM blakeblackshear/frigate-ffmpeg:${FFMPEG_VERSION}-${ARCH} as ffmpeg | ||||||
|  | FROM blakeblackshear/frigate-nginx:${NGINX_VERSION} as nginx | ||||||
|  | FROM frigate-web as web | ||||||
|  |  | ||||||
|  | FROM ubuntu:20.04 | ||||||
|  | LABEL maintainer "blakeb@blakeshome.com" | ||||||
|  |  | ||||||
|  | COPY --from=ffmpeg /usr/local /usr/local/ | ||||||
|  |  | ||||||
|  | COPY --from=wheels /wheels/. /wheels/ | ||||||
|  |  | ||||||
|  | ENV FLASK_ENV=development | ||||||
|  | # ENV FONTCONFIG_PATH=/etc/fonts | ||||||
|  | ENV DEBIAN_FRONTEND=noninteractive | ||||||
|  | # Install packages for apt repo | ||||||
|  | RUN apt-get -qq update \ | ||||||
|  |     && apt-get upgrade -y \ | ||||||
|  |     && apt-get -qq install --no-install-recommends -y gnupg wget unzip tzdata libxml2 \ | ||||||
|  |     && apt-get -qq install --no-install-recommends -y python3-pip \ | ||||||
|  |     && pip3 install -U /wheels/*.whl \ | ||||||
|  |     && APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn apt-key adv --fetch-keys https://packages.cloud.google.com/apt/doc/apt-key.gpg \ | ||||||
|  |     && echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" > /etc/apt/sources.list.d/coral-edgetpu.list \ | ||||||
|  |     && echo "libedgetpu1-max libedgetpu/accepted-eula select true" | debconf-set-selections \ | ||||||
|  |     && apt-get -qq update && apt-get -qq install --no-install-recommends -y libedgetpu1-max python3-tflite-runtime python3-pycoral \ | ||||||
|  |     && rm -rf /var/lib/apt/lists/* /wheels \ | ||||||
|  |     && (apt-get autoremove -y; apt-get autoclean -y) | ||||||
|  |  | ||||||
|  | RUN pip3 install \ | ||||||
|  |     peewee_migrate \ | ||||||
|  |     pydantic \ | ||||||
|  |     zeroconf \ | ||||||
|  |     ws4py | ||||||
|  |  | ||||||
|  | COPY --from=nginx /usr/local/nginx/ /usr/local/nginx/ | ||||||
|  |  | ||||||
|  | # get model and labels | ||||||
|  | COPY labelmap.txt /labelmap.txt | ||||||
|  | RUN wget -q https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite -O /edgetpu_model.tflite | ||||||
|  | RUN wget -q https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite -O /cpu_model.tflite | ||||||
|  |  | ||||||
|  | WORKDIR /opt/frigate/ | ||||||
|  | ADD frigate frigate/ | ||||||
|  | ADD migrations migrations/ | ||||||
|  |  | ||||||
|  | COPY --from=web /opt/frigate/build web/ | ||||||
|  |  | ||||||
|  | COPY docker/rootfs/ / | ||||||
|  |  | ||||||
|  | EXPOSE 5000 | ||||||
|  | EXPOSE 1935 | ||||||
							
								
								
									
										24
									
								
								docker/Dockerfile.dev
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								docker/Dockerfile.dev
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | FROM frigate:latest | ||||||
|  |  | ||||||
|  | ARG USERNAME=vscode | ||||||
|  | ARG USER_UID=1000 | ||||||
|  | ARG USER_GID=$USER_UID | ||||||
|  |  | ||||||
|  | # Create the user | ||||||
|  | RUN groupadd --gid $USER_GID $USERNAME \ | ||||||
|  |     && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ | ||||||
|  |     # | ||||||
|  |     # [Optional] Add sudo support. Omit if you don't need to install software after connecting. | ||||||
|  |     && apt-get update \ | ||||||
|  |     && apt-get install -y sudo \ | ||||||
|  |     && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ | ||||||
|  |     && chmod 0440 /etc/sudoers.d/$USERNAME | ||||||
|  |  | ||||||
|  | RUN apt-get update \ | ||||||
|  |     && apt-get install -y git curl vim htop | ||||||
|  |  | ||||||
|  | RUN pip3 install pylint black | ||||||
|  |  | ||||||
|  | # Install Node 14 | ||||||
|  | RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \ | ||||||
|  |     && apt-get install -y nodejs | ||||||
							
								
								
									
										486
									
								
								docker/Dockerfile.ffmpeg.aarch64
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										486
									
								
								docker/Dockerfile.ffmpeg.aarch64
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,486 @@ | |||||||
|  | # inspired by: | ||||||
|  | # https://github.com/collelog/ffmpeg/blob/master/4.3.1-alpine-rpi4-arm64v8.Dockerfile | ||||||
|  | # https://github.com/mmastrac/ffmpeg-omx-rpi-docker/blob/master/Dockerfile | ||||||
|  | # https://github.com/jrottenberg/ffmpeg/pull/158/files | ||||||
|  | # https://github.com/jrottenberg/ffmpeg/pull/239 | ||||||
|  | FROM        ubuntu:20.04 AS base | ||||||
|  |  | ||||||
|  | WORKDIR     /tmp/workdir | ||||||
|  |  | ||||||
|  | ENV     DEBIAN_FRONTEND=noninteractive | ||||||
|  | RUN     apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 xutils-dev && \ | ||||||
|  |         apt-get autoremove -y && \ | ||||||
|  |         apt-get clean -y | ||||||
|  |  | ||||||
|  | FROM base as build | ||||||
|  |  | ||||||
|  | ENV     FFMPEG_VERSION=4.3.2 \ | ||||||
|  |         AOM_VERSION=v1.0.0 \ | ||||||
|  |         FDKAAC_VERSION=0.1.5 \ | ||||||
|  |         FREETYPE_VERSION=2.11.0 \ | ||||||
|  |         FRIBIDI_VERSION=0.19.7 \ | ||||||
|  |         KVAZAAR_VERSION=1.2.0 \ | ||||||
|  |         LAME_VERSION=3.100 \ | ||||||
|  |         LIBPTHREAD_STUBS_VERSION=0.4 \ | ||||||
|  |         LIBVIDSTAB_VERSION=1.1.0 \ | ||||||
|  |         LIBXCB_VERSION=1.13.1 \ | ||||||
|  |         XCBPROTO_VERSION=1.13 \ | ||||||
|  |         OGG_VERSION=1.3.2 \ | ||||||
|  |         OPENCOREAMR_VERSION=0.1.5 \ | ||||||
|  |         OPUS_VERSION=1.2 \ | ||||||
|  |         OPENJPEG_VERSION=2.1.2 \ | ||||||
|  |         THEORA_VERSION=1.1.1 \ | ||||||
|  |         VORBIS_VERSION=1.3.5 \ | ||||||
|  |         VPX_VERSION=1.8.0 \ | ||||||
|  |         WEBP_VERSION=1.0.2 \ | ||||||
|  |         X264_VERSION=20170226-2245-stable \ | ||||||
|  |         X265_VERSION=3.1.1 \ | ||||||
|  |         XAU_VERSION=1.0.9 \ | ||||||
|  |         XORG_MACROS_VERSION=1.19.2 \ | ||||||
|  |         XPROTO_VERSION=7.0.31 \ | ||||||
|  |         XVID_VERSION=1.3.4 \ | ||||||
|  |         LIBZMQ_VERSION=4.3.2 \ | ||||||
|  |         SRC=/usr/local | ||||||
|  |  | ||||||
|  | ARG         FREETYPE_SHA256SUM="a45c6b403413abd5706f3582f04c8339d26397c4304b78fa552f2215df64101f freetype-2.11.0.tar.gz" | ||||||
|  | ARG         FRIBIDI_SHA256SUM="3fc96fa9473bd31dcb5500bdf1aa78b337ba13eb8c301e7c28923fea982453a8 0.19.7.tar.gz" | ||||||
|  | ARG         LIBVIDSTAB_SHA256SUM="14d2a053e56edad4f397be0cb3ef8eb1ec3150404ce99a426c4eb641861dc0bb v1.1.0.tar.gz" | ||||||
|  | ARG         OGG_SHA256SUM="e19ee34711d7af328cb26287f4137e70630e7261b17cbe3cd41011d73a654692 libogg-1.3.2.tar.gz" | ||||||
|  | ARG         OPUS_SHA256SUM="77db45a87b51578fbc49555ef1b10926179861d854eb2613207dc79d9ec0a9a9 opus-1.2.tar.gz" | ||||||
|  | ARG         THEORA_SHA256SUM="40952956c47811928d1e7922cda3bc1f427eb75680c3c37249c91e949054916b libtheora-1.1.1.tar.gz" | ||||||
|  | ARG         VORBIS_SHA256SUM="6efbcecdd3e5dfbf090341b485da9d176eb250d893e3eb378c428a2db38301ce libvorbis-1.3.5.tar.gz" | ||||||
|  | ARG         XVID_SHA256SUM="4e9fd62728885855bc5007fe1be58df42e5e274497591fec37249e1052ae316f xvidcore-1.3.4.tar.gz" | ||||||
|  | ARG         LIBZMQ_SHA256SUM="02ecc88466ae38cf2c8d79f09cfd2675ba299a439680b64ade733e26a349edeb v4.3.2.tar.gz" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ARG         LD_LIBRARY_PATH=/opt/ffmpeg/lib | ||||||
|  | ARG         MAKEFLAGS="-j2" | ||||||
|  | ARG         PKG_CONFIG_PATH="/opt/ffmpeg/share/pkgconfig:/opt/ffmpeg/lib/pkgconfig:/opt/ffmpeg/lib64/pkgconfig" | ||||||
|  | ARG         PREFIX=/opt/ffmpeg | ||||||
|  | ARG         LD_LIBRARY_PATH="/opt/ffmpeg/lib:/opt/ffmpeg/lib64:/usr/lib64:/usr/lib:/lib64:/lib" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUN     buildDeps="autoconf \ | ||||||
|  |         automake \ | ||||||
|  |         cmake \ | ||||||
|  |         curl \ | ||||||
|  |         bzip2 \ | ||||||
|  |         libexpat1-dev \ | ||||||
|  |         g++ \ | ||||||
|  |         gcc \ | ||||||
|  |         git \ | ||||||
|  |         gperf \ | ||||||
|  |         libtool \ | ||||||
|  |         make \ | ||||||
|  |         nasm \ | ||||||
|  |         perl \ | ||||||
|  |         pkg-config \ | ||||||
|  |         python \ | ||||||
|  |         libssl-dev \ | ||||||
|  |         yasm \ | ||||||
|  |         linux-headers-raspi2 \ | ||||||
|  |         libomxil-bellagio-dev \ | ||||||
|  |         zlib1g-dev" && \ | ||||||
|  |         apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ${buildDeps} | ||||||
|  | ## opencore-amr https://sourceforge.net/projects/opencore-amr/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opencore-amr && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-${OPENCOREAMR_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## x264 http://www.videolan.org/developers/x264.html | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/x264 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-${X264_VERSION}.tar.bz2 | \ | ||||||
|  |         tar -jx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --enable-pic --disable-cli && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### x265 http://x265.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/x265 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://download.videolan.org/pub/videolan/x265/x265_${X265_VERSION}.tar.gz  | \ | ||||||
|  |         tar -zx && \ | ||||||
|  |         cd x265_${X265_VERSION}/build/linux && \ | ||||||
|  |         sed -i "/-DEXTRA_LIB/ s/$/ -DCMAKE_INSTALL_PREFIX=\${PREFIX}/" multilib.sh && \ | ||||||
|  |         sed -i "/^cmake/ s/$/ -DENABLE_CLI=OFF/" multilib.sh && \ | ||||||
|  |         export CXXFLAGS="${CXXFLAGS} -fPIC" && \ | ||||||
|  |         ./multilib.sh && \ | ||||||
|  |         make -C 8bit install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libogg https://www.xiph.org/ogg/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ogg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/ogg/libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OGG_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libopus https://www.opus-codec.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opus && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OPUS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvorbis https://xiph.org/vorbis/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vorbis && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${VORBIS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libtheora http://www.theora.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/theora && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/theora/libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         echo ${THEORA_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' -o config.guess && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' -o config.sub && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvpx https://www.webmproject.org/code/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vpx && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://codeload.github.com/webmproject/libvpx/tar.gz/v${VPX_VERSION} | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-vp8 --enable-vp9 --enable-vp9-highbitdepth --enable-pic --enable-shared \ | ||||||
|  |         --disable-debug --disable-examples --disable-docs --disable-install-bins  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libwebp https://developers.google.com/speed/webp/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vebp && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${WEBP_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libmp3lame http://lame.sourceforge.net/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/lame && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/lame/lame/$(echo ${LAME_VERSION} | sed -e 's/[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)/\1.\2/')/lame-${LAME_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" --enable-shared --enable-nasm --disable-frontend && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### xvid https://www.xvid.com/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xvid && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xvid.org/downloads/xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         echo ${XVID_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx -f xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         cd xvidcore/build/generic && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### fdk-aac https://github.com/mstorsjo/fdk-aac | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/fdk-aac && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/mstorsjo/fdk-aac/archive/v${FDKAAC_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --datadir="${DIR}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## openjpeg https://github.com/uclouvain/openjpeg | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/openjpeg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         export CFLAGS="${CFLAGS} -DPNG_ARM_NEON_OPT=0" && \ | ||||||
|  |         cmake -DBUILD_THIRDPARTY:BOOL=ON -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## freetype https://www.freetype.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/freetype && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FREETYPE_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## libvstab https://github.com/georgmartius/vid.stab | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/vid.stab && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/georgmartius/vid.stab/archive/v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBVIDSTAB_SHA256SUM} | sha256sum --check &&  \ | ||||||
|  |         tar -zx --strip-components=1 -f v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## fridibi https://www.fribidi.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/fribidi && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/fribidi/fribidi/archive/${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FRIBIDI_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f ${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         sed -i 's/^SUBDIRS =.*/SUBDIRS=gen.tab charset lib bin/' Makefile.am && \ | ||||||
|  |         ./bootstrap --no-config --auto && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j1 && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## kvazaar https://github.com/ultravideo/kvazaar | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/kvazaar && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/ultravideo/kvazaar/archive/v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/aom && \ | ||||||
|  |         git clone --branch ${AOM_VERSION} --depth 1 https://aomedia.googlesource.com/aom ${DIR} ; \ | ||||||
|  |         cd ${DIR} ; \ | ||||||
|  |         rm -rf CMakeCache.txt CMakeFiles ; \ | ||||||
|  |         mkdir -p ./aom_build ; \ | ||||||
|  |         cd ./aom_build ; \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DBUILD_SHARED_LIBS=1 ..; \ | ||||||
|  |         make ; \ | ||||||
|  |         make install ; \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libxcb (and supporting libraries) for screen capture https://xcb.freedesktop.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xorg-macros && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive//individual/util/util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xproto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/proto/xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' -o config.guess && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' -o config.sub && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libXau && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/lib/libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libpthread-stubs && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb-proto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libzmq https://github.com/zeromq/libzmq/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libzmq && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/zeromq/libzmq/archive/v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBZMQ_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -xz --strip-components=1 -f v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make check && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/rkmpp && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         git clone https://github.com/rockchip-linux/libdrm-rockchip && git clone https://github.com/rockchip-linux/mpp && \ | ||||||
|  |         cd libdrm-rockchip && bash autogen.sh && ./configure && make && make install && \ | ||||||
|  |         cd ../mpp && cmake -DRKPLATFORM=ON -DHAVE_DRM=ON && make -j6 && make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## ffmpeg https://ffmpeg.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         curl -sLO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \ | ||||||
|  |         tar -jx --strip-components=1 -f ffmpeg-${FFMPEG_VERSION}.tar.bz2 | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         ./configure \ | ||||||
|  |         --disable-debug \ | ||||||
|  |         --disable-doc \ | ||||||
|  |         --disable-ffplay \ | ||||||
|  |         --enable-shared \ | ||||||
|  |         --enable-avresample \ | ||||||
|  |         --enable-libopencore-amrnb \ | ||||||
|  |         --enable-libopencore-amrwb \ | ||||||
|  |         --enable-gpl \ | ||||||
|  |         --enable-libfreetype \ | ||||||
|  |         --enable-libvidstab \ | ||||||
|  |         --enable-libmp3lame \ | ||||||
|  |         --enable-libopus \ | ||||||
|  |         --enable-libtheora \ | ||||||
|  |         --enable-libvorbis \ | ||||||
|  |         --enable-libvpx \ | ||||||
|  |         --enable-libwebp \ | ||||||
|  |         --enable-libxcb \ | ||||||
|  |         --enable-libx265 \ | ||||||
|  |         --enable-libxvid \ | ||||||
|  |         --enable-libx264 \ | ||||||
|  |         --enable-nonfree \ | ||||||
|  |         --enable-openssl \ | ||||||
|  |         --enable-libfdk_aac \ | ||||||
|  |         --enable-postproc \ | ||||||
|  |         --enable-small \ | ||||||
|  |         --enable-version3 \ | ||||||
|  |         --enable-libzmq \ | ||||||
|  |         --extra-libs=-ldl \ | ||||||
|  |         --prefix="${PREFIX}" \ | ||||||
|  |         --enable-libopenjpeg \ | ||||||
|  |         --enable-libkvazaar \ | ||||||
|  |         --enable-libaom \ | ||||||
|  |         --extra-libs=-lpthread \ | ||||||
|  |         --enable-rkmpp \ | ||||||
|  |         --enable-libdrm \ | ||||||
|  |         # --enable-omx \ | ||||||
|  |         # --enable-omx-rpi \ | ||||||
|  |         # --enable-mmal \ | ||||||
|  |         --enable-v4l2_m2m \ | ||||||
|  |         --enable-neon \ | ||||||
|  |         --extra-cflags="-I${PREFIX}/include" \ | ||||||
|  |         --extra-ldflags="-L${PREFIX}/lib" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         make tools/zmqsend && cp tools/zmqsend ${PREFIX}/bin/ && \ | ||||||
|  |         make distclean && \ | ||||||
|  |         hash -r && \ | ||||||
|  |         cd tools && \ | ||||||
|  |         make qt-faststart && cp qt-faststart ${PREFIX}/bin/ | ||||||
|  |  | ||||||
|  | ## cleanup | ||||||
|  | RUN \ | ||||||
|  |         ldd ${PREFIX}/bin/ffmpeg | grep opt/ffmpeg | cut -d ' ' -f 3 | xargs -i cp {} /usr/local/lib/ && \ | ||||||
|  |         for lib in /usr/local/lib/*.so.*; do ln -s "${lib##*/}" "${lib%%.so.*}".so; done && \ | ||||||
|  |         cp ${PREFIX}/bin/* /usr/local/bin/ && \ | ||||||
|  |         cp -r ${PREFIX}/share/ffmpeg /usr/local/share/ && \ | ||||||
|  |         LD_LIBRARY_PATH=/usr/local/lib ffmpeg -buildconf && \ | ||||||
|  |         cp -r ${PREFIX}/include/libav* ${PREFIX}/include/libpostproc ${PREFIX}/include/libsw* /usr/local/include && \ | ||||||
|  |         mkdir -p /usr/local/lib/pkgconfig && \ | ||||||
|  |         for pc in ${PREFIX}/lib/pkgconfig/libav*.pc ${PREFIX}/lib/pkgconfig/libpostproc.pc ${PREFIX}/lib/pkgconfig/libsw*.pc; do \ | ||||||
|  |         sed "s:${PREFIX}:/usr/local:g" <"$pc" >/usr/local/lib/pkgconfig/"${pc##*/}"; \ | ||||||
|  |         done | ||||||
|  |  | ||||||
|  | FROM        base AS release | ||||||
|  |  | ||||||
|  | ENV         LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64:/lib:/lib64 | ||||||
|  |  | ||||||
|  | CMD         ["--help"] | ||||||
|  | ENTRYPOINT  ["ffmpeg"] | ||||||
|  |  | ||||||
|  | COPY --from=build /usr/local /usr/local/ | ||||||
|  |  | ||||||
|  | # Run ffmpeg with -c:v h264_v4l2m2m to enable HW accell for decoding on raspberry pi4 64-bit | ||||||
							
								
								
									
										468
									
								
								docker/Dockerfile.ffmpeg.amd64
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										468
									
								
								docker/Dockerfile.ffmpeg.amd64
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,468 @@ | |||||||
|  | # inspired by: | ||||||
|  | # https://github.com/collelog/ffmpeg/blob/master/4.3.1-alpine-rpi4-arm64v8.Dockerfile | ||||||
|  | # https://github.com/jrottenberg/ffmpeg/pull/158/files | ||||||
|  | # https://github.com/jrottenberg/ffmpeg/pull/239 | ||||||
|  | FROM        ubuntu:20.04 AS base | ||||||
|  |  | ||||||
|  | WORKDIR     /tmp/workdir | ||||||
|  |  | ||||||
|  | ENV     DEBIAN_FRONTEND=noninteractive | ||||||
|  | RUN     apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 && \ | ||||||
|  |         apt-get autoremove -y && \ | ||||||
|  |         apt-get clean -y | ||||||
|  |  | ||||||
|  | FROM base as build | ||||||
|  |  | ||||||
|  | ENV     FFMPEG_VERSION=4.3.2 \ | ||||||
|  |         AOM_VERSION=v1.0.0 \ | ||||||
|  |         FDKAAC_VERSION=0.1.5 \ | ||||||
|  |         FREETYPE_VERSION=2.5.5 \ | ||||||
|  |         FRIBIDI_VERSION=0.19.7 \ | ||||||
|  |         KVAZAAR_VERSION=1.2.0 \ | ||||||
|  |         LAME_VERSION=3.100 \ | ||||||
|  |         LIBPTHREAD_STUBS_VERSION=0.4 \ | ||||||
|  |         LIBVIDSTAB_VERSION=1.1.0 \ | ||||||
|  |         LIBXCB_VERSION=1.13.1 \ | ||||||
|  |         XCBPROTO_VERSION=1.13 \ | ||||||
|  |         OGG_VERSION=1.3.2 \ | ||||||
|  |         OPENCOREAMR_VERSION=0.1.5 \ | ||||||
|  |         OPUS_VERSION=1.2 \ | ||||||
|  |         OPENJPEG_VERSION=2.1.2 \ | ||||||
|  |         THEORA_VERSION=1.1.1 \ | ||||||
|  |         VORBIS_VERSION=1.3.5 \ | ||||||
|  |         VPX_VERSION=1.8.0 \ | ||||||
|  |         WEBP_VERSION=1.0.2 \ | ||||||
|  |         X264_VERSION=20170226-2245-stable \ | ||||||
|  |         X265_VERSION=3.1.1 \ | ||||||
|  |         XAU_VERSION=1.0.9 \ | ||||||
|  |         XORG_MACROS_VERSION=1.19.2 \ | ||||||
|  |         XPROTO_VERSION=7.0.31 \ | ||||||
|  |         XVID_VERSION=1.3.4 \ | ||||||
|  |         LIBZMQ_VERSION=4.3.2 \ | ||||||
|  |         SRC=/usr/local | ||||||
|  |  | ||||||
|  | ARG         FREETYPE_SHA256SUM="5d03dd76c2171a7601e9ce10551d52d4471cf92cd205948e60289251daddffa8 freetype-2.5.5.tar.gz" | ||||||
|  | ARG         FRIBIDI_SHA256SUM="3fc96fa9473bd31dcb5500bdf1aa78b337ba13eb8c301e7c28923fea982453a8 0.19.7.tar.gz" | ||||||
|  | ARG         LIBVIDSTAB_SHA256SUM="14d2a053e56edad4f397be0cb3ef8eb1ec3150404ce99a426c4eb641861dc0bb v1.1.0.tar.gz" | ||||||
|  | ARG         OGG_SHA256SUM="e19ee34711d7af328cb26287f4137e70630e7261b17cbe3cd41011d73a654692 libogg-1.3.2.tar.gz" | ||||||
|  | ARG         OPUS_SHA256SUM="77db45a87b51578fbc49555ef1b10926179861d854eb2613207dc79d9ec0a9a9 opus-1.2.tar.gz" | ||||||
|  | ARG         THEORA_SHA256SUM="40952956c47811928d1e7922cda3bc1f427eb75680c3c37249c91e949054916b libtheora-1.1.1.tar.gz" | ||||||
|  | ARG         VORBIS_SHA256SUM="6efbcecdd3e5dfbf090341b485da9d176eb250d893e3eb378c428a2db38301ce libvorbis-1.3.5.tar.gz" | ||||||
|  | ARG         XVID_SHA256SUM="4e9fd62728885855bc5007fe1be58df42e5e274497591fec37249e1052ae316f xvidcore-1.3.4.tar.gz" | ||||||
|  | ARG         LIBZMQ_SHA256SUM="02ecc88466ae38cf2c8d79f09cfd2675ba299a439680b64ade733e26a349edeb v4.3.2.tar.gz" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ARG         LD_LIBRARY_PATH=/opt/ffmpeg/lib | ||||||
|  | ARG         MAKEFLAGS="-j2" | ||||||
|  | ARG         PKG_CONFIG_PATH="/opt/ffmpeg/share/pkgconfig:/opt/ffmpeg/lib/pkgconfig:/opt/ffmpeg/lib64/pkgconfig" | ||||||
|  | ARG         PREFIX=/opt/ffmpeg | ||||||
|  | ARG         LD_LIBRARY_PATH="/opt/ffmpeg/lib:/opt/ffmpeg/lib64:/usr/lib64:/usr/lib:/lib64:/lib" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUN     buildDeps="autoconf \ | ||||||
|  |         automake \ | ||||||
|  |         cmake \ | ||||||
|  |         curl \ | ||||||
|  |         bzip2 \ | ||||||
|  |         libexpat1-dev \ | ||||||
|  |         g++ \ | ||||||
|  |         gcc \ | ||||||
|  |         git \ | ||||||
|  |         gperf \ | ||||||
|  |         libtool \ | ||||||
|  |         make \ | ||||||
|  |         nasm \ | ||||||
|  |         perl \ | ||||||
|  |         pkg-config \ | ||||||
|  |         python \ | ||||||
|  |         libssl-dev \ | ||||||
|  |         yasm \ | ||||||
|  |         libva-dev \ | ||||||
|  |         libmfx-dev \ | ||||||
|  |         zlib1g-dev" && \ | ||||||
|  |         apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ${buildDeps} | ||||||
|  | ## opencore-amr https://sourceforge.net/projects/opencore-amr/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opencore-amr && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-${OPENCOREAMR_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## x264 http://www.videolan.org/developers/x264.html | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/x264 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-${X264_VERSION}.tar.bz2 | \ | ||||||
|  |         tar -jx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --enable-pic --disable-cli && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### x265 http://x265.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/x265 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://download.videolan.org/pub/videolan/x265/x265_${X265_VERSION}.tar.gz  | \ | ||||||
|  |         tar -zx && \ | ||||||
|  |         cd x265_${X265_VERSION}/build/linux && \ | ||||||
|  |         sed -i "/-DEXTRA_LIB/ s/$/ -DCMAKE_INSTALL_PREFIX=\${PREFIX}/" multilib.sh && \ | ||||||
|  |         sed -i "/^cmake/ s/$/ -DENABLE_CLI=OFF/" multilib.sh && \ | ||||||
|  |         ./multilib.sh && \ | ||||||
|  |         make -C 8bit install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libogg https://www.xiph.org/ogg/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ogg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/ogg/libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OGG_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libopus https://www.opus-codec.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opus && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OPUS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvorbis https://xiph.org/vorbis/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vorbis && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${VORBIS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libtheora http://www.theora.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/theora && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/theora/libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         echo ${THEORA_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvpx https://www.webmproject.org/code/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vpx && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://codeload.github.com/webmproject/libvpx/tar.gz/v${VPX_VERSION} | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-vp8 --enable-vp9 --enable-vp9-highbitdepth --enable-pic --enable-shared \ | ||||||
|  |         --disable-debug --disable-examples --disable-docs --disable-install-bins  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libwebp https://developers.google.com/speed/webp/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vebp && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${WEBP_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libmp3lame http://lame.sourceforge.net/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/lame && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/lame/lame/$(echo ${LAME_VERSION} | sed -e 's/[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)/\1.\2/')/lame-${LAME_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" --enable-shared --enable-nasm --disable-frontend && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### xvid https://www.xvid.com/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xvid && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xvid.org/downloads/xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         echo ${XVID_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx -f xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         cd xvidcore/build/generic && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### fdk-aac https://github.com/mstorsjo/fdk-aac | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/fdk-aac && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/mstorsjo/fdk-aac/archive/v${FDKAAC_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --datadir="${DIR}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## openjpeg https://github.com/uclouvain/openjpeg | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/openjpeg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         cmake -DBUILD_THIRDPARTY:BOOL=ON -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## freetype https://www.freetype.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/freetype && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FREETYPE_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## libvstab https://github.com/georgmartius/vid.stab | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/vid.stab && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/georgmartius/vid.stab/archive/v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBVIDSTAB_SHA256SUM} | sha256sum --check &&  \ | ||||||
|  |         tar -zx --strip-components=1 -f v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## fridibi https://www.fribidi.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/fribidi && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/fribidi/fribidi/archive/${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FRIBIDI_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f ${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         sed -i 's/^SUBDIRS =.*/SUBDIRS=gen.tab charset lib bin/' Makefile.am && \ | ||||||
|  |         ./bootstrap --no-config --auto && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j1 && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## kvazaar https://github.com/ultravideo/kvazaar | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/kvazaar && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/ultravideo/kvazaar/archive/v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/aom && \ | ||||||
|  |         git clone --branch ${AOM_VERSION} --depth 1 https://aomedia.googlesource.com/aom ${DIR} ; \ | ||||||
|  |         cd ${DIR} ; \ | ||||||
|  |         rm -rf CMakeCache.txt CMakeFiles ; \ | ||||||
|  |         mkdir -p ./aom_build ; \ | ||||||
|  |         cd ./aom_build ; \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DBUILD_SHARED_LIBS=1 ..; \ | ||||||
|  |         make ; \ | ||||||
|  |         make install ; \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libxcb (and supporting libraries) for screen capture https://xcb.freedesktop.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xorg-macros && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive//individual/util/util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xproto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/proto/xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libXau && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/lib/libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libpthread-stubs && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb-proto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libzmq https://github.com/zeromq/libzmq/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libzmq && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/zeromq/libzmq/archive/v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBZMQ_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -xz --strip-components=1 -f v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make check && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## ffmpeg https://ffmpeg.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         curl -sLO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \ | ||||||
|  |         tar -jx --strip-components=1 -f ffmpeg-${FFMPEG_VERSION}.tar.bz2 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         ./configure \ | ||||||
|  |         --disable-debug \ | ||||||
|  |         --disable-doc \ | ||||||
|  |         --disable-ffplay \ | ||||||
|  |         --enable-shared \ | ||||||
|  |         --enable-avresample \ | ||||||
|  |         --enable-libopencore-amrnb \ | ||||||
|  |         --enable-libopencore-amrwb \ | ||||||
|  |         --enable-gpl \ | ||||||
|  |         --enable-libfreetype \ | ||||||
|  |         --enable-libvidstab \ | ||||||
|  |         --enable-libmfx \ | ||||||
|  |         --enable-libmp3lame \ | ||||||
|  |         --enable-libopus \ | ||||||
|  |         --enable-libtheora \ | ||||||
|  |         --enable-libvorbis \ | ||||||
|  |         --enable-libvpx \ | ||||||
|  |         --enable-libwebp \ | ||||||
|  |         --enable-libxcb \ | ||||||
|  |         --enable-libx265 \ | ||||||
|  |         --enable-libxvid \ | ||||||
|  |         --enable-libx264 \ | ||||||
|  |         --enable-nonfree \ | ||||||
|  |         --enable-openssl \ | ||||||
|  |         --enable-libfdk_aac \ | ||||||
|  |         --enable-postproc \ | ||||||
|  |         --enable-small \ | ||||||
|  |         --enable-version3 \ | ||||||
|  |         --enable-libzmq \ | ||||||
|  |         --extra-libs=-ldl \ | ||||||
|  |         --prefix="${PREFIX}" \ | ||||||
|  |         --enable-libopenjpeg \ | ||||||
|  |         --enable-libkvazaar \ | ||||||
|  |         --enable-libaom \ | ||||||
|  |         --extra-libs=-lpthread \ | ||||||
|  |         --enable-vaapi \ | ||||||
|  |         --extra-cflags="-I${PREFIX}/include" \ | ||||||
|  |         --extra-ldflags="-L${PREFIX}/lib" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         make tools/zmqsend && cp tools/zmqsend ${PREFIX}/bin/ && \ | ||||||
|  |         make distclean && \ | ||||||
|  |         hash -r && \ | ||||||
|  |         cd tools && \ | ||||||
|  |         make qt-faststart && cp qt-faststart ${PREFIX}/bin/ | ||||||
|  |  | ||||||
|  | ## cleanup | ||||||
|  | RUN \ | ||||||
|  |         ldd ${PREFIX}/bin/ffmpeg | grep opt/ffmpeg | cut -d ' ' -f 3 | xargs -i cp {} /usr/local/lib/ && \ | ||||||
|  |         for lib in /usr/local/lib/*.so.*; do ln -s "${lib##*/}" "${lib%%.so.*}".so; done && \ | ||||||
|  |         cp ${PREFIX}/bin/* /usr/local/bin/ && \ | ||||||
|  |         cp -r ${PREFIX}/share/ffmpeg /usr/local/share/ && \ | ||||||
|  |         LD_LIBRARY_PATH=/usr/local/lib ffmpeg -buildconf && \ | ||||||
|  |         cp -r ${PREFIX}/include/libav* ${PREFIX}/include/libpostproc ${PREFIX}/include/libsw* /usr/local/include && \ | ||||||
|  |         mkdir -p /usr/local/lib/pkgconfig && \ | ||||||
|  |         for pc in ${PREFIX}/lib/pkgconfig/libav*.pc ${PREFIX}/lib/pkgconfig/libpostproc.pc ${PREFIX}/lib/pkgconfig/libsw*.pc; do \ | ||||||
|  |         sed "s:${PREFIX}:/usr/local:g" <"$pc" >/usr/local/lib/pkgconfig/"${pc##*/}"; \ | ||||||
|  |         done | ||||||
|  |  | ||||||
|  | FROM        base AS release | ||||||
|  |  | ||||||
|  | ENV         LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64:/lib:/lib64 | ||||||
|  |  | ||||||
|  | CMD         ["--help"] | ||||||
|  | ENTRYPOINT  ["ffmpeg"] | ||||||
|  |  | ||||||
|  | COPY --from=build /usr/local /usr/local/ | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         apt-get update -y && \ | ||||||
|  |         apt-get install -y --no-install-recommends libva-drm2 libva2 i965-va-driver mesa-va-drivers && \ | ||||||
|  |         rm -rf /var/lib/apt/lists/* | ||||||
							
								
								
									
										549
									
								
								docker/Dockerfile.ffmpeg.amd64nvidia
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										549
									
								
								docker/Dockerfile.ffmpeg.amd64nvidia
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,549 @@ | |||||||
|  | # inspired by https://github.com/jrottenberg/ffmpeg/blob/master/docker-images/4.3/ubuntu1804/Dockerfile | ||||||
|  |  | ||||||
|  | # ffmpeg - http://ffmpeg.org/download.html | ||||||
|  | # | ||||||
|  | # From https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu | ||||||
|  | # | ||||||
|  | # https://hub.docker.com/r/jrottenberg/ffmpeg/ | ||||||
|  | # | ||||||
|  | # | ||||||
|  |  | ||||||
|  | FROM    nvidia/cuda:11.1-devel-ubuntu20.04 AS devel-base | ||||||
|  |  | ||||||
|  | ENV	    NVIDIA_DRIVER_CAPABILITIES compute,utility,video | ||||||
|  | ENV         DEBIAN_FRONTEND=noninteractive | ||||||
|  |  | ||||||
|  | WORKDIR     /tmp/workdir | ||||||
|  |  | ||||||
|  | RUN     apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 && \ | ||||||
|  |         apt-get autoremove -y && \ | ||||||
|  |         apt-get clean -y | ||||||
|  |  | ||||||
|  | FROM       nvidia/cuda:11.1-runtime-ubuntu20.04 AS runtime-base | ||||||
|  |  | ||||||
|  | ENV	    NVIDIA_DRIVER_CAPABILITIES compute,utility,video | ||||||
|  | ENV         DEBIAN_FRONTEND=noninteractive | ||||||
|  |  | ||||||
|  | WORKDIR     /tmp/workdir | ||||||
|  |  | ||||||
|  | RUN     apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 libxcb-shape0-dev && \ | ||||||
|  |         apt-get autoremove -y && \ | ||||||
|  |         apt-get clean -y | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FROM  devel-base as build | ||||||
|  |  | ||||||
|  | ENV        NVIDIA_HEADERS_VERSION=9.1.23.1 | ||||||
|  |  | ||||||
|  | ENV     FFMPEG_VERSION=4.3.2 \ | ||||||
|  |         AOM_VERSION=v1.0.0 \ | ||||||
|  |         FDKAAC_VERSION=0.1.5 \ | ||||||
|  |         FREETYPE_VERSION=2.5.5 \ | ||||||
|  |         FRIBIDI_VERSION=0.19.7 \ | ||||||
|  |         KVAZAAR_VERSION=1.2.0 \ | ||||||
|  |         LAME_VERSION=3.100 \ | ||||||
|  |         LIBPTHREAD_STUBS_VERSION=0.4 \ | ||||||
|  |         LIBVIDSTAB_VERSION=1.1.0 \ | ||||||
|  |         LIBXCB_VERSION=1.13.1 \ | ||||||
|  |         XCBPROTO_VERSION=1.13 \ | ||||||
|  |         OGG_VERSION=1.3.2 \ | ||||||
|  |         OPENCOREAMR_VERSION=0.1.5 \ | ||||||
|  |         OPUS_VERSION=1.2 \ | ||||||
|  |         OPENJPEG_VERSION=2.1.2 \ | ||||||
|  |         THEORA_VERSION=1.1.1 \ | ||||||
|  |         VORBIS_VERSION=1.3.5 \ | ||||||
|  |         VPX_VERSION=1.8.0 \ | ||||||
|  |         WEBP_VERSION=1.0.2 \ | ||||||
|  |         X264_VERSION=20170226-2245-stable \ | ||||||
|  |         X265_VERSION=3.1.1 \ | ||||||
|  |         XAU_VERSION=1.0.9 \ | ||||||
|  |         XORG_MACROS_VERSION=1.19.2 \ | ||||||
|  |         XPROTO_VERSION=7.0.31 \ | ||||||
|  |         XVID_VERSION=1.3.4 \ | ||||||
|  |         LIBZMQ_VERSION=4.3.2 \ | ||||||
|  |         LIBSRT_VERSION=1.4.1 \ | ||||||
|  |         LIBARIBB24_VERSION=1.0.3 \ | ||||||
|  |         LIBPNG_VERSION=1.6.9 \ | ||||||
|  |         SRC=/usr/local | ||||||
|  |  | ||||||
|  | ARG         FREETYPE_SHA256SUM="5d03dd76c2171a7601e9ce10551d52d4471cf92cd205948e60289251daddffa8 freetype-2.5.5.tar.gz" | ||||||
|  | ARG         FRIBIDI_SHA256SUM="3fc96fa9473bd31dcb5500bdf1aa78b337ba13eb8c301e7c28923fea982453a8 0.19.7.tar.gz" | ||||||
|  | ARG         LIBVIDSTAB_SHA256SUM="14d2a053e56edad4f397be0cb3ef8eb1ec3150404ce99a426c4eb641861dc0bb v1.1.0.tar.gz" | ||||||
|  | ARG         OGG_SHA256SUM="e19ee34711d7af328cb26287f4137e70630e7261b17cbe3cd41011d73a654692 libogg-1.3.2.tar.gz" | ||||||
|  | ARG         OPUS_SHA256SUM="77db45a87b51578fbc49555ef1b10926179861d854eb2613207dc79d9ec0a9a9 opus-1.2.tar.gz" | ||||||
|  | ARG         THEORA_SHA256SUM="40952956c47811928d1e7922cda3bc1f427eb75680c3c37249c91e949054916b libtheora-1.1.1.tar.gz" | ||||||
|  | ARG         VORBIS_SHA256SUM="6efbcecdd3e5dfbf090341b485da9d176eb250d893e3eb378c428a2db38301ce libvorbis-1.3.5.tar.gz" | ||||||
|  | ARG         XVID_SHA256SUM="4e9fd62728885855bc5007fe1be58df42e5e274497591fec37249e1052ae316f xvidcore-1.3.4.tar.gz" | ||||||
|  | ARG         LIBZMQ_SHA256SUM="02ecc88466ae38cf2c8d79f09cfd2675ba299a439680b64ade733e26a349edeb v4.3.2.tar.gz" | ||||||
|  | ARG         LIBARIBB24_SHA256SUM="f61560738926e57f9173510389634d8c06cabedfa857db4b28fb7704707ff128 v1.0.3.tar.gz" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ARG         LD_LIBRARY_PATH=/opt/ffmpeg/lib | ||||||
|  | ARG         MAKEFLAGS="-j2" | ||||||
|  | ARG         PKG_CONFIG_PATH="/opt/ffmpeg/share/pkgconfig:/opt/ffmpeg/lib/pkgconfig:/opt/ffmpeg/lib64/pkgconfig" | ||||||
|  | ARG         PREFIX=/opt/ffmpeg | ||||||
|  | ARG         LD_LIBRARY_PATH="/opt/ffmpeg/lib:/opt/ffmpeg/lib64" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUN     buildDeps="autoconf \ | ||||||
|  |         automake \ | ||||||
|  |         cmake \ | ||||||
|  |         curl \ | ||||||
|  |         bzip2 \ | ||||||
|  |         libexpat1-dev \ | ||||||
|  |         g++ \ | ||||||
|  |         gcc \ | ||||||
|  |         git \ | ||||||
|  |         gperf \ | ||||||
|  |         libtool \ | ||||||
|  |         make \ | ||||||
|  |         nasm \ | ||||||
|  |         perl \ | ||||||
|  |         pkg-config \ | ||||||
|  |         python \ | ||||||
|  |         libssl-dev \ | ||||||
|  |         yasm \ | ||||||
|  |         zlib1g-dev" && \ | ||||||
|  |         apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ${buildDeps} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/nv-codec-headers && \ | ||||||
|  |         git clone https://github.com/FFmpeg/nv-codec-headers ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         git checkout n${NVIDIA_HEADERS_VERSION} && \ | ||||||
|  |         make PREFIX="${PREFIX}" && \ | ||||||
|  |         make install PREFIX="${PREFIX}" && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## opencore-amr https://sourceforge.net/projects/opencore-amr/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opencore-amr && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-${OPENCOREAMR_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## x264 http://www.videolan.org/developers/x264.html | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/x264 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-${X264_VERSION}.tar.bz2 | \ | ||||||
|  |         tar -jx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --enable-pic --disable-cli && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### x265 http://x265.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/x265 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://download.videolan.org/pub/videolan/x265/x265_${X265_VERSION}.tar.gz  | \ | ||||||
|  |         tar -zx && \ | ||||||
|  |         cd x265_${X265_VERSION}/build/linux && \ | ||||||
|  |         sed -i "/-DEXTRA_LIB/ s/$/ -DCMAKE_INSTALL_PREFIX=\${PREFIX}/" multilib.sh && \ | ||||||
|  |         sed -i "/^cmake/ s/$/ -DENABLE_CLI=OFF/" multilib.sh && \ | ||||||
|  |         ./multilib.sh && \ | ||||||
|  |         make -C 8bit install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libogg https://www.xiph.org/ogg/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ogg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/ogg/libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OGG_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libopus https://www.opus-codec.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opus && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OPUS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvorbis https://xiph.org/vorbis/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vorbis && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${VORBIS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libtheora http://www.theora.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/theora && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/theora/libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         echo ${THEORA_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvpx https://www.webmproject.org/code/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vpx && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://codeload.github.com/webmproject/libvpx/tar.gz/v${VPX_VERSION} | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-vp8 --enable-vp9 --enable-vp9-highbitdepth --enable-pic --enable-shared \ | ||||||
|  |         --disable-debug --disable-examples --disable-docs --disable-install-bins  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libwebp https://developers.google.com/speed/webp/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vebp && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${WEBP_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libmp3lame http://lame.sourceforge.net/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/lame && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/lame/lame/$(echo ${LAME_VERSION} | sed -e 's/[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)/\1.\2/')/lame-${LAME_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" --enable-shared --enable-nasm --disable-frontend && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### xvid https://www.xvid.com/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xvid && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xvid.org/downloads/xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         echo ${XVID_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx -f xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         cd xvidcore/build/generic && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### fdk-aac https://github.com/mstorsjo/fdk-aac | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/fdk-aac && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/mstorsjo/fdk-aac/archive/v${FDKAAC_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --datadir="${DIR}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## openjpeg https://github.com/uclouvain/openjpeg | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/openjpeg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         cmake -DBUILD_THIRDPARTY:BOOL=ON -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## freetype https://www.freetype.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/freetype && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FREETYPE_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## libvstab https://github.com/georgmartius/vid.stab | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/vid.stab && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/georgmartius/vid.stab/archive/v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBVIDSTAB_SHA256SUM} | sha256sum --check &&  \ | ||||||
|  |         tar -zx --strip-components=1 -f v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## fridibi https://www.fribidi.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/fribidi && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/fribidi/fribidi/archive/${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FRIBIDI_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f ${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         sed -i 's/^SUBDIRS =.*/SUBDIRS=gen.tab charset lib bin/' Makefile.am && \ | ||||||
|  |         ./bootstrap --no-config --auto && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j1 && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## kvazaar https://github.com/ultravideo/kvazaar | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/kvazaar && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/ultravideo/kvazaar/archive/v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/aom && \ | ||||||
|  |         git clone --branch ${AOM_VERSION} --depth 1 https://aomedia.googlesource.com/aom ${DIR} ; \ | ||||||
|  |         cd ${DIR} ; \ | ||||||
|  |         rm -rf CMakeCache.txt CMakeFiles ; \ | ||||||
|  |         mkdir -p ./aom_build ; \ | ||||||
|  |         cd ./aom_build ; \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DBUILD_SHARED_LIBS=1 ..; \ | ||||||
|  |         make ; \ | ||||||
|  |         make install ; \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libxcb (and supporting libraries) for screen capture https://xcb.freedesktop.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xorg-macros && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive//individual/util/util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xproto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/proto/xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libXau && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/lib/libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libpthread-stubs && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb-proto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libzmq https://github.com/zeromq/libzmq/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libzmq && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/zeromq/libzmq/archive/v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBZMQ_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -xz --strip-components=1 -f v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make check && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libsrt https://github.com/Haivision/srt | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/srt && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/Haivision/srt/archive/v${LIBSRT_VERSION}.tar.gz && \ | ||||||
|  |         tar -xz --strip-components=1 -f v${LIBSRT_VERSION}.tar.gz && \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libpng | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/png && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         git clone https://git.code.sf.net/p/libpng/code ${DIR} -b v${LIBPNG_VERSION} --depth 1 && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make check && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libaribb24 | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/b24 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/nkoriyama/aribb24/archive/v${LIBARIBB24_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBARIBB24_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -xz --strip-components=1 -f v${LIBARIBB24_VERSION}.tar.gz && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure CFLAGS="-I${PREFIX}/include -fPIC" --prefix="${PREFIX}" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## ffmpeg https://ffmpeg.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         curl -sLO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \ | ||||||
|  |         tar -jx --strip-components=1 -f ffmpeg-${FFMPEG_VERSION}.tar.bz2 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         ./configure \ | ||||||
|  |         --disable-debug \ | ||||||
|  |         --disable-doc \ | ||||||
|  |         --disable-ffplay \ | ||||||
|  |         --enable-shared \ | ||||||
|  |         --enable-avresample \ | ||||||
|  |         --enable-libopencore-amrnb \ | ||||||
|  |         --enable-libopencore-amrwb \ | ||||||
|  |         --enable-gpl \ | ||||||
|  |         --enable-libfreetype \ | ||||||
|  |         --enable-libvidstab \ | ||||||
|  |         --enable-libmp3lame \ | ||||||
|  |         --enable-libopus \ | ||||||
|  |         --enable-libtheora \ | ||||||
|  |         --enable-libvorbis \ | ||||||
|  |         --enable-libvpx \ | ||||||
|  |         --enable-libwebp \ | ||||||
|  |         --enable-libxcb \ | ||||||
|  |         --enable-libx265 \ | ||||||
|  |         --enable-libxvid \ | ||||||
|  |         --enable-libx264 \ | ||||||
|  |         --enable-nonfree \ | ||||||
|  |         --enable-openssl \ | ||||||
|  |         --enable-libfdk_aac \ | ||||||
|  |         --enable-postproc \ | ||||||
|  |         --enable-small \ | ||||||
|  |         --enable-version3 \ | ||||||
|  |         --enable-libzmq \ | ||||||
|  |         --extra-libs=-ldl \ | ||||||
|  |         --prefix="${PREFIX}" \ | ||||||
|  |         --enable-libopenjpeg \ | ||||||
|  |         --enable-libkvazaar \ | ||||||
|  |         --enable-libaom \ | ||||||
|  |         --extra-libs=-lpthread \ | ||||||
|  |         --enable-libsrt \ | ||||||
|  |         --enable-libaribb24 \ | ||||||
|  |         --enable-nvenc \ | ||||||
|  |         --enable-cuda \ | ||||||
|  |         --enable-cuvid \ | ||||||
|  |         --enable-libnpp \ | ||||||
|  |         --extra-cflags="-I${PREFIX}/include -I${PREFIX}/include/ffnvcodec -I/usr/local/cuda/include/" \ | ||||||
|  |         --extra-ldflags="-L${PREFIX}/lib -L/usr/local/cuda/lib64 -L/usr/local/cuda/lib32/" && \ | ||||||
|  |         make && \ | ||||||
|  |         make install && \ | ||||||
|  |         make tools/zmqsend && cp tools/zmqsend ${PREFIX}/bin/ && \ | ||||||
|  |         make distclean && \ | ||||||
|  |         hash -r && \ | ||||||
|  |         cd tools && \ | ||||||
|  |         make qt-faststart && cp qt-faststart ${PREFIX}/bin/ | ||||||
|  |  | ||||||
|  | ## cleanup | ||||||
|  | RUN \ | ||||||
|  |         LD_LIBRARY_PATH="${PREFIX}/lib:${PREFIX}/lib64:${LD_LIBRARY_PATH}" ldd ${PREFIX}/bin/ffmpeg | grep opt/ffmpeg | cut -d ' ' -f 3 | xargs -i cp {} /usr/local/lib/ && \ | ||||||
|  |         for lib in /usr/local/lib/*.so.*; do ln -s "${lib##*/}" "${lib%%.so.*}".so; done && \ | ||||||
|  |         cp ${PREFIX}/bin/* /usr/local/bin/ && \ | ||||||
|  |         cp -r ${PREFIX}/share/* /usr/local/share/ && \ | ||||||
|  |         LD_LIBRARY_PATH=/usr/local/lib ffmpeg -buildconf && \ | ||||||
|  |         cp -r ${PREFIX}/include/libav* ${PREFIX}/include/libpostproc ${PREFIX}/include/libsw* /usr/local/include && \ | ||||||
|  |         mkdir -p /usr/local/lib/pkgconfig && \ | ||||||
|  |         for pc in ${PREFIX}/lib/pkgconfig/libav*.pc ${PREFIX}/lib/pkgconfig/libpostproc.pc ${PREFIX}/lib/pkgconfig/libsw*.pc; do \ | ||||||
|  |         sed "s:${PREFIX}:/usr/local:g; s:/lib64:/lib:g" <"$pc" >/usr/local/lib/pkgconfig/"${pc##*/}"; \ | ||||||
|  |         done | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | FROM        runtime-base AS release | ||||||
|  |  | ||||||
|  | ENV         LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64 | ||||||
|  |  | ||||||
|  | CMD         ["--help"] | ||||||
|  | ENTRYPOINT  ["ffmpeg"] | ||||||
|  |  | ||||||
|  | # copy only needed files, without copying nvidia dev files | ||||||
|  | COPY --from=build /usr/local/bin /usr/local/bin/ | ||||||
|  | COPY --from=build /usr/local/share /usr/local/share/ | ||||||
|  | COPY --from=build /usr/local/lib /usr/local/lib/ | ||||||
|  | COPY --from=build /usr/local/include /usr/local/include/ | ||||||
|  |  | ||||||
|  | # Let's make sure the app built correctly | ||||||
|  | # Convenient to verify on https://hub.docker.com/r/jrottenberg/ffmpeg/builds/ console output | ||||||
							
								
								
									
										490
									
								
								docker/Dockerfile.ffmpeg.armv7
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										490
									
								
								docker/Dockerfile.ffmpeg.armv7
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,490 @@ | |||||||
|  | # inspired by: | ||||||
|  | # https://github.com/collelog/ffmpeg/blob/master/4.3.1-alpine-rpi4-arm64v8.Dockerfile | ||||||
|  | # https://github.com/mmastrac/ffmpeg-omx-rpi-docker/blob/master/Dockerfile | ||||||
|  | # https://github.com/jrottenberg/ffmpeg/pull/158/files | ||||||
|  | # https://github.com/jrottenberg/ffmpeg/pull/239 | ||||||
|  | FROM        ubuntu:20.04 AS base | ||||||
|  |  | ||||||
|  | WORKDIR     /tmp/workdir | ||||||
|  |  | ||||||
|  | ENV     DEBIAN_FRONTEND=noninteractive | ||||||
|  | RUN     apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 && \ | ||||||
|  |         apt-get autoremove -y && \ | ||||||
|  |         apt-get clean -y | ||||||
|  |  | ||||||
|  | FROM base as build | ||||||
|  |  | ||||||
|  | ENV     FFMPEG_VERSION=4.3.2 \ | ||||||
|  |         AOM_VERSION=v1.0.0 \ | ||||||
|  |         FDKAAC_VERSION=0.1.5 \ | ||||||
|  |         FREETYPE_VERSION=2.5.5 \ | ||||||
|  |         FRIBIDI_VERSION=0.19.7 \ | ||||||
|  |         KVAZAAR_VERSION=1.2.0 \ | ||||||
|  |         LAME_VERSION=3.100 \ | ||||||
|  |         LIBPTHREAD_STUBS_VERSION=0.4 \ | ||||||
|  |         LIBVIDSTAB_VERSION=1.1.0 \ | ||||||
|  |         LIBXCB_VERSION=1.13.1 \ | ||||||
|  |         XCBPROTO_VERSION=1.13 \ | ||||||
|  |         OGG_VERSION=1.3.2 \ | ||||||
|  |         OPENCOREAMR_VERSION=0.1.5 \ | ||||||
|  |         OPUS_VERSION=1.2 \ | ||||||
|  |         OPENJPEG_VERSION=2.1.2 \ | ||||||
|  |         THEORA_VERSION=1.1.1 \ | ||||||
|  |         VORBIS_VERSION=1.3.5 \ | ||||||
|  |         VPX_VERSION=1.8.0 \ | ||||||
|  |         WEBP_VERSION=1.0.2 \ | ||||||
|  |         X264_VERSION=20170226-2245-stable \ | ||||||
|  |         X265_VERSION=3.1.1 \ | ||||||
|  |         XAU_VERSION=1.0.9 \ | ||||||
|  |         XORG_MACROS_VERSION=1.19.2 \ | ||||||
|  |         XPROTO_VERSION=7.0.31 \ | ||||||
|  |         XVID_VERSION=1.3.4 \ | ||||||
|  |         LIBZMQ_VERSION=4.3.3 \ | ||||||
|  |         SRC=/usr/local | ||||||
|  |  | ||||||
|  | ARG         FREETYPE_SHA256SUM="5d03dd76c2171a7601e9ce10551d52d4471cf92cd205948e60289251daddffa8 freetype-2.5.5.tar.gz" | ||||||
|  | ARG         FRIBIDI_SHA256SUM="3fc96fa9473bd31dcb5500bdf1aa78b337ba13eb8c301e7c28923fea982453a8 0.19.7.tar.gz" | ||||||
|  | ARG         LIBVIDSTAB_SHA256SUM="14d2a053e56edad4f397be0cb3ef8eb1ec3150404ce99a426c4eb641861dc0bb v1.1.0.tar.gz" | ||||||
|  | ARG         OGG_SHA256SUM="e19ee34711d7af328cb26287f4137e70630e7261b17cbe3cd41011d73a654692 libogg-1.3.2.tar.gz" | ||||||
|  | ARG         OPUS_SHA256SUM="77db45a87b51578fbc49555ef1b10926179861d854eb2613207dc79d9ec0a9a9 opus-1.2.tar.gz" | ||||||
|  | ARG         THEORA_SHA256SUM="40952956c47811928d1e7922cda3bc1f427eb75680c3c37249c91e949054916b libtheora-1.1.1.tar.gz" | ||||||
|  | ARG         VORBIS_SHA256SUM="6efbcecdd3e5dfbf090341b485da9d176eb250d893e3eb378c428a2db38301ce libvorbis-1.3.5.tar.gz" | ||||||
|  | ARG         XVID_SHA256SUM="4e9fd62728885855bc5007fe1be58df42e5e274497591fec37249e1052ae316f xvidcore-1.3.4.tar.gz" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ARG         LD_LIBRARY_PATH=/opt/ffmpeg/lib | ||||||
|  | ARG         MAKEFLAGS="-j2" | ||||||
|  | ARG         PKG_CONFIG_PATH="/opt/ffmpeg/share/pkgconfig:/opt/ffmpeg/lib/pkgconfig:/opt/ffmpeg/lib64/pkgconfig:/opt/vc/lib/pkgconfig" | ||||||
|  | ARG         PREFIX=/opt/ffmpeg | ||||||
|  | ARG         LD_LIBRARY_PATH="/opt/ffmpeg/lib:/opt/ffmpeg/lib64:/usr/lib64:/usr/lib:/lib64:/lib:/opt/vc/lib" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | RUN     buildDeps="autoconf \ | ||||||
|  |         automake \ | ||||||
|  |         cmake \ | ||||||
|  |         curl \ | ||||||
|  |         bzip2 \ | ||||||
|  |         libexpat1-dev \ | ||||||
|  |         g++ \ | ||||||
|  |         gcc \ | ||||||
|  |         git \ | ||||||
|  |         gperf \ | ||||||
|  |         libtool \ | ||||||
|  |         make \ | ||||||
|  |         nasm \ | ||||||
|  |         perl \ | ||||||
|  |         pkg-config \ | ||||||
|  |         python \ | ||||||
|  |         sudo \ | ||||||
|  |         libssl-dev \ | ||||||
|  |         yasm \ | ||||||
|  |         linux-headers-raspi2 \ | ||||||
|  |         libomxil-bellagio-dev \ | ||||||
|  |         libx265-dev \ | ||||||
|  |         libaom-dev \ | ||||||
|  |         zlib1g-dev" && \ | ||||||
|  |         apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends ${buildDeps} | ||||||
|  | ## opencore-amr https://sourceforge.net/projects/opencore-amr/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opencore-amr && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/opencore-amr/opencore-amr/opencore-amr-${OPENCOREAMR_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## x264 http://www.videolan.org/developers/x264.html | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/x264 && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-${X264_VERSION}.tar.bz2 | \ | ||||||
|  |         tar -jx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --enable-pic --disable-cli && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | # ### x265 http://x265.org/ | ||||||
|  | # RUN \ | ||||||
|  | #         DIR=/tmp/x265 && \ | ||||||
|  | #         mkdir -p ${DIR} && \ | ||||||
|  | #         cd ${DIR} && \ | ||||||
|  | #         curl -sL https://download.videolan.org/pub/videolan/x265/x265_${X265_VERSION}.tar.gz  | \ | ||||||
|  | #         tar -zx && \ | ||||||
|  | #         cd x265_${X265_VERSION}/build/linux && \ | ||||||
|  | #         sed -i "/-DEXTRA_LIB/ s/$/ -DCMAKE_INSTALL_PREFIX=\${PREFIX}/" multilib.sh && \ | ||||||
|  | #         sed -i "/^cmake/ s/$/ -DENABLE_CLI=OFF/" multilib.sh && \ | ||||||
|  | #         # export CXXFLAGS="${CXXFLAGS} -fPIC" && \ | ||||||
|  | #         ./multilib.sh && \ | ||||||
|  | #         make -C 8bit install && \ | ||||||
|  | #         rm -rf ${DIR} | ||||||
|  | ### libogg https://www.xiph.org/ogg/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ogg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/ogg/libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OGG_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libogg-${OGG_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libopus https://www.opus-codec.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/opus && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${OPUS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f opus-${OPUS_VERSION}.tar.gz && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvorbis https://xiph.org/vorbis/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vorbis && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/vorbis/libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         echo ${VORBIS_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libvorbis-${VORBIS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libtheora http://www.theora.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/theora && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xiph.org/releases/theora/libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         echo ${THEORA_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f libtheora-${THEORA_VERSION}.tar.gz && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' -o config.guess && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' -o config.sub && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --with-ogg="${PREFIX}" --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libvpx https://www.webmproject.org/code/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vpx && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://codeload.github.com/webmproject/libvpx/tar.gz/v${VPX_VERSION} | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-vp8 --enable-vp9 --enable-vp9-highbitdepth --enable-pic --enable-shared \ | ||||||
|  |         --disable-debug --disable-examples --disable-docs --disable-install-bins  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libwebp https://developers.google.com/speed/webp/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/vebp && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${WEBP_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared  && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### libmp3lame http://lame.sourceforge.net/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/lame && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://versaweb.dl.sourceforge.net/project/lame/lame/$(echo ${LAME_VERSION} | sed -e 's/[^0-9]*\([0-9]*\)[.]\([0-9]*\)[.]\([0-9]*\)\([0-9A-Za-z-]*\)/\1.\2/')/lame-${LAME_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" --enable-shared --enable-nasm --disable-frontend && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### xvid https://www.xvid.com/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xvid && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO http://downloads.xvid.org/downloads/xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         echo ${XVID_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx -f xvidcore-${XVID_VERSION}.tar.gz && \ | ||||||
|  |         cd xvidcore/build/generic && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --bindir="${PREFIX}/bin" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ### fdk-aac https://github.com/mstorsjo/fdk-aac | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/fdk-aac && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/mstorsjo/fdk-aac/archive/v${FDKAAC_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         autoreconf -fiv && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --enable-shared --datadir="${DIR}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## openjpeg https://github.com/uclouvain/openjpeg | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/openjpeg && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sL https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz | \ | ||||||
|  |         tar -zx --strip-components=1 && \ | ||||||
|  |         export CFLAGS="${CFLAGS} -DPNG_ARM_NEON_OPT=0" && \ | ||||||
|  |         cmake -DBUILD_THIRDPARTY:BOOL=ON -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## freetype https://www.freetype.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/freetype && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FREETYPE_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f freetype-${FREETYPE_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## libvstab https://github.com/georgmartius/vid.stab | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/vid.stab && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/georgmartius/vid.stab/archive/v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         echo ${LIBVIDSTAB_SHA256SUM} | sha256sum --check &&  \ | ||||||
|  |         tar -zx --strip-components=1 -f v${LIBVIDSTAB_VERSION}.tar.gz && \ | ||||||
|  |         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" . && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  | ## fridibi https://www.fribidi.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/fribidi && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/fribidi/fribidi/archive/${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         echo ${FRIBIDI_SHA256SUM} | sha256sum --check && \ | ||||||
|  |         tar -zx --strip-components=1 -f ${FRIBIDI_VERSION}.tar.gz && \ | ||||||
|  |         sed -i 's/^SUBDIRS =.*/SUBDIRS=gen.tab charset lib bin/' Makefile.am && \ | ||||||
|  |         ./bootstrap --no-config --auto && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j1 && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## kvazaar https://github.com/ultravideo/kvazaar | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/kvazaar && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/ultravideo/kvazaar/archive/v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f v${KVAZAAR_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | # RUN \ | ||||||
|  | #         DIR=/tmp/aom && \ | ||||||
|  | #         git clone --branch ${AOM_VERSION} --depth 1 https://aomedia.googlesource.com/aom ${DIR} ; \ | ||||||
|  | #         cd ${DIR} ; \ | ||||||
|  | #         rm -rf CMakeCache.txt CMakeFiles ; \ | ||||||
|  | #         mkdir -p ./aom_build ; \ | ||||||
|  | #         cd ./aom_build ; \ | ||||||
|  | #         cmake -DCMAKE_INSTALL_PREFIX="${PREFIX}" -DBUILD_SHARED_LIBS=1 ..; \ | ||||||
|  | #         make ; \ | ||||||
|  | #         make install ; \ | ||||||
|  | #         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libxcb (and supporting libraries) for screen capture https://xcb.freedesktop.org/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xorg-macros && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive//individual/util/util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f util-macros-${XORG_MACROS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/xproto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/proto/xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xproto-${XPROTO_VERSION}.tar.gz && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' -o config.guess && \ | ||||||
|  |         curl -sL 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' -o config.sub && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libXau && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://www.x.org/archive/individual/lib/libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libXau-${XAU_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --srcdir=${DIR} --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libpthread-stubs && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libpthread-stubs-${LIBPTHREAD_STUBS_VERSION}.tar.gz && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb-proto && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f xcb-proto-${XCBPROTO_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libxcb && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://xcb.freedesktop.org/dist/libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         tar -zx --strip-components=1 -f libxcb-${LIBXCB_VERSION}.tar.gz && \ | ||||||
|  |         ACLOCAL_PATH="${PREFIX}/share/aclocal" ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" --disable-static --enable-shared && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## libzmq https://github.com/zeromq/libzmq/ | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/libzmq && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         curl -sLO https://github.com/zeromq/libzmq/archive/v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         tar -xz --strip-components=1 -f v${LIBZMQ_VERSION}.tar.gz && \ | ||||||
|  |         ./autogen.sh && \ | ||||||
|  |         ./configure --prefix="${PREFIX}" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         # make check && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## userland https://github.com/raspberrypi/userland | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/userland && \ | ||||||
|  |         mkdir -p ${DIR} && \ | ||||||
|  |         cd ${DIR} && \ | ||||||
|  |         git clone --depth 1 https://github.com/raspberrypi/userland.git . && \ | ||||||
|  |         ./buildme && \ | ||||||
|  |         rm -rf ${DIR} | ||||||
|  |  | ||||||
|  | ## ffmpeg https://ffmpeg.org/ | ||||||
|  | RUN  \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         curl -sLO https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2 && \ | ||||||
|  |         tar -jx --strip-components=1 -f ffmpeg-${FFMPEG_VERSION}.tar.bz2 | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         DIR=/tmp/ffmpeg && mkdir -p ${DIR} && cd ${DIR} && \ | ||||||
|  |         ./configure \ | ||||||
|  |         --disable-debug \ | ||||||
|  |         --disable-doc \ | ||||||
|  |         --disable-ffplay \ | ||||||
|  |         --enable-shared \ | ||||||
|  |         --enable-avresample \ | ||||||
|  |         --enable-libopencore-amrnb \ | ||||||
|  |         --enable-libopencore-amrwb \ | ||||||
|  |         --enable-gpl \ | ||||||
|  |         --enable-libfreetype \ | ||||||
|  |         --enable-libvidstab \ | ||||||
|  |         --enable-libmp3lame \ | ||||||
|  |         --enable-libopus \ | ||||||
|  |         --enable-libtheora \ | ||||||
|  |         --enable-libvorbis \ | ||||||
|  |         --enable-libvpx \ | ||||||
|  |         --enable-libwebp \ | ||||||
|  |         --enable-libxcb \ | ||||||
|  |         --enable-libx265 \ | ||||||
|  |         --enable-libxvid \ | ||||||
|  |         --enable-libx264 \ | ||||||
|  |         --enable-nonfree \ | ||||||
|  |         --enable-openssl \ | ||||||
|  |         --enable-libfdk_aac \ | ||||||
|  |         --enable-postproc \ | ||||||
|  |         --enable-small \ | ||||||
|  |         --enable-version3 \ | ||||||
|  |         --enable-libzmq \ | ||||||
|  |         --extra-libs=-ldl \ | ||||||
|  |         --prefix="${PREFIX}" \ | ||||||
|  |         --enable-libopenjpeg \ | ||||||
|  |         --enable-libkvazaar \ | ||||||
|  |         --enable-libaom \ | ||||||
|  |         --extra-libs=-lpthread \ | ||||||
|  |         --enable-omx \ | ||||||
|  |         --enable-omx-rpi \ | ||||||
|  |         --enable-mmal \ | ||||||
|  |         --enable-v4l2_m2m \ | ||||||
|  |         --enable-neon \ | ||||||
|  |         --extra-cflags="-I${PREFIX}/include" \ | ||||||
|  |         --extra-ldflags="-L${PREFIX}/lib" && \ | ||||||
|  |         make -j $(nproc) && \ | ||||||
|  |         make -j $(nproc) install && \ | ||||||
|  |         make tools/zmqsend && cp tools/zmqsend ${PREFIX}/bin/ && \ | ||||||
|  |         make distclean && \ | ||||||
|  |         hash -r && \ | ||||||
|  |         cd tools && \ | ||||||
|  |         make qt-faststart && cp qt-faststart ${PREFIX}/bin/ | ||||||
|  |  | ||||||
|  | ## cleanup | ||||||
|  | RUN \ | ||||||
|  |         ldd ${PREFIX}/bin/ffmpeg | grep opt/ffmpeg | cut -d ' ' -f 3 | xargs -i cp {} /usr/local/lib/ && \ | ||||||
|  |         # copy userland lib too | ||||||
|  |         ldd ${PREFIX}/bin/ffmpeg | grep opt/vc | cut -d ' ' -f 3 | xargs -i cp {} /usr/local/lib/ && \ | ||||||
|  |         for lib in /usr/local/lib/*.so.*; do ln -s "${lib##*/}" "${lib%%.so.*}".so; done && \ | ||||||
|  |         cp ${PREFIX}/bin/* /usr/local/bin/ && \ | ||||||
|  |         cp -r ${PREFIX}/share/ffmpeg /usr/local/share/ && \ | ||||||
|  |         LD_LIBRARY_PATH=/usr/local/lib ffmpeg -buildconf && \ | ||||||
|  |         cp -r ${PREFIX}/include/libav* ${PREFIX}/include/libpostproc ${PREFIX}/include/libsw* /usr/local/include && \ | ||||||
|  |         mkdir -p /usr/local/lib/pkgconfig && \ | ||||||
|  |         for pc in ${PREFIX}/lib/pkgconfig/libav*.pc ${PREFIX}/lib/pkgconfig/libpostproc.pc ${PREFIX}/lib/pkgconfig/libsw*.pc; do \ | ||||||
|  |         sed "s:${PREFIX}:/usr/local:g" <"$pc" >/usr/local/lib/pkgconfig/"${pc##*/}"; \ | ||||||
|  |         done | ||||||
|  |  | ||||||
|  | FROM        base AS release | ||||||
|  |  | ||||||
|  | ENV         LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64:/lib:/lib64 | ||||||
|  |  | ||||||
|  | RUN \ | ||||||
|  |         apt-get -yqq update && \ | ||||||
|  |         apt-get install -yq --no-install-recommends libx265-dev libaom-dev && \ | ||||||
|  |         apt-get autoremove -y && \ | ||||||
|  |         apt-get clean -y | ||||||
|  |  | ||||||
|  | CMD         ["--help"] | ||||||
|  | ENTRYPOINT  ["ffmpeg"] | ||||||
|  |  | ||||||
|  | COPY --from=build /usr/local /usr/local/ | ||||||
							
								
								
									
										52
									
								
								docker/Dockerfile.nginx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								docker/Dockerfile.nginx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | |||||||
|  | FROM ubuntu:20.04 AS base | ||||||
|  |  | ||||||
|  | ENV DEBIAN_FRONTEND=noninteractive | ||||||
|  | RUN apt-get -yqq update && \ | ||||||
|  |     apt-get install -yq --no-install-recommends ca-certificates expat libgomp1 && \ | ||||||
|  |     apt-get autoremove -y && \ | ||||||
|  |     apt-get clean -y | ||||||
|  |  | ||||||
|  | FROM base as build | ||||||
|  |  | ||||||
|  | ARG NGINX_VERSION=1.18.0 | ||||||
|  | ARG VOD_MODULE_VERSION=1.28 | ||||||
|  | ARG SECURE_TOKEN_MODULE_VERSION=1.4 | ||||||
|  | ARG RTMP_MODULE_VERSION=1.2.1 | ||||||
|  |  | ||||||
|  | RUN cp /etc/apt/sources.list /etc/apt/sources.list~ \ | ||||||
|  |     && sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list \ | ||||||
|  |     && apt-get update | ||||||
|  |  | ||||||
|  | RUN apt-get -yqq build-dep nginx | ||||||
|  |  | ||||||
|  | RUN apt-get -yqq install --no-install-recommends curl \ | ||||||
|  |     && mkdir /tmp/nginx \ | ||||||
|  |     && curl -sL https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz | tar -C /tmp/nginx -zx --strip-components=1 \ | ||||||
|  |     && mkdir /tmp/nginx-vod-module \ | ||||||
|  |     && curl -sL https://github.com/kaltura/nginx-vod-module/archive/refs/tags/${VOD_MODULE_VERSION}.tar.gz | tar -C /tmp/nginx-vod-module -zx --strip-components=1 \ | ||||||
|  |     # Patch MAX_CLIPS to allow more clips to be added than the default 128 | ||||||
|  |     && sed -i 's/MAX_CLIPS (128)/MAX_CLIPS (1080)/g' /tmp/nginx-vod-module/vod/media_set.h \ | ||||||
|  |     && mkdir /tmp/nginx-secure-token-module \ | ||||||
|  |     && curl -sL https://github.com/kaltura/nginx-secure-token-module/archive/refs/tags/${SECURE_TOKEN_MODULE_VERSION}.tar.gz | tar -C /tmp/nginx-secure-token-module -zx --strip-components=1 \ | ||||||
|  |     && mkdir /tmp/nginx-rtmp-module \ | ||||||
|  |     && curl -sL https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v${RTMP_MODULE_VERSION}.tar.gz | tar -C /tmp/nginx-rtmp-module -zx --strip-components=1 | ||||||
|  |  | ||||||
|  | WORKDIR /tmp/nginx | ||||||
|  |  | ||||||
|  | RUN ./configure --prefix=/usr/local/nginx \ | ||||||
|  |     --with-file-aio \ | ||||||
|  |     --with-http_sub_module \ | ||||||
|  |     --with-http_ssl_module \ | ||||||
|  |     --with-threads \ | ||||||
|  |     --add-module=../nginx-vod-module \ | ||||||
|  |     --add-module=../nginx-secure-token-module \ | ||||||
|  |     --add-module=../nginx-rtmp-module \ | ||||||
|  |     --with-cc-opt="-O3 -Wno-error=implicit-fallthrough" | ||||||
|  |  | ||||||
|  | RUN make && make install | ||||||
|  | RUN rm -rf /usr/local/nginx/html /usr/local/nginx/conf/*.default | ||||||
|  |  | ||||||
|  | FROM base | ||||||
|  | COPY --from=build /usr/local/nginx /usr/local/nginx | ||||||
|  | ENTRYPOINT ["/usr/local/nginx/sbin/nginx"] | ||||||
|  | CMD ["-g", "daemon off;"] | ||||||
							
								
								
									
										9
									
								
								docker/Dockerfile.web
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docker/Dockerfile.web
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | ARG NODE_VERSION=14.0 | ||||||
|  |  | ||||||
|  | FROM node:${NODE_VERSION} | ||||||
|  |  | ||||||
|  | WORKDIR /opt/frigate | ||||||
|  |  | ||||||
|  | COPY . . | ||||||
|  |  | ||||||
|  | RUN npm install && npm run build | ||||||
							
								
								
									
										41
									
								
								docker/Dockerfile.wheels
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								docker/Dockerfile.wheels
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | |||||||
|  | FROM ubuntu:20.04 as build | ||||||
|  |  | ||||||
|  | ENV DEBIAN_FRONTEND=noninteractive | ||||||
|  |  | ||||||
|  | RUN apt-get -qq update \ | ||||||
|  |     && apt-get -qq install -y \ | ||||||
|  |     python3 \ | ||||||
|  |     python3-dev \ | ||||||
|  |     wget \ | ||||||
|  |     # opencv dependencies | ||||||
|  |     build-essential cmake git pkg-config libgtk-3-dev \ | ||||||
|  |     libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ | ||||||
|  |     libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \ | ||||||
|  |     gfortran openexr libatlas-base-dev libssl-dev\ | ||||||
|  |     libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev \ | ||||||
|  |     libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \ | ||||||
|  |     # scipy dependencies | ||||||
|  |     gcc gfortran libopenblas-dev liblapack-dev cython | ||||||
|  |  | ||||||
|  | RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ | ||||||
|  |     && python3 get-pip.py "pip==20.2.4" | ||||||
|  |  | ||||||
|  | RUN pip3 install scikit-build | ||||||
|  |  | ||||||
|  | RUN pip3 wheel --wheel-dir=/wheels \ | ||||||
|  |     opencv-python-headless \ | ||||||
|  |     numpy \ | ||||||
|  |     imutils \ | ||||||
|  |     scipy \ | ||||||
|  |     psutil \ | ||||||
|  |     Flask \ | ||||||
|  |     paho-mqtt \ | ||||||
|  |     PyYAML \ | ||||||
|  |     matplotlib \ | ||||||
|  |     click \ | ||||||
|  |     setproctitle \ | ||||||
|  |     peewee | ||||||
|  |  | ||||||
|  | FROM scratch | ||||||
|  |  | ||||||
|  | COPY --from=build /wheels /wheels | ||||||
| @@ -1,263 +0,0 @@ | |||||||
| # syntax=docker/dockerfile:1.6 |  | ||||||
|  |  | ||||||
| # https://askubuntu.com/questions/972516/debian-frontend-environment-variable |  | ||||||
| ARG DEBIAN_FRONTEND=noninteractive |  | ||||||
|  |  | ||||||
| ARG BASE_IMAGE=debian:11 |  | ||||||
| ARG SLIM_BASE=debian:11-slim |  | ||||||
|  |  | ||||||
| FROM ${BASE_IMAGE} AS base |  | ||||||
|  |  | ||||||
| FROM --platform=${BUILDPLATFORM} debian:11 AS base_host |  | ||||||
|  |  | ||||||
| FROM ${SLIM_BASE} AS slim-base |  | ||||||
|  |  | ||||||
| FROM slim-base AS wget |  | ||||||
| ARG DEBIAN_FRONTEND |  | ||||||
| RUN apt-get update \ |  | ||||||
|     && apt-get install -y wget xz-utils \ |  | ||||||
|     && rm -rf /var/lib/apt/lists/* |  | ||||||
| WORKDIR /rootfs |  | ||||||
|  |  | ||||||
| FROM base AS nginx |  | ||||||
| ARG DEBIAN_FRONTEND |  | ||||||
| ENV CCACHE_DIR /root/.ccache |  | ||||||
| ENV CCACHE_MAXSIZE 2G |  | ||||||
|  |  | ||||||
| # bind /var/cache/apt to tmpfs to speed up nginx build |  | ||||||
| RUN --mount=type=tmpfs,target=/tmp --mount=type=tmpfs,target=/var/cache/apt \ |  | ||||||
|     --mount=type=bind,source=docker/main/build_nginx.sh,target=/deps/build_nginx.sh \ |  | ||||||
|     --mount=type=cache,target=/root/.ccache \ |  | ||||||
|     /deps/build_nginx.sh |  | ||||||
|  |  | ||||||
| FROM scratch AS go2rtc |  | ||||||
| ARG TARGETARCH |  | ||||||
| WORKDIR /rootfs/usr/local/go2rtc/bin |  | ||||||
| ADD --link --chmod=755 "https://github.com/AlexxIT/go2rtc/releases/download/v1.8.1/go2rtc_linux_${TARGETARCH}" go2rtc |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #### |  | ||||||
| # |  | ||||||
| # OpenVino Support |  | ||||||
| # |  | ||||||
| # 1. Download and convert a model from Intel's Public Open Model Zoo |  | ||||||
| # 2. Build libUSB without udev to handle NCS2 enumeration |  | ||||||
| # |  | ||||||
| #### |  | ||||||
| # Download and Convert OpenVino model |  | ||||||
| FROM base_host AS ov-converter |  | ||||||
| ARG DEBIAN_FRONTEND |  | ||||||
|  |  | ||||||
| # Install OpenVino Runtime and Dev library |  | ||||||
| COPY docker/main/requirements-ov.txt /requirements-ov.txt |  | ||||||
| RUN apt-get -qq update \ |  | ||||||
|     && apt-get -qq install -y wget python3 python3-distutils \ |  | ||||||
|     && wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ |  | ||||||
|     && python3 get-pip.py "pip" \ |  | ||||||
|     && pip install -r /requirements-ov.txt |  | ||||||
|  |  | ||||||
| # Get OpenVino Model |  | ||||||
| RUN mkdir /models \ |  | ||||||
|     && cd /models && omz_downloader --name ssdlite_mobilenet_v2 \ |  | ||||||
|     && cd /models && omz_converter --name ssdlite_mobilenet_v2 --precision FP16 |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # libUSB - No Udev |  | ||||||
| FROM wget as libusb-build |  | ||||||
| ARG TARGETARCH |  | ||||||
| ARG DEBIAN_FRONTEND |  | ||||||
| ENV CCACHE_DIR /root/.ccache |  | ||||||
| ENV CCACHE_MAXSIZE 2G |  | ||||||
|  |  | ||||||
| # Build libUSB without udev.  Needed for Openvino NCS2 support |  | ||||||
| WORKDIR /opt |  | ||||||
| RUN apt-get update && apt-get install -y unzip build-essential automake libtool ccache pkg-config |  | ||||||
| RUN --mount=type=cache,target=/root/.ccache wget -q https://github.com/libusb/libusb/archive/v1.0.26.zip -O v1.0.26.zip && \ |  | ||||||
|     unzip v1.0.26.zip && cd libusb-1.0.26 && \ |  | ||||||
|     ./bootstrap.sh && \ |  | ||||||
|     ./configure CC='ccache gcc' CCX='ccache g++' --disable-udev --enable-shared && \ |  | ||||||
|     make -j $(nproc --all) |  | ||||||
| RUN apt-get update && \ |  | ||||||
|     apt-get install -y --no-install-recommends libusb-1.0-0-dev && \ |  | ||||||
|     rm -rf /var/lib/apt/lists/* |  | ||||||
| WORKDIR /opt/libusb-1.0.26/libusb |  | ||||||
| RUN /bin/mkdir -p '/usr/local/lib' && \ |  | ||||||
|     /bin/bash ../libtool  --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib' && \ |  | ||||||
|     /bin/mkdir -p '/usr/local/include/libusb-1.0' && \ |  | ||||||
|     /usr/bin/install -c -m 644 libusb.h '/usr/local/include/libusb-1.0' && \ |  | ||||||
|     /bin/mkdir -p '/usr/local/lib/pkgconfig' && \ |  | ||||||
|     cd  /opt/libusb-1.0.26/ && \ |  | ||||||
|     /usr/bin/install -c -m 644 libusb-1.0.pc '/usr/local/lib/pkgconfig' && \ |  | ||||||
|     ldconfig |  | ||||||
|  |  | ||||||
| FROM wget AS models |  | ||||||
|  |  | ||||||
| # Get model and labels |  | ||||||
| RUN wget -qO edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite |  | ||||||
| RUN wget -qO cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite |  | ||||||
| COPY labelmap.txt . |  | ||||||
| # Copy OpenVino model |  | ||||||
| COPY --from=ov-converter /models/public/ssdlite_mobilenet_v2/FP16 openvino-model |  | ||||||
| RUN wget -q https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt -O openvino-model/coco_91cl_bkgr.txt && \ |  | ||||||
|     sed -i 's/truck/car/g' openvino-model/coco_91cl_bkgr.txt |  | ||||||
| # Get Audio Model and labels |  | ||||||
| RUN wget -qO cpu_audio_model.tflite https://tfhub.dev/google/lite-model/yamnet/classification/tflite/1?lite-format=tflite |  | ||||||
| COPY audio-labelmap.txt . |  | ||||||
|  |  | ||||||
|  |  | ||||||
| FROM wget AS s6-overlay |  | ||||||
| ARG TARGETARCH |  | ||||||
| RUN --mount=type=bind,source=docker/main/install_s6_overlay.sh,target=/deps/install_s6_overlay.sh \ |  | ||||||
|     /deps/install_s6_overlay.sh |  | ||||||
|  |  | ||||||
|  |  | ||||||
| FROM base AS wheels |  | ||||||
| ARG DEBIAN_FRONTEND |  | ||||||
| ARG TARGETARCH |  | ||||||
|  |  | ||||||
| # Use a separate container to build wheels to prevent build dependencies in final image |  | ||||||
| RUN apt-get -qq update \ |  | ||||||
|     && apt-get -qq install -y \ |  | ||||||
|     apt-transport-https \ |  | ||||||
|     gnupg \ |  | ||||||
|     wget \ |  | ||||||
|     # the key fingerprint can be obtained from https://ftp-master.debian.org/keys.html |  | ||||||
|     && wget -qO- "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA4285295FC7B1A81600062A9605C66F00D6C9793" | \ |  | ||||||
|     gpg --dearmor > /usr/share/keyrings/debian-archive-bullseye-stable.gpg \ |  | ||||||
|     && echo "deb [signed-by=/usr/share/keyrings/debian-archive-bullseye-stable.gpg] http://deb.debian.org/debian bullseye main contrib non-free" | \ |  | ||||||
|     tee /etc/apt/sources.list.d/debian-bullseye-nonfree.list \ |  | ||||||
|     && apt-get -qq update \ |  | ||||||
|     && apt-get -qq install -y \ |  | ||||||
|     python3.9 \ |  | ||||||
|     python3.9-dev \ |  | ||||||
|     # opencv dependencies |  | ||||||
|     build-essential cmake git pkg-config libgtk-3-dev \ |  | ||||||
|     libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ |  | ||||||
|     libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \ |  | ||||||
|     gfortran openexr libatlas-base-dev libssl-dev\ |  | ||||||
|     libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev \ |  | ||||||
|     libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev \ |  | ||||||
|     # scipy dependencies |  | ||||||
|     gcc gfortran libopenblas-dev liblapack-dev && \ |  | ||||||
|     rm -rf /var/lib/apt/lists/* |  | ||||||
|  |  | ||||||
| # Ensure python3 defaults to python3.9 |  | ||||||
| RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1 |  | ||||||
|  |  | ||||||
| RUN wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py \ |  | ||||||
|     && python3 get-pip.py "pip" |  | ||||||
|  |  | ||||||
| COPY docker/main/requirements.txt /requirements.txt |  | ||||||
| RUN pip3 install -r /requirements.txt |  | ||||||
|  |  | ||||||
| COPY docker/main/requirements-wheels.txt /requirements-wheels.txt |  | ||||||
| RUN pip3 wheel --wheel-dir=/wheels -r /requirements-wheels.txt |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # Collect deps in a single layer |  | ||||||
| FROM scratch AS deps-rootfs |  | ||||||
| COPY --from=nginx /usr/local/nginx/ /usr/local/nginx/ |  | ||||||
| COPY --from=go2rtc /rootfs/ / |  | ||||||
| COPY --from=libusb-build /usr/local/lib /usr/local/lib |  | ||||||
| COPY --from=s6-overlay /rootfs/ / |  | ||||||
| COPY --from=models /rootfs/ / |  | ||||||
| COPY docker/main/rootfs/ / |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # Frigate deps (ffmpeg, python, nginx, go2rtc, s6-overlay, etc) |  | ||||||
| FROM slim-base AS deps |  | ||||||
| ARG TARGETARCH |  | ||||||
|  |  | ||||||
| ARG DEBIAN_FRONTEND |  | ||||||
| # http://stackoverflow.com/questions/48162574/ddg#49462622 |  | ||||||
| ARG APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn |  | ||||||
|  |  | ||||||
| # https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(Native-GPU-Support) |  | ||||||
| ENV NVIDIA_VISIBLE_DEVICES=all |  | ||||||
| ENV NVIDIA_DRIVER_CAPABILITIES="compute,video,utility" |  | ||||||
|  |  | ||||||
| ENV PATH="/usr/lib/btbn-ffmpeg/bin:/usr/local/go2rtc/bin:/usr/local/nginx/sbin:${PATH}" |  | ||||||
|  |  | ||||||
| # Install dependencies |  | ||||||
| RUN --mount=type=bind,source=docker/main/install_deps.sh,target=/deps/install_deps.sh \ |  | ||||||
|     /deps/install_deps.sh |  | ||||||
|  |  | ||||||
| RUN --mount=type=bind,from=wheels,source=/wheels,target=/deps/wheels \ |  | ||||||
|     python3 -m pip install --upgrade pip && \ |  | ||||||
|     pip3 install -U /deps/wheels/*.whl |  | ||||||
|  |  | ||||||
| COPY --from=deps-rootfs / / |  | ||||||
|  |  | ||||||
| RUN ldconfig |  | ||||||
|  |  | ||||||
| EXPOSE 5000 |  | ||||||
| EXPOSE 1935 |  | ||||||
| EXPOSE 8554 |  | ||||||
| EXPOSE 8555/tcp 8555/udp |  | ||||||
|  |  | ||||||
| # Configure logging to prepend timestamps, log to stdout, keep 0 archives and rotate on 10MB |  | ||||||
| ENV S6_LOGGING_SCRIPT="T 1 n0 s10000000 T" |  | ||||||
|  |  | ||||||
| ENTRYPOINT ["/init"] |  | ||||||
| CMD [] |  | ||||||
|  |  | ||||||
| HEALTHCHECK --start-period=120s --start-interval=5s --interval=15s --timeout=5s --retries=3 \ |  | ||||||
|     CMD curl --fail --silent --show-error http://127.0.0.1:5000/api/version || exit 1 |  | ||||||
|  |  | ||||||
| # Frigate deps with Node.js and NPM for devcontainer |  | ||||||
| FROM deps AS devcontainer |  | ||||||
|  |  | ||||||
| # Do not start the actual Frigate service on devcontainer as it will be started by VSCode |  | ||||||
| # But start a fake service for simulating the logs |  | ||||||
| COPY docker/main/fake_frigate_run /etc/s6-overlay/s6-rc.d/frigate/run |  | ||||||
|  |  | ||||||
| # Create symbolic link to the frigate source code, as go2rtc's create_config.sh uses it |  | ||||||
| RUN mkdir -p /opt/frigate \ |  | ||||||
|     && ln -svf /workspace/frigate/frigate /opt/frigate/frigate |  | ||||||
|  |  | ||||||
| # Install Node 16 |  | ||||||
| RUN apt-get update \ |  | ||||||
|     && apt-get install wget -y \ |  | ||||||
|     && wget -qO- https://deb.nodesource.com/setup_16.x | bash - \ |  | ||||||
|     && apt-get install -y nodejs \ |  | ||||||
|     && rm -rf /var/lib/apt/lists/* \ |  | ||||||
|     && npm install -g npm@9 |  | ||||||
|  |  | ||||||
| WORKDIR /workspace/frigate |  | ||||||
|  |  | ||||||
| RUN apt-get update \ |  | ||||||
|     && apt-get install make -y \ |  | ||||||
|     && rm -rf /var/lib/apt/lists/* |  | ||||||
|  |  | ||||||
| RUN --mount=type=bind,source=./docker/main/requirements-dev.txt,target=/workspace/frigate/requirements-dev.txt \ |  | ||||||
|     pip3 install -r requirements-dev.txt |  | ||||||
|  |  | ||||||
| CMD ["sleep", "infinity"] |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # Frigate web build |  | ||||||
| # This should be architecture agnostic, so speed up the build on multiarch by not using QEMU. |  | ||||||
| FROM --platform=$BUILDPLATFORM node:16 AS web-build |  | ||||||
|  |  | ||||||
| WORKDIR /work |  | ||||||
| COPY web/package.json web/package-lock.json ./ |  | ||||||
| RUN npm install |  | ||||||
|  |  | ||||||
| COPY web/ ./ |  | ||||||
| RUN npm run build \ |  | ||||||
|     && mv dist/BASE_PATH/monacoeditorwork/* dist/assets/ \ |  | ||||||
|     && rm -rf dist/BASE_PATH |  | ||||||
|  |  | ||||||
| # Collect final files in a single layer |  | ||||||
| FROM scratch AS rootfs |  | ||||||
|  |  | ||||||
| WORKDIR /opt/frigate/ |  | ||||||
| COPY frigate frigate/ |  | ||||||
| COPY migrations migrations/ |  | ||||||
| COPY --from=web-build /work/dist/ web/ |  | ||||||
|  |  | ||||||
| # Frigate final container |  | ||||||
| FROM deps AS frigate |  | ||||||
|  |  | ||||||
| WORKDIR /opt/frigate/ |  | ||||||
| COPY --from=rootfs / / |  | ||||||
| @@ -1,70 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -euxo pipefail |  | ||||||
|  |  | ||||||
| NGINX_VERSION="1.25.2" |  | ||||||
| VOD_MODULE_VERSION="1.31" |  | ||||||
| SECURE_TOKEN_MODULE_VERSION="1.5" |  | ||||||
| RTMP_MODULE_VERSION="1.2.2" |  | ||||||
|  |  | ||||||
| cp /etc/apt/sources.list /etc/apt/sources.list.d/sources-src.list |  | ||||||
| sed -i 's|deb http|deb-src http|g' /etc/apt/sources.list.d/sources-src.list |  | ||||||
| apt-get update |  | ||||||
|  |  | ||||||
| apt-get -yqq build-dep nginx |  | ||||||
|  |  | ||||||
| apt-get -yqq install --no-install-recommends ca-certificates wget |  | ||||||
| update-ca-certificates -f |  | ||||||
| apt install -y ccache |  | ||||||
|  |  | ||||||
| export PATH="/usr/lib/ccache:$PATH" |  | ||||||
|  |  | ||||||
| mkdir /tmp/nginx |  | ||||||
| wget -nv https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz |  | ||||||
| tar -zxf nginx-${NGINX_VERSION}.tar.gz -C /tmp/nginx --strip-components=1 |  | ||||||
| rm nginx-${NGINX_VERSION}.tar.gz |  | ||||||
| mkdir /tmp/nginx-vod-module |  | ||||||
| wget -nv https://github.com/kaltura/nginx-vod-module/archive/refs/tags/${VOD_MODULE_VERSION}.tar.gz |  | ||||||
| tar -zxf ${VOD_MODULE_VERSION}.tar.gz -C /tmp/nginx-vod-module --strip-components=1 |  | ||||||
| rm ${VOD_MODULE_VERSION}.tar.gz |  | ||||||
|     # Patch MAX_CLIPS to allow more clips to be added than the default 128 |  | ||||||
| sed -i 's/MAX_CLIPS (128)/MAX_CLIPS (1080)/g' /tmp/nginx-vod-module/vod/media_set.h |  | ||||||
| patch -d /tmp/nginx-vod-module/ -p1 << 'EOF' |  | ||||||
| --- a/vod/avc_hevc_parser.c       2022-06-27 11:38:10.000000000 +0000 |  | ||||||
| +++ b/vod/avc_hevc_parser.c       2023-01-16 11:25:10.900521298 +0000 |  | ||||||
| @@ -3,6 +3,9 @@ |  | ||||||
|  bool_t |  | ||||||
|  avc_hevc_parser_rbsp_trailing_bits(bit_reader_state_t* reader) |  | ||||||
|  { |  | ||||||
| +	// https://github.com/blakeblackshear/frigate/issues/4572 |  | ||||||
| +	return TRUE; |  | ||||||
| + |  | ||||||
|  	uint32_t one_bit; |  | ||||||
|  |  | ||||||
|  	if (reader->stream.eof_reached) |  | ||||||
| EOF |  | ||||||
|  |  | ||||||
|  |  | ||||||
| mkdir /tmp/nginx-secure-token-module |  | ||||||
| wget https://github.com/kaltura/nginx-secure-token-module/archive/refs/tags/${SECURE_TOKEN_MODULE_VERSION}.tar.gz |  | ||||||
| tar -zxf ${SECURE_TOKEN_MODULE_VERSION}.tar.gz -C /tmp/nginx-secure-token-module --strip-components=1 |  | ||||||
| rm ${SECURE_TOKEN_MODULE_VERSION}.tar.gz |  | ||||||
| mkdir /tmp/nginx-rtmp-module |  | ||||||
| wget -nv https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v${RTMP_MODULE_VERSION}.tar.gz |  | ||||||
| tar -zxf v${RTMP_MODULE_VERSION}.tar.gz -C /tmp/nginx-rtmp-module --strip-components=1 |  | ||||||
| rm v${RTMP_MODULE_VERSION}.tar.gz |  | ||||||
|  |  | ||||||
| cd /tmp/nginx |  | ||||||
|  |  | ||||||
| ./configure --prefix=/usr/local/nginx \ |  | ||||||
|     --with-file-aio \ |  | ||||||
|     --with-http_sub_module \ |  | ||||||
|     --with-http_ssl_module \ |  | ||||||
|     --with-threads \ |  | ||||||
|     --add-module=../nginx-vod-module \ |  | ||||||
|     --add-module=../nginx-secure-token-module \ |  | ||||||
|     --add-module=../nginx-rtmp-module \ |  | ||||||
|     --with-cc-opt="-O3 -Wno-error=implicit-fallthrough" |  | ||||||
|  |  | ||||||
| make CC="ccache gcc" -j$(nproc) && make install |  | ||||||
| rm -rf /usr/local/nginx/html /usr/local/nginx/conf/*.default |  | ||||||
| @@ -1,13 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Start the fake Frigate service |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Tell S6-Overlay not to restart this service |  | ||||||
| s6-svc -O . |  | ||||||
|  |  | ||||||
| while true; do |  | ||||||
|   echo "[INFO] The fake Frigate service is running..." |  | ||||||
|   sleep 5s |  | ||||||
| done |  | ||||||
| @@ -1,84 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -euxo pipefail |  | ||||||
|  |  | ||||||
| apt-get -qq update |  | ||||||
|  |  | ||||||
| apt-get -qq install --no-install-recommends -y \ |  | ||||||
|     apt-transport-https \ |  | ||||||
|     gnupg \ |  | ||||||
|     wget \ |  | ||||||
|     procps vainfo \ |  | ||||||
|     unzip locales tzdata libxml2 xz-utils \ |  | ||||||
|     python3.9 \ |  | ||||||
|     python3-pip \ |  | ||||||
|     curl \ |  | ||||||
|     jq \ |  | ||||||
|     nethogs |  | ||||||
|  |  | ||||||
| # ensure python3 defaults to python3.9 |  | ||||||
| update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1 |  | ||||||
|  |  | ||||||
| mkdir -p -m 600 /root/.gnupg |  | ||||||
|  |  | ||||||
| # add coral repo |  | ||||||
| curl -fsSLo - https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ |  | ||||||
|     gpg --dearmor -o /etc/apt/trusted.gpg.d/google-cloud-packages-archive-keyring.gpg |  | ||||||
| echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | tee /etc/apt/sources.list.d/coral-edgetpu.list |  | ||||||
| echo "libedgetpu1-max libedgetpu/accepted-eula select true" | debconf-set-selections |  | ||||||
|  |  | ||||||
| # enable non-free repo in Debian |  | ||||||
| if grep -q "Debian" /etc/issue; then |  | ||||||
|     sed -i -e's/ main/ main contrib non-free/g' /etc/apt/sources.list |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # coral drivers |  | ||||||
| apt-get -qq update |  | ||||||
| apt-get -qq install --no-install-recommends --no-install-suggests -y \ |  | ||||||
|     libedgetpu1-max python3-tflite-runtime python3-pycoral |  | ||||||
|  |  | ||||||
| # btbn-ffmpeg -> amd64 |  | ||||||
| if [[ "${TARGETARCH}" == "amd64" ]]; then |  | ||||||
|     mkdir -p /usr/lib/btbn-ffmpeg |  | ||||||
|     wget -qO btbn-ffmpeg.tar.xz "https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2022-07-31-12-37/ffmpeg-n5.1-2-g915ef932a3-linux64-gpl-5.1.tar.xz" |  | ||||||
|     tar -xf btbn-ffmpeg.tar.xz -C /usr/lib/btbn-ffmpeg --strip-components 1 |  | ||||||
|     rm -rf btbn-ffmpeg.tar.xz /usr/lib/btbn-ffmpeg/doc /usr/lib/btbn-ffmpeg/bin/ffplay |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # ffmpeg -> arm64 |  | ||||||
| if [[ "${TARGETARCH}" == "arm64" ]]; then |  | ||||||
|     mkdir -p /usr/lib/btbn-ffmpeg |  | ||||||
|     wget -qO btbn-ffmpeg.tar.xz "https://github.com/BtbN/FFmpeg-Builds/releases/download/autobuild-2022-07-31-12-37/ffmpeg-n5.1-2-g915ef932a3-linuxarm64-gpl-5.1.tar.xz" |  | ||||||
|     tar -xf btbn-ffmpeg.tar.xz -C /usr/lib/btbn-ffmpeg --strip-components 1 |  | ||||||
|     rm -rf btbn-ffmpeg.tar.xz /usr/lib/btbn-ffmpeg/doc /usr/lib/btbn-ffmpeg/bin/ffplay |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # arch specific packages |  | ||||||
| if [[ "${TARGETARCH}" == "amd64" ]]; then |  | ||||||
|     # use debian bookworm for hwaccel packages |  | ||||||
|     echo 'deb https://deb.debian.org/debian bookworm main contrib non-free' >/etc/apt/sources.list.d/debian-bookworm.list |  | ||||||
|     apt-get -qq update |  | ||||||
|     apt-get -qq install --no-install-recommends --no-install-suggests -y \ |  | ||||||
|         intel-opencl-icd \ |  | ||||||
|         mesa-va-drivers radeontop libva-drm2 intel-media-va-driver-non-free i965-va-driver libmfx1 intel-gpu-tools |  | ||||||
|     # something about this dependency requires it to be installed in a separate call rather than in the line above |  | ||||||
|     apt-get -qq install --no-install-recommends --no-install-suggests -y \ |  | ||||||
|         i965-va-driver-shaders |  | ||||||
|     rm -f /etc/apt/sources.list.d/debian-bookworm.list |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| if [[ "${TARGETARCH}" == "arm64" ]]; then |  | ||||||
|     apt-get -qq install --no-install-recommends --no-install-suggests -y \ |  | ||||||
|         libva-drm2 mesa-va-drivers |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| apt-get purge gnupg apt-transport-https xz-utils -y |  | ||||||
| apt-get clean autoclean -y |  | ||||||
| apt-get autoremove --purge -y |  | ||||||
| rm -rf /var/lib/apt/lists/* |  | ||||||
|  |  | ||||||
| # Install yq, for frigate-prepare and go2rtc echo source |  | ||||||
| curl -fsSL \ |  | ||||||
|     "https://github.com/mikefarah/yq/releases/download/v4.33.3/yq_linux_$(dpkg --print-architecture)" \ |  | ||||||
|     --output /usr/local/bin/yq |  | ||||||
| chmod +x /usr/local/bin/yq |  | ||||||
| @@ -1,19 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| set -euxo pipefail |  | ||||||
|  |  | ||||||
| s6_version="3.1.5.0" |  | ||||||
|  |  | ||||||
| if [[ "${TARGETARCH}" == "amd64" ]]; then |  | ||||||
|     s6_arch="x86_64" |  | ||||||
| elif [[ "${TARGETARCH}" == "arm64" ]]; then |  | ||||||
|     s6_arch="aarch64" |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| mkdir -p /rootfs/ |  | ||||||
|  |  | ||||||
| wget -qO- "https://github.com/just-containers/s6-overlay/releases/download/v${s6_version}/s6-overlay-noarch.tar.xz" | |  | ||||||
|     tar -C /rootfs/ -Jxpf - |  | ||||||
|  |  | ||||||
| wget -qO- "https://github.com/just-containers/s6-overlay/releases/download/v${s6_version}/s6-overlay-${s6_arch}.tar.xz" | |  | ||||||
|     tar -C /rootfs/ -Jxpf - |  | ||||||
| @@ -1,3 +0,0 @@ | |||||||
| black == 23.10.* |  | ||||||
| isort |  | ||||||
| ruff |  | ||||||
| @@ -1,5 +0,0 @@ | |||||||
| numpy |  | ||||||
| # Openvino Library - Custom built with MYRIAD support |  | ||||||
| openvino @ https://github.com/NateMeyer/openvino-wheels/releases/download/multi-arch_2022.3.1/openvino-2022.3.1-1-cp39-cp39-manylinux_2_31_x86_64.whl; platform_machine == 'x86_64' |  | ||||||
| openvino @ https://github.com/NateMeyer/openvino-wheels/releases/download/multi-arch_2022.3.1/openvino-2022.3.1-1-cp39-cp39-linux_aarch64.whl; platform_machine == 'aarch64' |  | ||||||
| openvino-dev[tensorflow2] @ https://github.com/NateMeyer/openvino-wheels/releases/download/multi-arch_2022.3.1/openvino_dev-2022.3.1-1-py3-none-any.whl |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| click == 8.1.* |  | ||||||
| Flask == 2.3.* |  | ||||||
| imutils == 0.5.* |  | ||||||
| matplotlib == 3.7.* |  | ||||||
| mypy == 1.6.1 |  | ||||||
| numpy == 1.23.* |  | ||||||
| onvif_zeep == 0.2.12 |  | ||||||
| opencv-python-headless == 4.7.0.* |  | ||||||
| paho-mqtt == 1.6.* |  | ||||||
| peewee == 3.17.* |  | ||||||
| peewee_migrate == 1.12.* |  | ||||||
| psutil == 5.9.* |  | ||||||
| pydantic == 1.10.* |  | ||||||
| git+https://github.com/fbcotter/py3nvml#egg=py3nvml |  | ||||||
| PyYAML == 6.0.* |  | ||||||
| pytz == 2023.3 |  | ||||||
| ruamel.yaml == 0.17.* |  | ||||||
| tzlocal == 5.1 |  | ||||||
| types-PyYAML == 6.0.* |  | ||||||
| requests == 2.31.* |  | ||||||
| types-requests == 2.31.* |  | ||||||
| scipy == 1.11.* |  | ||||||
| norfair == 2.2.* |  | ||||||
| setproctitle == 1.3.* |  | ||||||
| ws4py == 0.5.* |  | ||||||
| # Openvino Library - Custom built with MYRIAD support |  | ||||||
| openvino @ https://github.com/NateMeyer/openvino-wheels/releases/download/multi-arch_2022.3.1/openvino-2022.3.1-1-cp39-cp39-manylinux_2_31_x86_64.whl; platform_machine == 'x86_64' |  | ||||||
| openvino @ https://github.com/NateMeyer/openvino-wheels/releases/download/multi-arch_2022.3.1/openvino-2022.3.1-1-cp39-cp39-linux_aarch64.whl; platform_machine == 'aarch64' |  | ||||||
| @@ -1,2 +0,0 @@ | |||||||
| scikit-build == 0.17.* |  | ||||||
| nvidia-pyindex |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| frigate |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| frigate-pipeline |  | ||||||
| @@ -1,4 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
|  |  | ||||||
| exec logutil-service /dev/shm/logs/frigate |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| longrun |  | ||||||
| @@ -1,28 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Take down the S6 supervision tree when the service exits |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| declare exit_code_container |  | ||||||
| exit_code_container=$(cat /run/s6-linux-init-container-results/exitcode) |  | ||||||
| readonly exit_code_container |  | ||||||
| readonly exit_code_service="${1}" |  | ||||||
| readonly exit_code_signal="${2}" |  | ||||||
| readonly service="Frigate" |  | ||||||
|  |  | ||||||
| echo "[INFO] Service ${service} exited with code ${exit_code_service} (by signal ${exit_code_signal})" |  | ||||||
|  |  | ||||||
| if [[ "${exit_code_service}" -eq 256 ]]; then |  | ||||||
|   if [[ "${exit_code_container}" -eq 0 ]]; then |  | ||||||
|     echo $((128 + exit_code_signal)) >/run/s6-linux-init-container-results/exitcode |  | ||||||
|   fi |  | ||||||
| elif [[ "${exit_code_service}" -ne 0 ]]; then |  | ||||||
|   if [[ "${exit_code_container}" -eq 0 ]]; then |  | ||||||
|     echo "${exit_code_service}" >/run/s6-linux-init-container-results/exitcode |  | ||||||
|   fi |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| exec /run/s6/basedir/bin/halt |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| frigate-log |  | ||||||
| @@ -1,55 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Start the Frigate service |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| # Tell S6-Overlay not to restart this service |  | ||||||
| s6-svc -O . |  | ||||||
|  |  | ||||||
| function migrate_db_path() { |  | ||||||
|     # Find config file in yaml or yml, but prefer yaml |  | ||||||
|     local config_file="${CONFIG_FILE:-"/config/config.yml"}" |  | ||||||
|     local config_file_yaml="${config_file//.yml/.yaml}" |  | ||||||
|     if [[ -f "${config_file_yaml}" ]]; then |  | ||||||
|         config_file="${config_file_yaml}" |  | ||||||
|     elif [[ ! -f "${config_file}" ]]; then |  | ||||||
|         echo "[ERROR] Frigate config file not found" |  | ||||||
|         return 1 |  | ||||||
|     fi |  | ||||||
|     unset config_file_yaml |  | ||||||
|  |  | ||||||
|     # Use yq to check if database.path is set |  | ||||||
|     local user_db_path |  | ||||||
|     user_db_path=$(yq eval '.database.path' "${config_file}") |  | ||||||
|  |  | ||||||
|     if [[ "${user_db_path}" == "null" ]]; then |  | ||||||
|         local previous_db_path="/media/frigate/frigate.db" |  | ||||||
|         local new_db_dir="/config" |  | ||||||
|         if [[ -f "${previous_db_path}" ]]; then |  | ||||||
|             if mountpoint --quiet "${new_db_dir}"; then |  | ||||||
|                 # /config is a mount point, move the db |  | ||||||
|                 echo "[INFO] Moving db from '${previous_db_path}' to the '${new_db_dir}' dir..." |  | ||||||
|                 # Move all files that starts with frigate.db to the new directory |  | ||||||
|                 mv -vf "${previous_db_path}"* "${new_db_dir}" |  | ||||||
|             else |  | ||||||
|                 echo "[ERROR] Trying to migrate the db path from '${previous_db_path}' to the '${new_db_dir}' dir, but '${new_db_dir}' is not a mountpoint, please mount the '${new_db_dir}' dir" |  | ||||||
|                 return 1 |  | ||||||
|             fi |  | ||||||
|         fi |  | ||||||
|     fi |  | ||||||
| } |  | ||||||
|  |  | ||||||
| echo "[INFO] Preparing Frigate..." |  | ||||||
| migrate_db_path |  | ||||||
| export LIBAVFORMAT_VERSION_MAJOR=$(ffmpeg -version | grep -Po 'libavformat\W+\K\d+') |  | ||||||
|  |  | ||||||
| echo "[INFO] Starting Frigate..." |  | ||||||
|  |  | ||||||
| cd /opt/frigate || echo "[ERROR] Failed to change working directory to /opt/frigate" |  | ||||||
|  |  | ||||||
| # Replace the bash process with the Frigate process, redirecting stderr to stdout |  | ||||||
| exec 2>&1 |  | ||||||
| exec python3 -u -m frigate |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| 120000 |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| longrun |  | ||||||
| @@ -1,12 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| readonly exit_code_service="${1}" |  | ||||||
| readonly exit_code_signal="${2}" |  | ||||||
| readonly service="go2rtc-healthcheck" |  | ||||||
|  |  | ||||||
| echo "[INFO] The ${service} service exited with code ${exit_code_service} (by signal ${exit_code_signal})" |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| go2rtc-log |  | ||||||
| @@ -1,22 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Start the go2rtc-healthcheck service |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| # Give some additional time for go2rtc to start before start pinging |  | ||||||
| sleep 10s |  | ||||||
| echo "[INFO] Starting go2rtc healthcheck service..." |  | ||||||
|  |  | ||||||
| while sleep 30s; do |  | ||||||
|     # Check if the service is running |  | ||||||
|     if ! curl --connect-timeout 10 --fail --silent --show-error --output /dev/null http://127.0.0.1:1984/api/streams 2>&1; then |  | ||||||
|         echo "[ERROR] The go2rtc service is not responding to ping, restarting..." |  | ||||||
|         # We can also use -r instead of -t to send kill signal rather than term |  | ||||||
|         s6-svc -t /var/run/service/go2rtc 2>&1 |  | ||||||
|         # Give some additional time to go2rtc to restart before start pinging again |  | ||||||
|         sleep 10s |  | ||||||
|     fi |  | ||||||
| done |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| 5000 |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| longrun |  | ||||||
| @@ -1,2 +0,0 @@ | |||||||
| go2rtc |  | ||||||
| go2rtc-healthcheck |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| go2rtc-pipeline |  | ||||||
| @@ -1,4 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
|  |  | ||||||
| exec logutil-service /dev/shm/logs/go2rtc |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| longrun |  | ||||||
| @@ -1,12 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| readonly exit_code_service="${1}" |  | ||||||
| readonly exit_code_signal="${2}" |  | ||||||
| readonly service="go2rtc" |  | ||||||
|  |  | ||||||
| echo "[INFO] The ${service} service exited with code ${exit_code_service} (by signal ${exit_code_signal})" |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| go2rtc-log |  | ||||||
| @@ -1,72 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Start the go2rtc service |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| function get_ip_and_port_from_supervisor() { |  | ||||||
|     local ip_address |  | ||||||
|     # Example: 192.168.1.10/24 |  | ||||||
|     local ip_regex='^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/[0-9]{1,2}$' |  | ||||||
|     if ip_address=$( |  | ||||||
|         curl -fsSL \ |  | ||||||
|             -H "Authorization: Bearer ${SUPERVISOR_TOKEN}" \ |  | ||||||
|             -H "Content-Type: application/json" \ |  | ||||||
|             http://supervisor/network/interface/default/info | |  | ||||||
|             jq --exit-status --raw-output '.data.ipv4.address[0]' |  | ||||||
|     ) && [[ "${ip_address}" =~ ${ip_regex} ]]; then |  | ||||||
|         ip_address="${BASH_REMATCH[1]}" |  | ||||||
|         echo "[INFO] Got IP address from supervisor: ${ip_address}" |  | ||||||
|     else |  | ||||||
|         echo "[WARN] Failed to get IP address from supervisor" |  | ||||||
|         return 0 |  | ||||||
|     fi |  | ||||||
|  |  | ||||||
|     local webrtc_port |  | ||||||
|     local port_regex='^([0-9]{1,5})$' |  | ||||||
|     if webrtc_port=$( |  | ||||||
|         curl -fsSL \ |  | ||||||
|             -H "Authorization: Bearer ${SUPERVISOR_TOKEN}" \ |  | ||||||
|             -H "Content-Type: application/json" \ |  | ||||||
|             http://supervisor/addons/self/info | |  | ||||||
|             jq --exit-status --raw-output '.data.network["8555/tcp"]' |  | ||||||
|     ) && [[ "${webrtc_port}" =~ ${port_regex} ]]; then |  | ||||||
|         webrtc_port="${BASH_REMATCH[1]}" |  | ||||||
|         echo "[INFO] Got WebRTC port from supervisor: ${webrtc_port}" |  | ||||||
|     else |  | ||||||
|         echo "[WARN] Failed to get WebRTC port from supervisor" |  | ||||||
|         return 0 |  | ||||||
|     fi |  | ||||||
|  |  | ||||||
|     export FRIGATE_GO2RTC_WEBRTC_CANDIDATE_INTERNAL="${ip_address}:${webrtc_port}" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| export LIBAVFORMAT_VERSION_MAJOR=$(ffmpeg -version | grep -Po 'libavformat\W+\K\d+') |  | ||||||
|  |  | ||||||
| if [[ ! -f "/dev/shm/go2rtc.yaml" ]]; then |  | ||||||
|     echo "[INFO] Preparing go2rtc config..." |  | ||||||
|  |  | ||||||
|     if [[ -n "${SUPERVISOR_TOKEN:-}" ]]; then |  | ||||||
|         # Running as a Home Assistant add-on, infer the IP address and port |  | ||||||
|         get_ip_and_port_from_supervisor |  | ||||||
|     fi |  | ||||||
|  |  | ||||||
|     python3 /usr/local/go2rtc/create_config.py |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| readonly config_path="/config" |  | ||||||
|  |  | ||||||
| if [[ -x "${config_path}/go2rtc" ]]; then |  | ||||||
|   readonly binary_path="${config_path}/go2rtc" |  | ||||||
|   echo "[WARN] Using go2rtc binary from '${binary_path}' instead of the embedded one" |  | ||||||
| else |  | ||||||
|   readonly binary_path="/usr/local/go2rtc/bin/go2rtc" |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| echo "[INFO] Starting go2rtc..." |  | ||||||
|  |  | ||||||
| # Replace the bash process with the go2rtc process, redirecting stderr to stdout |  | ||||||
| exec 2>&1 |  | ||||||
| exec "${binary_path}" -config=/dev/shm/go2rtc.yaml |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| 30000 |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| longrun |  | ||||||
| @@ -1,11 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Prepare the logs folder for s6-log |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| dirs=(/dev/shm/logs/frigate /dev/shm/logs/go2rtc /dev/shm/logs/nginx) |  | ||||||
|  |  | ||||||
| mkdir -p "${dirs[@]}" |  | ||||||
| chown nobody:nogroup "${dirs[@]}" |  | ||||||
| chmod 02755 "${dirs[@]}" |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| oneshot |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| /etc/s6-overlay/s6-rc.d/log-prepare/run |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| nginx |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| nginx-pipeline |  | ||||||
| @@ -1,4 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
|  |  | ||||||
| exec logutil-service /dev/shm/logs/nginx |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| longrun |  | ||||||
| @@ -1,30 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Take down the S6 supervision tree when the service fails |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| declare exit_code_container |  | ||||||
| exit_code_container=$(cat /run/s6-linux-init-container-results/exitcode) |  | ||||||
| readonly exit_code_container |  | ||||||
| readonly exit_code_service="${1}" |  | ||||||
| readonly exit_code_signal="${2}" |  | ||||||
| readonly service="NGINX" |  | ||||||
|  |  | ||||||
| echo "[INFO] Service ${service} exited with code ${exit_code_service} (by signal ${exit_code_signal})" |  | ||||||
|  |  | ||||||
| if [[ "${exit_code_service}" -eq 256 ]]; then |  | ||||||
|   if [[ "${exit_code_container}" -eq 0 ]]; then |  | ||||||
|     echo $((128 + exit_code_signal)) >/run/s6-linux-init-container-results/exitcode |  | ||||||
|   fi |  | ||||||
|   if [[ "${exit_code_signal}" -eq 15 ]]; then |  | ||||||
|     exec /run/s6/basedir/bin/halt |  | ||||||
|   fi |  | ||||||
| elif [[ "${exit_code_service}" -ne 0 ]]; then |  | ||||||
|   if [[ "${exit_code_container}" -eq 0 ]]; then |  | ||||||
|     echo "${exit_code_service}" >/run/s6-linux-init-container-results/exitcode |  | ||||||
|   fi |  | ||||||
|   exec /run/s6/basedir/bin/halt |  | ||||||
| fi |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| nginx-log |  | ||||||
| @@ -1,13 +0,0 @@ | |||||||
| #!/command/with-contenv bash |  | ||||||
| # shellcheck shell=bash |  | ||||||
| # Start the NGINX service |  | ||||||
|  |  | ||||||
| set -o errexit -o nounset -o pipefail |  | ||||||
|  |  | ||||||
| # Logs should be sent to stdout so that s6 can collect them |  | ||||||
|  |  | ||||||
| echo "[INFO] Starting NGINX..." |  | ||||||
|  |  | ||||||
| # Replace the bash process with the NGINX process, redirecting stderr to stdout |  | ||||||
| exec 2>&1 |  | ||||||
| exec nginx |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| 30000 |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| longrun |  | ||||||
| @@ -1,137 +0,0 @@ | |||||||
| """Creates a go2rtc config file.""" |  | ||||||
|  |  | ||||||
| import json |  | ||||||
| import os |  | ||||||
| import sys |  | ||||||
|  |  | ||||||
| import yaml |  | ||||||
|  |  | ||||||
| sys.path.insert(0, "/opt/frigate") |  | ||||||
| from frigate.const import BIRDSEYE_PIPE  # noqa: E402 |  | ||||||
| from frigate.ffmpeg_presets import (  # noqa: E402 |  | ||||||
|     parse_preset_hardware_acceleration_encode, |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| sys.path.remove("/opt/frigate") |  | ||||||
|  |  | ||||||
|  |  | ||||||
| FRIGATE_ENV_VARS = {k: v for k, v in os.environ.items() if k.startswith("FRIGATE_")} |  | ||||||
| config_file = os.environ.get("CONFIG_FILE", "/config/config.yml") |  | ||||||
|  |  | ||||||
| # Check if we can use .yaml instead of .yml |  | ||||||
| config_file_yaml = config_file.replace(".yml", ".yaml") |  | ||||||
| if os.path.isfile(config_file_yaml): |  | ||||||
|     config_file = config_file_yaml |  | ||||||
|  |  | ||||||
| with open(config_file) as f: |  | ||||||
|     raw_config = f.read() |  | ||||||
|  |  | ||||||
| if config_file.endswith((".yaml", ".yml")): |  | ||||||
|     config: dict[str, any] = yaml.safe_load(raw_config) |  | ||||||
| elif config_file.endswith(".json"): |  | ||||||
|     config: dict[str, any] = json.loads(raw_config) |  | ||||||
|  |  | ||||||
| go2rtc_config: dict[str, any] = config.get("go2rtc", {}) |  | ||||||
|  |  | ||||||
| # Need to enable CORS for go2rtc so the frigate integration / card work automatically |  | ||||||
| if go2rtc_config.get("api") is None: |  | ||||||
|     go2rtc_config["api"] = {"origin": "*"} |  | ||||||
| elif go2rtc_config["api"].get("origin") is None: |  | ||||||
|     go2rtc_config["api"]["origin"] = "*" |  | ||||||
|  |  | ||||||
| # Need to set default location for HA config |  | ||||||
| if go2rtc_config.get("hass") is None: |  | ||||||
|     go2rtc_config["hass"] = {"config": "/config"} |  | ||||||
|  |  | ||||||
| # we want to ensure that logs are easy to read |  | ||||||
| if go2rtc_config.get("log") is None: |  | ||||||
|     go2rtc_config["log"] = {"format": "text"} |  | ||||||
| elif go2rtc_config["log"].get("format") is None: |  | ||||||
|     go2rtc_config["log"]["format"] = "text" |  | ||||||
|  |  | ||||||
| if not go2rtc_config.get("webrtc", {}).get("candidates", []): |  | ||||||
|     default_candidates = [] |  | ||||||
|     # use internal candidate if it was discovered when running through the add-on |  | ||||||
|     internal_candidate = os.environ.get( |  | ||||||
|         "FRIGATE_GO2RTC_WEBRTC_CANDIDATE_INTERNAL", None |  | ||||||
|     ) |  | ||||||
|     if internal_candidate is not None: |  | ||||||
|         default_candidates.append(internal_candidate) |  | ||||||
|     # should set default stun server so webrtc can work |  | ||||||
|     default_candidates.append("stun:8555") |  | ||||||
|  |  | ||||||
|     go2rtc_config["webrtc"] = {"candidates": default_candidates} |  | ||||||
| else: |  | ||||||
|     print( |  | ||||||
|         "[INFO] Not injecting WebRTC candidates into go2rtc config as it has been set manually", |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
| # sets default RTSP response to be equivalent to ?video=h264,h265&audio=aac |  | ||||||
| # this means user does not need to specify audio codec when using restream |  | ||||||
| # as source for frigate and the integration supports HLS playback |  | ||||||
| if go2rtc_config.get("rtsp") is None: |  | ||||||
|     go2rtc_config["rtsp"] = {"default_query": "mp4"} |  | ||||||
| else: |  | ||||||
|     if go2rtc_config["rtsp"].get("default_query") is None: |  | ||||||
|         go2rtc_config["rtsp"]["default_query"] = "mp4" |  | ||||||
|  |  | ||||||
|     if go2rtc_config["rtsp"].get("username") is not None: |  | ||||||
|         go2rtc_config["rtsp"]["username"] = go2rtc_config["rtsp"]["username"].format( |  | ||||||
|             **FRIGATE_ENV_VARS |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     if go2rtc_config["rtsp"].get("password") is not None: |  | ||||||
|         go2rtc_config["rtsp"]["password"] = go2rtc_config["rtsp"]["password"].format( |  | ||||||
|             **FRIGATE_ENV_VARS |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
| # need to replace ffmpeg command when using ffmpeg4 |  | ||||||
| if int(os.environ["LIBAVFORMAT_VERSION_MAJOR"]) < 59: |  | ||||||
|     if go2rtc_config.get("ffmpeg") is None: |  | ||||||
|         go2rtc_config["ffmpeg"] = { |  | ||||||
|             "rtsp": "-fflags nobuffer -flags low_delay -stimeout 5000000 -user_agent go2rtc/ffmpeg -rtsp_transport tcp -i {input}" |  | ||||||
|         } |  | ||||||
|     elif go2rtc_config["ffmpeg"].get("rtsp") is None: |  | ||||||
|         go2rtc_config["ffmpeg"][ |  | ||||||
|             "rtsp" |  | ||||||
|         ] = "-fflags nobuffer -flags low_delay -stimeout 5000000 -user_agent go2rtc/ffmpeg -rtsp_transport tcp -i {input}" |  | ||||||
|  |  | ||||||
| for name in go2rtc_config.get("streams", {}): |  | ||||||
|     stream = go2rtc_config["streams"][name] |  | ||||||
|  |  | ||||||
|     if isinstance(stream, str): |  | ||||||
|         try: |  | ||||||
|             go2rtc_config["streams"][name] = go2rtc_config["streams"][name].format( |  | ||||||
|                 **FRIGATE_ENV_VARS |  | ||||||
|             ) |  | ||||||
|         except KeyError as e: |  | ||||||
|             print( |  | ||||||
|                 "[ERROR] Invalid substitution found, see https://docs.frigate.video/configuration/restream#advanced-restream-configurations for more info." |  | ||||||
|             ) |  | ||||||
|             sys.exit(e) |  | ||||||
|  |  | ||||||
|     elif isinstance(stream, list): |  | ||||||
|         for i, stream in enumerate(stream): |  | ||||||
|             try: |  | ||||||
|                 go2rtc_config["streams"][name][i] = stream.format(**FRIGATE_ENV_VARS) |  | ||||||
|             except KeyError as e: |  | ||||||
|                 print( |  | ||||||
|                     "[ERROR] Invalid substitution found, see https://docs.frigate.video/configuration/restream#advanced-restream-configurations for more info." |  | ||||||
|                 ) |  | ||||||
|                 sys.exit(e) |  | ||||||
|  |  | ||||||
| # add birdseye restream stream if enabled |  | ||||||
| if config.get("birdseye", {}).get("restream", False): |  | ||||||
|     birdseye: dict[str, any] = config.get("birdseye") |  | ||||||
|  |  | ||||||
|     input = f"-f rawvideo -pix_fmt yuv420p -video_size {birdseye.get('width', 1280)}x{birdseye.get('height', 720)} -r 10 -i {BIRDSEYE_PIPE}" |  | ||||||
|     ffmpeg_cmd = f"exec:{parse_preset_hardware_acceleration_encode(config.get('ffmpeg', {}).get('hwaccel_args'), input, '-rtsp_transport tcp -f rtsp {output}')}" |  | ||||||
|  |  | ||||||
|     if go2rtc_config.get("streams"): |  | ||||||
|         go2rtc_config["streams"]["birdseye"] = ffmpeg_cmd |  | ||||||
|     else: |  | ||||||
|         go2rtc_config["streams"] = {"birdseye": ffmpeg_cmd} |  | ||||||
|  |  | ||||||
| # Write go2rtc_config to /dev/shm/go2rtc.yaml |  | ||||||
| with open("/dev/shm/go2rtc.yaml", "w") as f: |  | ||||||
|     yaml.dump(go2rtc_config, f) |  | ||||||
| @@ -1,243 +0,0 @@ | |||||||
| daemon off; |  | ||||||
| user root; |  | ||||||
| worker_processes auto; |  | ||||||
|  |  | ||||||
| error_log /dev/stdout warn; |  | ||||||
| pid /var/run/nginx.pid; |  | ||||||
|  |  | ||||||
| events { |  | ||||||
|     worker_connections 1024; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| http { |  | ||||||
|     include mime.types; |  | ||||||
|     default_type application/octet-stream; |  | ||||||
|  |  | ||||||
|     log_format main '$remote_addr - $remote_user [$time_local] "$request" ' |  | ||||||
|                         '$status $body_bytes_sent "$http_referer" ' |  | ||||||
|                         '"$http_user_agent" "$http_x_forwarded_for"'; |  | ||||||
|  |  | ||||||
|     access_log /dev/stdout main; |  | ||||||
|  |  | ||||||
|     # send headers in one piece, it is better than sending them one by one |  | ||||||
|     tcp_nopush on; |  | ||||||
|  |  | ||||||
|     sendfile on; |  | ||||||
|  |  | ||||||
|     keepalive_timeout 65; |  | ||||||
|  |  | ||||||
|     gzip on; |  | ||||||
|     gzip_comp_level 6; |  | ||||||
|     gzip_types text/plain text/css application/json application/x-javascript application/javascript text/javascript image/svg+xml image/x-icon image/bmp image/png image/gif image/jpeg image/jpg; |  | ||||||
|     gzip_proxied no-cache no-store private expired auth; |  | ||||||
|     gzip_vary on; |  | ||||||
|  |  | ||||||
|     upstream frigate_api { |  | ||||||
|         server 127.0.0.1:5001; |  | ||||||
|         keepalive 1024; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     upstream mqtt_ws { |  | ||||||
|         server 127.0.0.1:5002; |  | ||||||
|         keepalive 1024; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     upstream jsmpeg { |  | ||||||
|         server 127.0.0.1:8082; |  | ||||||
|         keepalive 1024; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     upstream go2rtc { |  | ||||||
|         server 127.0.0.1:1984; |  | ||||||
|         keepalive 1024; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     server { |  | ||||||
|         listen 5000; |  | ||||||
|  |  | ||||||
|         # vod settings |  | ||||||
|         vod_base_url ''; |  | ||||||
|         vod_segments_base_url ''; |  | ||||||
|         vod_mode mapped; |  | ||||||
|         vod_max_mapping_response_size 1m; |  | ||||||
|         vod_upstream_location /api; |  | ||||||
|         vod_align_segments_to_key_frames on; |  | ||||||
|         vod_manifest_segment_durations_mode accurate; |  | ||||||
|         vod_ignore_edit_list on; |  | ||||||
|         vod_segment_duration 10000; |  | ||||||
|         vod_hls_mpegts_align_frames off; |  | ||||||
|         vod_hls_mpegts_interleave_frames on; |  | ||||||
|  |  | ||||||
|         # file handle caching / aio |  | ||||||
|         open_file_cache max=1000 inactive=5m; |  | ||||||
|         open_file_cache_valid 2m; |  | ||||||
|         open_file_cache_min_uses 1; |  | ||||||
|         open_file_cache_errors on; |  | ||||||
|         aio on; |  | ||||||
|  |  | ||||||
|         # https://github.com/kaltura/nginx-vod-module#vod_open_file_thread_pool |  | ||||||
|         vod_open_file_thread_pool default; |  | ||||||
|  |  | ||||||
|         # vod caches |  | ||||||
|         vod_metadata_cache metadata_cache 512m; |  | ||||||
|         vod_mapping_cache mapping_cache 5m 10m; |  | ||||||
|  |  | ||||||
|         # gzip manifests |  | ||||||
|         gzip on; |  | ||||||
|         gzip_types application/vnd.apple.mpegurl; |  | ||||||
|  |  | ||||||
|         location /vod/ { |  | ||||||
|             aio threads; |  | ||||||
|             vod hls; |  | ||||||
|  |  | ||||||
|             secure_token $args; |  | ||||||
|             secure_token_types application/vnd.apple.mpegurl; |  | ||||||
|  |  | ||||||
|             add_header Cache-Control "no-store"; |  | ||||||
|             expires off; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /stream/ { |  | ||||||
|             add_header Cache-Control "no-store"; |  | ||||||
|             expires off; |  | ||||||
|  |  | ||||||
|             types { |  | ||||||
|                 application/dash+xml mpd; |  | ||||||
|                 application/vnd.apple.mpegurl m3u8; |  | ||||||
|                 video/mp2t ts; |  | ||||||
|                 image/jpeg jpg; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             root /tmp; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /clips/ { |  | ||||||
|  |  | ||||||
|             types { |  | ||||||
|                 video/mp4 mp4; |  | ||||||
|                 image/jpeg jpg; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             autoindex on; |  | ||||||
|             root /media/frigate; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /cache/ { |  | ||||||
|             internal; # This tells nginx it's not accessible from the outside |  | ||||||
|             alias /tmp/cache/; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /recordings/ { |  | ||||||
|             types { |  | ||||||
|                 video/mp4 mp4; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             autoindex on; |  | ||||||
|             autoindex_format json; |  | ||||||
|             root /media/frigate; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /exports/ { |  | ||||||
|             types { |  | ||||||
|                 video/mp4 mp4; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             autoindex on; |  | ||||||
|             autoindex_format json; |  | ||||||
|             root /media/frigate; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /ws { |  | ||||||
|             proxy_pass http://mqtt_ws/; |  | ||||||
|             include proxy.conf; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /live/jsmpeg/ { |  | ||||||
|             proxy_pass http://jsmpeg/; |  | ||||||
|             include proxy.conf; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /live/mse/ { |  | ||||||
|             proxy_pass http://go2rtc/; |  | ||||||
|             include proxy.conf; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /live/webrtc/ { |  | ||||||
|             proxy_pass http://go2rtc/; |  | ||||||
|             include proxy.conf; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location ~* /api/go2rtc([/]?.*)$ { |  | ||||||
|             proxy_pass http://go2rtc; |  | ||||||
|             rewrite ^/api/go2rtc(.*)$ /api$1 break; |  | ||||||
|             include proxy.conf; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location ~* /api/.*\.(jpg|jpeg|png)$ { |  | ||||||
|             rewrite ^/api/(.*)$ $1 break; |  | ||||||
|             proxy_pass http://frigate_api; |  | ||||||
|             include proxy.conf; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location /api/ { |  | ||||||
|             add_header Cache-Control "no-store"; |  | ||||||
|             expires off; |  | ||||||
|             proxy_pass http://frigate_api/; |  | ||||||
|             include proxy.conf; |  | ||||||
|  |  | ||||||
|             location /api/stats { |  | ||||||
|                 access_log off; |  | ||||||
|                 rewrite ^/api/(.*)$ $1 break; |  | ||||||
|                 proxy_pass http://frigate_api; |  | ||||||
|                 include proxy.conf; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             location /api/version { |  | ||||||
|                 access_log off; |  | ||||||
|                 rewrite ^/api/(.*)$ $1 break; |  | ||||||
|                 proxy_pass http://frigate_api; |  | ||||||
|                 include proxy.conf; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         location / { |  | ||||||
|             add_header Cache-Control "no-store"; |  | ||||||
|             expires off; |  | ||||||
|  |  | ||||||
|             location /assets/ { |  | ||||||
|                 access_log off; |  | ||||||
|                 expires 1y; |  | ||||||
|                 add_header Cache-Control "public"; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             sub_filter 'href="/BASE_PATH/' 'href="$http_x_ingress_path/'; |  | ||||||
|             sub_filter 'url(/BASE_PATH/' 'url($http_x_ingress_path/'; |  | ||||||
|             sub_filter '"/BASE_PATH/dist/' '"$http_x_ingress_path/dist/'; |  | ||||||
|             sub_filter '"/BASE_PATH/js/' '"$http_x_ingress_path/js/'; |  | ||||||
|             sub_filter '"/BASE_PATH/assets/' '"$http_x_ingress_path/assets/'; |  | ||||||
|             sub_filter '"/BASE_PATH/monacoeditorwork/' '"$http_x_ingress_path/assets/'; |  | ||||||
|             sub_filter 'return"/BASE_PATH/"' 'return window.baseUrl'; |  | ||||||
|             sub_filter '<body>' '<body><script>window.baseUrl="$http_x_ingress_path/";</script>'; |  | ||||||
|             sub_filter_types text/css application/javascript; |  | ||||||
|             sub_filter_once off; |  | ||||||
|  |  | ||||||
|             root /opt/frigate/web; |  | ||||||
|             try_files $uri $uri/ /index.html; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| rtmp { |  | ||||||
|     server { |  | ||||||
|         listen 1935; |  | ||||||
|         chunk_size 4096; |  | ||||||
|         allow publish 127.0.0.1; |  | ||||||
|         deny publish all; |  | ||||||
|         allow play all; |  | ||||||
|         application live { |  | ||||||
|             live on; |  | ||||||
|             record off; |  | ||||||
|             meta copy; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,4 +0,0 @@ | |||||||
| proxy_http_version 1.1; |  | ||||||
| proxy_set_header Upgrade $http_upgrade; |  | ||||||
| proxy_set_header Connection "Upgrade"; |  | ||||||
| proxy_set_header Host $host; |  | ||||||
							
								
								
									
										5
									
								
								docker/rootfs/etc/services.d/nginx/finish
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								docker/rootfs/etc/services.d/nginx/finish
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | #!/usr/bin/execlineb -S1 | ||||||
|  | if { s6-test ${1} -ne 0 } | ||||||
|  | if { s6-test ${1} -ne 256 } | ||||||
|  |  | ||||||
|  | s6-svscanctl -t /var/run/s6/services | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user