天天看點

H.264句法和文法總結(十一)宏塊層預測句法

mb_pred( mb_type ) {   
     if( MbPartPredMode( mb_type, 0 )    = =    Intra_4x4    | |     
         MbPartPredMode( mb_type, 0 )    = =    Intra_16x16 ) { 
         if( MbPartPredMode( mb_type, 0 )    = =    Intra_4x4 )         
             for( luma4x4BlkIdx=0; luma4x4BlkIdx<16; luma4x4BlkIdx++ ) {    
                 // prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] rem_intra4x4_pred_mode[ luma4x4BlkIdx ] 幀内預測的模式也是需要預測的,  prev_intra4x4_pred_mode_flag 用來指明幀内預測時,亮度分量的預測模式的預測值是否就是真實預測模式,如果是,就不需另外再傳預測模式。如果不是,就由 rem_intra4x4_pred_mode 指定真實預測模式。        
                prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ]   
                 if( !prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] )         
                    rem_intra4x4_pred_mode[ luma4x4BlkIdx ]   
             }         
         // intra_chroma_pred_mode  在幀内預測時指定色度的預測模式, 
             intra_chroma_pred_mode        預測模式 
             0                                               DC 
             1                                               Horizontal 
             2                                               Vertical             
             3                                               Plane  
         intra_chroma_pred_mode       } else if( MbPartPredMode( mb_type, 0 )    !=    Direct ) {         
         for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)                 
             if( ( num_ref_idx_l0_active_minus1 > 0    | | 
                     mb_field_decoding_flag ) &&     
                 MbPartPredMode( mb_type, mbPartIdx )    !=    Pred_L1 ) 
                 // ref_idx_l0[ mbPartIdx]用參考幀隊列 L0 進行預測,即前向預測時,參考圖像在參考幀隊列中的序号。其中 mbPartIdx 是宏塊分區的序号。 如 果 當 前 宏 塊 是非場宏塊 ,  則ref_idx_l0[ mbPartIdx ] 值的範圍是0到 num_ref_idx_l0_active_minus1。 否則,如果目前宏塊是場宏塊,(宏塊所在圖像是場,當圖像是幀場自适應時目前宏塊處于場編碼的宏塊對),ref_idx_l0[ mbPartIdx]值的範圍是 0  到 2*num_ref_idx_l0_active_minus1 + 1,如前所述,此時參考幀隊列的幀都将拆成場,故參考隊列長度加倍。 
                ref_idx_l0[ mbPartIdx ]   
         for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)                 
             if( ( num_ref_idx_l1_active_minus1    >    0    | | 
                     mb_field_decoding_flag ) &&     
                 MbPartPredMode( mb_type, mbPartIdx )    !=    Pred_L0 ) 
                 ref_idx_l1[ mbPartIdx ]   
         for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)                 
             if( MbPartPredMode ( mb_type, mbPartIdx )    !=    Pred_L1 )         
                 for( compIdx = 0; compIdx < 2; compIdx++ )         
                    // mvd_l0[ mbPartIdx ][ 0 ][ compIdx ]  運動矢量的預測值和實際值之間的差。mbPartIdx  是宏塊分區的序号。CompIdx = 0 時水準運動矢量;  CompIdx = 1 垂直運動矢量。  
                     mvd_l0[ mbPartIdx ][ 0 ][ compIdx ]   
         for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)                 
             if( MbPartPredMode( mb_type, mbPartIdx )    !=    Pred_L0 )         
                 for( compIdx = 0; compIdx < 2; compIdx++ )         
                     mvd_l1[ mbPartIdx ][ 0 ][ compIdx ]    
     }         
 }      

繼續閱讀