]> git.sesse.net Git - vlc/commitdiff
Le parser fonctionne maintenant avec les I, les P et les B.
authorJean-Marc Dressler <polux@videolan.org>
Tue, 18 Jan 2000 20:39:12 +0000 (20:39 +0000)
committerJean-Marc Dressler <polux@videolan.org>
Tue, 18 Jan 2000 20:39:12 +0000 (20:39 +0000)
Reste a implementer la synchro et finir le decodeur.

include/vpar_motion.h
src/video_parser/vpar_blocks.c
src/video_parser/vpar_motion.c
src/video_parser/vpar_synchro.c

index fdfe328f15de7761a651d320875544505a82fe8c..ed47dfe540fdcc0da4481188bb94e71615ab5b94 100644 (file)
@@ -3,11 +3,6 @@
  * (c)1999 VideoLAN
  *****************************************************************************/
 
-typedef struct
-{
-  char i_val, i_len;
-} mv_tab_t;
-
 /*
  * Prototypes
  */
index d7f71d1a7767efcde04b24576c0a7cb16e8cb4b5..b95188d3b73c21c3105753b387e41924ba1e0ccd 100644 (file)
@@ -39,6 +39,7 @@
 #include "vpar_synchro.h"
 #include "video_parser.h"
 
+
 /*
  * Local prototypes
  */
