{"id":50952787,"url":"https://github.com/atelier-socle/swift-cmaf-kit","last_synced_at":"2026-06-18T03:04:51.965Z","repository":{"id":359794693,"uuid":"1241393793","full_name":"atelier-socle/swift-cmaf-kit","owner":"atelier-socle","description":"Pure-Swift Common Media Application Format (CMAF) + ISO BMFF foundation. Read, write, validate fragmented MP4 / CMAF media across macOS, iOS, iPadOS, tvOS, watchOS, visionOS, and Linux. Opt-in CMAFKitDRM library for typed pssh decoding of 9 DRM systems. Zero C vendoring, Swift 6.2 strict concurrency.","archived":false,"fork":false,"pushed_at":"2026-05-23T13:32:01.000Z","size":1229,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T15:05:08.307Z","etag":null,"topics":["audio","cenc","clearkey","cmaf","common-encryption","dash","drm","fairplay","fragmented-mp4","hls","iso-bmff","ll-hls","mp4","playready","streaming","swift","swift-package-manager","swift6","video","widevine"],"latest_commit_sha":null,"homepage":"https://atelier-socle.github.io/swift-cmaf-kit/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/atelier-socle.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"atelier-socle"}},"created_at":"2026-05-17T10:34:52.000Z","updated_at":"2026-05-23T13:20:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/atelier-socle/swift-cmaf-kit","commit_stats":null,"previous_names":["atelier-socle/swift-cmaf-kit"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/atelier-socle/swift-cmaf-kit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atelier-socle%2Fswift-cmaf-kit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atelier-socle%2Fswift-cmaf-kit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atelier-socle%2Fswift-cmaf-kit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atelier-socle%2Fswift-cmaf-kit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atelier-socle","download_url":"https://codeload.github.com/atelier-socle/swift-cmaf-kit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atelier-socle%2Fswift-cmaf-kit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34474065,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","cenc","clearkey","cmaf","common-encryption","dash","drm","fairplay","fragmented-mp4","hls","iso-bmff","ll-hls","mp4","playready","streaming","swift","swift-package-manager","swift6","video","widevine"],"created_at":"2026-06-18T03:04:51.201Z","updated_at":"2026-06-18T03:04:51.952Z","avatar_url":"https://github.com/atelier-socle.png","language":"Swift","funding_links":["https://github.com/sponsors/atelier-socle"],"categories":[],"sub_categories":[],"readme":"# swift-cmaf-kit\n\n[![CI](https://github.com/atelier-socle/swift-cmaf-kit/actions/workflows/ci.yml/badge.svg)](https://github.com/atelier-socle/swift-cmaf-kit/actions/workflows/ci.yml)\n[![Platform Builds](https://github.com/atelier-socle/swift-cmaf-kit/actions/workflows/platform-builds.yml/badge.svg)](https://github.com/atelier-socle/swift-cmaf-kit/actions/workflows/platform-builds.yml)\n[![Coverage](https://github.com/atelier-socle/swift-cmaf-kit/actions/workflows/coverage-report.yml/badge.svg)](https://github.com/atelier-socle/swift-cmaf-kit/actions/workflows/coverage-report.yml)\n[![codecov](https://codecov.io/gh/atelier-socle/swift-cmaf-kit/branch/main/graph/badge.svg)](https://codecov.io/gh/atelier-socle/swift-cmaf-kit)\n[![DocC](https://github.com/atelier-socle/swift-cmaf-kit/actions/workflows/docc-deploy.yml/badge.svg)](https://atelier-socle.github.io/swift-cmaf-kit/)\n[![Swift 6.2](https://img.shields.io/badge/Swift-6.2-orange.svg)](https://swift.org)\n[![Platforms](https://img.shields.io/badge/Platforms-macOS%2014%20|%20iOS%2017%20|%20iPadOS%2017%20|%20tvOS%2017%20|%20watchOS%2010%20|%20visionOS%201%20|%20Linux-blue.svg)]()\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n\n![swift-cmaf-kit](./assets/banner.png)\n\nA pure-Swift implementation of the Common Media Application Format (ISO/IEC 23000-19) plus the underlying ISO Base Media File Format hierarchy. Read, write, validate, and surface typed metadata for fragmented MP4 / CMAF media. Cross-platform from day one. Zero C vendoring. Swift 6.2 strict concurrency. 3,575 tests across macOS and Linux. The container and codec foundation of the [Atelier Socle](https://www.atelier-socle.com) streaming ecosystem.\n\n## Status\n\n**0.1.2** — refinement patch over the v0.1.1 surface. CLI refactored to the idiomatic library + thin executable pattern (unblocks `xcodebuild test` on Apple platforms); `swift-crypto` declared-but-unwired dependency removed; industry-grade uniform DocC coverage achieved with 94 new test-traceable code samples (113 swift blocks across 25 articles). Purely additive on the public typed surface — zero breaking change. APIs may evolve before 1.0 based on community feedback. The library ships two products (`CMAFKit` + opt-in `CMAFKitDRM`) and a companion executable (`cmafkit-cli`).\n\n## What's new in 0.1.2\n\nA refinement patch that closes the architectural cohesion gap with\nthe peer ecosystem (`swift-hls-kit`, `swift-srt-kit`, `swift-rtmp-kit`,\n`swift-icecast-kit`) and brings the DocC catalog to industry-grade\nuniform coverage. Every new code sample traces to an existing test.\n\n| Refinement | What changed | Why |\n|---|---|---|\n| CLI architecture | New `CMAFKitCommands` library target + thin `CMAFKitCLI` executable wrapper | Mirrors peer-lib pattern; unblocks `xcodebuild test -scheme swift-cmaf-kit-Package -destination 'platform=macOS'` on Apple platforms |\n| DocC enrichment | +94 swift code samples across 22 articles (14 → 113 blocks ecosystem-wide) | Industry-grade uniform coverage; every sample traces to a specific `@Test` (zero invention) |\n| Dependency cleanup | `swift-crypto` removed (declared but unwired) | Phase A audit verified zero `import Crypto` call sites; 3 SPM dependencies → 2 |\n| Catalog migration | `CMAFKitCLI.docc/` → `CMAFKitCommands.docc/` | The testable library owns the catalog (peer-lib convention) |\n| ProtoBuf docs | `ProtocolBufferReader` / `ProtocolBufferWriter` doc comments expanded | Legitimises public visibility for consumers implementing custom DRM providers |\n\n### Metrics\n\n- **+94 swift code samples** across 22 documentation articles\n- **Zero public symbol removed** since v0.1.1\n- **Zero forbidden patterns** introduced\n- **3 SPM dependencies → 2** (`swift-crypto` removed; `swift-argument-parser` + `swift-docc-plugin` remaining)\n- **Coverage** ≥ 92 % global maintained (93.53 %)\n\n### Validation\n\n- `xcodebuild test -scheme swift-cmaf-kit-Package -destination 'platform=macOS'` → `TEST SUCCEEDED` (the headline behavioural validation of 0.1.2)\n- `xcodebuild build` matrix 5 Apple platforms → `BUILD SUCCEEDED × 5`\n- Linux Docker (`swift:6.2-jammy`, Swift 6.2.4) → `Test run with 3 574 tests passed`\n- DocC × 3 (CMAFKit + CMAFKitDRM + CMAFKitCommands) → zero warnings\n\nSee [CHANGELOG.md](CHANGELOG.md) `[0.1.2]` for the complete shipped surface.\n\n## Requirements\n\n- Swift **6.2** toolchain (strict concurrency)\n- macOS **14** / iOS **17** / iPadOS **17** / tvOS **17** / watchOS **10** / visionOS **1** / Linux (Swift 6.2)\n- Xcode 26 (when building via xcodebuild)\n- Zero external dependencies in `CMAFKit` / `CMAFKitDRM`. The CLI depends only on Apple's [`swift-argument-parser`](https://github.com/apple/swift-argument-parser).\n\n## Installation\n\nSwift Package Manager:\n\n```swift\n// Package.swift\ndependencies: [\n    .package(url: \"https://github.com/atelier-socle/swift-cmaf-kit.git\", from: \"0.1.0\"),\n],\ntargets: [\n    .target(\n        name: \"MyApp\",\n        dependencies: [\n            .product(name: \"CMAFKit\", package: \"swift-cmaf-kit\"),\n            // optional — typed DRM init-data decoding\n            .product(name: \"CMAFKitDRM\", package: \"swift-cmaf-kit\"),\n        ]\n    )\n]\n```\n\n## Quick start\n\n```swift\nimport CMAFKit\nimport Foundation\n\nlet avc = AVCDecoderConfigurationRecord(\n    profileIndication: .baseline,\n    profileCompatibility: AVCProfileCompatibility(rawValue: 0xE0),\n    levelIndication: .level3,\n    lengthSize: .fourBytes,\n    sequenceParameterSets: [AVCParameterSet(rbspBytes: Data([0x67, 0x42, 0xC0, 0x1E]))],\n    pictureParameterSets: [AVCParameterSet(rbspBytes: Data([0x68, 0xCE, 0x3C, 0x80]))]\n)\n\nlet video = CMAFTrackConfiguration(\n    trackID: 1, kind: .video, profile: .basic, timescale: 90_000,\n    language: \"und\",\n    videoFields: CMAFTrackConfiguration.VideoFields(\n        width: 1920, height: 1080,\n        codec: .avc1, codecConfiguration: .avc(avc),\n        frameRate: .init(numerator: 30, denominator: 1)\n    )\n)\n\n// Write\nlet initBytes = try CMAFInitSegmentWriter(configurations: [video]).emit()\n\n// Read back\nlet reader = try await CMAFInitSegmentReader(bytes: initBytes)\nprint(reader.tracks().count, \"track(s)\")\n```\n\n## Features\n\n### Reading\n\n- **ISOBMFF parsing** — every box from ISO/IEC 14496-12 needed for streaming, with typed surfaces and byte-perfect unknown-box round-trip preservation\n- **Init segments** — `CMAFInitSegmentReader` (stateless value type) reconstructs the typed `CMAFTrackConfiguration` list from a `ftyp` + `moov` byte stream; handler-dispatched video / audio / subtitle / metadata resolution per ISO/IEC 14496-12 §8\n- **Media segments** — `CMAFMediaSegmentReader` (actor) ingests segment-by-segment, yields typed `CMAFParsedSample` values with per-sample bytes, duration, composition-time offset, sync flag, decode time, and (when encrypted) IV + subsample partitions\n- **Track analysis** — codec, profile, encryption scheme, language, video dimensions, audio sample rate / channel count, HDR / Dolby Vision metadata, closed-caption channels, edit list\n- **Box registry** — pluggable `BoxRegistry` for custom box parsers; default registry covers 100+ ISOBMFF / CMAF boxes\n\n### Writing\n\n- **Init segments** — `CMAFInitSegmentWriter` composes the `ftyp` + `moov` tree from typed track configurations; brand composition selects `iso6` + the CMAF major brand (`cmfc` / `cmf2` / `cmff` / `cmfl` / `cmfs` / `cmfd` / `cmfh`) + codec-specific compatible brands\n- **Media segments** — `CMAFMediaSegmentWriter` (actor) emits `moof` + `mdat` fragments with monotonic `tfdt` and sample-accurate `trun` offsets; supports multi-fragment segments and LL-HLS partial chunks via `CMAFPartialChunkBoundary`\n- **Fragment boundaries** — `CMAFFragmentBoundary` predicates: `sampleCount(N)` / `durationSeconds(N)` / `onSyncSample` / `custom(predicate)`; SAP rule enforced at runtime (every video fragment opens on a sync sample)\n- **Sample entries** — automatic dispatch to the right sample-entry composer per codec (10 video, 8 audio, 3 subtitle, 4 metadata codecs)\n- **Encrypted output** — `encv` / `enca` sample-entry rewrite, `sinf` / `schm` / `schi` / `tenc` emission, `senc` boxes with per-sample IVs + optional subsample partitions\n- **Segment indices** — `sidx` / `prft` / `emsg` emission for DASH-aligned content; LL-HLS partial chunks per IETF RFC 8216bis-15 §B\n\n### Validating\n\n- **CMAF** — `CMAFConformanceValidator` enforces 10+ rules from ISO/IEC 23000-19 §7 (SAP at fragment head, uniform track ID per traf, declared tracks, encryption symmetry, `iso6` + `cmfc` brand presence, `mfhd` sequence monotonicity, per-track `tfdt` monotonicity)\n- **DASH** — `DASHConformanceValidator` enforces the ISO BMFF profile (ISO/IEC 23009-1 §6.3) and DASH-IF IOP recommendations (`sidx` mandatory, `prft` NTP signalling, `emsg` timescale alignment, segment-duration consistency, timescale ≥ 1000)\n- **Low-Latency HLS** — `LLHLSConformanceValidator` enforces IETF RFC 8216bis-15 §B partial-chunk rules (first sample sync ↔ INDEPENDENT, unique `mfhd.sequence_number`, PART-TARGET enforcement, first-chunk INDEPENDENT flag, per-fragment `tfdt` monotonicity)\n- **Structural integrity** — every typed parser throws a precise `ISOBoxError` / `CMAFReaderError` on malformed input, never silently degrades\n- **Reports** — `CMAFValidationReport` aggregates issues across validators; each issue carries severity (error / warning / info), rule reference (spec section number), description, optional track ID, optional segment index\n\n### Encrypting (Common Encryption)\n\n- **All four schemes** per ISO/IEC 23001-7 — `cenc` (AES-CTR full-sample), `cbc1` (AES-CBC full-sample), `cens` (AES-CTR pattern), `cbcs` (AES-CBC pattern; the HLS FairPlay mode)\n- **Pattern encryption** — `crypt_byte_block` / `skip_byte_block` parameters for `cens` and `cbcs`\n- **Per-sample metadata** — typed `CMAFSampleInput.EncryptionMetadata` carries the IV + optional subsample partitions; the reader recovers them byte-perfectly\n- **PSSH passthrough** — `ProtectionSystemSpecificHeaderBox` carries any DRM system's init data verbatim; the opt-in `CMAFKitDRM` target lifts it to typed shapes\n- **No key material in the library** — CMAFKit packages and parses encrypted content; key acquisition and decryption live in the operator's downstream pipeline\n\n### DRM init-data typing (opt-in `CMAFKitDRM`)\n\nTyped `pssh.data` decoders for **9 publicly-registered DRM systems**:\n\n| System | Wire format | Status |\n|---|---|---|\n| Widevine | `WidevineCencHeader` Protocol Buffer (10 fields) | full typing |\n| PlayReady | PRO + WRMHEADER XML v4.0 / 4.1 / 4.2 / 4.3 | full typing |\n| FairPlay Streaming | Apple Modular DRM binary | full typing |\n| ClearKey | W3C EME §9 JSON + RFC 4648 §5 base64url | full typing |\n| Marlin | Marlin Broadband BBA URN + inner payload | full typing |\n| ChinaDRM | KID array per GY/T 277.2 + operator inner | full typing |\n| Nagra Connect | proprietary, NDA-only | opaque wrapper (closed-spec) |\n| Verimatrix Multi-DRM | proprietary | opaque wrapper (closed-spec) |\n| Adobe Primetime | discontinued 2020 | opaque wrapper (deprecated service) |\n\nRound-trip is byte-perfect for the six fully-typed providers (canonical-order encoding for Widevine + PlayReady; deterministic JSON for ClearKey) and for the three opaque wrappers (bytes preserved verbatim). Honest treatment of closed-spec providers is documented in each provider's file header — no fake-typing.\n\n### Closed captions\n\n- **In-band SEI extraction** — CEA-608 byte pairs and CEA-708 DTVCC packets carried inside AVC / HEVC SEI `user_data_registered_itu_t_t35` messages with the ATSC A/72 signature; `ClosedCaptionExtractor` actor surfaces typed `ClosedCaptionData`\n- **DTVCC reassembly** — cross-NAL DTVCC packet reassembly per CTA-708-E §6 + SCTE-128 §8\n- **Out-of-band caption tracks** — typed `c608` and `c708` sample entries per ISO/IEC 14496-30 §11.2 / §11.3\n- **67-case CCService enum** — CEA-608 channels `cc1..cc4` + CEA-708 services `service1..service63`, with extended 7-bit service number support\n\n### HDR and Dolby Vision\n\n- **HDR10** — SMPTE ST 2086 mastering display colour volume (`mdcv`) + CTA-861.3 content light level (`clli`)\n- **HLG / HDR10+** — colour-information box variants per ISO/IEC 14496-12 §8.5.2.2 + ISO/IEC 23001-8\n- **Dolby Vision** — Profile 5 / 7 / 8.x / 10 with `DolbyVisionConfigurationBox` (`dvcC` / `dvvC` / `dvwC` / `lhvC`) + Enhancement Layer config; HDR10-compatible base-layer signalling\n- **ICC colour profiles** — full `prof` colour information box reader + writer with element-relative `mluc` offsets per ICC.1:2010 + ICC.1:2022 §10.13 (Adobe / ColorSync / Argyll CMS cross-encoder interop verified)\n\n### Cross-platform\n\n- **Apple platforms** — macOS 14, iOS 17, iPadOS 17, tvOS 17, watchOS 10, visionOS 1; xcodebuild matrix runs on every release\n- **Linux** — Swift 6.2 toolchain (`swift:6.2-jammy`); 3,574 tests / 3,574 pass; zero conditional dependencies (no `swift-crypto`, no platform shims)\n- **Strict concurrency** — every public type is `Sendable`; zero `@unchecked Sendable`, zero `nonisolated(unsafe)`, zero `@preconcurrency`, zero `Task.detached`\n\n## Standards coverage\n\n| Standard | Section / Scope |\n|---|---|\n| ISO/IEC 14496-12 (ISO BMFF) | full box hierarchy |\n| ISO/IEC 14496-14 (MPEG-4 sample entry) | `mp4a` |\n| ISO/IEC 14496-15 (NAL unit carriage) | `avcC` / `hvcC` |\n| ISO/IEC 14496-30 (Timed Text) | `wvtt` / `stpp` / `c608` / `c708` |\n| ISO/IEC 23000-19 (CMAF) | 7 profiles, conformance validator |\n| ISO/IEC 23001-7 (CENC) | 4 schemes |\n| ISO/IEC 23001-8 (CICP) | colour primaries / transfer / matrix |\n| ISO/IEC 23008-2 (HEVC) | full bitstream parsing |\n| ISO/IEC 23008-3 (MPEG-H 3D Audio) | `mhm1` / `mhm2` |\n| ISO/IEC 23009-1 (DASH ISO BMFF) | `sidx` / `prft` / `emsg` |\n| ITU-T H.264 / H.265 | NAL units, parameter sets, VUI, HRD, SEI |\n| IETF RFC 8216bis-15 (LL-HLS) | partial chunks |\n| IETF RFC 9639 (FLAC) | frame header + metadata blocks |\n| AOMedia AV1 | sequence header, OBU framing |\n| WebM VP8 / VP9 | codec config records |\n| ETSI TS 102 366 (AC-3 / E-AC-3) | AC3SpecificBox |\n| ETSI TS 103 190-2 (AC-4) | AC4SpecificBox |\n| W3C WebVTT / TTML2 / IMSC1 | subtitle formats |\n| CTA-608-E / CTA-708-E | closed captions |\n| ATSC A/72 / SCTE-128 | SEI signalling |\n| ICC.1:2010 / 2022 | colour profile elements |\n| Google Widevine | CencHeader Protocol Buffer |\n| Microsoft PlayReady | PRO + WRMHEADER v4.0-4.3 |\n| Apple FairPlay Streaming | Modular DRM binary |\n| W3C EME ClearKey | JSON init data |\n| MDC Marlin Broadband | BBA URN |\n| GY/T 277.2 ChinaDRM | KID array |\n| IETF RFC 4648 §5 | base64url |\n| DASH-IF IOP | DRM system ID registry |\n\n## Architecture\n\nSee the [DocC catalog](Sources/CMAFKit/CMAFKit.docc/) for the full API documentation. The library is organised in eleven layered modules where lower layers cannot reference upper layers (BinaryIO → Media → ISOBMFF → CodecBitstream → CodecSampleEntries → Color → Encryption → Fragmentation → Reader → Validator → CMAFProfiles).\n\nA high-level overview is in [Showcase.md](Showcase.md).\n\n## Atelier Socle ecosystem\n\n| Library | Role |\n|---|---|\n| **swift-cmaf-kit** (this repo) | ISO BMFF / CMAF / CENC foundation |\n| swift-hls-kit | HLS playlists + segments — depends on CMAFKit |\n| swift-dash-kit (future) | DASH manifests + segments |\n| swift-rtmp-kit | RTMP transport over TCP |\n| swift-srt-kit | SRT transport over UDP |\n| swift-icecast-kit | Icecast / Shoutcast HTTP audio |\n| swift-capture-kit | Audio + video capture |\n\n## CMAFKit vs CMAFKitDRM\n\n`CMAFKit` ships the container, codec, conformance, and encryption surface. `CMAFKitDRM` is an opt-in second library product that lifts the opaque `pssh.data` field carried by ISOBMFF `pssh` boxes into typed shapes per the public specifications of nine DRM systems. Consumers that do not need DRM typing depend on `CMAFKit` only.\n\n## CLI\n\n`cmafkit-cli` is the companion executable:\n\n```bash\ncmafkit-cli probe init.mp4                          # per-track metadata\ncmafkit-cli validate init.mp4 --profile cmaf        # conformance validator\ncmafkit-cli dump-tree init.mp4 --depth 3            # box hierarchy\ncmafkit-cli decrypt-init init.mp4 --output json     # typed DRM init data\n```\n\nEvery subcommand accepts `--output text|json|table` and is read-only (never modifies the input file). The `decrypt-init` subcommand parses pssh init data; it never handles decryption key material.\n\n## Testing\n\n```bash\nswift test                                          # 3575+ tests\nxcodebuild test -scheme swift-cmaf-kit-Package \\\n    -destination 'platform=macOS'                   # Apple platforms\ndocker run --rm -v \"$(pwd):/repo\" -w /repo \\\n    swift:6.2-jammy bash -c \"swift test\"            # Linux parity\n```\n\nThe 6-platform xcodebuild matrix (macOS / iOS Sim / iPadOS Sim / tvOS Sim / watchOS Sim / visionOS Sim) is run for every release.\n\n## Contributing\n\nContributions welcome. Pull requests must:\n\n- Pass `swift test` on macOS + Linux\n- Pass `swift-format lint --strict` and `swiftlint --strict`\n- Cite the relevant standard in the doc comment for any new public symbol\n- Add tests for any new behaviour\n\n## License\n\nApache 2.0 — see [LICENSE](LICENSE).\n\n## Acknowledgments\n\nCMAFKit is developed by Atelier Socle SAS. The library is built against the public specifications cited in the standards coverage table above; we acknowledge the standards organisations (ISO/IEC, ITU-T, IETF, ETSI, W3C, CTA, SCTE, DASH-IF, AOMedia) whose specifications make interoperable streaming media possible.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatelier-socle%2Fswift-cmaf-kit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatelier-socle%2Fswift-cmaf-kit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatelier-socle%2Fswift-cmaf-kit/lists"}