Proxies: FFmpeg proxy builder wasn't taking image quality into account at all
authorSergey Sharybin <sergey.vfx@gmail.com>
Sun, 19 Feb 2012 08:02:05 +0000 (08:02 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sun, 19 Feb 2012 08:02:05 +0000 (08:02 +0000)
which made it using default quality settings which are really bad for camera
tracking (and perhaps for CSE too).

haven't found Jpeg quality setting for FFmpeg which will behave in the same way
as quality setting for image sequence, but seems that mapping image quality
from 1..100 UI range to 31..1 range of qmin/qmax gives expected result.

--
svn merge -r44228:44230 ^/branches/soc-2011-tomato

source/blender/imbuf/intern/indexer.c

index e1481d2a08feb37fc49c5809b28916a804a733f6..ade63aa1e9c43c217d4e0ff400ff3d7ad0c6bb56 100644 (file)
@@ -459,12 +459,13 @@ static int round_up(int x, int mod)
 static struct proxy_output_ctx * alloc_proxy_output_ffmpeg(
        struct anim * anim,
        AVStream * st, int proxy_size, int width, int height,
-       int UNUSED(quality))
+       int quality)
 {
        struct proxy_output_ctx * rv = MEM_callocN(
                sizeof(struct proxy_output_ctx), "alloc_proxy_output");
        
        char fname[FILE_MAX];
+       int ffmpeg_quality;
 
        // JPEG requires this
        width = round_up(width, 8);
@@ -514,6 +515,12 @@ static struct proxy_output_ctx * alloc_proxy_output_ffmpeg(
        rv->c->time_base.num = 1;
        rv->st->time_base = rv->c->time_base;
 
+       /* there's no  way to set JPEG quality in the same way as in AVI JPEG and image sequence,
+        * but this seems to be giving expected quality result */
+       ffmpeg_quality = (int)(1.0f + 30.0f * (1.0f - (float)quality / 100.0f) + 0.5f);
+       av_set_int(rv->c, "qmin", ffmpeg_quality);
+       av_set_int(rv->c, "qmax", ffmpeg_quality);
+
        if (rv->of->flags & AVFMT_GLOBALHEADER) {
                rv->c->flags |= CODEC_FLAG_GLOBAL_HEADER;
        }