From: Thomas D. <tj...@us...> - 2006-10-30 13:42:51
|
Update of /cvsroot/dirac/compress/libdirac_common In directory sc8-pr-cvs12.sourceforge.net:/tmp/cvs-serv10115/libdirac_common Modified Files: band_codec.cpp motion.cpp motion.h mv_codec.cpp Log Message: Fixed definitions of mean/median so that unbiased mean values are used. Likewise changed the prediction for DC values to take account of the fact that they may be negative. These changes change the bitstream. Index: band_codec.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_common/band_codec.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** band_codec.cpp 19 Oct 2006 13:53:54 -0000 1.28 --- band_codec.cpp 30 Oct 2006 13:42:41 -0000 1.29 *************** *** 837,841 **** { if (xpos!=0) ! return (data[ypos][xpos - 1] + data[ypos - 1][xpos - 1] + data[ypos - 1][xpos]) / 3; else return data[ypos - 1][0]; --- 837,847 ---- { if (xpos!=0) ! { ! int sum = data[ypos][xpos-1] + data[ypos-1][xpos-1] + data[ypos-1][xpos]; ! if (sum>0) ! return (sum+1)/3; ! else ! return -((-sum)+1)/3; ! } else return data[ypos - 1][0]; Index: motion.h =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_common/motion.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** motion.h 28 Jul 2006 13:33:16 -0000 1.19 --- motion.h 30 Oct 2006 13:42:42 -0000 1.20 *************** *** 418,422 **** //! Return the mean of two motion vectors ! MVector MvMean(MVector& mv1,MVector& mv2); //! Return the squared length of a motion vector --- 418,422 ---- //! Return the mean of two motion vectors ! MVector MvMean(const MVector& mv1, const MVector& mv2); //! Return the squared length of a motion vector *************** *** 431,442 **** //! Return the mean of a set of unsigned integer values ! inline unsigned int GetMean(std::vector<unsigned int>& values){ ! int sum=0; ! for (unsigned int I=0;I<values.size();++I) ! sum+=values[I]; ! sum+=(values.size()>>1); ! sum/=values.size(); ! return sum; ! } } // namespace dirac --- 431,438 ---- //! Return the mean of a set of unsigned integer values ! unsigned int GetUMean(std::vector<unsigned int>& values); ! ! //! Return the mean of a set of signed integer values ! int GetSMean(std::vector<int>& values); } // namespace dirac Index: motion.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_common/motion.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** motion.cpp 28 Jul 2006 13:33:16 -0000 1.18 --- motion.cpp 30 Oct 2006 13:42:42 -0000 1.19 *************** *** 508,594 **** MVector MvMedian(const std::vector<MVector>& vect_list){ ! //more general median. Takes the median of each vector component ! MVector median; ! int num_vals=int(vect_list.size()); ! if (num_vals>0) { ! int pos=0; ! std::vector<int> ordered_vals(vect_list.size()); ! //do x first ! ordered_vals[0]=vect_list[0].x; ! for (int I=1;I<num_vals;++I){ ! for (int K=0;K<I;++K){ ! if (vect_list[I].x<ordered_vals[K]){ ! pos=K; ! break; ! } ! else ! pos=K+1; ! }//K ! if (pos==I) ! ordered_vals[I]=vect_list[I].x; ! else{ ! for (int K=I-1;K>=pos;--K){ ! ordered_vals[K+1]=ordered_vals[K]; ! } ! ordered_vals[pos]=vect_list[I].x; ! } ! }//I ! if (vect_list.size()%2!=0) ! median.x=ordered_vals[(num_vals-1)/2]; ! else ! median.x=(ordered_vals[(num_vals/2)-1]+ordered_vals[num_vals/2])/2; ! //now do y ! ordered_vals[0]=vect_list[0].y; ! for (int I=1;I<num_vals;++I){ ! for (int K=0;K<I;++K){ ! if (vect_list[I].y<ordered_vals[K]){ ! pos=K; ! break; } ! else ! pos=K+1; ! }//K ! if (pos==I) ! ordered_vals[I]=vect_list[I].y; ! else{ ! for (int K=I-1;K>=pos;--K){ ! ordered_vals[K+1]=ordered_vals[K]; } ! ordered_vals[pos]=vect_list[I].y; ! } ! }//I ! if (num_vals%2!=0) ! median.y=ordered_vals[(num_vals-1)/2]; ! else ! median.y=(ordered_vals[(num_vals/2)-1]+ordered_vals[num_vals/2])/2; ! } ! else{ ! median.x=0; ! median.y=0; } - return median; } ! //! Return the mean of two motion vectors ! MVector MvMean(MVector& mv1,MVector& mv2) { ! //takes median of each vector component MVector tmp_mv; ! tmp_mv.x=mv1.x; ! tmp_mv.x+=mv2.x; ! tmp_mv.x/=2; ! tmp_mv.y=mv1.y; ! tmp_mv.y+=mv2.y; ! tmp_mv.y/=2; return tmp_mv; } } // namespace dirac --- 508,667 ---- MVector MvMedian(const std::vector<MVector>& vect_list){ ! //median of 0-3 vectors ! ! if ( vect_list.size() == 0 ) ! return 0; ! else if ( vect_list.size() == 1 ) ! return vect_list[0]; ! else if ( vect_list.size() == 2 ) ! return MvMean( vect_list[0], vect_list[1] ); ! else if ( vect_list.size() == 3 ) ! return MvMedian(vect_list[0], vect_list[1], vect_list[2] ); ! else if ( vect_list.size() == 4 ) ! { ! MVector tmp_mv(0); ! MVector max_mv(vect_list[0]); ! MVector min_mv(vect_list[0]); ! for (int i=0; i<4; ++i ) ! { ! tmp_mv.x += vect_list[i].x; ! max_mv.x=std::max(max_mv.x, vect_list[i].x); ! min_mv.x=std::min(min_mv.x, vect_list[i].x); ! tmp_mv.y += vect_list[i].y; ! max_mv.y=std::max(max_mv.y, vect_list[i].y); ! min_mv.y=std::min(min_mv.y, vect_list[i].y); ! }// i ! ! tmp_mv.x -= (max_mv.x+min_mv.x); ! tmp_mv.y -= (max_mv.y+min_mv.y); ! ! tmp_mv.x = (tmp_mv.x+1)>>1; ! tmp_mv.y = (tmp_mv.y+1)>>1; ! ! return tmp_mv; ! ! } ! else ! { ! MVector median; ! int num_vals=int(vect_list.size()); ! if (num_vals>0) { ! int pos=0; ! std::vector<int> ordered_vals(vect_list.size()); ! //do x first ! ordered_vals[0]=vect_list[0].x; ! for (int I=1;I<num_vals;++I){ ! for (int K=0;K<I;++K){ ! if (vect_list[I].x<ordered_vals[K]){ ! pos=K; ! break; ! } ! else ! pos=K+1; ! }//K ! if (pos==I) ! ordered_vals[I]=vect_list[I].x; ! else{ ! for (int K=I-1;K>=pos;--K){ ! ordered_vals[K+1]=ordered_vals[K]; ! } ! ordered_vals[pos]=vect_list[I].x; } ! }//I ! if (vect_list.size()%2!=0) ! median.x=ordered_vals[(num_vals-1)/2]; ! else ! median.x=(ordered_vals[(num_vals/2)-1]+ordered_vals[num_vals/2]+1)>>1; ! ! //now do y ! ordered_vals[0]=vect_list[0].y; ! for (int I=1;I<num_vals;++I){ ! for (int K=0;K<I;++K){ ! if (vect_list[I].y<ordered_vals[K]){ ! pos=K; ! break; ! } ! else ! pos=K+1; ! }//K ! if (pos==I) ! ordered_vals[I]=vect_list[I].y; ! else{ ! for (int K=I-1;K>=pos;--K){ ! ordered_vals[K+1]=ordered_vals[K]; ! } ! ordered_vals[pos]=vect_list[I].y; } ! }//I ! if (num_vals%2!=0) ! median.y=ordered_vals[(num_vals-1)/2]; ! else ! median.y=(ordered_vals[(num_vals/2)-1]+ordered_vals[num_vals/2]+1)>>1; ! } ! else{ ! median.x=0; ! median.y=0; ! } ! ! return median; } } ! ! //! Return the unbiased mean of two motion vectors ! MVector MvMean(const MVector& mv1, const MVector& mv2) ! { ! //takes mean of each vector component MVector tmp_mv; ! tmp_mv.x = mv1.x; ! tmp_mv.x += mv2.x+1; ! tmp_mv.x >>= 1; ! tmp_mv.y = mv1.y; ! tmp_mv.y += mv2.y+1; ! tmp_mv.y >>= 1; return tmp_mv; } + //! Return the mean of a set of unsigned integer values + unsigned int GetUMean(std::vector<unsigned int>& values) + { + unsigned int sum=0; + for (unsigned int I=0;I<values.size();++I) + sum+=values[I]; + sum+=(values.size()>>1); + sum/=values.size(); + + return sum; + } + + //! Return the mean of a set of signed integer values + int GetSMean(std::vector<int>& values) + { + int sum=0; + for (unsigned int I=0;I<values.size();++I) + sum+=values[I]; + if ( sum>0 ) + { + sum+=(values.size()>>1); + sum/=values.size(); + } + else + { + sum = -sum; + sum+=(values.size()>>1); + sum/=values.size(); + sum = -sum; + } + + return sum; + } } // namespace dirac Index: mv_codec.cpp =================================================================== RCS file: /cvsroot/dirac/compress/libdirac_common/mv_codec.cpp,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** mv_codec.cpp 28 Jul 2006 13:33:16 -0000 1.25 --- mv_codec.cpp 30 Oct 2006 13:42:42 -0000 1.26 *************** *** 93,97 **** nbrs.push_back( split_data[m_mb_yp][m_mb_xp-1] ); ! result = GetMean(nbrs); } else if (m_mb_xp > 0 && m_mb_yp == 0) --- 93,97 ---- nbrs.push_back( split_data[m_mb_yp][m_mb_xp-1] ); ! result = GetUMean(nbrs); } else if (m_mb_xp > 0 && m_mb_yp == 0) *************** *** 243,247 **** if (nbrs.size() > 0) ! result = ValueType(GetMean(nbrs)); } else if (m_b_xp > 0 && m_b_yp == 0) --- 243,247 ---- if (nbrs.size() > 0) ! result = ValueType(GetUMean(nbrs)); } else if (m_b_xp > 0 && m_b_yp == 0) |