Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37778046
en ru br
Репозитории ALT
S:1.0.2-alt2.1
D:0.10.0-alt0.1
5.1: 0.10.0-alt1
4.1: 0.9.1-alt1
4.0: 0.7.0-alt1
www.altlinux.org/Changes

Группа :: Видео
Пакет: dirac

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: 0001-Fix-uninitialised-memory-read-that-causes-the-encode.patch
Скачать


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.3
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin