[FFmpeg-devel] [PATCHv2] vf_scale: Use correct chroma position in YUV420P interlaced conversions

Kieran Kunhya kierank at obe.tv
Wed Dec 24 16:10:56 CET 2014


Fixed wrong chroma line use
---
 libavfilter/vf_scale.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
index 64b88c2..9189103 100644
--- a/libavfilter/vf_scale.c
+++ b/libavfilter/vf_scale.c
@@ -373,6 +373,13 @@ static int config_props(AVFilterLink *outlink)
             av_opt_set_int(*s, "dst_format", outfmt, 0);
             av_opt_set_int(*s, "sws_flags", scale->flags, 0);
 
+            /* Override interlaced YUV420P settings to have the correct (MPEG-2) chroma positions
+             * MPEG-2 chroma positions are used by convention
+             * Set the context up for tff */
+            if (i && scale->interlaced && inlink->format == AV_PIX_FMT_YUV420P){
+                scale->in_v_chr_pos = (i == 1) ? 64 : -64;
+            }
+
             av_opt_set_int(*s, "src_h_chr_pos", scale->in_h_chr_pos, 0);
             av_opt_set_int(*s, "src_v_chr_pos", scale->in_v_chr_pos, 0);
             av_opt_set_int(*s, "dst_h_chr_pos", scale->out_h_chr_pos, 0);
@@ -520,8 +527,8 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
               INT_MAX);
 
     if(scale->interlaced>0 || (scale->interlaced<0 && in->interlaced_frame)){
-        scale_slice(link, out, in, scale->isws[0], 0, (link->h+1)/2, 2, 0);
-        scale_slice(link, out, in, scale->isws[1], 0,  link->h   /2, 2, 1);
+        scale_slice(link, out, in, scale->isws[!in->top_field_first], 0, (link->h+1)/2, 2, 0);
+        scale_slice(link, out, in, scale->isws[in->top_field_first],  0,  link->h   /2, 2, 1);
     }else{
         scale_slice(link, out, in, scale->sws, 0, link->h, 1, 0);
     }
-- 
1.9.1



More information about the ffmpeg-devel mailing list