mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-31 02:56:37 +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", | ||||
|   "service": "devcontainer", | ||||
|   "workspaceFolder": "/workspace/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": [ | ||||
|         "ms-python.python", | ||||
|         "ms-python.vscode-pylance", | ||||
|         "ms-python.black-formatter", | ||||
|         "visualstudioexptteam.vscodeintellicode", | ||||
|         "mhutchie.git-graph", | ||||
|         "ms-azuretools.vscode-docker", | ||||
|         "streetsidesoftware.code-spell-checker", | ||||
|         "esbenp.prettier-vscode", | ||||
|         "dbaeumer.vscode-eslint", | ||||
|         "mikestead.dotenv", | ||||
|         "csstools.postcss", | ||||
|         "blanu.vscode-styled-jsx", | ||||
|         "bradlc.vscode-tailwindcss", | ||||
|         "ms-python.isort", | ||||
|         "charliermarsh.ruff" | ||||
|       ], | ||||
|       "settings": { | ||||
|         "remote.autoForwardPorts": false, | ||||
|         "python.linting.pylintEnabled": true, | ||||
|         "python.linting.enabled": true, | ||||
|         "python.formatting.provider": "none", | ||||
|         "python.languageServer": "Pylance", | ||||
|         "editor.formatOnPaste": false, | ||||
|         "editor.formatOnSave": true, | ||||
|         "editor.formatOnType": true, | ||||
|         "python.testing.pytestEnabled": false, | ||||
|         "python.testing.unittestEnabled": true, | ||||
|         "python.testing.unittestArgs": ["-v", "-s", "./frigate/test"], | ||||
|         "files.trimTrailingWhitespace": true, | ||||
|         "eslint.workingDirectories": ["./web"], | ||||
|         "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"] | ||||
|       } | ||||
|     } | ||||
|   "service": "dev", | ||||
|   "workspaceFolder": "/lab/frigate", | ||||
|   "extensions": [ | ||||
|     "ms-python.python", | ||||
|     "visualstudioexptteam.vscodeintellicode", | ||||
|     "mhutchie.git-graph", | ||||
|     "ms-azuretools.vscode-docker", | ||||
|     "streetsidesoftware.code-spell-checker", | ||||
|     "eamodio.gitlens", | ||||
|     "esbenp.prettier-vscode", | ||||
|     "ms-python.vscode-pylance" | ||||
|   ], | ||||
|   "settings": { | ||||
|     "python.pythonPath": "/usr/bin/python3", | ||||
|     "python.linting.pylintEnabled": true, | ||||
|     "python.linting.enabled": true, | ||||
|     "python.formatting.provider": "black", | ||||
|     "editor.formatOnPaste": false, | ||||
|     "editor.formatOnSave": true, | ||||
|     "editor.formatOnType": true, | ||||
|     "files.trimTrailingWhitespace": true, | ||||
|     "terminal.integrated.shell.linux": "/bin/bash" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
| core | ||||
| *.mp4 | ||||
| *.jpg | ||||
| *.db | ||||
| *.ts | ||||
|  | ||||
| web/dist/ | ||||
| web/node_modules/ | ||||
| web/.npm | ||||
| *.ts | ||||
							
								
								
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,3 @@ | ||||
| github: | ||||
|   - 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 | ||||
| description: General support request for Frigate | ||||
| name: Support Request | ||||
| description: Support for Frigate setup or configuration | ||||
| title: "[Support]: " | ||||
| labels: ["support", "triage"] | ||||
| 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 | ||||
|  | ||||
| env: | ||||
|   DEFAULT_PYTHON: 3.9 | ||||
|  | ||||
| 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: | ||||
|     name: Web - Lint | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 16.x | ||||
|           node-version: 14.x | ||||
|       - run: npm install | ||||
|         working-directory: ./web | ||||
|       - 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 | ||||
|  | ||||
|   web_test: | ||||
|     name: Web - Test | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: actions/checkout@master | ||||
|       - uses: actions/setup-node@master | ||||
|         with: | ||||
|           node-version: 16.x | ||||
|           node-version: 14.x | ||||
|       - run: npm install | ||||
|         working-directory: ./web | ||||
|       - name: Test | ||||
|         run: npm run test | ||||
|         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 | ||||
| *.swp | ||||
| debug | ||||
| .vscode/* | ||||
| !.vscode/launch.json | ||||
| config/* | ||||
| !config/*.example | ||||
| .vscode | ||||
| config/config.yml | ||||
| models | ||||
| *.mp4 | ||||
| *.ts | ||||
| @@ -16,5 +14,3 @@ web/build | ||||
| web/node_modules | ||||
| web/coverage | ||||
| 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) | ||||
| 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: | ||||
| 	echo 'VERSION = "$(VERSION)-$(COMMIT_HASH)"' > frigate/version.py | ||||
| 	echo "VERSION='0.10.0-$(COMMIT_HASH)'" > frigate/version.py | ||||
|  | ||||
| local: version | ||||
| 	docker buildx build --target=frigate --tag frigate:latest --load --file docker/main/Dockerfile . | ||||
| web: | ||||
| 	docker build --tag frigate-web --file docker/Dockerfile.web web/ | ||||
|  | ||||
| amd64: | ||||
| 	docker buildx build --platform linux/amd64 --target=frigate --tag $(IMAGE_REPO):$(VERSION)-$(COMMIT_HASH) --file docker/main/Dockerfile . | ||||
| amd64_wheels: | ||||
| 	docker build --tag blakeblackshear/frigate-wheels:1.0.3-amd64 --file docker/Dockerfile.wheels . | ||||
|  | ||||
| arm64: | ||||
| 	docker buildx build --platform linux/arm64 --target=frigate --tag $(IMAGE_REPO):$(VERSION)-$(COMMIT_HASH) --file docker/main/Dockerfile . | ||||
| amd64_ffmpeg: | ||||
| 	docker build --no-cache --pull --tag blakeblackshear/frigate-ffmpeg:1.2.0-amd64 --file docker/Dockerfile.ffmpeg.amd64 . | ||||
|  | ||||
| build: version amd64 arm64 | ||||
| 	docker buildx build --platform linux/arm64/v8,linux/amd64 --target=frigate --tag $(IMAGE_REPO):$(VERSION)-$(COMMIT_HASH) --file docker/main/Dockerfile . | ||||
| nginx_frigate: | ||||
| 	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 | ||||
| 	docker buildx build --push --platform linux/arm64/v8,linux/amd64 --target=frigate --tag $(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH) --file docker/main/Dockerfile . | ||||
| amd64_frigate: version web | ||||
| 	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 | ||||
| 	docker run --rm --publish=5000:5000 --volume=${PWD}/config:/config frigate:latest | ||||
| amd64_all: amd64_wheels amd64_ffmpeg amd64_frigate | ||||
|  | ||||
| run_tests: local | ||||
| 	docker run --rm --workdir=/opt/frigate --entrypoint= frigate:latest python3 -u -m unittest | ||||
| 	docker run --rm --workdir=/opt/frigate --entrypoint= frigate:latest python3 -u -m mypy --config-file frigate/mypy.ini frigate | ||||
| amd64nvidia_wheels: | ||||
| 	docker build --tag blakeblackshear/frigate-wheels:1.0.3-amd64nvidia --file docker/Dockerfile.wheels . | ||||
|  | ||||
| .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 | ||||
| - Records video with retention settings based on detected objects | ||||
| - 24/7 recording | ||||
| - Re-streaming via RTSP to reduce the number of connections to your camera | ||||
| - WebRTC & MSE support for low-latency live view | ||||
| - Re-streaming via RTMP to reduce the number of connections to your camera | ||||
|  | ||||
| ## 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 | ||||
							
								
								
									
										71
									
								
								benchmark.py
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								benchmark.py
									
									
									
									
									
								
							| @@ -1,18 +1,12 @@ | ||||
| import datetime | ||||
| import multiprocessing as mp | ||||
| import os | ||||
| from statistics import mean | ||||
|  | ||||
| import multiprocessing as mp | ||||
| import numpy as np | ||||
| import datetime | ||||
| from frigate.edgetpu import LocalObjectDetector, EdgeTPUProcess, RemoteObjectDetector, load_labels | ||||
|  | ||||
| from frigate.config import DetectorTypeEnum | ||||
| from frigate.object_detection import ( | ||||
|     ObjectDetectProcess, | ||||
|     RemoteObjectDetector, | ||||
|     load_labels, | ||||
| ) | ||||
|  | ||||
| my_frame = np.expand_dims(np.full((300, 300, 3), 1, np.uint8), axis=0) | ||||
| labels = load_labels("/labelmap.txt") | ||||
| my_frame = np.expand_dims(np.full((300,300,3), 1, np.uint8), axis=0) | ||||
| labels = load_labels('/labelmap.txt') | ||||
|  | ||||
| ###### | ||||
| # Minimal same process runner | ||||
| @@ -45,23 +39,20 @@ labels = load_labels("/labelmap.txt") | ||||
|  | ||||
|  | ||||
| def start(id, num_detections, detection_queue, event): | ||||
|     object_detector = RemoteObjectDetector( | ||||
|         str(id), "/labelmap.txt", detection_queue, event | ||||
|     ) | ||||
|     start = datetime.datetime.now().timestamp() | ||||
|   object_detector = RemoteObjectDetector(str(id), '/labelmap.txt', detection_queue, event) | ||||
|   start = datetime.datetime.now().timestamp() | ||||
|  | ||||
|     frame_times = [] | ||||
|     for x in range(0, num_detections): | ||||
|         start_frame = datetime.datetime.now().timestamp() | ||||
|         object_detector.detect(my_frame) | ||||
|         frame_times.append(datetime.datetime.now().timestamp() - start_frame) | ||||
|  | ||||
|     duration = datetime.datetime.now().timestamp() - start | ||||
|     object_detector.cleanup() | ||||
|     print(f"{id} - Processed for {duration:.2f} seconds.") | ||||
|     print(f"{id} - FPS: {object_detector.fps.eps():.2f}") | ||||
|     print(f"{id} - Average frame processing time: {mean(frame_times)*1000:.2f}ms") | ||||
|   frame_times = [] | ||||
|   for x in range(0, num_detections): | ||||
|     start_frame = datetime.datetime.now().timestamp() | ||||
|     detections = object_detector.detect(my_frame) | ||||
|     frame_times.append(datetime.datetime.now().timestamp()-start_frame) | ||||
|  | ||||
|   duration = datetime.datetime.now().timestamp()-start | ||||
|   object_detector.cleanup() | ||||
|   print(f"{id} - Processed for {duration:.2f} seconds.") | ||||
|   print(f"{id} - FPS: {object_detector.fps.eps():.2f}") | ||||
|   print(f"{id} - Average frame processing time: {mean(frame_times)*1000:.2f}ms") | ||||
|  | ||||
| ###### | ||||
| # Separate process runner | ||||
| @@ -80,29 +71,23 @@ camera_processes = [] | ||||
|  | ||||
| events = {} | ||||
| for x in range(0, 10): | ||||
|     events[str(x)] = mp.Event() | ||||
|   events[str(x)] = mp.Event() | ||||
| detection_queue = mp.Queue() | ||||
| edgetpu_process_1 = ObjectDetectProcess( | ||||
|     detection_queue, events, DetectorTypeEnum.edgetpu, "usb:0" | ||||
| ) | ||||
| edgetpu_process_2 = ObjectDetectProcess( | ||||
|     detection_queue, events, DetectorTypeEnum.edgetpu, "usb:1" | ||||
| ) | ||||
| edgetpu_process_1 = EdgeTPUProcess(detection_queue, events, 'usb:0') | ||||
| edgetpu_process_2 = EdgeTPUProcess(detection_queue, events, 'usb:1') | ||||
|  | ||||
| for x in range(0, 10): | ||||
|     camera_process = mp.Process( | ||||
|         target=start, args=(x, 300, detection_queue, events[str(x)]) | ||||
|     ) | ||||
|     camera_process.daemon = True | ||||
|     camera_processes.append(camera_process) | ||||
|   camera_process = mp.Process(target=start, args=(x, 300, detection_queue, events[str(x)])) | ||||
|   camera_process.daemon = True | ||||
|   camera_processes.append(camera_process) | ||||
|  | ||||
| start_time = datetime.datetime.now().timestamp() | ||||
|  | ||||
| for p in camera_processes: | ||||
|     p.start() | ||||
|   p.start() | ||||
|  | ||||
| for p in camera_processes: | ||||
|     p.join() | ||||
|   p.join() | ||||
|  | ||||
| duration = datetime.datetime.now().timestamp() - start_time | ||||
| print(f"Total - Processed for {duration:.2f} seconds.") | ||||
| duration = datetime.datetime.now().timestamp()-start_time | ||||
| 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" | ||||
| services: | ||||
|   devcontainer: | ||||
|     container_name: frigate-devcontainer | ||||
|     # add groups from host for render, plugdev, video | ||||
|     group_add: | ||||
|       - "109" # render | ||||
|       - "110" # render | ||||
|       - "44"  # video | ||||
|       - "46"  # plugdev | ||||
|   dev: | ||||
|     container_name: frigate-dev | ||||
|     user: vscode | ||||
|     privileged: true | ||||
|     shm_size: "256mb" | ||||
|     build: | ||||
|       context: . | ||||
|       dockerfile: docker/main/Dockerfile | ||||
|       # 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 | ||||
|       dockerfile: docker/Dockerfile.dev | ||||
|     volumes: | ||||
|       - .:/workspace/frigate:cached | ||||
|       - ./web/dist:/opt/frigate/web:cached | ||||
|       - /etc/localtime:/etc/localtime:ro | ||||
|       - ./config:/config | ||||
|       - .:/lab/frigate:cached | ||||
|       - ./config/config.yml:/config/config.yml:ro | ||||
|       - ./debug:/media/frigate | ||||
|       - /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: | ||||
|     container_name: mqtt | ||||
|     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