Skip to content

Releases/v1.1.0 - #175

Open
eugene-mux wants to merge 16 commits into
mainfrom
releases/v1.1.0
Open

eugene-mux wants to merge 16 commits into
mainfrom
releases/v1.1.0

Conversation

@eugene-mux

@eugene-mux eugene-mux commented Nov 4, 2026 •

Copy link
Copy Markdown

Description

Release Android Upload SDK 1.1.0 with HEVC-aware input standardization and reliable generated-file resume.

Changes

  • Preserve H.264/HEVC on supported conversions, validate generated output, and upload originals when preparation is unsupported or fails.
  • Default to 1080p generated output; offer 1440p/2160p limits, eligible HDR preservation and opt-in tone mapping.
  • Require Android API 23+, Kotlin 2.1+, AGP 8.10+ and compileSdk 36+. Android 6 uploads originals; local conversion requires Android 7 (API 24)+ and a supported input/device.

Validation

  • Merge NAT-551: Capability checks and acceptance fixes #176 into this branch before release. It contains the final-tested capability, Builder, diagnostics, packaging and sample fixes, plus the accepted Android 6 compatibility wording.
  • The combined implementation passes 323 debug + 323 release unit tests, SDK/sample release builds, vital lint analyses and packaged-consumer/R8 checks. Fixture, physical-device, sample-UI and real Mux upload/recovery evidence is summarized in NAT-551: Capability checks and acceptance fixes #176.
  • Full lint on that candidate remains at 102 errors / 33 warnings versus this branch's 103 / 34. Performance acceptance is owner-deferred.

Note

High Risk
Large changes to on-device transcoding, resumable upload persistence, and HTTP resume semantics directly affect what bytes reach Mux and whether interrupted uploads can safely continue.

Overview
Android Upload SDK 1.1.0 raises the platform floor (API 23+, compileSdk 36, Kotlin/AGP bumps) and documents default 1080p standardization plus 1440p/2160p, HdrHandling, and dependency 1.1.0.

The legacy TranscoderContext MediaCodec path is removed in favor of a Media3 Transformer–based Standard Input pipeline (metadata/sample inspection, optional SDR/HDR export, validated generated files). MuxUpload.Builder gains hdrHandling and clearer standardization docs; InputStandardization now carries HDR settings and Preset2560x1440.

Upload behavior is reworked around UploadAttempt, UploadSession, and UploadProtocol: stricter 308/Range acknowledgement, chunk retries with backoff, pause/cancel/restart/replace semantics (including awaitSuccess and listener deduping), and durable resume for standardized payloads via PayloadIdentity, destination block lists, and richer UploadPersistence. MuxUploadManager restores paused jobs differently on cold start vs resumeAllCachedJobs, and failed uploads stay discoverable for retry.

ChunkWorker uses async OkHttp and one-shot counting bodies; UploadJobFactory ties preparation, transport, and cleanup together.

Reviewed by Cursor Bugbot for commit be9c63f. Bugbot is set up for automated code reviews on this repo. Configure here.

* NAT-541: Pin Media3 build and verify consumer compatibility

* NAT-541: Trim compatibility documentation

* NAT-541: Address consumer compatibility review findings

* NAT-541: Remove internal compatibility tooling from deliverables
* NAT-543: Add and retain Standard Input options

* NAT-543: Clarify option and validation boundaries

* NAT-543: Describe active legacy paths and strengthen retention coverage

* NAT-543: Keep legacy conversion documentation precise

* Remove ticket references from lifecycle test comments
* Add a pure Standard Input policy and planner

* Simplify Standard Input planning and policy checks

* Require audio capability proof and preserve unknown tier evidence

* Require concrete conversion targets and consistent capability proof

* Align conversion proof with output limits and preserve cadence
* Inspect container and track metadata for Standard Input

* Keep metadata fixture validation tooling external

* Resolve metadata review findings and inspect effective timelines

* Reuse Media3 timeline parsing and resolve metadata review findings

* Keep ambiguous timeline and ISO rotation evidence unknown

* Simplify metadata inspection and defer effective timeline validation

* Keep codec facts unknown when Media3 helpers are incompatible

* Use platform metadata without duplicate codec or container parsing

* Retain missing pixel and color evidence without reconciling platform values

* Fill missing pre-API-24 profile evidence without overriding platform metadata
* Inspect bounded compressed video samples for Standard Input

* Fix sample inspection review findings

* Limit ISO inspection to sample edit-list evidence
* Inspect bounded compressed video samples for Standard Input

* Fix sample inspection review findings

* Limit ISO inspection to sample edit-list evidence

