# HG changeset patch # User Steve Borho <st...@borho.org> # Date 1382647728 18000 # Thu Oct 24 15:48:48 2013 -0500 # Branch stable # Node ID 0315cf14dedaaf53b388105fb7744f9a44ae65c0 # Parent a54a9fa53063dbb792e73bc014b4949b26d37053 TComPicYuv: fix padding of picture buffers
Ensure row starts are at a multiple of 32, this causes strides to be multiple of 64. Before this patch, strides we capable of being multiples of 8, causing alignment exceptions for some videos. diff -r a54a9fa53063 -r 0315cf14deda source/Lib/TLibCommon/TComPicYuv.cpp --- a/source/Lib/TLibCommon/TComPicYuv.cpp Thu Oct 24 15:13:13 2013 -0500 +++ b/source/Lib/TLibCommon/TComPicYuv.cpp Thu Oct 24 15:48:48 2013 -0500 @@ -73,36 +73,34 @@ m_cuWidth = maxCUWidth; m_cuHeight = maxCUHeight; - int numCuInWidth = (m_picWidth + m_cuWidth - 1) / m_cuWidth; - int numCuInHeight = (m_picHeight + m_cuHeight - 1) / m_cuHeight; + m_numCuInWidth = (m_picWidth + m_cuWidth - 1) / m_cuWidth; + m_numCuInHeight = (m_picHeight + m_cuHeight - 1) / m_cuHeight; - m_numCuInWidth = numCuInWidth; - m_numCuInHeight = numCuInHeight; + m_lumaMarginX = g_maxCUWidth + 32; // search margin and 8-tap filter half-length, padded for 32-byte alignment + m_lumaMarginY = g_maxCUHeight + 4; // search margin and 8-tap filter half-length + m_stride = (m_numCuInWidth * g_maxCUWidth) + (m_lumaMarginX << 1); - m_lumaMarginX = g_maxCUWidth + 16; // for 16-byte alignment - m_lumaMarginY = g_maxCUHeight + 16; // margin for 8-tap filter and infinite padding - m_stride = m_picWidth + (m_lumaMarginX << 1); + m_chromaMarginX = m_lumaMarginX; // keep 16-byte alignment for chroma CTUs + m_chromaMarginY = m_lumaMarginY >> 1; + m_strideC = ((m_numCuInWidth * g_maxCUWidth) >> 1) + (m_chromaMarginX << 1); + int maxHeight = m_numCuInHeight * g_maxCUHeight; - m_chromaMarginX = m_lumaMarginX; // keep 16-byte alignment for chroma CTUs - m_chromaMarginY = m_lumaMarginY >> 1; - m_strideC = (m_picWidth >> 1) + (m_chromaMarginX << 1); - - m_picBufY = (Pel*)X265_MALLOC(Pel, (m_picWidth + (m_lumaMarginX << 1)) * (m_picHeight + (m_lumaMarginY << 1))); - m_picBufU = (Pel*)X265_MALLOC(Pel, ((m_picWidth >> 1) + (m_chromaMarginX << 1)) * ((m_picHeight >> 1) + (m_chromaMarginY << 1))); - m_picBufV = (Pel*)X265_MALLOC(Pel, ((m_picWidth >> 1) + (m_chromaMarginX << 1)) * ((m_picHeight >> 1) + (m_chromaMarginY << 1))); + m_picBufY = (Pel*)X265_MALLOC(Pel, m_stride * (maxHeight + (m_lumaMarginY << 1))); + m_picBufU = (Pel*)X265_MALLOC(Pel, m_strideC * ((maxHeight >> 1) + (m_chromaMarginY << 1))); + m_picBufV = (Pel*)X265_MALLOC(Pel, m_strideC * ((maxHeight >> 1) + (m_chromaMarginY << 1))); m_picOrgY = m_picBufY + m_lumaMarginY * getStride() + m_lumaMarginX; m_picOrgU = m_picBufU + m_chromaMarginY * getCStride() + m_chromaMarginX; m_picOrgV = m_picBufV + m_chromaMarginY * getCStride() + m_chromaMarginX; - m_cuOffsetY = new int[numCuInWidth * numCuInHeight]; - m_cuOffsetC = new int[numCuInWidth * numCuInHeight]; - for (int cuRow = 0; cuRow < numCuInHeight; cuRow++) + m_cuOffsetY = new int[m_numCuInWidth * m_numCuInHeight]; + m_cuOffsetC = new int[m_numCuInWidth * m_numCuInHeight]; + for (int cuRow = 0; cuRow < m_numCuInHeight; cuRow++) { - for (int cuCol = 0; cuCol < numCuInWidth; cuCol++) + for (int cuCol = 0; cuCol < m_numCuInWidth; cuCol++) { - m_cuOffsetY[cuRow * numCuInWidth + cuCol] = getStride() * cuRow * m_cuHeight + cuCol * m_cuWidth; - m_cuOffsetC[cuRow * numCuInWidth + cuCol] = getCStride() * cuRow * (m_cuHeight / 2) + cuCol * (m_cuWidth / 2); + m_cuOffsetY[cuRow * m_numCuInWidth + cuCol] = getStride() * cuRow * m_cuHeight + cuCol * m_cuWidth; + m_cuOffsetC[cuRow * m_numCuInWidth + cuCol] = getCStride() * cuRow * (m_cuHeight / 2) + cuCol * (m_cuWidth / 2); } } diff -r a54a9fa53063 -r 0315cf14deda source/common/reference.cpp --- a/source/common/reference.cpp Thu Oct 24 15:13:13 2013 -0500 +++ b/source/common/reference.cpp Thu Oct 24 15:48:48 2013 -0500 @@ -67,12 +67,9 @@ if (w) { - int width = pic->getWidth(); - int height = pic->getHeight(); - size_t padwidth = width + pic->m_lumaMarginX * 2; - size_t padheight = height + pic->m_lumaMarginY * 2; + size_t padheight = (pic->m_numCuInHeight * g_maxCUHeight) + pic->m_lumaMarginY * 2; setWeight(*w); - fpelPlane = (pixel*)X265_MALLOC(pixel, padwidth * padheight); + fpelPlane = (pixel*)X265_MALLOC(pixel, lumaStride * padheight); if (fpelPlane) fpelPlane += m_startPad; else return -1; } _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel