Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
3be8227
Initial v1.1.0 improvements
cu-andrefecto Nov 16, 2025
d22ac7f
Added install files and tests
andrefecto Nov 16, 2025
80210f0
Updating readme
andrefecto Nov 16, 2025
81ffb60
Fixing keyboard shortcuts for pausing
andrefecto Nov 17, 2025
cb0fd80
Bug fixes, new features, and logo
andrefecto Nov 20, 2025
a9d2f8a
Added camera config ability
andrefecto Nov 24, 2025
4e71cb7
Fix critical bugs and add comprehensive code documentation
andrefecto Dec 17, 2025
ad8ec66
Trying to fix FPS and jitter
andrefecto Dec 17, 2025
3df6ec9
Major performance improvements and bug fixes for v1.1.0
andrefecto Dec 17, 2025
2cffe09
Optimize camera initialization performance for Windows
andrefecto Dec 17, 2025
9942f79
Fix thread safety, resource leaks, and code duplication
andrefecto Feb 13, 2026
a22db65
Add camera backend abstraction layer and Basler camera support
andrefecto Mar 4, 2026
d91d476
Add FPS-independent smoothing to pose estimator
andrefecto Mar 4, 2026
f3073e4
Fix GUI bugs: broken zoom labels, thread safety, and slider consistency
andrefecto Mar 4, 2026
6effd71
Add pylint config and improve code quality and AI-friendliness
andrefecto Mar 4, 2026
49e7835
Add AI development disclosure to README acknowledgments
andrefecto Mar 4, 2026
d730211
Fix ~20 README inaccuracies accumulated during development
andrefecto Mar 4, 2026
61440b1
Fix camera defaults, no-camera UI, and add maintenance scripts
andrefecto Apr 3, 2026
2513406
Remove camera format overrides and stabilize UUID generation
andrefecto Apr 3, 2026
7c10541
Switch Windows camera backend from DirectShow to Media Foundation
andrefecto Apr 3, 2026
a55be4c
Fix camera backend selection with MSMF-first fallback and stream veri…
andrefecto Apr 3, 2026
bf70260
Use MJPG format for 1080p fallback to fix low FPS on DirectShow
andrefecto Apr 3, 2026
164c0ce
feat: Add first-class Basler Ace 2 camera support with GenICam controls
andrefecto Apr 6, 2026
8557afa
ci: enforce pylint in CI and make the codebase lint-clean
andrefecto May 25, 2026
3fc49d5
ci: install GL libs so the test job's MediaPipe tests pass
andrefecto May 25, 2026
ec877d1
docs: mark TODO #1 complete (CI green after GL-libs fix)
andrefecto May 25, 2026
5f0b281
fix: make PoseEstimator thread-safe (recording-with-pose race)
andrefecto May 25, 2026
de523c3
fix: pose editing lines up under zoom (editor reuses displayed landma…
andrefecto May 25, 2026
103a775
refactor: remove dead/misleading code (TODO #6)
andrefecto May 25, 2026
471df70
refactor(gui): extract controls/divider/input_handlers from layout.py…
andrefecto May 25, 2026
26f009f
refactor(gui): lift menu dialogs into a gui/dialogs/ package (#5 2/3)
andrefecto May 25, 2026
089c286
refactor(gui): extract gui/menu.py; layout.py is now core grid only (…
andrefecto May 25, 2026
d63534d
fix: size video texture at native res (4K display bug) (#7 1/5)
andrefecto May 26, 2026
2694d2c
refactor(gui): extract camera_actions for zoom + live-pause UI (#7 2/5)
andrefecto May 26, 2026
23d3187
refactor(gui): single source of truth for key-name maps (#7 3/5)
andrefecto May 26, 2026
d48cb6f
fix: drop redundant camera-name double-save (#7 4/5)
andrefecto May 26, 2026
e77cb33
test: cover camera_actions, keymap bijection, apply_zoom (#7 5/5)
andrefecto May 26, 2026
912893b
docs: mark TODO #7 (de-duplicate control/init code) done
andrefecto May 26, 2026
51dab12
docs: sync texture-size + name-save hazard notes with #7 fixes
andrefecto May 26, 2026
89f69d8
feat(camera): add Camera.position_key (stable quadrant key) (#8 1/3)
andrefecto May 26, 2026
4a7eac9
refactor(gui): key camera_positions by position_key, not id() (#8 2/3)
andrefecto May 26, 2026
1d6adee
test: cover position_key + save_camera_positions mirror (#8 3/3)
andrefecto May 26, 2026
86fa9b3
security: pin all dependency versions + verify pose model checksum
andrefecto May 26, 2026
fab657d
refactor(logging): demote per-event hot-path logs to DEBUG (#9)
andrefecto May 26, 2026
1d5fe2e
test: cover quadrant manipulation (shift/swap/toggle/eject) (#10 1/3)
andrefecto May 26, 2026
d7b9c84
refactor(camera): extract _zoom_crop_box + test zoom geometry (#10 2/3)
andrefecto May 26, 2026
7dc9ee1
test: cover buffer scrubbing + angle edge cases (#10 3/3)
andrefecto May 26, 2026
e977fec
refactor(camera): extract ZoomMixin to camera/_zoom.py (#11 1/6)
andrefecto May 26, 2026
cbc22ed
refactor(camera): extract PlaybackMixin to camera/_playback.py (#11 2/6)
andrefecto May 26, 2026
a7d888b
refactor(camera): extract RecordingMixin to camera/_recording.py (#11…
andrefecto May 26, 2026
bd48a8a
refactor(camera): extract PoseMixin to camera/_pose.py (#11 4/6)
andrefecto May 26, 2026
52b829f
refactor(camera): extract RenderMixin to camera/_render.py (#11 5/6)
andrefecto May 26, 2026
6995137
refactor(camera): extract CaptureMixin; finish camera.py split (#11 6/6)
andrefecto May 26, 2026
be094d0
docs: sync CHANGELOG with the audit + correct stale entries
andrefecto May 26, 2026
f5ac960
feat: add __version__ + installer Python/version fixes (auto-update 1/7)
andrefecto May 26, 2026
1dd0f3b
feat: add auto-update settings (auto_check/skip/last-check) (auto-upd…
andrefecto May 26, 2026
c2b5501
feat: add pure update-check core (utils/updater.py) + tests (auto-upd…
andrefecto May 26, 2026
38ca9a2
feat: add git pre-flight (update_capability) + tests (auto-update 4/7)
andrefecto May 26, 2026
217d29f
feat: committed updater scripts + stop installers regenerating launch…
andrefecto May 26, 2026
7f62eb1
feat: wire update check, consent dialog + File>Check for Updates (aut…
andrefecto May 26, 2026
f93f7c5
docs: release process + auto-update notes (auto-update 7/7)
andrefecto May 26, 2026
b9c8e51
feat: Basler camera controls + .pfs backup/restore
andrefecto May 28, 2026
f46cecc
docs: refresh README for v1.1.0 (install, auto-update, Basler)
andrefecto May 28, 2026
031028b
feat: manual angle tool (free-form protractor) with per-frame video a…
andrefecto May 28, 2026
0353597
docs: move TODO.md into docs/ and add IDEAS.md
andrefecto May 28, 2026
ec56b43
refactor: remove dead/unused code (audit scan, TODO #1)
andrefecto May 28, 2026
abcdf1f
feat: crisp anti-aliased UI font (Roboto 18px)
andrefecto May 28, 2026
130208e
feat: Quick Settings menu — global pose & FPS toggles
andrefecto May 28, 2026
2cc8620
feat: consolidate the menu bar (Easier navigation)
andrefecto May 28, 2026
2427564
feat: Camera Control Quadrant
andrefecto May 28, 2026
4f9f7a2
chore: tidy root dir — install/ and utilities/ folders
andrefecto May 28, 2026
bc8f283
feat: Athlete History quadrant (phase 1)
andrefecto May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: CI

on:
push:
branches: [ main, dev-v1.1.0 ]
pull_request:
branches: [ main ]

jobs:
test:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

# MediaPipe (PoseLandmarker) links libGLESv2.so.2 even on the CPU delegate,
# and OpenCV needs libGL — neither ships on the bare runner.
- name: Install system libraries (MediaPipe/OpenCV need GL)
run: |
sudo apt-get update
sudo apt-get install -y libgl1 libegl1 libgles2

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: pip
cache-dependency-path: requirements.txt

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Run tests
run: |
python tests/run_tests.py

lint:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
cache: pip
cache-dependency-path: requirements-dev.txt

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements-dev.txt

- name: Run pylint
run: |
pylint $(git ls-files '*.py')
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,7 @@ dmypy.json
# Cython debug symbols
cython_debug/

# Local runtime data
settings.json
db_athlete/

7 changes: 7 additions & 0 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"MD013": false,
"MD033": false,
"MD041": false,
"MD024": { "siblings_only": true },
"MD029": false
}
20 changes: 20 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Pre-commit hooks for FrameLab.
#
# One-time setup (inside your venv):
# pip install -r requirements-dev.txt
# pre-commit install
#
# Run manually against everything:
# pre-commit run --all-files
#
# The pylint hook uses the project's .pylintrc and the pylint installed in
# your environment (language: system), so it matches the CI lint job.
repos:
- repo: local
hooks:
- id: pylint
name: pylint
entry: pylint
language: system
types: [python]
require_serial: true
59 changes: 59 additions & 0 deletions .pylintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
[MAIN]
# Use multiple processes to speed up pylint
jobs=1

# Allow loading of all C extensions (cv2, mediapipe, dearpygui)
unsafe-load-any-extension=yes

[MESSAGES CONTROL]
disable=
C0114, # missing-module-docstring
C0115, # missing-class-docstring
C0116, # missing-function-docstring
C0301, # line-too-long (DearPyGUI calls are naturally long)
R0902, # too-many-instance-attributes (Camera class legitimately large)
R0903, # too-few-public-methods
R0913, # too-many-arguments
R0914, # too-many-locals
R0912, # too-many-branches
R0915, # too-many-statements
R0801, # duplicate-code (camera init duplicated between main.py and layout.py)
E1101, # no-member (false positives with cv2, dpg, mediapipe C extensions)
W0718, # broad-exception-caught (used intentionally in cleanup paths)
W0719, # broad-exception-raised
W1203, # logging-fstring-interpolation (project uses f-strings consistently)
W0511, # fixme/todo
C0415, # import-outside-toplevel (deferred imports used to avoid circular deps)
W0603, # global-statement (singleton/cache pattern used consistently)
W0613, # unused-argument (DearPyGUI callbacks use a fixed (sender, app_data, user_data) signature)
R0917, # too-many-positional-arguments (same rationale as R0913 above)
R0911, # too-many-return-statements (dispatch-style functions)
R1702, # too-many-nested-blocks (UI/loop code; same family as R0912/R0915 above)
R0904, # too-many-public-methods (Settings is a large config facade; see R0902)
R0401, # cyclic-import (gui deferred-import cycle; broken at runtime via function-local imports)

[FORMAT]
max-line-length=120
indent-string=' '

[BASIC]
# Allow short variable names common in image processing,
# plus cv2.VideoCapture-compatibility method aliases (intentional camelCase).
good-names=i,j,k,x,y,w,h,dx,dy,f,e,ex,_,dt,p1,p2,p3,v1,v2,db,isOpened,getBackendName

# gui/state.py uses module-level names as intentionally-mutable shared state,
# not constants, so don't enforce UPPER_CASE on module-level assignments.
const-naming-style=any

[DESIGN]
max-args=10
max-locals=25

[IMPORTS]
# Known third-party modules
known-third-party=cv2,numpy,dearpygui,mediapipe,certifi

[TYPECHECK]
# Ignore imports that can't be resolved (C extensions)
ignored-modules=cv2,dearpygui.dearpygui,mediapipe
ignored-classes=cv2.VideoCapture,cv2.VideoWriter
Loading
Loading