* Validate generated media before upload

* Fix output validation timing and bounded sample inspection

* Unify ISO inspection and include trimmed video payload

* Simplify inspection results and regression setup

* Correct edited bitrate spans and require source timeline proof

* Remove non-ISO sample scanning and raw duration guesses

* Ignore dropped audio tracks in expected output duration

* Match timeline evidence using platform track identity
* NAT-547: define SDR targets and bounded codec preflight

* NAT-547: own cancellable Media3 SDR export and validated files

* NAT-547: cover terminal races and document adapter evidence

* NAT-547: harden SDR conversion and add reproducible review coverage

* NAT-547: remove internal README notes from product changes

* Remove manual fixture tooling and test-only SDK entry points

* Use actual VFR GOP windows and reject unproven rate hints

* Synchronize SDR test completion and share AAC layout mapping

* Use normalized platform metadata in SDR conversion

* Use coroutines and a cancellable continuation for SDR conversion
* Inspect container and track metadata for Standard Input

* Keep metadata fixture validation tooling external

* Resolve metadata review findings and inspect effective timelines

* Reuse Media3 timeline parsing and resolve metadata review findings

* Keep ambiguous timeline and ISO rotation evidence unknown

* Simplify metadata inspection and defer effective timeline validation

* Keep codec facts unknown when Media3 helpers are incompatible

* Use platform metadata without duplicate codec or container parsing

* Retain missing pixel and color evidence without reconciling platform values

* Fill missing pre-API-24 profile evidence without overriding platform metadata

* Inspect bounded compressed video samples for Standard Input

* Fix sample inspection review findings

* Limit ISO inspection to sample edit-list evidence

* Validate generated media before upload

* Fix output validation timing and bounded sample inspection

* Unify ISO inspection and include trimmed video payload

* Simplify inspection results and regression setup

* Correct edited bitrate spans and require source timeline proof

* Remove non-ISO sample scanning and raw duration guesses

* Ignore dropped audio tracks in expected output duration

* Match timeline evidence using platform track identity

* NAT-547: define SDR targets and bounded codec preflight

* NAT-547: own cancellable Media3 SDR export and validated files

* Integrate upload preparation and pause/cancel lifecycle

* NAT-547: cover terminal races and document adapter evidence

* Preserve server audio selection for multi-track inputs

* NAT-547: harden SDR conversion and add reproducible review coverage

* Fix upload preparation lifecycle review findings

* NAT-547: remove internal README notes from product changes

* Fix listener reentrancy and upload replacement lifecycle

* Remove manual fixture tooling and test-only SDK entry points

* Follow adopted upload sessions and consolidate lifecycle tests

* Use actual VFR GOP windows and reject unproven rate hints

* NAT-548: Return cancellation failure to active await callers

* Synchronize SDR test completion and share AAC layout mapping

* NAT-548: Keep await callers attached across force restart

* Use normalized platform metadata in SDR conversion

* Update upload preparation fixtures for platform metadata

* Use coroutines and a cancellable continuation for SDR conversion

* NAT-547: define SDR targets and bounded codec preflight

* NAT-547: own cancellable Media3 SDR export and validated files

* NAT-547: cover terminal races and document adapter evidence

* NAT-547: harden SDR conversion and add reproducible review coverage

* NAT-547: remove internal README notes from product changes

* Remove manual fixture tooling and test-only SDK entry points

* Use actual VFR GOP windows and reject unproven rate hints

* Synchronize SDR test completion and share AAC layout mapping

* Use normalized platform metadata in SDR conversion

* Use coroutines and a cancellable continuation for SDR conversion
* Inspect container and track metadata for Standard Input

* Keep metadata fixture validation tooling external

* Resolve metadata review findings and inspect effective timelines

* Reuse Media3 timeline parsing and resolve metadata review findings

* Keep ambiguous timeline and ISO rotation evidence unknown

* Simplify metadata inspection and defer effective timeline validation

* Keep codec facts unknown when Media3 helpers are incompatible

* Use platform metadata without duplicate codec or container parsing

* Retain missing pixel and color evidence without reconciling platform values

* Fill missing pre-API-24 profile evidence without overriding platform metadata

* Inspect bounded compressed video samples for Standard Input

* Fix sample inspection review findings

* Limit ISO inspection to sample edit-list evidence

* Validate generated media before upload

* Fix output validation timing and bounded sample inspection

* Unify ISO inspection and include trimmed video payload

* Simplify inspection results and regression setup

* Correct edited bitrate spans and require source timeline proof

* Remove non-ISO sample scanning and raw duration guesses

