From 6a641af1a54fd5084e276de9b42cbdb7775d0e8a Mon Sep 17 00:00:00 2001 From: bobo1on1 Date: Sat, 22 Jan 2011 20:37:12 +0100 Subject: [PATCH] backport 569648f2a3b8e094c33d102edd41397ca04b07be into dharma 10.1 (because git master has changed too much, this has been done by hand) --- xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 5 +++-- xbmc/cores/dvdplayer/Codecs/DllSwScale.h | 11 +++++++++++ xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp | 3 ++- xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp | 2 +- xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 2 +- xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp | 4 ++-- xbmc/cores/dvdplayer/DVDFileInfo.cpp | 2 +- 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp index f83b814..17a4dec 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp @@ -557,7 +557,8 @@ void CLinuxRendererGL::UploadYV12Texture(int source) struct SwsContext *context = m_dllSwScale->sws_getContext(im->width, im->height, PIX_FMT_YUV420P, im->width, im->height, PIX_FMT_BGRA, - SWS_FAST_BILINEAR, NULL, NULL, NULL); + SWS_FAST_BILINEAR | SwScaleCPUFlags(), + NULL, NULL, NULL); uint8_t *src[] = { im->plane[0], im->plane[1], im->plane[2], 0 }; int srcStride[] = { im->stride[0], im->stride[1], im->stride[2], 0 }; uint8_t *dst[] = { m_rgbBuffer, 0, 0, 0 }; @@ -585,7 +586,7 @@ void CLinuxRendererGL::UploadYV12Texture(int source) struct SwsContext *ctx = m_dllSwScale->sws_getContext(im->width, im->height, PIX_FMT_YUV420P, m_upscalingWidth, m_upscalingHeight, PIX_FMT_YUV420P, - algorithm, NULL, NULL, NULL); + algorithm | SwScaleCPUFlags(), NULL, NULL, NULL); m_dllSwScale->sws_scale(ctx, src, srcStride, 0, im->height, dst, dstStride); m_dllSwScale->sws_freeContext(ctx); diff --git a/xbmc/cores/dvdplayer/Codecs/DllSwScale.h b/xbmc/cores/dvdplayer/Codecs/DllSwScale.h index a16645a..da43968 100644 --- a/xbmc/cores/dvdplayer/Codecs/DllSwScale.h +++ b/xbmc/cores/dvdplayer/Codecs/DllSwScale.h @@ -66,6 +66,17 @@ extern "C" { #endif } +inline int SwScaleCPUFlags() +{ +#if !defined(__powerpc__) && !defined(__ppc__) && !defined(__arm__) + return SWS_CPU_CAPS_MMX; +#elif defined(__powerpc__) || defined(__ppc__) + return SWS_CPU_CAPS_ALTIVEC; +#else + return 0; +#endif +} + class DllSwScaleInterface { public: diff --git a/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp b/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp index 2c46324..bb7d161 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/DVDCodecUtils.cpp @@ -266,7 +266,8 @@ DVDVideoPicture* CDVDCodecUtils::ConvertToYUV422PackedPicture(DVDVideoPicture *p struct SwsContext *ctx = dllSwScale.sws_getContext(pSrc->iWidth, pSrc->iHeight, PIX_FMT_YUV420P, pPicture->iWidth, pPicture->iHeight, dstformat, - SWS_FAST_BILINEAR, NULL, NULL, NULL); + SWS_FAST_BILINEAR | SwScaleCPUFlags(), + NULL, NULL, NULL); dllSwScale.sws_scale(ctx, src, srcStride, 0, pSrc->iHeight, dst, dstStride); dllSwScale.sws_freeContext(ctx); } diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp index f8c315a..582a19e 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/CrystalHD.cpp @@ -873,7 +873,7 @@ bool CMPCOutputThread::GetDecoderOutput(void) m_sw_scale_ctx = m_dllSwScale->sws_getCachedContext(m_sw_scale_ctx, pBuffer->m_width, pBuffer->m_height, PIX_FMT_YUYV422, pBuffer->m_width, pBuffer->m_height, PIX_FMT_YUV420P, - SWS_FAST_BILINEAR, NULL, NULL, NULL); + SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); m_dllSwScale->sws_scale(m_sw_scale_ctx, src, srcStride, 0, pBuffer->m_height, dst, dstStride); } break; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp index fbc3b4e..eb411d2 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -451,7 +451,7 @@ int CDVDVideoCodecFFmpeg::Decode(BYTE* pData, int iSize, double dts, double pts) // convert the picture struct SwsContext *context = m_dllSwScale.sws_getContext(m_pCodecContext->width, m_pCodecContext->height, m_pCodecContext->pix_fmt, m_pCodecContext->width, m_pCodecContext->height, - PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL); + PIX_FMT_YUV420P, SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); if(context == NULL) { diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp index 53b9e85..37ca15c 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecVDA.cpp @@ -748,7 +748,7 @@ void CDVDVideoCodecVDA::UYVY422_to_YUV420P(uint8_t *yuv422_ptr, int yuv422_strid struct SwsContext *swcontext = m_dllSwScale->sws_getContext( m_videobuffer.iWidth, m_videobuffer.iHeight, PIX_FMT_UYVY422, m_videobuffer.iWidth, m_videobuffer.iHeight, PIX_FMT_YUV420P, - SWS_FAST_BILINEAR, NULL, NULL, NULL); + SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); if (swcontext) { uint8_t *src[] = { yuv422_ptr, 0, 0, 0 }; @@ -768,7 +768,7 @@ void CDVDVideoCodecVDA::BGRA_to_YUV420P(uint8_t *bgra_ptr, int bgra_stride, DVDV struct SwsContext *swcontext = m_dllSwScale->sws_getContext( m_videobuffer.iWidth, m_videobuffer.iHeight, PIX_FMT_BGRA, m_videobuffer.iWidth, m_videobuffer.iHeight, PIX_FMT_YUV420P, - SWS_FAST_BILINEAR, NULL, NULL, NULL); + SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); if (swcontext) { uint8_t *src[] = { bgra_ptr, 0, 0, 0 }; diff --git a/xbmc/cores/dvdplayer/DVDFileInfo.cpp b/xbmc/cores/dvdplayer/DVDFileInfo.cpp index 6dc6a29..046bc26 100644 --- a/xbmc/cores/dvdplayer/DVDFileInfo.cpp +++ b/xbmc/cores/dvdplayer/DVDFileInfo.cpp @@ -210,7 +210,7 @@ bool CDVDFileInfo::ExtractThumb(const CStdString &strPath, const CStdString &str BYTE *pOutBuf = new BYTE[nWidth * nHeight * 4]; struct SwsContext *context = dllSwScale.sws_getContext(picture.iWidth, picture.iHeight, - PIX_FMT_YUV420P, nWidth, nHeight, PIX_FMT_BGRA, SWS_FAST_BILINEAR, NULL, NULL, NULL); + PIX_FMT_YUV420P, nWidth, nHeight, PIX_FMT_BGRA, SWS_FAST_BILINEAR | SwScaleCPUFlags(), NULL, NULL, NULL); uint8_t *src[] = { picture.data[0], picture.data[1], picture.data[2], 0 }; int srcStride[] = { picture.iLineSize[0], picture.iLineSize[1], picture.iLineSize[2], 0 }; uint8_t *dst[] = { pOutBuf, 0, 0, 0 }; -- 2.7.4