ffmpeg with wild video formats:
For your first method, you can speed it up by a shared bitmap and the other resources, that will eliminate any memory allocation and speed it up a lot.
As for rendering FFmpeg results to a GLSurfaceView, you should look here:
(I have used both JJmpeg and JavaCV)
Most of the gems are here: (GLESVideoRenderer.onDrawFrame method) https://code.google.com/p/jjmpeg/source/browse/branches/ffmpeg-0.10-android/jjmpeg/src/au/notzed/jjmpeg/mediaplayer/GLESVideoRenderer.java
Basic idea is to load the frames into 2D texture array, and then draw it.
You can modify the FFmpegFrameGrabber to a renderer for the GLSurfaceView, framerates will vary between devices.
If you know the video format:
What you really should do since you are already on Android 4.2.2, is to use MediaCodec from SDK and push the frames directly onto a surface.