From: Thomas D. <tj...@us...> - 2008-04-29 08:51:56
|
Update of /cvsroot/dirac/compress/libdirac_encoder In directory sc8-pr-cvs12.sourceforge.net:/tmp/cvs-serv26109/libdirac_encoder Modified Files: comp_compress.cpp comp_compress.h dirac_encoder.cpp dirac_encoder.h picture_compress.cpp picture_compress.h quality_monitor.cpp quality_monitor.h quant_chooser.cpp seq_compress.cpp Log Message: Various refactorings and bug-fixes. 1. Changed how padding is implemented so that padding is only added to the coefficient array before the wavelet transform, and is removed from the coefficient array immediately after the wavelet transform. No metadata for "OrigXl" etc is needed now. 2. Various places "frame" is changed to "picture" and "fparams" to "pparams" etc. 3. Fixed bug with misreporting bit rate for long sequences by recording data with int64_t not int. 4. Fixed a bug with perceptual weighting where additional weight was being given to the DC band even though it is coded losslessly. This threw out weights for the other bands when the weights were normalised, especially for intra pictures. In turn this required that the relative lambdas used for different picture types had to be changed. 5. Fixed a minor bug with rate control where the intra lambda was not being applied correctly. 6. Changed "field coding" metadata to "picture coding mode" metadata throughout, as per spec. 7. Changed "QIndex" throughout to "QuantIndex" etc for clarity. 8. Refactored picture coding and decoding to simplify things a little. Index: picture_compress.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/picture_compress.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** picture_compress.cpp 5 Mar 2008 11:07:20 -0000 1.2 --- picture_compress.cpp 29 Apr 2008 08:51:52 -0000 1.3 *************** *** 112,126 **** Picture& my_picture = my_buffer.GetPicture( pnum ); ! PictureParams& fparams = my_picture.GetPparams(); ! const PictureSort& fsort = fparams.PicSort(); // Set the wavelet filter ! if ( fsort.IsIntra() ) ! { m_encparams.SetTransformFilter( m_encparams.IntraTransformFilter() ); m_encparams.SetUsualCodeBlocks( INTRA_PICTURE ); } ! else ! { m_encparams.SetTransformFilter( m_encparams.InterTransformFilter() ); m_encparams.SetUsualCodeBlocks( INTER_PICTURE ); --- 112,124 ---- Picture& my_picture = my_buffer.GetPicture( pnum ); ! PictureParams& pparams = my_picture.GetPparams(); ! const PictureSort& psort = pparams.PicSort(); // Set the wavelet filter ! if ( psort.IsIntra() ){ m_encparams.SetTransformFilter( m_encparams.IntraTransformFilter() ); m_encparams.SetUsualCodeBlocks( INTRA_PICTURE ); } ! else{ m_encparams.SetTransformFilter( m_encparams.InterTransformFilter() ); m_encparams.SetUsualCodeBlocks( INTER_PICTURE ); *************** *** 132,152 **** // can do this at any point prior to actually writing any picture data. //WritePictureHeader( my_picture.GetPparams() ); ! PictureByteIO* p_picture_byteio = new PictureByteIO(fparams, ! pnum); p_picture_byteio->Output(); ! if ( !m_skipped ) ! { // If not skipped we continue with the coding ... if (m_encparams.Verbose() ) std::cout<<std::endl<<"Using QF: "<<m_encparams.Qf(); ! if (fsort.IsInter() ) ! { // Code the MV data // If we're using global motion parameters, code them ! if (m_use_global) ! { /* Code the global motion parameters --- 130,147 ---- // can do this at any point prior to actually writing any picture data. //WritePictureHeader( my_picture.GetPparams() ); ! PictureByteIO* p_picture_byteio = new PictureByteIO(pparams, pnum); p_picture_byteio->Output(); ! if ( !m_skipped ){ ! // If not skipped we continue with the coding ... if (m_encparams.Verbose() ) std::cout<<std::endl<<"Using QF: "<<m_encparams.Qf(); ! if (psort.IsInter() ){ // Code the MV data // If we're using global motion parameters, code them ! if (m_use_global){ /* Code the global motion parameters *************** *** 156,162 **** // If we're using block motion vectors, code them ! if ( m_use_block_mv ) ! { ! MvDataByteIO *mv_data = new MvDataByteIO(fparams, static_cast<CodecParams&>(m_encparams)); p_picture_byteio->SetMvData(mv_data); --- 151,156 ---- // If we're using block motion vectors, code them ! if ( m_use_block_mv ){ ! MvDataByteIO *mv_data = new MvDataByteIO(pparams, static_cast<CodecParams&>(m_encparams)); p_picture_byteio->SetMvData(mv_data); *************** *** 167,177 **** // Then motion compensate MotionCompensator::CompensatePicture( m_encparams , SUBTRACT , ! my_buffer , pnum , ! *m_me_data ); }//?fsort //Write Transform Header ! TransformByteIO *p_transform_byteio = new TransformByteIO(fparams, static_cast<CodecParams&>(m_encparams)); p_picture_byteio->SetTransformData(p_transform_byteio); --- 161,170 ---- // Then motion compensate MotionCompensator::CompensatePicture( m_encparams , SUBTRACT , ! my_buffer , pnum , *m_me_data ); }//?fsort //Write Transform Header ! TransformByteIO *p_transform_byteio = new TransformByteIO(pparams, static_cast<CodecParams&>(m_encparams)); p_picture_byteio->SetTransformData(p_transform_byteio); *************** *** 181,266 **** ///////////////////////// ! CompCompressor my_compcoder(m_encparams , fparams ); ! ! PicArray* comp_data[3]; ! CoeffArray* comp_coeff_data[3]; ! WaveletTransform* comp_transform[3]; ! SubbandList* comp_bands[3]; ! OneDArray<unsigned int>* est_bits[3]; ! const int depth=m_encparams.TransformDepth(); const WltFilter filter = m_encparams.TransformFilter(); ! // Construction and definition of objects ! for (int i=0;i<3;++i){ ! comp_data[i] = &my_buffer.GetComponent( pnum , (CompSort) i ); ! comp_transform[i] = new WaveletTransform( depth, filter ); ! comp_coeff_data[i] = new CoeffArray(comp_data[i]->LengthY(), ! comp_data[i]->LengthX(), (CompSort) i ); ! }// i ! ! // Do the wavelet transforms for Y, U and V ! ! for (int i=0;i<3;++i){ ! comp_transform[i]->Transform( FORWARD , *comp_data[i], *comp_coeff_data[i] ); ! comp_transform[i]->SetBandWeights( m_encparams.CPD() , fsort , ! fparams.CFormat(), (CompSort) i, m_encparams.FieldCoding()); ! comp_bands[i] = &comp_transform[i]->BandList(); ! SetupCodeBlocks( *comp_bands[i] ); ! ! }//i ! ! // Select the component quantisers ! float lambda; ! for (int i=0; i<3; ++i){ ! lambda = GetCompLambda( fparams, (CompSort) i ); ! est_bits[i] = new OneDArray<unsigned int>( Range( 1, comp_bands[i]->Length() ) ); ! SelectQuantisers( *comp_coeff_data[i] , *comp_bands[i] , lambda, ! *est_bits[i] , m_encparams.GetCodeBlockMode(), ! fsort, (CompSort) i ); ! } ! - // Quantise and code the component subbands - for (int i=0; i<3; ++i){ p_transform_byteio->AddComponent( my_compcoder.Compress( ! *comp_coeff_data[i], *comp_bands[i], *est_bits[i] ) ); } - // Transform back into the picture domain if required ! if ( fsort.IsIntra() || fsort.IsRef() || m_encparams.LocalDecode() ) ! { ! for (int i=0; i<3; ++i){ ! comp_transform[i]->Transform( BACKWARD , *comp_data[i], *comp_coeff_data[i] ); ! }// i } - // Destruction of objects ! for (int i=0; i<3; ++i) ! { ! delete comp_transform[i]; ! delete comp_coeff_data[i]; ! delete est_bits[i]; ! ! } //motion compensate again if necessary ! if (fsort.IsInter() ) ! { ! if ( fsort.IsRef() || m_encparams.LocalDecode() ) ! { MotionCompensator::CompensatePicture( m_encparams , ADD , ! my_buffer , pnum , ! *m_me_data ); ! } ! }//?fsort //finally clip the data to keep it in range --- 174,232 ---- ///////////////////////// ! CompCompressor my_compcoder(m_encparams , pparams ); const int depth=m_encparams.TransformDepth(); const WltFilter filter = m_encparams.TransformFilter(); ! PicArray* comp_data[3]; ! CoeffArray coeff_data[3]; ! WaveletTransform wtransform( depth, filter ); ! OneDArray<unsigned int>* est_bits[3]; ! float lambda[3]; ! // Construction and definition of objects ! for (int c=0;c<3;++c){ ! comp_data[c] = &my_buffer.GetComponent( pnum , (CompSort) c ); ! InitCoeffData( coeff_data[c], comp_data[c]->LengthX(), comp_data[c]->LengthY() ); ! est_bits[c] = new OneDArray<unsigned int>( Range( 1, 3*depth+1 ) ); ! }// c ! /* Do the wavelet transforms and select the component ! * quantisers using perceptual weighting ! */ ! for (int c=0; c<3; ++c){ ! lambda[c] = GetCompLambda( pparams, (CompSort) c ); ! wtransform.Transform( FORWARD , *comp_data[c], coeff_data[c] ); ! wtransform.SetBandWeights( m_encparams.CPD() , psort , ! pparams.CFormat(), (CompSort) c, m_encparams.FieldCoding()); + SubbandList& bands = wtransform.BandList(); + SetupCodeBlocks( bands ); + SelectQuantisers( coeff_data[c] , bands , lambda[c], + *est_bits[c] , m_encparams.GetCodeBlockMode(), pparams, (CompSort) c ); p_transform_byteio->AddComponent( my_compcoder.Compress( ! coeff_data[c], bands, (CompSort) c, *est_bits[c] ) ); } // Transform back into the picture domain if required ! if ( psort.IsIntra() || psort.IsRef() || m_encparams.LocalDecode() ){ ! for (int c=0; c<3; ++c){ ! wtransform.Transform( BACKWARD , *comp_data[c], coeff_data[c] ); ! }// c } // Destruction of objects ! for (int c=0; c<3; ++c) ! delete est_bits[c]; //motion compensate again if necessary ! if (psort.IsInter() ){ ! if ( psort.IsRef() || m_encparams.LocalDecode() ) MotionCompensator::CompensatePicture( m_encparams , ADD , ! my_buffer , pnum , *m_me_data ); ! } //finally clip the data to keep it in range *************** *** 329,332 **** --- 295,317 ---- } + void PictureCompressor::InitCoeffData( CoeffArray& coeff_data, const int xl, const int yl ){ + + // First set the dimensions up // + int xpad_len = xl; + int ypad_len = yl; + + // The pic dimensions must be a multiple of 2^(transform depth) + int tx_mul = (1<<m_encparams.TransformDepth()); + + if ( xpad_len%tx_mul != 0 ) + xpad_len = ( (xpad_len/tx_mul)+1 ) *tx_mul; + if ( ypad_len%tx_mul != 0 ) + ypad_len = ( (ypad_len/tx_mul)+1 ) * tx_mul; + + coeff_data.Resize( ypad_len, xpad_len ); + + } + + void PictureCompressor::AnalyseMEData( const MEData& me_data ) { *************** *** 357,383 **** } ! float PictureCompressor::GetCompLambda( const PictureParams& fparams, const CompSort csort ) { ! const PictureSort fsort = fparams.PicSort(); float lambda; ! if ( fsort.IsIntra() ) ! { lambda= m_encparams.ILambda(); if ( m_is_a_cut ) - { // The intra picture is inserted so we can lower the quality lambda *= 5; - - } } ! else ! { double log_intra_lambda = std::log10( m_encparams.ILambda() ); double log_picture_lambda; ! if (fparams.IsBPicture() ) log_picture_lambda= std::log10( m_encparams.L2Lambda() ); else --- 342,363 ---- } ! float PictureCompressor::GetCompLambda( const PictureParams& pparams, const CompSort csort ) { ! const PictureSort psort = pparams.PicSort(); float lambda; ! if ( psort.IsIntra() ){ lambda= m_encparams.ILambda(); if ( m_is_a_cut ) // The intra picture is inserted so we can lower the quality lambda *= 5; } ! else{ double log_intra_lambda = std::log10( m_encparams.ILambda() ); double log_picture_lambda; ! if (pparams.IsBPicture() ) log_picture_lambda= std::log10( m_encparams.L2Lambda() ); else *************** *** 389,393 **** } - if (csort == U_COMP) lambda*= m_encparams.UFactor(); --- 369,372 ---- *************** *** 403,413 **** int yregions; ! // The maximum number of regions horizontally and vertically ! ! ! for (int band_num = 1; band_num<=bands.Length() ; ++band_num) ! { ! if (m_encparams.SpatialPartition()) ! { int level = m_encparams.TransformDepth() - (band_num-1)/3; const CodeBlocks &cb = m_encparams.GetCodeBlocks(level); --- 382,387 ---- int yregions; ! for (int band_num = 1; band_num<=bands.Length() ; ++band_num){ ! if (m_encparams.SpatialPartition()){ int level = m_encparams.TransformDepth() - (band_num-1)/3; const CodeBlocks &cb = m_encparams.GetCodeBlocks(level); *************** *** 415,420 **** yregions = cb.VerticalCodeBlocks(); } ! else ! { xregions = 1; yregions = 1; --- 389,393 ---- yregions = cb.VerticalCodeBlocks(); } ! else{ xregions = 1; yregions = 1; *************** *** 430,440 **** OneDArray<unsigned int>& est_bits, const CodeBlockMode cb_mode, ! const PictureSort fsort, const CompSort csort ) { // Set up the multiquantiser mode ! for ( int b=bands.Length() ; b>=1 ; --b ) ! { // Set multiquants flag in the subband only if // a. Global m_cb_mode flag is set to QUANT_MULTIPLE in encparams --- 403,412 ---- OneDArray<unsigned int>& est_bits, const CodeBlockMode cb_mode, ! const PictureParams& pp, const CompSort csort ) { // Set up the multiquantiser mode ! for ( int b=bands.Length() ; b>=1 ; --b ){ // Set multiquants flag in the subband only if // a. Global m_cb_mode flag is set to QUANT_MULTIPLE in encparams *************** *** 452,459 **** // Select all the quantizers ! if ( !m_encparams.Lossless() ) ! { // Set the DC band quantiser to be 1 ! bands( bands.Length() ).SetQIndex( 0 ); bands( bands.Length() ).SetSkip( false ); bands( bands.Length() ).SetUsingMultiQuants( false ); --- 424,430 ---- // Select all the quantizers ! if ( !m_encparams.Lossless() ){ // Set the DC band quantiser to be 1 ! bands( bands.Length() ).SetQuantIndex( 0 ); bands( bands.Length() ).SetSkip( false ); bands( bands.Length() ).SetUsingMultiQuants( false ); *************** *** 462,487 **** for (int j=0; j<blocks.LengthY(); ++j) for (int i=0 ; i<blocks.LengthX(); ++i ) ! blocks[j][i].SetQIndex( 0 ); // Now do the rest of the bands. for ( int b=bands.Length()-1 ; b>=1 ; --b ) ! { est_bits[b] = SelectMultiQuants( coeff_data , bands , b, lambda, ! fsort, csort ); ! }// b } ! else ! { ! for ( int b=bands.Length() ; b>=1 ; --b ) ! { ! bands(b).SetQIndex( 0 ); est_bits[b] = 0; TwoDArray<CodeBlock>& blocks = bands(b).GetCodeBlocks(); for (int j=0; j<blocks.LengthY() ;++j) - { for (int i=0; i<blocks.LengthX() ;++i) ! { ! blocks[j][i].SetQIndex( 0 ); ! }// i ! }// j }// b } --- 433,451 ---- for (int j=0; j<blocks.LengthY(); ++j) for (int i=0 ; i<blocks.LengthX(); ++i ) ! blocks[j][i].SetQuantIndex( 0 ); // Now do the rest of the bands. for ( int b=bands.Length()-1 ; b>=1 ; --b ) ! est_bits[b] = SelectMultiQuants( coeff_data , bands , b, lambda, ! pp, csort ); } ! else{ ! for ( int b=bands.Length() ; b>=1 ; --b ){ ! bands(b).SetQuantIndex( 0 ); est_bits[b] = 0; TwoDArray<CodeBlock>& blocks = bands(b).GetCodeBlocks(); for (int j=0; j<blocks.LengthY() ;++j) for (int i=0; i<blocks.LengthX() ;++i) ! blocks[j][i].SetQuantIndex( 0 ); }// b } *************** *** 489,493 **** int PictureCompressor::SelectMultiQuants( CoeffArray& coeff_data , SubbandList& bands , ! const int band_num , const float lambda, const PictureSort fsort, const CompSort csort) { Subband& node( bands( band_num ) ); --- 453,457 ---- int PictureCompressor::SelectMultiQuants( CoeffArray& coeff_data , SubbandList& bands , ! const int band_num , const float lambda, const PictureParams& pp, const CompSort csort) { Subband& node( bands( band_num ) ); *************** *** 499,512 **** // For the DC band in I pictures, remove the average ! if ( band_num == bands.Length() && fsort.IsIntra() ) AddSubAverage( coeff_data , node.Xl() , node.Yl() , SUBTRACT); // The total estimated bits for the subband int band_bits( 0 ); ! qchooser.SetEntropyCorrection( m_encparams.EntropyFactors().Factor( band_num , fsort , csort ) ); band_bits = qchooser.GetBestQuant( node ); // Put the DC band average back in if necessary ! if ( band_num == bands.Length() && fsort.IsIntra() ) AddSubAverage( coeff_data , node.Xl() , node.Yl() , ADD); --- 463,476 ---- // For the DC band in I pictures, remove the average ! if ( band_num == bands.Length() && pp.PicSort().IsIntra() ) AddSubAverage( coeff_data , node.Xl() , node.Yl() , SUBTRACT); // The total estimated bits for the subband int band_bits( 0 ); ! qchooser.SetEntropyCorrection( m_encparams.EntropyFactors().Factor( band_num, pp, csort ) ); band_bits = qchooser.GetBestQuant( node ); // Put the DC band average back in if necessary ! if ( band_num == bands.Length() && pp.PicSort().IsIntra() ) AddSubAverage( coeff_data , node.Xl() , node.Yl() , ADD); Index: dirac_encoder.h =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/dirac_encoder.h,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** dirac_encoder.h 6 Mar 2008 08:04:01 -0000 1.21 --- dirac_encoder.h 29 Apr 2008 08:51:52 -0000 1.22 *************** *** 279,293 **** { /*! Number of motion vector bits */ ! unsigned int mv_bits; /*! Total number of bits used to encode sequence */ ! unsigned int seq_bits; /*! Number of used to encode y component */ ! unsigned int ycomp_bits; /*! Number of used to encode u component */ ! unsigned int ucomp_bits; /*! Number of used to encode v component */ ! unsigned int vcomp_bits; /*! Average bit rate for the sequence */ ! unsigned int bit_rate; } dirac_enc_seqstats_t; --- 279,293 ---- { /*! Number of motion vector bits */ ! int64_t mv_bits; /*! Total number of bits used to encode sequence */ ! int64_t seq_bits; /*! Number of used to encode y component */ ! int64_t ycomp_bits; /*! Number of used to encode u component */ ! int64_t ucomp_bits; /*! Number of used to encode v component */ ! int64_t vcomp_bits; /*! Average bit rate for the sequence */ ! int64_t bit_rate; } dirac_enc_seqstats_t; Index: quant_chooser.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/quant_chooser.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** quant_chooser.cpp 16 Jan 2008 16:11:17 -0000 1.14 --- quant_chooser.cpp 29 Apr 2008 08:51:52 -0000 1.15 *************** *** 128,132 **** bit_sum = m_costs[m_min_idx].ENTROPY * node.Xl() * node.Yl(); ! node.SetQIndex( m_min_idx ); TwoDArray<CodeBlock>& block_list( node.GetCodeBlocks() ); --- 128,132 ---- bit_sum = m_costs[m_min_idx].ENTROPY * node.Xl() * node.Yl(); ! node.SetQuantIndex( m_min_idx ); TwoDArray<CodeBlock>& block_list( node.GetCodeBlocks() ); *************** *** 134,152 **** // Set the codeblock quantisers for (int j=0 ; j<block_list.LengthY() ; ++j ) - { for (int i=0 ; i<block_list.LengthX() ; ++i ) ! { ! block_list[j][i].SetQIndex( m_min_idx ); ! }// i ! }// j // Set the codeblock skip flags for (int j=0 ; j<block_list.LengthY() ; ++j ) - { for (int i=0 ; i<block_list.LengthX() ; ++i ) - { SetSkip( block_list[j][i], m_min_idx ); - }// i - }// j --- 134,144 ---- // Set the codeblock quantisers for (int j=0 ; j<block_list.LengthY() ; ++j ) for (int i=0 ; i<block_list.LengthX() ; ++i ) ! block_list[j][i].SetQuantIndex( m_min_idx ); // Set the codeblock skip flags for (int j=0 ; j<block_list.LengthY() ; ++j ) for (int i=0 ; i<block_list.LengthX() ; ++i ) SetSkip( block_list[j][i], m_min_idx ); Index: comp_compress.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/comp_compress.cpp,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** comp_compress.cpp 31 Jan 2008 11:25:18 -0000 1.46 --- comp_compress.cpp 29 Apr 2008 08:51:52 -0000 1.47 *************** *** 56,77 **** #include <iostream> ! CompCompressor::CompCompressor( EncoderParams& encp,const PictureParams& fp) : m_encparams(encp), ! m_fparams(fp), ! m_fsort( m_fparams.PicSort() ), ! m_cformat( m_fparams.CFormat() ) {} ComponentByteIO* CompCompressor::Compress( CoeffArray& coeff_data , SubbandList& bands, ! const OneDArray<unsigned int>& estimated_bits ) { ! //need to transform, select quantisers for each band, and then compress each component in turn ! m_csort=coeff_data.CSort(); unsigned int num_band_bytes( 0 ); // create byte output ! ComponentByteIO *p_component_byteio = new ComponentByteIO(m_csort); // Loop over all the bands (from DC to HF) quantising and coding them --- 56,78 ---- #include <iostream> ! CompCompressor::CompCompressor( EncoderParams& encp,const PictureParams& pp) : m_encparams(encp), ! m_pparams(pp), ! m_psort( m_pparams.PicSort() ), ! m_cformat( m_pparams.CFormat() ) {} 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 *************** *** 84,88 **** if ( !bands(b).Skipped() ) { // If not skipped ... ! if (m_fparams.UsingAC()) { // A pointer to an object for coding the subband data --- 85,89 ---- if ( !bands(b).Skipped() ) { // If not skipped ... ! if (m_pparams.UsingAC()) { // A pointer to an object for coding the subband data *************** *** 93,106 **** if (b >= bands.Length()-3) { ! if ( m_fsort.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_fsort.IsIntra()); } else bcoder=new BandCodec(&subband_byteio , TOTAL_COEFF_CTXS , ! bands , b, m_fsort.IsIntra() ); num_band_bytes = bcoder->Compress(coeff_data); --- 94,107 ---- 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); *************** *** 114,122 **** BandVLC* bcoder; ! if ( m_fsort.IsIntra() && b == bands.Length() ) bcoder=new IntraDCBandVLC(&subband_byteio, bands ); else bcoder=new BandVLC(&subband_byteio , bands , b, ! m_fsort.IsIntra() ); num_band_bytes = bcoder->Compress(coeff_data); --- 115,123 ---- 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); *************** *** 125,129 **** } // Update the entropy correction factors ! m_encparams.EntropyFactors().Update(b , m_fsort , m_csort , estimated_bits[b] , 8*num_band_bytes); } else --- 126,130 ---- } // Update the entropy correction factors ! m_encparams.EntropyFactors().Update(b , m_pparams , csort , estimated_bits[b] , 8*num_band_bytes); } else Index: comp_compress.h =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/comp_compress.h,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** comp_compress.h 31 Jan 2008 11:25:18 -0000 1.17 --- comp_compress.h 29 Apr 2008 08:51:52 -0000 1.18 *************** *** 78,81 **** --- 78,82 ---- ComponentByteIO* Compress( CoeffArray& coeff_data , SubbandList& bands, + CompSort csort, const OneDArray<unsigned int>& estimated_bits); *************** *** 96,107 **** EncoderParams& m_encparams; ! const PictureParams& m_fparams; ! const PictureSort& m_fsort; const ChromaFormat& m_cformat; - CompSort m_csort; - float m_lambda; --- 97,106 ---- EncoderParams& m_encparams; ! const PictureParams& m_pparams; ! const PictureSort& m_psort; const ChromaFormat& m_cformat; float m_lambda; Index: picture_compress.h =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/picture_compress.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** picture_compress.h 31 Jan 2008 11:25:18 -0000 1.1 --- picture_compress.h 29 Apr 2008 08:51:52 -0000 1.2 *************** *** 117,120 **** --- 117,123 ---- PictureCompressor& operator=(const PictureCompressor& rhs); + //! Initialise the coefficient data array for holding wavelet coefficients + void InitCoeffData( CoeffArray& coeff_data, const int xl, const int yl ); + //! Analyses the ME data and returns true if a cut is detected, false otherwise void AnalyseMEData( const MEData& ); *************** *** 132,136 **** OneDArray<unsigned int>& est_counts, const CodeBlockMode cb_mode, ! const PictureSort fsort, const CompSort csort ); --- 135,139 ---- OneDArray<unsigned int>& est_counts, const CodeBlockMode cb_mode, ! const PictureParams& pp, const CompSort csort ); *************** *** 139,143 **** const int band_num, const float lambda, ! const PictureSort fsort, const CompSort csort ); --- 142,146 ---- const int band_num, const float lambda, ! const PictureParams& pp, const CompSort csort ); Index: quality_monitor.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/quality_monitor.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** quality_monitor.cpp 31 Jan 2008 15:20:05 -0000 1.30 --- quality_monitor.cpp 29 Apr 2008 08:51:52 -0000 1.31 *************** *** 47,51 **** m_quality_averageU(3), m_quality_averageV(3), ! m_frame_total(3) { ResetAll(); --- 47,51 ---- m_quality_averageU(3), m_quality_averageV(3), ! m_picture_total(3) { ResetAll(); *************** *** 63,72 **** m_quality_averageU[i] = 0.0; m_quality_averageV[i] = 0.0; ! m_frame_total[i] = 0; }// i m_totalquality_averageY = 0.0; m_totalquality_averageU = 0.0; m_totalquality_averageV = 0.0; ! m_allframe_total = 0; } --- 63,72 ---- m_quality_averageU[i] = 0.0; m_quality_averageV[i] = 0.0; ! m_picture_total[i] = 0; }// i m_totalquality_averageY = 0.0; m_totalquality_averageU = 0.0; m_totalquality_averageV = 0.0; ! m_allpicture_total = 0; } *************** *** 77,87 **** std::cout<<std::endl<<"Y: "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_totalquality_averageY/m_allframe_total<<std::endl; std::cout<<std::endl<<"U: "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_totalquality_averageU/m_allframe_total<<std::endl; std::cout<<std::endl<<"V: "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_totalquality_averageV/m_allframe_total<<std::endl; --- 77,87 ---- std::cout<<std::endl<<"Y: "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_totalquality_averageY/m_allpicture_total<<std::endl; std::cout<<std::endl<<"U: "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_totalquality_averageU/m_allpicture_total<<std::endl; std::cout<<std::endl<<"V: "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_totalquality_averageV/m_allpicture_total<<std::endl; *************** *** 94,150 **** std::cout<<std::endl<<" Intra || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageY[0]/m_frame_total[0]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageU[0]/m_frame_total[0]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageV[0]/m_frame_total[0]<<" || "; std::cout<<std::endl<<"-----------------||---------------------------------------------------"; std::cout<<std::endl<<" Inter Ref || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageY[1]/m_frame_total[1]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageU[1]/m_frame_total[1]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageV[1]/m_frame_total[1]<<" || "; std::cout<<std::endl<<"-----------------||---------------------------------------------------"; std::cout<<std::endl<<" Inter Non Ref || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageY[2]/m_frame_total[2]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageU[2]/m_frame_total[2]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageV[2]/m_frame_total[2]<<" || "; std::cout<<std::endl<<"-----------------||---------------------------------------------------"; } ! void QualityMonitor::UpdateModel(const Picture& ld_frame, const Picture& orig_frame ) { ! const PictureSort& fsort = ld_frame.GetPparams().PicSort(); int idx = fsort.IsIntra() ? 0 : (fsort.IsRef() ? 1 : 2); double fqualityY, fqualityU, fqualityV; ! fqualityY = QualityVal( ld_frame.Ydata() , orig_frame.Ydata(), ! m_encparams.OrigXl(), m_encparams.OrigYl(), Y_COMP); m_quality_averageY[idx] += fqualityY; m_totalquality_averageY += fqualityY; ! fqualityU = QualityVal( ld_frame.Udata() , orig_frame.Udata(), ! m_encparams.OrigChromaXl(), ! m_encparams.OrigChromaYl(), U_COMP); m_quality_averageU[idx] += fqualityU; m_totalquality_averageU += fqualityU; ! fqualityV = QualityVal( ld_frame.Vdata() , orig_frame.Vdata(), ! m_encparams.OrigChromaXl(), ! m_encparams.OrigChromaYl(), V_COMP); m_quality_averageV[idx] += fqualityV; m_totalquality_averageV += fqualityV; ! m_frame_total[idx]++; ! m_allframe_total++; if (m_encparams.Verbose() ) --- 94,150 ---- std::cout<<std::endl<<" Intra || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageY[0]/m_picture_total[0]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageU[0]/m_picture_total[0]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageV[0]/m_picture_total[0]<<" || "; std::cout<<std::endl<<"-----------------||---------------------------------------------------"; std::cout<<std::endl<<" Inter Ref || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageY[1]/m_picture_total[1]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageU[1]/m_picture_total[1]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageV[1]/m_picture_total[1]<<" || "; std::cout<<std::endl<<"-----------------||---------------------------------------------------"; std::cout<<std::endl<<" Inter Non Ref || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageY[2]/m_picture_total[2]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageU[2]/m_picture_total[2]<<" || "; std::cout.width(5);std::cout.precision(4); ! std::cout<<m_quality_averageV[2]/m_picture_total[2]<<" || "; std::cout<<std::endl<<"-----------------||---------------------------------------------------"; } ! void QualityMonitor::UpdateModel(const Picture& ld_picture, const Picture& orig_picture ) { ! const PictureSort& fsort = ld_picture.GetPparams().PicSort(); int idx = fsort.IsIntra() ? 0 : (fsort.IsRef() ? 1 : 2); double fqualityY, fqualityU, fqualityV; ! fqualityY = QualityVal( ld_picture.Ydata() , orig_picture.Ydata(), ! m_encparams.Xl(), m_encparams.Yl(), Y_COMP); m_quality_averageY[idx] += fqualityY; m_totalquality_averageY += fqualityY; ! fqualityU = QualityVal( ld_picture.Udata() , orig_picture.Udata(), ! m_encparams.ChromaXl(), ! m_encparams.ChromaYl(), U_COMP); m_quality_averageU[idx] += fqualityU; m_totalquality_averageU += fqualityU; ! fqualityV = QualityVal( ld_picture.Vdata() , orig_picture.Vdata(), ! m_encparams.ChromaXl(), ! m_encparams.ChromaYl(), V_COMP); m_quality_averageV[idx] += fqualityV; m_totalquality_averageV += fqualityV; ! m_picture_total[idx]++; ! m_allpicture_total++; if (m_encparams.Verbose() ) Index: seq_compress.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/seq_compress.cpp,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** seq_compress.cpp 15 Apr 2008 09:56:12 -0000 1.54 --- seq_compress.cpp 29 Apr 2008 08:51:52 -0000 1.55 *************** *** 66,138 **** m_encparams.SetEntropyFactors( new EntropyCorrector(m_encparams.TransformDepth()) ); ! //We have to set up the block parameters and file padding. This needs to take into ! //account both blocks for motion compensation and also wavelet transforms ! ! //Amount of horizontal padding for Y,U and V components ! int xpad_luma,xpad_chroma; ! ! //Amount of vertical padding for Y,U and V components ! int ypad_luma,ypad_chroma; ! ! //First, we need to have sufficient padding to take account of the blocksizes. ! //It's sufficient to check for chroma ! ! ! int xl_chroma = m_encparams.OrigChromaXl(); ! int yl_chroma = m_encparams.OrigChromaYl(); ! xpad_chroma = ypad_chroma = 0; ! // The pic dimensions must be a multiple of 2^(transform depth). ! int tx_mul = 1<<m_encparams.TransformDepth(); ! ! if ( xl_chroma%tx_mul != 0 ) ! xpad_chroma = ( (xl_chroma/tx_mul)+1 ) *tx_mul - xl_chroma; ! if ( yl_chroma%tx_mul != 0 ) ! ypad_chroma = ( (yl_chroma/tx_mul)+1 ) * tx_mul - yl_chroma; ! ! int xpad_chroma_len = xl_chroma+xpad_chroma; ! int ypad_chroma_len = yl_chroma+ypad_chroma; // Make sure we have enough macroblocks to cover the pictures m_encparams.SetXNumMB( xl_chroma/m_encparams.ChromaBParams(0).Xbsep() ); m_encparams.SetYNumMB( yl_chroma/m_encparams.ChromaBParams(0).Ybsep() ); if ( m_encparams.XNumMB() * m_encparams.ChromaBParams(0).Xbsep() < xl_chroma ) - { m_encparams.SetXNumMB( m_encparams.XNumMB() + 1 ); - } - if ( m_encparams.YNumMB() * m_encparams.ChromaBParams(0).Ybsep() < yl_chroma ) - { m_encparams.SetYNumMB( m_encparams.YNumMB() + 1 ); - } - - - xpad_luma = ypad_luma = 0; - int xpad_len = m_encparams.OrigXl(); - int ypad_len = m_encparams.OrigYl(); - - // The pic dimensions must be a multiple of 2^(transform depth). - if ( xpad_len%tx_mul != 0 ) - xpad_luma = ( (xpad_len/tx_mul)+1 ) *tx_mul - xpad_len; - if ( ypad_len%tx_mul != 0 ) - ypad_luma = ( (ypad_len/tx_mul)+1 ) * tx_mul - ypad_len; - - xpad_len += xpad_luma; - ypad_len += ypad_luma; - // NOTE: Do we need to recalculate the number of Macro blocks!!! - - // Note that we do not have an integral number of macroblocks in a picture - // So it is possible that part of a macro-block and some blocks can fall - // of the edge of the padded picture. We need to take this into - // consideration while doing Motion Estimation m_encparams.SetXNumBlocks( 4 * m_encparams.XNumMB() ); m_encparams.SetYNumBlocks( 4 * m_encparams.YNumMB() ); ! // Set up the picture buffers with the PADDED picture sizes m_fbuffer = new PictureBuffer( m_srcparams.CFormat() , m_encparams.NumL1() , m_encparams.L1Sep() , ! m_encparams.OrigXl(), m_encparams.OrigYl(), ! xpad_len , ypad_len, ! xpad_chroma_len, ypad_chroma_len, m_encparams.LumaDepth(), m_encparams.ChromaDepth(), --- 66,88 ---- m_encparams.SetEntropyFactors( new EntropyCorrector(m_encparams.TransformDepth()) ); ! int xl_chroma = m_encparams.ChromaXl(); ! int yl_chroma = m_encparams.ChromaYl(); // Make sure we have enough macroblocks to cover the pictures m_encparams.SetXNumMB( xl_chroma/m_encparams.ChromaBParams(0).Xbsep() ); m_encparams.SetYNumMB( yl_chroma/m_encparams.ChromaBParams(0).Ybsep() ); + if ( m_encparams.XNumMB() * m_encparams.ChromaBParams(0).Xbsep() < xl_chroma ) m_encparams.SetXNumMB( m_encparams.XNumMB() + 1 ); if ( m_encparams.YNumMB() * m_encparams.ChromaBParams(0).Ybsep() < yl_chroma ) m_encparams.SetYNumMB( m_encparams.YNumMB() + 1 ); m_encparams.SetXNumBlocks( 4 * m_encparams.XNumMB() ); m_encparams.SetYNumBlocks( 4 * m_encparams.YNumMB() ); ! // Set up the picture buffers m_fbuffer = new PictureBuffer( m_srcparams.CFormat() , m_encparams.NumL1() , m_encparams.L1Sep() , ! m_encparams.Xl(), m_encparams.Yl(), m_encparams.LumaDepth(), m_encparams.ChromaDepth(), *************** *** 140,150 **** m_encparams.UsingAC()); ! // Retain the original picture dimensions for the Motion estimation ! // buffer m_mebuffer = new PictureBuffer( m_srcparams.CFormat() , m_encparams.NumL1() , m_encparams.L1Sep() , ! m_encparams.OrigXl(), m_encparams.OrigYl(), ! m_encparams.OrigXl(), m_encparams.OrigYl(), ! xl_chroma, yl_chroma, m_encparams.LumaDepth(), m_encparams.ChromaDepth(), --- 90,97 ---- m_encparams.UsingAC()); ! // Retain the original pictures the motion estimation buffer m_mebuffer = new PictureBuffer( m_srcparams.CFormat() , m_encparams.NumL1() , m_encparams.L1Sep() , ! m_encparams.Xl(), m_encparams.Yl(), m_encparams.LumaDepth(), m_encparams.ChromaDepth(), *************** *** 297,303 **** Picture& my_picture = m_fbuffer->GetPicture( m_current_display_pnum ); ! PictureParams& fparams = my_picture.GetPparams(); ! if (fparams.PicSort().IsRef()) m_fbuffer->SetRetiredPictureNum( m_show_pnum, m_current_display_pnum ); --- 244,250 ---- Picture& my_picture = m_fbuffer->GetPicture( m_current_display_pnum ); ! PictureParams& pparams = my_picture.GetPparams(); ! if (pparams.PicSort().IsRef()) m_fbuffer->SetRetiredPictureNum( m_show_pnum, m_current_display_pnum ); *************** *** 307,314 **** std::cout<<std::endl<<"References " << (m_encparams.FieldCoding() ? "field " : "frame ") ! << fparams.Refs()[0]; ! if (fparams.Refs().size() > 1) { ! std::cout<<" and "<< fparams.Refs()[1]; } } --- 254,261 ---- std::cout<<std::endl<<"References " << (m_encparams.FieldCoding() ? "field " : "frame ") ! << pparams.Refs()[0]; ! if (pparams.Refs().size() > 1) { ! std::cout<<" and "<< pparams.Refs()[1]; } } *************** *** 573,603 **** return; ! PictureByteIO *p_picture_byteio; ! ! p_picture_byteio = m_pcoder.Compress(*m_fbuffer, ! m_current_display_pnum); ! ! PictureParams& fparams = my_frame.GetPparams(); ! const PictureSort& fsort = fparams.PicSort(); ! // Coding using Rate Control Algorithm ! if ( fsort.IsIntra() && ! m_current_display_pnum != 0 && ! m_encparams.NumL1() != 0) ! { // Calculate the new QF for encoding the following I pictures in the sequence // in normal coding ! if ( is_a_cut ) ! { ! // Recompute the QF based on long-term history since recent history is bunk m_ratecontrol->SetCutPictureQualFactor(); - } else m_ratecontrol->CalcNextIntraQualFactor(); } // add the picture to the byte stream --- 520,542 ---- return; ! PictureParams& pparams = my_frame.GetPparams(); ! const PictureSort& fsort = pparams.PicSort(); // Coding using Rate Control Algorithm ! if ( fsort.IsIntra() && m_current_display_pnum != 0 && ! m_encparams.NumL1() != 0){ // Calculate the new QF for encoding the following I pictures in the sequence // in normal coding ! if ( is_a_cut ) // Recompute the QF based on long-term history since recent history is bunk m_ratecontrol->SetCutPictureQualFactor(); else m_ratecontrol->CalcNextIntraQualFactor(); } + PictureByteIO *p_picture_byteio; + p_picture_byteio = m_pcoder.Compress(*m_fbuffer, + m_current_display_pnum); // add the picture to the byte stream *************** *** 606,610 **** // Update the quality factor ! m_ratecontrol->CalcNextQualFactor(fparams, p_picture_byteio->GetSize()*8); } --- 545,549 ---- // Update the quality factor ! m_ratecontrol->CalcNextQualFactor(pparams, p_picture_byteio->GetSize()*8); } *************** *** 628,633 **** m_pic_in->ReadNextFrame( *m_fbuffer, m_last_picture_read+1 ); ! if ( m_pic_in->End() ) ! { m_all_done = true; return false; --- 567,571 ---- m_pic_in->ReadNextFrame( *m_fbuffer, m_last_picture_read+1 ); ! if ( m_pic_in->End() ){ m_all_done = true; return false; *************** *** 745,757 **** return; ! ! PictureByteIO *p_picture_byteio; ! ! p_picture_byteio = m_pcoder.Compress(*m_fbuffer, ! m_current_display_pnum); ! ! ! PictureParams& fparams = my_picture.GetPparams(); ! const PictureSort& fsort = fparams.PicSort(); // Coding using Rate Control Algorithm --- 683,688 ---- return; ! PictureParams& pparams = my_picture.GetPparams(); ! const PictureSort& fsort = pparams.PicSort(); // Coding using Rate Control Algorithm *************** *** 764,775 **** if ( is_a_cut ) - { // Recompute the QF based on long-term history since recent history is bunk m_ratecontrol->SetCutPictureQualFactor(); - } else if (m_current_display_pnum%2 == 0) m_ratecontrol->CalcNextIntraQualFactor(); } if (m_current_display_pnum%2 == 0) --- 695,707 ---- if ( is_a_cut ) // Recompute the QF based on long-term history since recent history is bunk m_ratecontrol->SetCutPictureQualFactor(); else if (m_current_display_pnum%2 == 0) m_ratecontrol->CalcNextIntraQualFactor(); } + PictureByteIO *p_picture_byteio; + p_picture_byteio = m_pcoder.Compress(*m_fbuffer, + m_current_display_pnum); if (m_current_display_pnum%2 == 0) *************** *** 779,785 **** // Update the quality factor ! if (fparams.PictureNum()%2) ! m_ratecontrol->CalcNextQualFactor(fparams, (m_field1_bytes+m_field2_bytes)*8); ! // add the picture to the byte stream --- 711,716 ---- // Update the quality factor ! if (pparams.PictureNum()%2) ! m_ratecontrol->CalcNextQualFactor(pparams, (m_field1_bytes+m_field2_bytes)*8); // add the picture to the byte stream Index: quality_monitor.h =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/quality_monitor.h,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** quality_monitor.h 31 Jan 2008 11:25:18 -0000 1.15 --- quality_monitor.h 29 Apr 2008 08:51:52 -0000 1.16 *************** *** 69,76 **** /*! Update the quality factors, returning true if we need to recode ! \param ld_frame the locally-decoded picture ! \param orig_frame the original picture */ ! void UpdateModel(const Picture& ld_frame, const Picture& orig_frame ); //! Reset the quality factors (say if there's been a cut) --- 69,76 ---- /*! Update the quality factors, returning true if we need to recode ! \param ld_picture the locally-decoded picture ! \param orig_picture the original picture */ ! void UpdateModel(const Picture& ld_picture, const Picture& orig_picture ); //! Reset the quality factors (say if there's been a cut) *************** *** 106,111 **** long double m_totalquality_averageV; ! //! The total number of frames coded ! int m_allframe_total; //! The average Y quality for the picture types --- 106,111 ---- long double m_totalquality_averageV; ! //! The total number of pictures coded ! int m_allpicture_total; //! The average Y quality for the picture types *************** *** 118,123 **** OneDArray<long double> m_quality_averageV; ! //! The number of frames of each type ! OneDArray<int> m_frame_total; }; --- 118,123 ---- OneDArray<long double> m_quality_averageV; ! //! The number of pictures of each type ! OneDArray<int> m_picture_total; }; Index: dirac_encoder.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_encoder/dirac_encoder.cpp,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** dirac_encoder.cpp 6 Mar 2008 08:04:01 -0000 1.43 --- dirac_encoder.cpp 29 Apr 2008 08:51:52 -0000 1.44 *************** *** 496,505 **** m_encparams.SetLocalDecode(enc_ctx->decode_flag); ! m_encparams.SetOrigXl( enc_ctx->src_params.width ); ! m_encparams.SetOrigYl( enc_ctx->src_params.height ); ! m_encparams.SetOrigChromaXl( enc_ctx->src_params.chroma_width ); ! m_encparams.SetOrigChromaYl( enc_ctx->src_params.chroma_height ); ! if (enc_ctx->enc_params.picture_coding_mode > 1) { std::ostringstream errstr; --- 496,505 ---- m_encparams.SetLocalDecode(enc_ctx->decode_flag); ! m_encparams.SetXl( enc_ctx->src_params.width ); ! m_encparams.SetYl( enc_ctx->src_params.height ); ! m_encparams.SetChromaXl( enc_ctx->src_params.chroma_width ); ! m_encparams.SetChromaYl( enc_ctx->src_params.chroma_height ); ! if (enc_ctx->enc_params.picture_coding_mode > 3) { std::ostringstream errstr; *************** *** 507,511 **** errstr << "Picture coding mode " << enc_ctx->enc_params.picture_coding_mode ! << " out of supported range [0-2]"; DIRAC_THROW_EXCEPTION( ERR_INVALID_INIT_DATA, --- 507,511 ---- errstr << "Picture coding mode " << enc_ctx->enc_params.picture_coding_mode ! << " out of supported range [0-3]"; DIRAC_THROW_EXCEPTION( ERR_INVALID_INIT_DATA, *************** *** 514,523 **** } ! m_encparams.SetFieldCoding(enc_ctx->enc_params.picture_coding_mode == 1); if (m_encparams.FieldCoding()) { // Change coding dimensions to field dimensions ! m_encparams.SetOrigYl( enc_ctx->src_params.height>>1 ); ! m_encparams.SetOrigChromaYl( enc_ctx->src_params.chroma_height >> 1); } --- 514,523 ---- } ! m_encparams.SetPictureCodingMode(enc_ctx->enc_params.picture_coding_mode); if (m_encparams.FieldCoding()) { // Change coding dimensions to field dimensions ! m_encparams.SetYl( enc_ctx->src_params.height>>1 ); ! m_encparams.SetChromaYl( enc_ctx->src_params.chroma_height >> 1); } *************** *** 794,798 **** sstats->vcomp_bits = dirac_seq_stats.GetBitCount(STAT_VCOMP_BYTE_COUNT); ! sstats->bit_rate = int((sstats->seq_bits * (double)m_srcparams.FrameRate().m_num)/ (m_srcparams.FrameRate().m_denom * m_num_coded_pictures)); --- 794,798 ---- sstats->vcomp_bits = dirac_seq_stats.GetBitCount(STAT_VCOMP_BYTE_COUNT); ! sstats->bit_rate = int64_t((sstats->seq_bits * (double)m_srcparams.FrameRate().m_num)/ (m_srcparams.FrameRate().m_denom * m_num_coded_pictures)); |