Il problema è che il suo file è in formato planare, per cui prima ci sono tutti i valori Y campionati a 8 bit, poi tutti gli U e poi i V a 2 bit; non garantisco la correttezza di queste informazioni, in particolare per quanto riguarda il sottocampionamento di U e V e il loro ordine, la documentazione non è chiarissima.

Per inciso, potresti ottimizzare un pelo quel codice usando gli shift invece delle divisioni per potenze di due e riducendo il numero di variabili (per quanto è probabile che già ci pensi il compilatore). Potresti anche sostituire il confronto con 255 con un & (potenzialmente più veloce):
codice:
if(Y And Not 255)
    Y = 255
. Tutti miglioramenti marginali, ma che, se il codice deve processare frame in realtime, possono aiutare.