1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- From 88fae6224b54ecf92ac6e3ae5083c3f352adc798 Mon Sep 17 00:00:00 2001
- From: Anuradha Suraparaju <anuradha@hoyle.rd.bbc.co.uk>
- Date: Fri, 17 Apr 2009 17:47:27 +1000
- Subject: [PATCH] Fix uninitialised memory read that causes the encoder to crash when using
- non-overlapping blocks.
- ---
- libdirac_common/mot_comp.cpp | 21 +++++++++++++++------
- 1 files changed, 15 insertions(+), 6 deletions(-)
- diff --git a/libdirac_common/mot_comp.cpp b/libdirac_common/mot_comp.cpp
- index aa8d37c..e0ec2ff 100644
- --- a/libdirac_common/mot_comp.cpp
- +++ b/libdirac_common/mot_comp.cpp
- @@ -306,6 +306,8 @@ void MotionCompensator::CompensateComponent( Picture* pic ,
-
- int save_from_row = m_bparams.Ybsep()-m_bparams.Yoffset();
-
- + bool row_overlap = ((m_bparams.Yblen() - m_bparams.Ybsep()) > 0);
- +
- // unpadded picture dimensions
- const int x_end_data = pic_data_out.FirstX() + std::min(pic_data_out.LengthX(), pic_size.x );
- const int y_end_data = pic_data_out.FirstY() + std::min(pic_data_out.LengthY(), pic_size.y );
- @@ -489,12 +491,19 @@ void MotionCompensator::CompensateComponent( Picture* pic ,
- //Increment the block vertical position
- pos.y += m_bparams.Ybsep();
-
- - // Copy the rows required to motion compensate the next row of block.
- - // This is usually Yblen-Ybsep rows.
- - memmove (pic_data[0], pic_data[save_from_row], (m_bparams.Yblen() - save_from_row)*pic_data.LengthX()*sizeof(ValueType));
- - memset( pic_data[m_bparams.Yblen() - save_from_row], 0, save_from_row*pic_data.LengthX()*sizeof(ValueType) );
- - save_from_row = m_bparams.Ybsep();
- -
- + if (row_overlap)
- + {
- + // Copy the rows required to motion compensate the next row of
- + // blocks. This is usually Yblen-Ybsep rows.
- + memmove (pic_data[0], pic_data[save_from_row], (m_bparams.Yblen() - save_from_row)*pic_data.LengthX()*sizeof(ValueType));
- + memset( pic_data[m_bparams.Yblen() - save_from_row], 0, save_from_row*pic_data.LengthX()*sizeof(ValueType) );
- + save_from_row = m_bparams.Ybsep();
- + }
- + else
- + {
- + // no row overlap. So reset pic_data to 0.
- + memset( pic_data[0], 0, m_bparams.Yblen()*pic_data.LengthX()*sizeof(ValueType) );
- + }
- }//yblock
-
- if ( m_add_or_sub == SUBTRACT)
- --
- 1.7.0.4
|