3395 Commits
Author SHA1 Message Date
Jonathan Thomas 1c46200eae Preserve host SIGPIPE handling during crash handler initialization
Leave SIGPIPE disposition unchanged so Python can handle a disconnected output pipe as EPIPE instead of terminating the editor. Add a native regression test that verifies the ignored disposition and a write to a closed pipe.

Validation: 50 CrashHandler, Logger, and Timeline tests passed. A Python subprocess exits with signal 13 using the installed library and survives the same closed-pipe write using the rebuilt library.
v1.0.1
2026-09-27 16:04:44 -05:00
Jonathan Thomas 1f54aa1279 Preserve imported clip location coordinate conventions
Persist canvas or geometry location units per clip so legacy animation is evaluated without rewriting keyframes. Keep auto behavior for new clips and add historical render and JSON regression coverage.
2026-09-27 01:45:30 -05:00
Jonathan Thomas f92622179f Add missing REUSE copyright and license metadata 2026-09-26 21:29:47 -05:00
Jonathan Thomas 54ada2010d Fix Codacy findings in Timeline tests 2026-09-26 21:23:40 -05:00
Jonathan Thomas a2e1297aa4 Fix preview alignment, export timestamps, and capture color range
Align reduced preview dimensions after aspect fitting while preserving native output sizes. Pad export scaler rows and copy planes by stride, including compatibility handling for legacy GIF palettes.

Preserve delayed audio encoder timestamps, skip unavailable packets, and use actual resampler output counts. Share JPEG-range normalization with live capture and add sizing, export, audio, GIF, and color regression tests.
2026-09-25 19:43:06 -05:00
Jonathan Thomas 03b66ebe92 Fix transition routing and stacking for clips with tied start times
Preserve clip order for equal layer and position values, and route video and audio transitions according to compositing order. Cover fade directions, rounded start frames, audio gains, and JSON order preservation.
2026-09-25 12:10:59 -05:00
Jonathan Thomas e9bc7831b3 Fix Qt player frame handoff and seek races 2026-09-24 19:23:50 -05:00
Jonathan Thomas b590640fba Speed up JSON keyframe updates and add focused transform benchmarks
Interactive transform edits repeatedly replace growing X/Y keyframe curves.
Applying each update copied the same JSON data through several layers and
rebuilt keyframe storage from scratch, making edits increasingly expensive
as an animation accumulated points.

Move JSON values that are already owned by the loader through the existing
by-value interfaces instead of copying them again. Clip and effect loading
now share a base-field helper that reads common fields without copying all
of the derived animation data. Parsed SetJson input and nested color/point
values use the same ownership approach.

Keep allocated keyframe capacity across replacements and append sorted
points directly. Unordered input and duplicate frames still use AddPoint,
preserving ordering and replacement behavior. Existing public signatures,
virtual method layout, JSON format, and timeline locking remain unchanged.

Add two optional benchmark cases for a 720p/24fps image clip with 0 or 1,000
existing keyframes per axis. Each performs 100 successive X/Y transform
updates through Timeline::ApplyJsonDiff and reports the median of three
trials. Input preparation stays outside the measurement, and final point
counts and values are checked so a skipped update cannot look faster.
These cases belong to the separate benchmark executable, not normal CTest
runs. Report Ops/s because an operation can now be a JSON edit or a frame.

Document the reproduction commands and local before/after measurements.
The measured cost per update fell from 0.82 to 0.33 ms for the initially
empty curves and from 17.99 to 6.73 ms for curves starting at 1,000 points.
These isolate native JSON application; they do not measure GUI rendering
or guarantee the same performance on other machines.

Add regression coverage for caller-owned JSON, sorted and unordered input,
duplicate and fractional frames, interpolation handles, large curve
replacement, multiple actions in one diff, unchanged properties, and cache
invalidation.

