]> git.sesse.net Git - vlc/commitdiff
Corrections de bugs dans le motion.
authorChristophe Massiot <massiot@videolan.org>
Wed, 19 Jan 2000 13:11:36 +0000 (13:11 +0000)
committerChristophe Massiot <massiot@videolan.org>
Wed, 19 Jan 2000 13:11:36 +0000 (13:11 +0000)
include/vpar_blocks.h
include/vpar_headers.h
src/video_decoder/vdec_motion.c
src/video_parser/vpar_blocks.c
src/video_parser/vpar_headers.c

index 0d42aeaac1db1a4c9c5fdceefc27f0715f651bc4..05a8cb023e9c763e56be58f23366e612c3f0c01a 100644 (file)
@@ -45,6 +45,9 @@ typedef struct macroblock_s
     int                     ppi_field_select[2][2];
     int                     pppi_motion_vectors[2][2][2];
     int                     pi_dm_vector[2];
+    int                     i_motion_l_y;
+    int                     i_motion_c_y;
+    boolean_t               b_motion_field;
   
     /* AddBlock information */
     f_addb_t                pf_addb[12];      /* pointer to the Add function */
index 89683811446734d895f847b09d650ff97f194eb3..00d32973f70648c4c7014ae07631d1d9d6e0fbe3 100644 (file)
@@ -98,6 +98,7 @@ typedef struct picture_parsing_s
     /* Relative to the current field */
     int                 i_coding_type, i_structure;
     boolean_t           b_frame_structure;
+    boolean_t           b_motion_field;
     f_macroblock_type_t pf_macroblock_type;
 
     boolean_t           b_error;
index 5d0720fcba63b300a7131cbc1fb0d047f714dd48..91b01a3ce1445c40475fdb078826cb567ccd811c 100644 (file)
@@ -254,17 +254,14 @@ void vdec_MotionFieldField( macroblock_t * p_mb )
 
     args.i_height = 16;
     args.b_average = 0;
-    args.b_dest_field = 0;
+    args.b_dest_field = p_mb->b_motion_field;
     args.i_offset = 0;
 
     if( p_mb->i_mb_type & MB_MOTION_FORWARD )
     {
-        boolean_t   b_current_field;
-        
-        b_current_field = ( p_mb->i_structure == BOTTOM_FIELD );
         if( p_mb->b_P_coding_type
              && (p_mb->i_current_structure == FRAME_STRUCTURE)
-             && (b_current_field != p_mb->ppi_field_select[0][0]) )
+             && (p_mb->b_motion_field != p_mb->ppi_field_select[0][0]) )
             args.p_source = p_mb->p_picture;
         else
             args.p_source = p_mb->p_forward;
@@ -296,17 +293,14 @@ void vdec_MotionField16x8( macroblock_t * p_mb )
 
     args.i_height = 8;
     args.b_average = 0;
-    args.b_dest_field = 0;
+    args.b_dest_field = p_mb->b_motion_field;
     args.i_offset = 0;
 
     if( p_mb->i_mb_type & MB_MOTION_FORWARD )
     {
-        boolean_t   b_current_field;
-
-        b_current_field = ( p_mb->i_structure == BOTTOM_FIELD );
         if( p_mb->b_P_coding_type
              && (p_mb->i_current_structure == FRAME_STRUCTURE)
-             && (b_current_field != p_mb->ppi_field_select[0][0]) )
+             && (p_mb->b_motion_field != p_mb->ppi_field_select[0][0]) )
             args.p_source = p_mb->p_picture;
         else
             args.p_source = p_mb->p_forward;
@@ -317,7 +311,7 @@ void vdec_MotionField16x8( macroblock_t * p_mb )
 
         if( p_mb->b_P_coding_type
              && (p_mb->i_current_structure == FRAME_STRUCTURE)
-             && (b_current_field != p_mb->ppi_field_select[1][0]) )
+             && (p_mb->b_motion_field != p_mb->ppi_field_select[1][0]) )
             args.p_source = p_mb->p_picture;
         else
             args.p_source = p_mb->p_forward;
