A few different ways to do it with ffmpeg from the command line - searching for "ffmpeg add watermark" gives a bunch of examples to work with. Decide if you want it to be a logo from an image, or just text from a font and there are lots of options - including transparency / alpha channel blending into the video, or you can give it an embossed look on the video based on your image/font by taking the detected edges on the overlay and blending it.
By default it does it all in software, but depending on the hardware you have to work with and what GPU support is compiled in you can have the gpu assist in decode/encode and possibly the filter to add the overlay. If GPU support helps or not in the grand scheme depends on the video encoding and resolution/bitrate, and the quality you are trying to retain. If processing time isn't a limiting factor, doing it all in software will often give a more pleasing result but YMMV based on the type of content and motion in the scene.
Python or other language wrappers around the core libraries that ffmpeg uses or ffmpeg's internal graph do exist, but unless you are trying to do additional processing on the video / audio in code probably faster to just figure it out on the command line. If you want to do more serious image processing there is OpenCV and other ML / image processing frameworks to work in.
With everything ffmpeg / libav / vlc related, try and get the most recent versions of everything you can to assist in features and speed. The complexity of all the component libraries that each tool uses + the internals of the tools themselves mean there is a lot of development going on for all the pieces and the whole ends up being a fast moving target. If not a one-off job, it can be helpful to compile the whole stack from scratch to get the most recent versions of everything.