Validation: rebuilt the library, benchmark, and affected test executables;
all 197 KeyFrame, Timeline, Clip, Point, Color, ColorGrade, Mask, and
EffectMask tests passed in 6.2 seconds. Both remaining transform benchmark
cases also completed successfully. The slower 5,000-point benchmark case
is intentionally omitted.
2026-09-20 00:15:23 -05:00
Jonathan Thomas cfa5dfa3cd Bumping version to 1.0.1, SO 32, requiring OpenShotAudio 1.0.1 2026-09-19 18:23:52 -05:00
Jonathan Thomas 813fcca995 Merge pull request #1101 from OpenShot/libopenshot-stability-fixes
Fix crashes when opening or closing readers and exporting raw video
2026-09-19 16:56:26 -05:00
Jonathan Thomas ce5b56a281 Merge pull request #1100 from OpenShot/linux-camera-discovery
Discover Linux camera modes through native V4L2 queries
2026-09-19 16:56:16 -05:00
Jonathan Thomas 1ee6dbe334 Fix reader lifecycle races and raw-video packet ownership 2026-09-19 15:38:20 -05:00
Jonathan Thomas 04f9ccbe83 Discover Linux camera modes through native V4L2 queries 2026-09-19 15:10:01 -05:00
Jonathan Thomas f20829fb9b Merge pull request #1099 from OpenShot/simple-logging
Replace ZeroMQ logging with direct file and console output
2026-09-15 16:14:22 -05:00
Jonathan Thomas 68018f2d49 Add missing REUSE licensing headers for logging files 2026-09-15 15:58:33 -05:00
Jonathan Thomas 961775aa3d Support legacy MinGW Python DLL lookup in logger tests 2026-09-15 15:19:40 -05:00
Jonathan Thomas 387cf5cabe Use portable temporary files in ObjectMask tests 2026-09-15 15:17:35 -05:00
Jonathan Thomas bb5b082124 Fix OpenCV runtime DLL path on Windows x64 CI 2026-09-15 14:48:22 -05:00
Jonathan Thomas 8e4bc29c30 Fix logger compatibility with older macOS and Windows test DLL loading 2026-09-15 13:18:19 -05:00
Jonathan Thomas ea75014f08 Replace ZeroMQ logging with independent file and console logging
Add severity levels and environment configuration, preserve source aliases and raw crash-log output, and remove ZeroMQ build dependencies. Document the API and cover filtering, environment precedence, concurrent writes, and Python bindings.
2026-09-14 22:46:20 -05:00
Jonathan Thomas fb9f92ba0e Merge pull request #1098 from OpenShot/fix-camera-race-open-close
Fix camera race crash during Open/Close (and audio crackling after recording)
2026-09-14 19:01:14 -05:00
Jonathan Thomas dc43f4ddb5 Keep screen recording audio aligned to capture timestamps
Position PulseAudio and WASAPI loopback samples relative to recording start, dropping stale audio and preserving gaps without delaying subsequent sound. Request smaller PulseAudio fragments and tolerate bounded timestamp jitter to avoid crackling at packet boundaries.

Add regression coverage for both capture clocks, pre-recording buffers, late packets, gaps, queue overflow, reset, and sample continuity.
2026-09-14 16:11:43 -05:00
Jonathan Thomas 7389caf466 Prevent camera cleanup from racing FFmpeg device initialization
Serialize the FFmpeg capture Open path with GetFrame and Close using the
existing recursive mutex. Close still signals cancellation before waiting,
but cannot free a context while avformat_open_input or decoder setup uses it.
Clean up partially initialized resources on failure or cancellation.

Add a hardware-independent regression test that pauses a V4L2 open inside
FFmpeg and requests Close from another thread. It reproduces SIGSEGV with
the original implementation and passes with the fix, including 20 repeated
runs. All 15 camera/screen capture test cases pass (78 assertions).

Real-device AppImage validation remains necessary after rebuilding.
2026-09-14 15:36:46 -05:00
Jonathan Thomas 36e822f48b Merge pull request #1097 from OpenShot/sentry-sep-12-2026
Fix use-after-free when deleting timeline-owned clips
2026-09-13 01:18:14 -05:00
Jonathan Thomas 70322e152f Fix a crash when deleting timeline clips
Sentry-related fix:
- OPENSHOT-BV93 (confirmed deletion path): Read a clip's position and duration
  before removing it, since removal can immediately free the timeline-owned clip.

Additional coverage:
- Verify that deletion invalidates the former clip range without clearing
  unrelated cached frames.
- Verify that repeating an already-completed deletion is harmless.

Validation: 518 native tests pass, with two unavailable VAAPI hardware tests
explicitly skipped. The deletion regression covers seven assertions. Valgrind
reported four invalid reads before the fix and zero errors after it.
The paired openshot-qt branch passes 598 Python tests, and Jonathan's manual
editing tests were reported stable.

This summary records the fix in the preceding commit. BV93 also contains other
crash stacks, so this does not claim the entire Sentry issue group is resolved.
2026-09-12 22:55:05 -05:00