@@ -646,8 +647,6 @@ static __inline__ void MacroblockModes( vpar_thread_t * p_vpar,
     /* Get macroblock_type. */
     p_vpar->mb.i_mb_type = (p_vpar->picture.pf_macroblock_type)( p_vpar );
     p_mb->i_mb_type = p_vpar->mb.i_mb_type;
-
-//fprintf( stderr, "MB type : %d\n", p_mb->i_mb_type );
     
     /* SCALABILITY : warning, we don't know if spatial_temporal_weight_code
      * has to be dropped, take care if you use scalable streams. */
@@ -741,39 +740,13 @@ void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
     yuv_data_t *    p_data2;
 
     /************* DEBUG *************/
-    static int i_count = 0;
     int i_inc;
-    boolean_t b_stop = 0;
+    static int i_count;
+i_count++;
 
     i_inc = MacroblockAddressIncrement( p_vpar );
-   
     *pi_mb_address += i_inc;
-
     //*pi_mb_address += MacroblockAddressIncrement( p_vpar );
-    b_stop = i_inc > 1;
-//    fprintf( stderr, "inc : %d (%d)\n", *pi_mb_address, i_inc );
-if( 0  )//i_count > 8 )
-{
-    exit(0);
-}
-i_count++;
-
-if( 0 )        
-    //i_count == 249)
-    // i_count != *pi_mb_address)
-    //b_stop )
-{
-    fprintf( stderr, "i_count = %d (%d)\n", i_count, i_inc );
-     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
-     fprintf( stderr, "%x ", GetBits( &p_vpar->bit_stream, 16 ) );
-     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
-     fprintf( stderr, "%x\n", GetBits( &p_vpar->bit_stream, 16 ) );
-     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
-     fprintf( stderr, "%x ", GetBits( &p_vpar->bit_stream, 16 ) );
-     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
-     fprintf( stderr, "%x\n", GetBits( &p_vpar->bit_stream, 16 ) );
-     exit(0);
-}
 
     for( i_mb = i_mb_previous + 1; i_mb < *pi_mb_address; i_mb++ )
     {
@@ -782,7 +755,6 @@ if( 0 )
         static f_motion_t   pf_motion_skipped[4] = {NULL, vdec_MotionField,
                                 vdec_MotionField, vdec_MotionFrame};
 
-fprintf(stderr, "Skipped macroblock !\n");
         /* Reset DC predictors (7.2.1). */
         p_vpar->slice.pi_dc_dct_pred[0] = p_vpar->slice.pi_dc_dct_pred[1]
             = p_vpar->slice.pi_dc_dct_pred[2]
@@ -840,13 +812,13 @@ fprintf(stderr, "Skipped macroblock !\n");
 
     if( p_vpar->mb.i_mb_type & MB_MOTION_FORWARD )
     {
-fprintf( stderr, "motion !\n" );
+//fprintf( stderr, "motion !\n" );
         (*p_vpar->sequence.pf_decode_mv)( p_vpar, p_mb, 0 );
     }
 
     if( p_vpar->mb.i_mb_type & MB_MOTION_BACKWARD )
     {
-fprintf( stderr, "motion2 !\n" );    
+//fprintf( stderr, "motion2 !\n" );    
         (*p_vpar->sequence.pf_decode_mv)( p_vpar, p_mb, 1 );
     }
 
@@ -854,10 +826,27 @@ fprintf( stderr, "motion2 !\n" );
     {
         RemoveBits( &p_vpar->bit_stream, 1 );
     }
+if( 0 )        
+    //i_count == 1231 &&
+    // i_count != *pi_mb_address)
+    //p_vpar->picture.i_coding_type == P_CODING_TYPE )
+{
+    fprintf( stderr, "i_count = %d (%d)\n", i_count, p_vpar->mb.i_mb_type );
+     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
+     fprintf( stderr, "%x ", GetBits( &p_vpar->bit_stream, 16 ) );
+     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
+     fprintf( stderr, "%x\n", GetBits( &p_vpar->bit_stream, 16 ) );
+     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
+     fprintf( stderr, "%x ", GetBits( &p_vpar->bit_stream, 16 ) );
+     fprintf( stderr, "%x", GetBits( &p_vpar->bit_stream, 16 ) );
+     fprintf( stderr, "%x\n", GetBits( &p_vpar->bit_stream, 16 ) );
+     exit(0);
+}
 
     if( p_vpar->mb.i_mb_type & MB_PATTERN )
     {
-        (*p_vpar->sequence.pf_decode_pattern)( p_vpar );
+        p_vpar->mb.i_coded_block_pattern = (*p_vpar->sequence.pf_decode_pattern)( p_vpar );
+//fprintf( stderr, "pattern : %d\n", p_vpar->mb.i_coded_block_pattern );
     }
     else
     {
@@ -866,7 +855,6 @@ fprintf( stderr, "motion2 !\n" );
         p_vpar->mb.i_coded_block_pattern = pi_coded_block_pattern
                                     [p_vpar->mb.i_mb_type & MB_INTRA];
     }
-
     pf_addb = ppf_addb_intra[p_vpar->mb.i_mb_type & MB_INTRA];
 
     /*
@@ -1002,9 +990,45 @@ int vpar_PMBType( vpar_thread_t * p_vpar )
     /* Testing on 6 bits */
     int                i_type = ShowBits( &p_vpar->bit_stream, 6 );
     
+#if 0   
+/* Table B-3, macroblock_type in P-pictures, codes 001..1xx */
+static lookup_t PMBtab0[8] = {
+  {-1,0},
+  {MB_MOTION_FORWARD,3},
+  {MB_PATTERN,2}, {MB_PATTERN,2},
+  {MB_MOTION_FORWARD|MB_PATTERN,1}, 
+  {MB_MOTION_FORWARD|MB_PATTERN,1},
+  {MB_MOTION_FORWARD|MB_PATTERN,1}, 
+  {MB_MOTION_FORWARD|MB_PATTERN,1}
+};
+
+/* Table B-3, macroblock_type in P-pictures, codes 000001..00011x */
+static lookup_t PMBtab1[8] = {
+  {-1,0},
+  {MB_QUANT|MB_INTRA,6},
+  {MB_QUANT|MB_PATTERN,5}, {MB_QUANT|MB_PATTERN,5},
+  {MB_QUANT|MB_MOTION_FORWARD|MB_PATTERN,5}, {MB_QUANT|MB_MOTION_FORWARD|MB_PATTERN,5},
+  {MB_INTRA,5}, {MB_INTRA,5}
+};
+
+
+  if(i_type >= 8)      
+  {
+    i_type >>= 3;
+    RemoveBits( &p_vpar->bit_stream,PMBtab0[i_type].i_length );
+    return PMBtab0[i_type].i_value;
+  }
+
+  if (i_type==0)
+  {
+      printf("Invalid P macroblock_type code\n");
+    return -1;
+  }
+    RemoveBits( &p_vpar->bit_stream,PMBtab1[i_type].i_length );
+ return PMBtab1[i_type].i_value;
+#endif
     /* Dump the good number of bits */
     RemoveBits( &p_vpar->bit_stream, p_vpar->ppl_mb_type[0][i_type].i_length );
-
     /* return the value from the lookup table for P type */
     return p_vpar->ppl_mb_type[0][i_type].i_value;
 }
@@ -1134,7 +1158,7 @@ static void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, in
     
     /* Lookup Table for the chromatic component */
     static int pi_cc_index[12] = { 0, 0, 0, 0, 1, 2, 1, 2, 1, 2 };
-    
+
     i_cc = pi_cc_index[i_b];
 
     /* Determine whether it is luminance or not (chrominance) */
@@ -1166,6 +1190,12 @@ static void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, in
                 i_length =  pl_DCT_tab_ac[(i_code>>12)-4].i_length;
              }
         }
