Example #1
0
void CompDecompressor::Decompress(ComponentByteIO* p_component_byteio,
                                  CoeffArray& coeff_data,
                                  SubbandList& bands)
{

    // Set up the code blocks
    SetupCodeBlocks( bands );

    for ( int b=bands.Length() ; b>=1 ; --b ){
        // Multiple quantiser are used only if
        // a. The global code_block_mode is QUANT_MULTIPLE
        //              and
        // b. More than one code block is present in the subband.
        bands(b).SetUsingMultiQuants( 
                           m_decparams.SpatialPartition() &&
                           m_decparams.GetCodeBlockMode() == QUANT_MULTIPLE &&
                           (bands(b).GetCodeBlocks().LengthX() > 1 ||
                           bands(b).GetCodeBlocks().LengthY() > 1)
                                );

        // Read the header data first
        SubbandByteIO subband_byteio(bands(b), *p_component_byteio);
        subband_byteio.Input();
        
        if ( !bands(b).Skipped() ){
            if (m_pparams.UsingAC()){
                // A pointer to the object(s) we'll be using for coding the bands
                BandCodec* bdecoder;
    
                if ( b>=bands.Length()-3){
                    if ( m_psort.IsIntra() && b==bands.Length() )
                        bdecoder=new IntraDCBandCodec(&subband_byteio, 
                                                       TOTAL_COEFF_CTXS ,bands);
                    else
                        bdecoder=new LFBandCodec(&subband_byteio ,
                                                 TOTAL_COEFF_CTXS, bands ,
                                                 b, m_psort.IsIntra());
                }
                else
                    bdecoder=new BandCodec( &subband_byteio , TOTAL_COEFF_CTXS ,
                                            bands , b, m_psort.IsIntra());

                bdecoder->Decompress(coeff_data , subband_byteio.GetBandDataLength());
                delete bdecoder;
            }
            else{
                // A pointer to the object(s) we'll be using for coding the bands
                BandVLC* bdecoder;
    
                   if ( m_psort.IsIntra() && b==bands.Length() )
                      bdecoder=new IntraDCBandVLC(&subband_byteio, bands);
                else
                    bdecoder=new BandVLC( &subband_byteio , bands ,
                                          b, m_psort.IsIntra());

                bdecoder->Decompress(coeff_data , subband_byteio.GetBandDataLength());
                delete bdecoder;
            }
        }
        else{
            SetToVal( coeff_data , bands(b) , 0 );
        }
    }
}
Example #2
0
ComponentByteIO* CompCompressor::Compress( CoeffArray& coeff_data ,
                                           SubbandList& bands,
                                           CompSort csort,
                                           const OneDArray<unsigned int>& estimated_bits)
{
    // Need to transform, select quantisers for each band, 
    // and then compress each component in turn

    unsigned int num_band_bytes( 0 );

    // create byte output
    ComponentByteIO *p_component_byteio = new ComponentByteIO(csort);

    // Loop over all the bands (from DC to HF) quantising and coding them
    for (int b=bands.Length() ; b>=1 ; --b )
    {

        // create subband byte io
        SubbandByteIO subband_byteio(bands(b));

        if ( !bands(b).Skipped() )
        {   // If not skipped ...
            if (m_pparams.UsingAC())
            {
                // A pointer to an object  for coding the subband data
                BandCodec* bcoder;


                 // Pick the right codec according to the picture type and subband
                if (b >= bands.Length()-3)
                {
                    if ( m_psort.IsIntra() && b == bands.Length() )
                        bcoder=new IntraDCBandCodec(&subband_byteio,
                                                TOTAL_COEFF_CTXS , bands );
                    else
                        bcoder=new LFBandCodec(&subband_byteio ,TOTAL_COEFF_CTXS,
                                           bands , b, m_psort.IsIntra());
                }
                else
                    bcoder=new BandCodec(&subband_byteio , TOTAL_COEFF_CTXS ,
                                         bands , b, m_psort.IsIntra() );

                num_band_bytes = bcoder->Compress(coeff_data);


                delete bcoder;
            }
            else
            {
                // A pointer to an object  for coding the subband data
                BandVLC* bcoder;

                   if ( m_psort.IsIntra() && b == bands.Length() )
                       bcoder=new IntraDCBandVLC(&subband_byteio, bands );
                else
                    bcoder=new BandVLC(&subband_byteio , bands , b,
                                       m_psort.IsIntra() );

                num_band_bytes = bcoder->Compress(coeff_data);

                delete bcoder;
            }
             // Update the entropy correction factors
            m_encparams.EntropyFactors().Update(b , m_pparams , csort , estimated_bits[b] , 8*num_band_bytes);
        }
        else
        {   // ... skipped
            SetToVal( coeff_data , bands(b) , 0 );
        }

            // output sub-band data
            p_component_byteio->AddSubband(&subband_byteio);


    }//b

    return p_component_byteio;
}
Example #3
0
void CompCompressor::Compress(PicArray& pic_data)
{

    //need to transform, select quantisers for each band, and then compress each component in turn
    m_csort=pic_data.CSort();
    const int depth=4;
    unsigned int num_band_bits;

    // A pointer to an object  for coding the subband data
    BandCodec* bcoder;

    // A pointer to an object for outputting the subband data
    UnitOutputManager* band_op;

    const size_t CONTEXTS_REQUIRED = 24;

    Subband node;

    //set up Lagrangian params    
    if (m_fsort == I_frame) 
        m_lambda= m_encparams.ILambda();
    else if (m_fsort == L1_frame) 
        m_lambda= m_encparams.L1Lambda();
    else 
        m_lambda= m_encparams.L2Lambda();

     if (m_csort == U_COMP) 
         m_lambda*= m_encparams.UFactor();
     if (m_csort == V_COMP) 
         m_lambda*= m_encparams.VFactor();

    WaveletTransform wtransform(depth);

    wtransform.Transform( FORWARD , pic_data );
    wtransform.SetBandWeights( m_encparams.CPD() , m_fparams.FSort() , m_fparams.CFormat(), m_csort);

    SubbandList& bands=wtransform.BandList();

    // Generate all the quantisation data
    GenQuantList();

    // Choose all the quantisers
    OneDArray<unsigned int> estimated_bits( Range( 1 , bands.Length() ) );
    SelectQuantisers( pic_data , bands , estimated_bits );  

    // Loop over all the bands (from DC to HF) quantising and coding them
    for (int b=bands.Length() ; b>=1 ; --b )
    {
        band_op = & m_encparams.BitsOut().FrameOutput().BandOutput( m_csort , b );

        GolombCode( band_op->Header() , bands(b).Qf(0) );

        if (bands(b).Qf(0) != -1)
        {   // If not skipped ...

            bands(b).SetQf( 0 , m_qflist[bands(b).Qf(0)] );

             // Pick the right codec according to the frame type and subband
            if (b >= bands.Length())
            {
                if ( m_fsort == I_frame && b == bands.Length() )
                    bcoder=new IntraDCBandCodec( &( band_op->Data() ) , CONTEXTS_REQUIRED , bands);
                else
                    bcoder=new LFBandCodec( &( band_op->Data() ) ,CONTEXTS_REQUIRED, bands , b);
            }
            else
                bcoder=new BandCodec( &( band_op->Data() ) , CONTEXTS_REQUIRED , bands , b);

            num_band_bits = bcoder->Compress(pic_data);

             // Update the entropy correction factors
            m_encparams.EntropyFactors().Update(b , m_fsort , m_csort , estimated_bits[b] , num_band_bits);

            // Write the length of the data chunk into the header, and flush everything out to file
            UnsignedGolombCode( band_op->Header() , num_band_bits);

            delete bcoder;            
        }
        else
        {   // ... skipped

            if (b == bands.Length() && m_fsort == I_frame)
                SetToVal( pic_data , bands(b) , 2692 );
            else
                SetToVal( pic_data , bands(b) , 0 );
        }        
    }//b

    // Transform back into the picture domain
    wtransform.Transform( BACKWARD , pic_data );

}