Revision: 15314
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15314
Author:   schlaile
Date:     2008-06-22 22:39:41 +0200 (Sun, 22 Jun 2008)

Log Message:
-----------
== FFMPEG ==

Added serious interlacing to movies opened using ffmpeg.
(Other video decoders to be done)

Rational: deinterlacing, if done seriously _has_ to be done
in YUV-space. Since internal interface first converts data
to RGB we are pretty much lost (and fall back to IMB_filtery
in that case).

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/IMB_imbuf_types.h
    trunk/blender/source/blender/imbuf/intern/anim.c
    trunk/blender/source/blender/src/buttons_scene.c
    trunk/blender/source/blender/src/sequence.c

Modified: trunk/blender/source/blender/imbuf/IMB_imbuf_types.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_imbuf_types.h        2008-06-22 
20:24:27 UTC (rev 15313)
+++ trunk/blender/source/blender/imbuf/IMB_imbuf_types.h        2008-06-22 
20:39:41 UTC (rev 15314)
@@ -149,6 +149,7 @@
 #define IB_zbuffloat   (1 << 16)
 #define IB_multilayer  (1 << 17)
 #define IB_imginfo             (1 << 18)
+#define IB_animdeinterlace      (1 << 19)
 
 /*
  * The bit flag is stored in the ImBuf.ftype variable.

Modified: trunk/blender/source/blender/imbuf/intern/anim.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/anim.c    2008-06-22 20:24:27 UTC 
(rev 15313)
+++ trunk/blender/source/blender/imbuf/intern/anim.c    2008-06-22 20:39:41 UTC 
(rev 15314)
@@ -638,6 +638,7 @@
        AVPacket packet;
        int64_t pts_to_search = 0;
        int pos_found = 1;
+       int filter_y = 0;
 
        if (anim == 0) return (0);
 
@@ -722,6 +723,18 @@
                        } 
 
                        if(frameFinished && pos_found == 1) {
+                               if (anim->ib_flags & IB_animdeinterlace) {
+                                       if (avpicture_deinterlace(
+                                                   anim->pFrame,
+                                                   anim->pFrame,
+                                                   anim->pCodecCtx->pix_fmt,
+                                                   anim->pCodecCtx->width,
+                                                   anim->pCodecCtx->height)
+                                           < 0) {
+                                               filter_y = 1;
+                                       }
+                               }
+
                                if (G.order == B_ENDIAN) {
                                        int * dstStride 
                                                = anim->pFrameRGB->linesize;
@@ -823,6 +836,10 @@
                av_free_packet(&packet);
        }
 
+       if (filter_y && ibuf) {
+               IMB_filtery(ibuf);
+       }
+
        return(ibuf);
 }
 
@@ -983,6 +1000,7 @@
        char head[256], tail[256];
        unsigned short digits;
        int pic;
+       int filter_y = (anim->ib_flags & IB_animdeinterlace);
 
        if (anim == NULL) return(0);
 
@@ -1040,6 +1058,7 @@
        case ANIM_FFMPEG:
                ibuf = ffmpeg_fetchibuf(anim, position);
                if (ibuf) anim->curposition = position;
+               filter_y = 0; /* done internally */
                break;
 #endif
 #ifdef WITH_REDCODE
@@ -1052,6 +1071,7 @@
 
        if (ibuf) {
                if (anim->ib_flags & IB_ttob) IMB_flipy(ibuf);
+               if (filter_y) IMB_filtery(ibuf);
                sprintf(ibuf->name, "%s.%04d", anim->name, anim->curposition + 
1);
                
        }

Modified: trunk/blender/source/blender/src/buttons_scene.c
===================================================================
--- trunk/blender/source/blender/src/buttons_scene.c    2008-06-22 20:24:27 UTC 
(rev 15313)
+++ trunk/blender/source/blender/src/buttons_scene.c    2008-06-22 20:39:41 UTC 
(rev 15314)
@@ -900,7 +900,7 @@
                     "Convert input to float data");
 
        uiDefButBitI(block, TOG, SEQ_FILTERY, 
-                    B_SEQ_BUT_RELOAD, "FilterY",       
+                    B_SEQ_BUT_RELOAD_FILE, "FilterY",  
                     170,110,80,19, &last_seq->flag, 
                     0.0, 21.0, 100, 0, 
                     "For video movies to remove fields");

Modified: trunk/blender/source/blender/src/sequence.c
===================================================================
--- trunk/blender/source/blender/src/sequence.c 2008-06-22 20:24:27 UTC (rev 
15313)
+++ trunk/blender/source/blender/src/sequence.c 2008-06-22 20:39:41 UTC (rev 
15314)
@@ -445,7 +445,10 @@
                seq->strip->len = seq->len;
        } else if (seq->type == SEQ_MOVIE) {
                if(seq->anim) IMB_free_anim(seq->anim);
-               seq->anim = openanim(str, IB_rect);
+               seq->anim = openanim(
+                       str, IB_rect | 
+                       ((seq->flag & SEQ_FILTERY) 
+                        ? IB_animdeinterlace : 0));
 
                if (!seq->anim) {
                        return;
@@ -1445,7 +1448,7 @@
        seq->strip->orx= se->ibuf->x;
        seq->strip->ory= se->ibuf->y;
 
-       if(seq->flag & SEQ_FILTERY) {
+       if((seq->flag & SEQ_FILTERY) && seq->type != SEQ_MOVIE) {
                IMB_filtery(se->ibuf);
        }
 
@@ -1772,8 +1775,11 @@
                                        BLI_join_dirfile(name, seq->strip->dir, 
seq->strip->stripdata->name);
                                        BLI_convertstringcode(name, G.sce);
                                        BLI_convertstringframe(name, 
G.scene->r.cfra);
-                               
-                                       seq->anim = openanim(name, IB_rect);
+                                       
+                                       seq->anim = openanim(
+                                               name, IB_rect | 
+                                               ((seq->flag & SEQ_FILTERY) 
+                                                ? IB_animdeinterlace : 0));
                                }
                                if(seq->anim) {
                                        IMB_anim_set_preseek(seq->anim, 
seq->anim_preseek);


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to