* Ignore dropped audio tracks in expected output duration

* Match timeline evidence using platform track identity

* NAT-547: define SDR targets and bounded codec preflight

* NAT-547: own cancellable Media3 SDR export and validated files

* Integrate upload preparation and pause/cancel lifecycle

* NAT-547: cover terminal races and document adapter evidence

* Preserve server audio selection for multi-track inputs

* NAT-547: harden SDR conversion and add reproducible review coverage

* Fix upload preparation lifecycle review findings

* NAT-547: remove internal README notes from product changes

* Fix listener reentrancy and upload replacement lifecycle

* Remove manual fixture tooling and test-only SDK entry points

* Follow adopted upload sessions and consolidate lifecycle tests

* Use actual VFR GOP windows and reject unproven rate hints

* NAT-548: Return cancellation failure to active await callers

* NAT-549: Resume generated payloads from verified server offsets

* Synchronize SDR test completion and share AAC layout mapping

* NAT-548: Keep await callers attached across force restart

* NAT-549: Preserve generated uploads across transient failures

* Use normalized platform metadata in SDR conversion

* Update upload preparation fixtures for platform metadata

* NAT-549: Preserve restart ownership and generated retry progress

* NAT-549: Allow untouched destinations after slow preparation release

* Use coroutines and a cancellable continuation for SDR conversion

* NAT-549: Reject stale generated writes and cancelled auto-restoration

* NAT-547: define SDR targets and bounded codec preflight

* NAT-547: own cancellable Media3 SDR export and validated files

* NAT-547: cover terminal races and document adapter evidence

* NAT-547: harden SDR conversion and add reproducible review coverage

* NAT-547: remove internal README notes from product changes

* Remove manual fixture tooling and test-only SDK entry points

* Use actual VFR GOP windows and reject unproven rate hints

* Synchronize SDR test completion and share AAC layout mapping

* Use normalized platform metadata in SDR conversion

* Use coroutines and a cancellable continuation for SDR conversion

* NAT-549: Allow landscape encoding with portrait rotation metadata

* NAT-549: Synchronize resume lifecycle tests with cleanup

* NAT-549: Simplify standardized upload lifecycle and transport

* NAT-549: Report missing original payloads during restoration

* NAT-549: Finalize payload selection and retain restart checkpoints

* NAT-549: Persist original selection atomically before transport

* NAT-549: Keep restarted uploads eligible for automatic resume

* NAT-549: Serialize startup persistence with pause and cancel
* NAT-550: Add opt-in HDR-to-SDR tone mapping

* NAT-550: Validate the requested tone-mapped color range

* NAT-550: Cover both codec families in HDR preflight tests
@eugene-mux
eugene-mux requested a review from a team as a code owner November 4, 2026 19:22

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want higher recall? High effort reviews run extra passes and find more bugs. A team admin can switch effort levels in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit be9c63f. Configure here.

Comment thread library/build.gradle Resolved
@eugene-mux
eugene-mux requested a review from daytime-em November 4, 2026 19:40

@daytime-em daytime-em left a comment •

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did some manual testing, and it looks like something important is missing. No files are ever standardized, even when standardization is requested. All capabilities are always missing: missing capabilities [SourceDecode, SourceTimeline, VideoEncode, Remediation(requirement=AverageBitrate), Remediation(requirement=MaximumGopBitrate), Remediation(requirement=VideoResolution), AacAudioPreparation, ToneMapping]

On closer inspection, it looks like standardization is attempted despite the lack of planning capabilities. StandardInputAction.Fallback is always returned from StandardInputPlanner.plan(), but the Action's StandardInputConversion object is used. Fallback appears to be ignored as a value through the rest of the standardization process.

Outside of tests, it doesn't look like PlanningCapabilities values are ever set, leaving the default false/empty values for all the relevant fields. StandardInputPlanner.plan() has an empty capabilities as a default param, so everything still builds, but capabilities are never actually validated or provided to plan(), and the fallback behavior is always chosen.

  1. avoid a default value for that parameter: there is no situation where you'd want to call plan() while also assuming no capabilities (aside from unit tests)
  2. If you no longer plan on probing for device capabilities, consider deleting the Fallback Action, as it's treated the same as Convert. You can probably also delete PlanningCapabilities since it's never populated with read data.

@eugene-mux

Copy link
Copy Markdown
Author

@daytime-em Thanks for the review - good catch! Addressed in #176: capabilities are checked before final planning, and only Convert starts conversion; Fallback uploads the original. Includes device testing and logcat evidence.

@eugene-mux
eugene-mux requested a review from daytime-em November 6, 2026 22:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants