Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ add_library(motrack_project STATIC src/document_session.cpp src/legacy_project.c
target_include_directories(motrack_project PUBLIC src)
target_link_libraries(motrack_project PUBLIC Qt6::Core PRIVATE Qt6::Xml motrack_archive)

# Image-package validation decodes staged media without adding image codecs to the project model.
# Package validation decodes staged images/movies without adding codecs to the project model.
add_library(motrack_image_package STATIC src/tracker_image_package.cpp)
target_include_directories(motrack_image_package PUBLIC src)
target_link_libraries(motrack_image_package PUBLIC motrack_project PRIVATE Qt6::Gui motrack_archive)
target_link_libraries(motrack_image_package PUBLIC motrack_project PRIVATE Qt6::Gui motrack_archive motrack_media)
Comment thread
mgradwohl marked this conversation as resolved.
Resolved

qt_add_executable(motrack src/main.cpp)
add_library(motrack_workspace STATIC src/image_sequence.cpp src/main_window.cpp src/movie_worker.cpp src/position_plot.cpp
Expand Down Expand Up @@ -148,7 +148,7 @@ if(BUILD_TESTING)
FetchContent_MakeAvailable(googletest)

add_executable(motrack_tests tests/paired_save_test.cpp tests/legacy_project_test.cpp tests/measurements_test.cpp tests/track_edits_test.cpp
tests/tracker_archive_test.cpp tests/tracker_archive_writer_test.cpp tests/tracker_image_package_test.cpp tests/tracker_references_test.cpp tests/tracker_writer_test.cpp)
tests/tracker_archive_test.cpp tests/tracker_archive_writer_test.cpp tests/tracker_image_package_test.cpp tests/tracker_movie_package_test.cpp tests/tracker_references_test.cpp tests/tracker_writer_test.cpp)
target_link_libraries(motrack_tests PRIVATE motrack_project motrack_image_package GTest::gtest_main motrack_archive Qt6::Xml Qt6::Gui)
Comment thread
mgradwohl marked this conversation as resolved.
Resolved
target_compile_definitions(motrack_tests PRIVATE
MOTRACK_FIXTURES="${CMAKE_CURRENT_SOURCE_DIR}/tests/fixtures")
Expand Down
20 changes: 11 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,28 +73,30 @@ conflict. Recovery never marks newer edits saved without writing them to both fi
This workflow currently covers audited media-free and local-image experiments, plus selected-member
updates to existing image/MOV archives. The movie writer supports mass, mark and clip-range edits in
audited constant-rate imports after timestamp indexing; its edited-file Tracker save/reopen acceptance
has passed for the pinned linked four-frame AVI case. Archive acceptance and later revisions require
has passed for the pinned linked four-frame AVI and mixed-tab MOV archive cases. Later revisions require
their own CI and review. Archived AVI output is refused because pinned Tracker cannot reopen it;
the original case and compatibility restriction are tracked in [#140](https://github.com/mgradwohl/MoTrack/issues/140).
Movie timing/calibration/track-identity edits, movie packaging, filters and broader settings remain unfinished. An unsupported export is refused; save a MoTrack copy to retain work.
Movie timing/calibration/track-identity edits, broader movie containers, filters and broader settings remain unfinished. An unsupported export is refused; save a MoTrack copy to retain work.
Image experiments can retain Clip Settings changes to the starting frame, ending frame and frame
interval in linked `.trk` files, existing image archives and portable image exports. All source images
and marks remain available, including those outside the selected clip; image timing stays unchanged.
Audited linked movies and archived MOV files also retain Clip Settings range and interval edits after indexing. The complete
movie and all measurements stay available; source frame numbers and numeric timing are unchanged.
The [format guide](docs/native-format.md) records the exact supported edits and compatibility evidence.

### Export a portable image experiment
### Export a portable experiment

For a supported imported image experiment, choose **File → Export portable image archive…** and save
as `.trz`. MoTrack copies the experiment and its linked images into one file that can be moved and
opened in Tracker. The current project keeps its original save destinations, unsaved edits and undo
For a supported imported image or indexed constant-rate MOV experiment, choose **File → Export portable archive…**
and save as `.trz`. MoTrack copies the experiment and its complete linked media without conversion into
one file that can be moved and opened in Tracker. The current project keeps its original save destinations, unsaved edits and undo
history; exporting a copy does not replace ordinary Save or create a companion automatically.

Export runs in the background with a Cancel button. Missing images are named in the error message,
Export runs in the background with a Cancel button. Missing media files are named in the error message,
and failures or cancellation before replacement keep an existing archive intact. This command currently
supports the audited local-image schemas described in the [format guide](docs/native-format.md#creating-a-portable-image-archive).
Movie packaging, arbitrary supporting documents and newly created standalone image projects remain unfinished.
supports audited local-image schemas and linked MOV mass/mark/clip-range edits described in the
[format guide](docs/native-format.md#creating-a-portable-movie-archive). The entire movie is retained, including
frames outside the selected clip. Other movie containers, arbitrary supporting documents and newly created
standalone media projects remain unfinished.

### Analyze motion

Expand Down
14 changes: 8 additions & 6 deletions docs/migration-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ selected archive-member writer ([#121](https://github.com/mgradwohl/MoTrack/pull
all-experiment archive acceptance ([#124](https://github.com/mgradwohl/MoTrack/pull/124)) and
paired-save recovery adapter ([#125](https://github.com/mgradwohl/MoTrack/pull/125)) are also merged.

The save-workflow queue is merged through PR #136, with the test-group correction in #138. Each row passed all six required checks and code
The save-workflow queue is merged through PR #139, including the test-group correction in #138. Each row passed all six required checks and code
review on the listed revision before merging; the links record the actual acceptance evidence.

| Merged slice | Reviewed revision | Passing CI |
Expand All @@ -94,9 +94,11 @@ review on the listed revision before merging; the links record the actual accept
| [#134: image clip range/stride saving](https://github.com/mgradwohl/MoTrack/pull/134) | 898328a | [42549943932](https://github.com/mgradwohl/MoTrack/actions/runs/42549943932) |
| [#138: bounded session/journal test groups](https://github.com/mgradwohl/MoTrack/pull/138) | 71b3494 | [42556009533](https://github.com/mgradwohl/MoTrack/actions/runs/42556009533) |
| [#136: movie clip range/stride saving](https://github.com/mgradwohl/MoTrack/pull/136) | 4cf2b0f | [42561178958](https://github.com/mgradwohl/MoTrack/actions/runs/42561178958) |
| [#139: existing MOV archive editing and AVI guard](https://github.com/mgradwohl/MoTrack/pull/139) | f166ba9 | [42568545597](https://github.com/mgradwohl/MoTrack/actions/runs/42568545597) |

The final row passes Windows, macOS, Linux, both contributor setup jobs and **95.72% combined C++ line
coverage (8874/9271)**. The four image-clip modes and both movie-clip modes pass MoTrack native reopen/standard export,
The final row passes Windows, macOS, Linux, both contributor setup jobs and **95.82% combined C++ line
coverage (8887/9275)**. All four edited MOV archive modes also load, save and freshly reopen both experiments,
check every media byte and reimport both natively. The four image-clip modes and both movie-clip modes pass MoTrack native reopen/standard export,
actual Tracker load/save/fresh-process reopen and native reimport. The complete saved image-reference
list, every image's bytes and the full movie hash are checked after Tracker resaves and reopens, including excluded frames.
These are scoped results, not full Tracker parity. Historical evidence below remains attributable to
Expand Down Expand Up @@ -170,9 +172,9 @@ and platform evidence before it can be marked complete.
| --- | --- | --- | --- |
| R01 | Reproducible native builds, CI, review, numerical tests, at least 90% combined C++ line coverage | Implemented foundation; continue applying gates to every new component. The reference helper executes repeated loader completion callbacks once, fixing the empty-resave race in #105; bounded failure diagnostics remain and no retry or acceptance bypass is added. The #137 infrastructure correction partitions journal/session cases with complementary filters and unchanged 60-second limits; full case-inventory and CI validation remain required. | 0, every phase |
| R02 | Open `.trk`/`.trz`; preserve all supported and unknown content, references, metadata, and archive tabs | Partial: supported point masses/vectors/calibration import; one archive tab selected. Native documents retain that tab's original XML, editable-track IDs and source-object associations for new imports. Version 5 embeds the exact original archive, including all tabs/media/unknown files. A partial read-only reference index maps original track names, panel/nested-view selections, table/plot owners (including dataset rows), ordered plot guests, mechanical-tool attachment slots/step targets center-of-mass/vector-sum members, model boosters and dynamic-system members to source nodes and known IDs; unknown subclass relationships remain explicit. Dataset rows have source-structure evidence only; media-backed application acceptance remains. Older native sources retain an explicit unknown-association state. | 1–3 |
| R03 | Save edited standard files plus optional `.motrack`; reopen in both applications without data loss | Partial: native source/archive preservation and audited standard writers are merged. Depending on the source schema, verified edits include mass/marks, independent vectors, clip ranges, media-free constant timing, fixed/partly fixed/varying calibration, unit labels, audited renames, independent track creation and supported removal/selection/plot/table cleanup. The [format guide](native-format.md) defines those per-schema limits. Linked images, selected image-archive members and indexed constant-rate linked movies have native reopen/relocation and actual Tracker acceptance. Per-output checkpoints, explicit recovery, desktop paired Save and portable image export are merged through #133. Image clip ranges/strides are merged in #134 with all four linked/archive/package application cases, including complete post-resave image inventory checks. Movie clip ranges/strides are merged in #136 with both application cases and complete post-resave movie hashes. Existing MOV-archive saving has native/desktop regressions and four mixed-tab reference modes; an original AVI archive fails pinned Tracker loading (#140), remains explicitly excluded from accepted interchange, and is refused by the standard writer; current-head application acceptance, CI and review are pending. Untouched archive experiments are checked independently. Remaining work includes broader schemas and dependencies, dataset-owner removal, movie-archive acceptance and new movie packaging, broader media timing and full export authoring. Known Tracker table-format losses (#64) and vector-sum losses (#63) retain strict guards and independent failing expectations. | 2–3, every feature |
| R03 | Save edited standard files plus optional `.motrack`; reopen in both applications without data loss | Partial: native source/archive preservation and audited standard writers are merged. Depending on the source schema, verified edits include mass/marks, independent vectors, clip ranges, media-free constant timing, fixed/partly fixed/varying calibration, unit labels, audited renames, independent track creation and supported removal/selection/plot/table cleanup. The [format guide](native-format.md) defines those per-schema limits. Linked images, selected image-archive members and indexed constant-rate linked movies have native reopen/relocation and actual Tracker acceptance. Per-output checkpoints, explicit recovery, desktop paired Save and portable image export are merged through #133. Image clip ranges/strides are merged in #134 with all four linked/archive/package application cases, including complete post-resave image inventory checks. Movie clip ranges/strides are merged in #136 with both application cases and complete post-resave movie hashes. Existing MOV-archive saving is merged in #139 with all four mixed-tab actual-Tracker modes passing; the original AVI extraction failure remains pinned and refused under #140. New portable MOV packaging has a native adapter and desktop export path, with three full/strided/single-frame application modes pending current-head CI and review. Untouched archive experiments are checked independently. Remaining work includes broader schemas and dependencies, dataset-owner removal, portable movie acceptance and broader containers, broader media timing and full export authoring. Known Tracker table-format losses (#64) and vector-sum losses (#63) retain strict guards and independent failing expectations. | 2–3, every feature |
| R04 | Multiple experiment tabs, independent undo/dirty state, tab/project Save As, cross-tab import and reusable views | Partial foundation: document sessions own independent data/history/save checkpoints, and native storage preserves unopened archive tabs. The desktop still has one active experiment; multi-tab controllers/UI, cross-tab import and reusable views remain. | 2–4 |
| R05 | Movies, stills, image sequences and zipped sequences; accurate clip/time/frame controls and media properties | Partial: local movies/images, trim/stride, indexing, orientation, bounded caching and playback exist. Media-free duration/time-origin edits have history and export oracles. Four-image and four-frame constant-rate AVI fixtures independently check pixels, order, timestamps, clip time and calibrated marks. The movie baseline (#132) passes actual Tracker load/save/fresh reopen; existing mass/mark export (#133) also passes native reimport; movie edits require unchanged timing/calibration/identity and a matching completed native index. Image clip edits (#134) pass all four linked/archive/package cases while preserving source frame numbers, measurements and every image, including excluded frames. See the merged CI table above. Strided/single-frame movie range saving is merged in #136 with actual Tracker acceptance. Existing MOV-archive mass/mark/clip saving has local native/desktop evidence; archived AVI output is refused after a reproduced Tracker extraction failure (#140); four mixed-tab application modes remain to pass current-head CI. Variable-rate timing, movie-archive acceptance, new movie packaging, broader formats/properties/controls, numeric media timing edits and media export remain. The synthetic AVI does not reproduce or resolve the historical MOV/Open Recent report in #65. | 1, 3–4, 6 |
| R05 | Movies, stills, image sequences and zipped sequences; accurate clip/time/frame controls and media properties | Partial: local movies/images, trim/stride, indexing, orientation, bounded caching and playback exist. Media-free duration/time-origin edits have history and export oracles. Four-image and four-frame constant-rate AVI fixtures independently check pixels, order, timestamps, clip time and calibrated marks. The movie baseline (#132) passes actual Tracker load/save/fresh reopen; existing mass/mark export (#133) also passes native reimport; movie edits require unchanged timing/calibration/identity and a matching completed native index. Image clip edits (#134) pass all four linked/archive/package cases while preserving source frame numbers, measurements and every image, including excluded frames. See the merged CI table above. Strided/single-frame movie range saving is merged in #136 with actual Tracker acceptance. Existing MOV-archive mass/mark/clip saving is merged in #139 with four passing mixed-tab application modes; archived AVI output is refused after the reproduced extraction failure (#140). New portable MOV packaging copies the complete movie and validates its staged index; native/desktop regressions pass, while actual-Tracker acceptance remains pending. Variable-rate timing, broader movie packaging, broader formats/properties/controls, numeric media timing edits and media export remain. The synthetic AVI does not reproduce or resolve the historical MOV/Open Recent report in #65. | 1, 3–4, 6 |
| R06 | Complete point-mass editing and appearance: selection, dragging/nudging, numeric positions, multiselect, locks, labels, trails, paths, and vector overlays | Partial: manual marking/replacement, repeat, rename/delete, mass, and undo exist. Finish manipulation, appearance, path length, and selection behavior. | 4–5 |
| R07 | Independent vectors, linked vectors, sums, their data, editing, and persistence | Partial: independent vectors import/display/edit/undo/native-save. Internal sample export, new-vector creation and unreferenced removal have independent empty/sparse/zero-vector reference cases; native selection-cleanup regressions cover empty and replacement vectors; creation retains the snapping/precision guards and requires an audited independent-vector/axes source. A Java-authored vector-sum case retains independent expected results but reproduces a Tracker 6.3.5 defect: members never resolve and resave loses their names. This is explicitly not accepted round-trip evidence; the internal writer rejects edited projects containing vector sums, including empty member tracks. Native read-only indexing now records original member links with explicit ambiguity/unclassified targets. Native links/sum evaluation, analysis and desktop standard saving remain. | 3–5 |
| R08 | Center-of-mass tracks, constituents, dependent updates, and moving reference frames | Native evaluation/editing missing. A Java-authored center-of-mass reference checks named constituents, total mass and independent weighted positions; native member-link indexing and constituent-name export preserve original targets. The rename case requires unchanged 5 kg total mass and weighted positions through actual Tracker resave; native dependency evaluation, constituent editing and moving reference frames remain. | 2, 5 |
Expand Down Expand Up @@ -333,7 +335,7 @@ Scoped image/archive/movie session loading now has the merged acceptance evidenc
requirement coverage, runtime/dependency provenance and exact source mapping remain unfinished. The initial phase-3 writer/reference path covers mass values, marks, independent-vector
samples, clip ranges/constant timing, existing fixed/partly fixed/fully varying calibration, length/mass/time-unit labels,
audited names, new independent point masses/vectors, unreferenced removals, selection cleanup and custom plot/table owner removal, including native reopen and Java resave acceptance gates. Expand it
to dataset-owner deletion, broader dependencies, movie-archive acceptance/new packaging and the remaining media timing/export
to dataset-owner deletion, broader dependencies, portable movie acceptance/broader containers and the remaining media timing/export
schemas. Desktop paired Save is available for the audited schemas; broader standard Save remains unfinished. Phase 2 has an XML source envelope, persistent point-mass/vector
IDs, original object associations, commands addressed by ID, native version migration and complete
original archive preservation. `DocumentSession` now owns each document's data/history/native save state;
Expand Down
Loading
Loading