Here is my scenario:
If you need do this without ffmpeg on Android device:
Start from : https://github.com/google/grafika
The answer on your question between Play video (PlayMovieActivity.java) and Record Gl App (RecordFBOActivity.java) examples.
Steps:
Setup mInputWindowSurface as Video Encoder Input Surface.
Decode frame from video stream using MoviePlayer as video (external) texture.
Draw this video texture on Surface.
Draw watermark on the same Surface over video texture.
Notify MediaCodec that surface ready for encoding:
mVideoEncoder.frameAvailableSoon();
mInputWindowSurface.setPresentationTime(timeStampNanos);
and then goto Step 2.
Don't forget to adjust speed of decoding. Just remove SpeedControlCallback which in example set to decode 60 FPS video.
Advantages of this way:
Media Codec use hardware decoder/encoder for video processing.
You can change bit rate of result video.