I'm using ffmpeg-3.2.4-win32, static and dev versions from zeranoe page, to decode some h264 mp4 videos I have created with x264 encoder. The videos have lots of static zones, 2d videogame type.
When I decode their frames using either ffmpeg.exe or avcodec_decode_video2() API function, I get poor chroma resolution, blocky and quite visible in the static zones of the video (edit: avcodec_decode_video2() returns correct YUV, the problem is the YUV->RGB conversion, see my own answer below).
With ffmpeg.exe I get poor chroma only if I output the frames to png, but if I output them to jpg, chroma seems much better (edit: this is due to poor YUV to RGB conversion of ffmpeg's sws_scale()).
Here is an example of the same frame obtained from a mp4 video created with a static image, the output frame is zoomed in to clearly see the effect.
https://drive.google.com/file/d/0B5KI1D-N1kHpV3lGaERJRjNkcms/view
1: Original frame before compressing.
2: YUV 4:2:0 conversion before compressing
3: Video output from MPC HC + LAV decoder. This is YUV decoded output.
4: Video frames decoded with ffmpeg.exe to jpeg, quality is mostly ok, just some jpeg macroblocking is visible.
5: Video frames decoded with ffmpeg.exe to png, very blocky chroma. This is RGB output, using avcodec_decode_video2() and sws_scale() conversion to RGB produces the same blocky chroma.
The command lines for decoding the frames to jpg and png are these:
ffmpeg -i testcase.mp4 -vframes 5 -qscale:v 2 output%03d.jpg
ffmpeg -i testcase.mp4 -vframes 5 output%03d.png
You can download mp4 and bat files that showcase the effect here:
https://drive.google.com/drive/folders/0B5KI1D-N1kHpcUdGd2IyM2pXMTg
I have tried with ffmpeg 3.2, but same thing happens.