A common C pattern here it to return a new webvtt_node* pointer with the initialized node. Kind of like a copy constructor that takes ownership of the passed-in object. See realloc, etc. The drawback is people not being rigorous about using only the returned pointer when the common pattern is to modify the contents of the argument instead.

Because of that I don't really like this call; it looks like it's initializing an elsewhere-allocated structure, but what it's really doing is freeing one and copying another. For the node to act like a proper box you should really release the contents and _copy_ empty_node. That's more like webvtt_reset_node(). Is this just a convenience function for the C++ api, or is there a way to have it make sense at the level of the C api?