CopyBlocker
One reason an export re-encodes rather than copying its streams across.
A copy is near-instant and lossless, so an export that misses it is worth explaining. Every member names one thing the caller can drop to get the copy back, and ExportPlan.copyBlockedBy lists the ones that applied.
None of these is an Adjustment: the caller asked for an output and got exactly that output, so nothing was changed behind their back and ExportSpec.strict has nothing to refuse.
Entries
More than one track, whose audio has to be mixed.
More than one clip, which has to be joined.
Composition-level effects, which have to be rendered.
Track-level effects, which have to be rendered.
Clip-level effects, which have to be rendered.
ExportSpec.frameRate names a rate, which only an encoder can deliver.
ExportSpec.videoCodec names a codec rather than leaving it to the source's own. Neither VideoCodec.Auto nor VideoCodec.MatchSource blocks a copy.
ExportSpec.audioCodec names a codec rather than leaving it to the source's own.
ExportSpec.heightPx names a height below the source's own, which only an encoder can deliver. A height at or above it keeps the source's frame and blocks nothing.
ExportSpec.bitrate names a rate or ExportSpec.quality names a tier, which only an encoder can deliver.
Geometry moves the frame away from the source's, whether from a target height or an effect.
EditComposition.audio leaves a stream the source carries out of the file, the way dev.jordond.filmstrip.edit.AudioSpec.Remove and dev.jordond.filmstrip.edit.AudioSpec.AudioOnly do.
The track is held off until after the composition starts, so the output opens on a gap.
The track contributes only audio or only video, so a stream the source carries is dropped.
The clip's audio level is not unity, so the samples have to be scaled.
The track's audio level is not unity, so the samples have to be scaled.
The composition's audio level is not unity, so the samples have to be scaled. That is dev.jordond.filmstrip.edit.AudioSpec.Mute, or a volume other than one.
The clip's speed is not one, so its frames have to be retimed and its audio stretched.
The clip is trimmed and no sync sample sits within Clip.snapWithin of the cut, so reaching it means decoding.
The clip ends before its source does and the source's video packets carry no presentation times, the way an AVI with B-frames lists them, so a copy has no frame it knows to stop on. Running the clip to the source's end keeps the copy.
The muxer will not take this source's streams without re-encoding them.
The source's pixels are not square and the backend cannot copy such a source as it is. On Android, media3's Transformer re-encodes it to square pixels or writes it across unchecked, so a copy never runs there.
The source's codecs have no VideoCodec or AudioCodec member to name them by, so a copy could not report what it wrote.
This backend has no stream copy at all.
The grade has to come down to SDR, which only a decode and re-encode can do.
Properties
Functions
Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
Returns an array containing the constants of this enum type, in the order they're declared.