@@ -406,18 +400,14 @@ void vdec_MotionFrameField( macroblock_t * p_mb )
 
     if( p_mb->i_mb_type & MB_MOTION_FORWARD )
     {
-        args.p_source = p_mb->p_forward;
-#
         args.b_source_field = p_mb->ppi_field_select[0][0];
         args.b_dest_field = 0;
         args.i_mv_x = p_mb->pppi_motion_vectors[0][0][0];
         args.i_mv_y = p_mb->pppi_motion_vectors[0][0][1] >> 1;
-//        p_mb->pf_chroma_motion( p_mb, &args );
+        p_mb->pf_chroma_motion( p_mb, &args );
 
-p_mb->i_l_y ++;
-p_mb->i_c_y ++;
-        args.b_source_field = p_mb->ppi_field_select[1][0]-1;
-        //args.b_dest_field = 1;
+        args.b_source_field = p_mb->ppi_field_select[1][0];
+        args.b_dest_field = 1;
         args.i_mv_x = p_mb->pppi_motion_vectors[1][0][0];
         args.i_mv_y = p_mb->pppi_motion_vectors[1][0][1] >> 1;
         p_mb->pf_chroma_motion( p_mb, &args );
@@ -463,14 +453,15 @@ void vdec_Motion420( macroblock_t * p_mb, motion_arg_t * p_motion )
     MotionComponent( /* source */
                      p_motion->p_source->p_y
                        + (p_mb->i_l_x + (p_motion->i_mv_x >> 1))
-                       + ((p_mb->i_l_y + p_motion->i_offset
-                          + (p_motion->i_mv_y >> 1))
-                          + (p_motion->b_source_field - p_motion->b_dest_field))
+                       + (p_mb->i_motion_l_y + p_motion->i_offset
+                          + (p_motion->i_mv_y >> 1)
+                          + p_motion->b_source_field)
                          * p_mb->p_picture->i_width,
                      /* destination */
                      p_mb->p_picture->p_y
                        + (p_mb->i_l_x)
-                       + (p_mb->i_l_y) * p_mb->p_picture->i_width,
+                       + (p_mb->i_motion_l_y + p_motion->b_dest_field)
+                         * p_mb->p_picture->i_width,
                      /* prediction width and height */
                      16, p_motion->i_height,
                      /* step */
@@ -483,13 +474,14 @@ void vdec_Motion420( macroblock_t * p_mb, motion_arg_t * p_motion )
     /* Chrominance Cr */
     MotionComponent( p_motion->p_source->p_u
                        + (p_mb->i_c_x + ((p_motion->i_mv_x/2) >> 1))
-                       + ((p_mb->i_c_y + (p_motion->i_offset >> 1)
+                       + ((p_mb->i_motion_c_y + (p_motion->i_offset >> 1)
                           + ((p_motion->i_mv_y/2) >> 1))
-                          + (p_motion->b_source_field - p_motion->b_dest_field))
+                          + p_motion->b_source_field)
                          * p_mb->p_picture->i_chroma_width,
                      p_mb->p_picture->p_u
                        + (p_mb->i_c_x)
-                       + (p_mb->i_c_y) * p_mb->p_picture->i_chroma_width,
+                       + (p_mb->i_motion_c_y + p_motion->b_dest_field)
+                         * p_mb->p_picture->i_chroma_width,
                      8, p_motion->i_height >> 1, p_mb->i_c_stride,
                      (p_motion->b_average << 2)
                        | (((p_motion->i_mv_y/2) & 1) << 1)
@@ -498,13 +490,14 @@ void vdec_Motion420( macroblock_t * p_mb, motion_arg_t * p_motion )
     /* Chrominance Cb */
     MotionComponent( p_motion->p_source->p_v
                        + (p_mb->i_c_x + ((p_motion->i_mv_x/2) >> 1))
-                       + ((p_mb->i_c_y + (p_motion->i_offset >> 1)
-                          +((p_motion->i_mv_y/2) >> 1))
-                          + (p_motion->b_source_field - p_motion->b_dest_field))
+                       + ((p_mb->i_motion_c_y + (p_motion->i_offset >> 1)
+                          + ((p_motion->i_mv_y/2) >> 1))
+                          + p_motion->b_source_field)
                          * p_mb->p_picture->i_chroma_width,
                      p_mb->p_picture->p_v
                        + (p_mb->i_c_x)
-                       + (p_mb->i_c_y) * p_mb->p_picture->i_chroma_width,
+                       + (p_mb->i_motion_c_y + p_motion->b_dest_field)
+                         * p_mb->p_picture->i_chroma_width,
                      8, p_motion->i_height >> 1, p_mb->i_c_stride,
                      (p_motion->b_average << 2)
                        | (((p_motion->i_mv_y/2) & 1) << 1)
index 9946dc02f546883ebead1d0f3f67f8c7a1478c44..d1f41dd87d95a7d8b4e2420413ccae0bc1ebb8b8 100644 (file)
@@ -580,9 +580,9 @@ static __inline__ void InitMacroblock( vpar_thread_t * p_vpar,
     p_mb->i_structure = p_vpar->picture.i_structure;
     p_mb->i_current_structure = p_vpar->picture.i_current_structure;
     p_mb->i_l_x = p_vpar->mb.i_l_x;
-    p_mb->i_l_y = p_vpar->mb.i_l_y;
+    p_mb->i_motion_l_y = p_mb->i_l_y = p_vpar->mb.i_l_y;
     p_mb->i_c_x = p_vpar->mb.i_c_x;
-    p_mb->i_c_y = p_vpar->mb.i_c_y;
+    p_mb->i_motion_c_y = p_mb->i_c_y = p_vpar->mb.i_c_y;
     p_mb->i_chroma_nb_blocks = p_vpar->sequence.i_chroma_nb_blocks;
     p_mb->pf_chroma_motion = pf_chroma_motion[p_vpar->sequence.i_chroma_format];
     p_mb->b_P_coding_type = ( p_vpar->picture.i_coding_type == P_CODING_TYPE );
@@ -607,6 +607,11 @@ static __inline__ void InitMacroblock( vpar_thread_t * p_vpar,
                         * (2 - p_vpar->picture.b_frame_structure)
                         * p_vpar->sequence.i_chroma_mb_height;
     p_vpar->mb.i_c_x %= p_vpar->sequence.i_chroma_width;
+    if( p_mb->b_motion_field = p_vpar->picture.b_motion_field )
+    {
+        p_mb->i_motion_l_y--;
+        p_mb->i_motion_c_y--;
+    }
 }
 
 /*****************************************************************************
index 15ab3b3e4e56cee83e35fb2cea58d1eb531c18bd..eafc6b5e11d56f70537154a9a22495eeb8046579 100644 (file)
@@ -699,7 +699,7 @@ memset( P_picture->p_data, 0, (p_vpar->sequence.i_mb_size*384));
     p_vpar->picture.b_frame_structure = (i_structure == FRAME_STRUCTURE);
 
     /* Initialize picture data for decoding. */
-    if( i_structure == BOTTOM_FIELD )
+    if( p_vpar->picture.b_motion_field = (i_structure == BOTTOM_FIELD) )
     {
         i_mb_base = p_vpar->sequence.i_mb_size >> 1;
         p_vpar->mb.i_l_y = 1;