DashMediaIo
One representation's segments read as a single forward stream (the adaptive layer's first tier): the initialization segment when one exists, then every media segment in plan order, byte-concatenated. FFmpeg demuxes the join exactly as it demuxes a file, which is the media3 shape chosen here: Kotlin segment logic FEEDING the decoder, never FFmpeg's own dash demuxer.
Forward-only and unsized on purpose: a segment plan's total byte size is unknown until the last fetch, and lying about seekability would let the demuxer walk into a wall. Seeking a DASH presentation properly means segment arithmetic at the PLAYER level; this tier plays.
fetch is the caller's own, so DashUrlPolicy does not reach it: what it requests and which redirects it follows are the caller's to judge. Dash.mediaItemFor builds one that applies the policy.