diff --git a/media/gpu/windows/d3d12_video_encode_h264_delegate.cc b/media/gpu/windows/d3d12_video_encode_h264_delegate.cc --- a/media/gpu/windows/d3d12_video_encode_h264_delegate.cc +++ b/media/gpu/windows/d3d12_video_encode_h264_delegate.cc @@ -648,7 +648,13 @@ EncoderStatus D3D12VideoEncodeH264Delegate::InitializeVideoEncoder( "support manual reference control, got %u", picture_control_support_h264.MaxDPBCapacity)}; } - max_num_ref_frames_ = picture_control_support_h264.MaxDPBCapacity; + // Manual reference control is implemented via H.264 long-term references, + // so the number of usable slots must not exceed the driver's + // MaxLongTermReferences. Reserve one extra DPB slot for frame_num gap + // handling (matches the SVC path), but never exceed MaxDPBCapacity. + max_num_ref_frames_ = std::min( + picture_control_support_h264.MaxDPBCapacity, + picture_control_support_h264.MaxLongTermReferences + 1); } if ((config.bitrate.mode() == Bitrate::Mode::kConstant ||