53 lines
2.3 KiB
Diff
53 lines
2.3 KiB
Diff
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
|
|
|