VideoRoutingPolicy routes H.264 to software when the container or avcC declares a field order, so DeinterlaceFilter can run — tvOS AVPlayer will not deinterlace, and 1080i broadcast content otherwise combs. The rule is right, and its comment prices the false positive honestly: "A false positive only costs an unnecessary SW decode (deint=interlaced passes progressive frames through untouched), never a wrong deinterlace."
There is a systematic false positive, and #220 has changed what it costs.
PsF
Blu-ray has no 1080p25, so 25 fps European content is mastered as 1080i25: progressive pictures in interlaced carriage. The container and SPS declare it interlaced and they are not lying about the encoding — but the pictures are progressive, and nothing needs deinterlacing.
On a 46-minute 1080i25 H.264 episode from a European Blu-ray remux (DTS-HD MA 5.1, one PGS track):
ffprobe stream: field_order=tt container and SPS declare TFF interlaced
ffprobe frames: interlaced_frame=0 every sampled frame, I/P and B
MediaInfo agrees with the container — Scan type: MBAFF / InterleavedFields / TFF, SEI pic_struct=3 — while every decoded frame comes out with equal field POCs and unflagged. Both tools are right at different layers.
The engine's own behaviour confirms it end to end. SoftwareVideoDecoder engages the filter only on flagged frames, so the graph never configures: logs from these sessions carry only the 64×64 warm-up probe and never a frame-size [Deinterlace] engaged line. The picture is correct, and the graph is right not to build. The content is decoded in software, and then nothing deinterlaces it.
What changed
Until now the cost of this false positive was one unnecessary software decode. #220 added a second cost: the software path with a subtitle track selected is where that issue lives, so the class of content that trips this rule for no benefit is also the class exposed to it. Independently, software-decoding 1080i25 H.264 alongside DTS-HD MA forgoes VideoToolbox and spends power and thermal headroom for a filter that never runs.
Proposal
The policy already has a hierarchy in which a concrete frames-analyzed PROGRESSIVE probe wins over the declared field order. Extending that probe to recognise PsF would take this class off the software path: decode a small sample and treat equal field POCs, or AV_FRAME_FLAG_INTERLACED unset across the sample, as progressive regardless of what the container declares. AVPlayer decodes MBAFF H.264 natively, and PsF needs no deinterlacing, so the result should be visually identical to what the software path produces today.
This is not a workaround for #220 and should not be treated as one. Genuinely interlaced content still routes to software with a subtitle track available — MPEG-2 576i here does build the graph at frame size — so whatever is eating the heap stays reachable regardless. The two are independent; I'd rather have both.
VideoRoutingPolicyroutes H.264 to software when the container or avcC declares a field order, soDeinterlaceFiltercan run — tvOS AVPlayer will not deinterlace, and 1080i broadcast content otherwise combs. The rule is right, and its comment prices the false positive honestly: "A false positive only costs an unnecessary SW decode (deint=interlaced passes progressive frames through untouched), never a wrong deinterlace."There is a systematic false positive, and #220 has changed what it costs.
PsF
Blu-ray has no 1080p25, so 25 fps European content is mastered as 1080i25: progressive pictures in interlaced carriage. The container and SPS declare it interlaced and they are not lying about the encoding — but the pictures are progressive, and nothing needs deinterlacing.
On a 46-minute 1080i25 H.264 episode from a European Blu-ray remux (DTS-HD MA 5.1, one PGS track):
MediaInfo agrees with the container —
Scan type: MBAFF / InterleavedFields / TFF, SEIpic_struct=3— while every decoded frame comes out with equal field POCs and unflagged. Both tools are right at different layers.The engine's own behaviour confirms it end to end.
SoftwareVideoDecoderengages the filter only on flagged frames, so the graph never configures: logs from these sessions carry only the 64×64 warm-up probe and never a frame-size[Deinterlace] engagedline. The picture is correct, and the graph is right not to build. The content is decoded in software, and then nothing deinterlaces it.What changed
Until now the cost of this false positive was one unnecessary software decode. #220 added a second cost: the software path with a subtitle track selected is where that issue lives, so the class of content that trips this rule for no benefit is also the class exposed to it. Independently, software-decoding 1080i25 H.264 alongside DTS-HD MA forgoes VideoToolbox and spends power and thermal headroom for a filter that never runs.
Proposal
The policy already has a hierarchy in which a concrete frames-analyzed PROGRESSIVE probe wins over the declared field order. Extending that probe to recognise PsF would take this class off the software path: decode a small sample and treat equal field POCs, or
AV_FRAME_FLAG_INTERLACEDunset across the sample, as progressive regardless of what the container declares. AVPlayer decodes MBAFF H.264 natively, and PsF needs no deinterlacing, so the result should be visually identical to what the software path produces today.This is not a workaround for #220 and should not be treated as one. Genuinely interlaced content still routes to software with a subtitle track available — MPEG-2 576i here does build the graph at frame size — so whatever is eating the heap stays reachable regardless. The two are independent; I'd rather have both.