summaryrefslogtreecommitdiff
path: root/multimedia/dirac/encoder.patch
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia/dirac/encoder.patch')
-rw-r--r--multimedia/dirac/encoder.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/multimedia/dirac/encoder.patch b/multimedia/dirac/encoder.patch
new file mode 100644
index 0000000000..a1b8d9bcb0
--- /dev/null
+++ b/multimedia/dirac/encoder.patch
@@ -0,0 +1,52 @@
+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
+