+        else if( i_code >= 1024 )
+        {
+            i_run =     pl_DCT_tab0[(i_code>>8)-4].i_run;
+            i_length =  pl_DCT_tab0[(i_code>>8)-4].i_length;
+            i_level =   pl_DCT_tab0[(i_code>>8)-4].i_level;            
+        }
         else
         {
             i_run =     ppl_dct_coef[0][i_code].i_run;
@@ -1203,16 +1233,21 @@ static void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, in
         i_coef = i_parse;
         i_parse += i_run;
         i_nc ++;
+
+if( i_parse >= 64 )
+{
+    break;
+}
+        
         i_pos = pi_scan[p_vpar->picture.b_alternate_scan][i_parse];
         i_level = ( i_level *
                     p_vpar->slice.i_quantizer_scale *
                     ppi_quant[i_type][i_pos] ) >> 5;
-        p_mb->ppi_blocks[i_b][i_parse] = b_sign ? -i_level : i_level;
+        p_mb->ppi_blocks[i_b][i_pos] = b_sign ? -i_level : i_level;
     }
-fprintf( stderr, "MPEG2 end (%d)\n", i_b );
+fprintf( stderr, "Non intra MPEG2 end (%d)\n", i_b );
 exit(0);
-
+//p_vpar->picture.b_error = 1;
 }
 
 /*****************************************************************************
@@ -1238,7 +1273,6 @@ static void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb,
     
     /* Lookup Table for the chromatic component */
     static int pi_cc_index[12] = { 0, 0, 0, 0, 1, 2, 1, 2, 1, 2 };
-
     i_cc = pi_cc_index[i_b];
 
     /* Determine whether it is luminance or not (chrominance) */
@@ -1436,7 +1470,11 @@ static void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb,
 //                  i_run, i_level, i_parse, ShowBits( &p_vpar->bit_stream, 16 ) );
 
 //fprintf( stderr, "- %4x\n",ShowBits( &p_vpar->bit_stream, 16 ) ); 
-    
+if( i_parse >= 64 )
+{
+    fprintf( stderr, "Beuhh dans l'intra decode (%d)\n", i_b );
+    break;
+}
         i_coef = i_parse;
         i_parse += i_run;
         i_nc ++;
@@ -1450,4 +1488,5 @@ static void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb,
     
 fprintf( stderr, "MPEG2 end (%d)\n", i_b );
 exit(0);
+//p_vpar->b_error = 1;
 }
index 42055fb17da24261e9bad8d271789db9b4665907..0892ee2cab11cc15ff208ab2400af8ee89cd27e6 100644 (file)
@@ -40,9 +40,7 @@
 #include "video_parser.h"
 #include "vpar_motion.h"
 
-/* mv_format */
-#define MV_FIELD 0
-#define MV_FRAME 1
+
 
 /*
  * Local prototypes
 static __inline__ int vpar_MotionCode( vpar_thread_t * p_vpar )
 {
     int i_code;
-   static mv_tab_t p_mv_tab0[8] = 
+    static lookup_t pl_mv_tab0[8] = 
         { {-1,0}, {3,3}, {2,2}, {2,2}, {1,1}, {1,1}, {1,1}, {1,1} };
     /* Table B-10, motion_code, codes 0000011 ... 000011x */
-    static mv_tab_t p_mv_tab1[8] =
+    static lookup_t pl_mv_tab1[8] =
         { {-1,0}, {-1,0}, {-1,0}, {7,6}, {6,6}, {5,6}, {4,5}, {4,5} };
     /* Table B-10, motion_code, codes 0000001100 ... 000001011x */
