1. Watermarking.
Depending on what your application does, server load, and many other variables, either resize and add the watermark when the file is uploaded prior to saving it in the upload directory in the web root, or save it outside of the web root, and add an image retrieval function/class to display the images.
For video manipulation, try FFMPEG.
2. Classes
Classes and OOP typically make code maintainablity, team development, and reusabilty much easier than procedural coding. Yes, you can build any project without using classes and have it function the same way as if you had used classes, and depending on the project and what you're familiar with, do it much faster without classes. However, as you need to add functionality or have other developers working on the script, it is a lot easier to keep track of what's going on if things are divided up into objects.
3. Thumbnailing
FFMPEG again
4. Security
This is another aspect where classes and OOP comes into play. If you make a data sanitization class, you only have one place to look at for common security holes as far as SQL injections or XSS comes into play. There are a few programs and services that will check for these issues, but if all of your data is being cleaned by a single class, this wouldn't be too much of a concern. The much larger potential security issues with an app like you described are going to be in your file upload and handling, and there isn't really any automated tests to do that. A good article about some common issues are at http://www.scanit.be/uploads/php-file-upload.pdf.
Good luck with it, and remember when you're architecting larger projects like this, designing the code to be easy to update and modify is just as important getting it to work.