[vlc-commits] CrystalHD: Deinterlacing support

Jean-Baptiste Kempf git at videolan.org
Mon Mar 21 23:52:44 CET 2011


vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Mon Mar 21 22:59:24 2011 +0100| [b3452df07fac7ae4f7f8a45466f59e9d172d483a] | committer: Jean-Baptiste Kempf

CrystalHD: Deinterlacing support

Without adding a memcpy :)

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b3452df07fac7ae4f7f8a45466f59e9d172d483a
---

 modules/codec/crystalhd.c |   34 ++++++++++++++++++++++++++++------
 1 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/modules/codec/crystalhd.c b/modules/codec/crystalhd.c
index b70f067..39c7ab3 100644
--- a/modules/codec/crystalhd.c
+++ b/modules/codec/crystalhd.c
@@ -172,6 +172,7 @@ static int OpenDecoder( vlc_object_t *p_this )
     p_sys->i_nal_size     = 4; // assume 4 byte start codes
     p_sys->i_sps_pps_size = 0;
     p_sys->p_sps_pps_buf  = NULL;
+    p_dec->p_sys->p_pic   = NULL;
 
     /* Win32 code *
      * We cannot link and ship BCM dll, even with LGPL license (too big)
@@ -374,16 +375,33 @@ static BC_STATUS ourCallback(void *shnd, uint32_t width, uint32_t height, uint32
 {
     decoder_t *p_dec          = (decoder_t *)shnd;
     BC_DTS_PROC_OUT *proc_out = p_dec->p_sys->proc_out;
+    BC_DTS_PROC_OUT *proc_in  = (BC_DTS_PROC_OUT*)pOut;
 
     /* Direct Rendering */
-    picture_t *p_pic     = p_dec->p_sys->p_pic = decoder_NewPicture( p_dec );
+    /* Do not allocate for the second-field in the pair, in interlaced */
+    if( !(proc_in->PicInfo.flags & VDEC_FLAG_INTERLACED_SRC) ||
+        !(proc_in->PicInfo.flags & VDEC_FLAG_FIELDPAIR) )
+        p_dec->p_sys->p_pic = decoder_NewPicture( p_dec );
+
+    /* */
+    picture_t *p_pic = p_dec->p_sys->p_pic;
     if( !p_pic )
         return BC_STS_ERROR;
 
-    proc_out->Ybuff      = p_pic->p[0].p_pixels;
-    proc_out->YbuffSz    = p_dec->fmt_out.video.i_width * p_dec->fmt_out.video.i_height  / 2;
-    proc_out->StrideSz   = p_pic->p[0].i_pitch /2 - p_dec->fmt_out.video.i_width;
-    proc_out->PoutFlags |= BC_POUT_FLAGS_STRIDE; /* Trust Stride info */
+    /* Interlacing */
+    p_pic->b_progressive     = !(proc_in->PicInfo.flags & VDEC_FLAG_INTERLACED_SRC);
+    p_pic->b_top_field_first = !(proc_in->PicInfo.flags & VDEC_FLAG_BOTTOM_FIRST);
+    p_pic->i_nb_fields       = p_pic->b_progressive? 1: 2;
+
+    /* Filling out the struct */
+    proc_out->Ybuff      = !(proc_in->PicInfo.flags & VDEC_FLAG_FIELDPAIR) ?
+                             &p_pic->p[0].p_pixels[0] :
+                             &p_pic->p[0].p_pixels[p_pic->p[0].i_pitch];
+    proc_out->YbuffSz    = 2 * p_pic->p[0].i_pitch;
+    proc_out->StrideSz   = (proc_in->PicInfo.flags & VDEC_FLAG_INTERLACED_SRC)?
+                            2 * (p_pic->p[0].i_pitch/2) - p_dec->fmt_out.video.i_width:
+                            p_pic->p[0].i_pitch/2 - p_dec->fmt_out.video.i_width;
+    proc_out->PoutFlags |= BC_POUT_FLAGS_STRIDE;              /* Trust Stride info */
 
     return BC_STS_SUCCESS;
 }
@@ -443,7 +461,6 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     proc_out.AppCallBack    = ourCallback;
     proc_out.hnd            = p_dec;
     p_sys->proc_out         = &proc_out;
-    p_sys->p_pic            = NULL;
 
 #ifdef DEBUG_CRYSTALHD
     msg_Dbg( p_dec, "%i, %i",  p_dec->fmt_out.video.i_width, p_dec->fmt_out.video.i_height );
@@ -469,6 +486,11 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             if( !p_pic )
                 break;
 
+            /* In interlaced mode, do not push the first field in the pipeline */
+            if( (proc_out.PicInfo.flags & VDEC_FLAG_INTERLACED_SRC) &&
+               !(proc_out.PicInfo.flags & VDEC_FLAG_FIELDPAIR) )
+                return NULL;
+
             //  crystal_CopyPicture( p_pic, &proc_out );
             p_pic->date = proc_out.PicInfo.timeStamp > 0 ? FROM_BC_PTS(proc_out.PicInfo.timeStamp) : VLC_TS_INVALID;
             //p_pic->date += 100 * 1000;



More information about the vlc-commits mailing list