Thank you all for the ansers. I am a guy who went through a lot of different approaches.
I wrote my own Videoplayer using openGL+FFMPEG that could play mp4 and decrypt each frame in the GPU using shaders. I also experimented with another possible solutions, such as streaming from a webserver using VLC. (VLC offers some kind of encryption/decryption when dealing with streams), and yada yada yada.
Also one solution was to use 4 mediaelements(WPF) and the actual video was virtually split into 4 areas and each area was rotated so the video was not viewable. Once you loaded the video into 4 mediaelements, you could map out which part you wanted to show and also rotate it back. But in all honesty, MediaElement is bad.
However I ended up exactly with what RomanR said. I built DirectShow graph using mp4splitter, ffdshow, videorenderer and I modified mp4splitter sourcefilter. The reading happens in BaseSplitter/AsyncReader.cpp (just modify SyncRead function) that mp4splitter uses.
If you would like to implement it yourself, just use MPC-HC project and modify the filters as you like. It took me some time to get around the DirectShow concept, but once you understand it, it becomes great weapon.
Decrypt each frame on the GPU! WOW. How does one frame look before it's GPU decrypted?
Since each frame was encrypted, mp4 wasn't so efficient anymore, since it could not interpolate anymore between frames, thus the filesize doubled and frames per second decoded decreased. As for the frame, I used simple technique of swaping pixel nibbles. So 1111 0000 would become 0000 1111. You could still see actual video but it was really messed up, color's didnt make sense. It seemed like a "color-filter" was applied. In order to actually make it unviewable, you gotta use some kind of stream based encryption and encrypt considering also position(you can read that in GPU afaik).