-    static mv_tab_t p_mv_tab2[12] = {
+    static lookup_t pl_mv_tab2[12] = {
         {16,9}, {15,9}, {14,9}, {13,9},
         {12,9}, {11,9}, {10,8}, {10,8},
         {9,8},  {9,8},  {8,8},  {8,8} };
     
-   if( GetBits(&p_vpar->bit_stream, 1) )
-   {
-       return 0;
-   }
-
-   if( (i_code = ShowBits(&p_vpar->bit_stream, 9)) >= 64 )
-   {
-       i_code >>= 6;
-       RemoveBits( &p_vpar->bit_stream, p_mv_tab0[0].i_len );
-       return( GetBits(&p_vpar->bit_stream, 1) ? -p_mv_tab0[i_code].i_val : p_mv_tab0[i_code].i_val );
-   }
-
-   if( i_code >= 24 )
-   {
-       i_code >>= 3;
-       RemoveBits( &p_vpar->bit_stream, p_mv_tab1[0].i_len );
-       return( GetBits(&p_vpar->bit_stream, 1) ? -p_mv_tab1[i_code].i_val : p_mv_tab1[i_code].i_val );
-   }
-
-   if( (i_code -= 12) < 0 )
-   {
-       p_vpar->picture.b_error = 1;
-       intf_DbgMsg( "vpar debug: Invalid motion_vector code\n" );
-       return 0;
-   }
-
-   RemoveBits( &p_vpar->bit_stream, p_mv_tab2[0].i_len );
-   return( GetBits(&p_vpar->bit_stream, 1) ? -p_mv_tab2[i_code].i_val : p_mv_tab2[i_code].i_val );            
+    if( GetBits(&p_vpar->bit_stream, 1) )
+    {
+        return 0;
+    }
+    if( (i_code = ShowBits(&p_vpar->bit_stream, 9)) >= 64 )
+    {
+        i_code >>= 6;
+        RemoveBits( &p_vpar->bit_stream, pl_mv_tab0[i_code].i_length );
+        return( GetBits(&p_vpar->bit_stream, 1) ? -pl_mv_tab0[i_code].i_value : pl_mv_tab0[i_code].i_value );
+    }
+
+    if( i_code >= 24 )
+    {
+        i_code >>= 3;
+        RemoveBits( &p_vpar->bit_stream, pl_mv_tab1[i_code].i_length );
+        return( GetBits(&p_vpar->bit_stream, 1) ? -pl_mv_tab1[i_code].i_value : pl_mv_tab1[i_code].i_value );
+    }
+
+    if( (i_code -= 12) < 0 )
+    {
+        p_vpar->picture.b_error = 1;
+        intf_DbgMsg( "vpar debug: Invalid motion_vector code\n" );
+        return 0;
+    }
+
+    RemoveBits( &p_vpar->bit_stream, pl_mv_tab2[i_code].i_length );
+    return( GetBits(&p_vpar->bit_stream, 1) ? -pl_mv_tab2[i_code].i_value : pl_mv_tab2[i_code].i_value );            
 }
 
 /****************************************************************************
@@ -129,7 +126,6 @@ static __inline__ void vpar_DecodeMotionVector( int * pi_prediction, int i_r_siz
 void vpar_MotionVector( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_r,
         int i_s, int i_full_pel )
 {
-        
     int i_motion_code, i_motion_residual;
     int i_r_size;
 
@@ -189,7 +185,7 @@ void vpar_MPEG2MotionVector( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_
 {
     if( p_vpar->mb.i_mv_count == 1 )
     {
-        if( p_vpar->mb.i_mv_format == MV_FIELD && !p_vpar->mb.b_dmv )
+        if( p_vpar->mb.i_mv_format == MOTION_FIELD && !p_vpar->mb.b_dmv )
         {
             p_mb->ppi_field_select[0][i_s] = p_mb->ppi_field_select[1][i_s]
                                             = GetBits( &p_vpar->bit_stream, 1 );
index 23e297f6c2358560f80c29d6cacc231ddba84884..b6eeccb7a784aacac9a76c24d7d17ee443ef313a 100644 (file)
@@ -49,7 +49,9 @@
 boolean_t vpar_SynchroChoose( vpar_thread_t * p_vpar, int i_coding_type,
                               int i_structure )
 {
-    return( i_coding_type == I_CODING_TYPE );
+    return( 1 );
+    return( i_coding_type == I_CODING_TYPE || i_coding_type == P_CODING_TYPE );
+    //return( i_coding_type == I_CODING_TYPE );
 }
 
 /*****************************************************************************