diff --git a/packages/mediacenter/xbmc-theme-Confluence/package.mk b/packages/mediacenter/xbmc-theme-Confluence/package.mk index c251805dcc..e246115a8f 100644 --- a/packages/mediacenter/xbmc-theme-Confluence/package.mk +++ b/packages/mediacenter/xbmc-theme-Confluence/package.mk @@ -17,7 +17,7 @@ ################################################################################ PKG_NAME="xbmc-theme-Confluence" -PKG_VERSION="14-fa7c4bb" +PKG_VERSION="14-4fbeb1b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc/package.mk b/packages/mediacenter/xbmc/package.mk index 2da827f4e0..c16cffd0be 100644 --- a/packages/mediacenter/xbmc/package.mk +++ b/packages/mediacenter/xbmc/package.mk @@ -17,7 +17,7 @@ ################################################################################ PKG_NAME="xbmc" -PKG_VERSION="14-fa7c4bb" +PKG_VERSION="14-4fbeb1b" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/xbmc/patches/xbmc-995.01-fernetmenta.patch b/packages/mediacenter/xbmc/patches/xbmc-995.01-fernetmenta.patch index 211ad59c67..dc93817114 100644 --- a/packages/mediacenter/xbmc/patches/xbmc-995.01-fernetmenta.patch +++ b/packages/mediacenter/xbmc/patches/xbmc-995.01-fernetmenta.patch @@ -1,7 +1,7 @@ -From 8d0a520fb74fd0f07472920381488e659653b875 Mon Sep 17 00:00:00 2001 +From 2d20f3215d6fe7ab66a03ff198162a3babca58d5 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:34:39 +0200 -Subject: [PATCH 01/25] videoplayer: adapt lateness detection and dropping to +Subject: [PATCH 01/21] videoplayer: adapt lateness detection and dropping to buffering --- @@ -643,10 +643,10 @@ index dcd0ffd..1f0e661 100644 }; -From e3134243cc16327a74b83a2c67c87adcde30342b Mon Sep 17 00:00:00 2001 +From 1250c52a4f9cab6eb74550acd4661e84ea25d0d3 Mon Sep 17 00:00:00 2001 From: xbmc Date: Sun, 2 Sep 2012 16:05:21 +0200 -Subject: [PATCH 02/25] video player: present correct pts to user for a/v sync +Subject: [PATCH 02/21] video player: present correct pts to user for a/v sync (after buffering in renderer) --- @@ -695,10 +695,10 @@ index 1f0e661..a38a9c3 100644 double GetOutputDelay(); /* returns the expected delay, from that a packet is put in queue */ int GetDecoderFreeSpace() { return 0; } -From 05617c2e5eb3601b7890f9a2e486a75614c39d4e Mon Sep 17 00:00:00 2001 +From 25eb4e4315be5c5bae049bb24000089c60ecd1f5 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:41:31 +0200 -Subject: [PATCH 03/25] videoplayer: update frametime, it might change due to +Subject: [PATCH 03/21] videoplayer: update frametime, it might change due to fps detection --- @@ -719,10 +719,10 @@ index 374f4bd..4a255c6 100644 { m_codecname = m_pVideoCodec->GetName(); -From 1ed76545508beb35796e56e6165654de9a586b58 Mon Sep 17 00:00:00 2001 +From 8124a37001e190e74109025a1d60be30e42d3854 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:43:06 +0200 -Subject: [PATCH 04/25] videoplayer: give streams with invalid fps a chance for +Subject: [PATCH 04/21] videoplayer: give streams with invalid fps a chance for fps detection --- @@ -743,10 +743,10 @@ index 4a255c6..391d802 100644 //reset the stored framerates if no good framerate was detected m_fStableFrameRate = 0.0; -From 7b747b2a15cc4b11d772e58b0c4b678f9695ce1e Mon Sep 17 00:00:00 2001 +From 1837b6803d3c64d7e5a67a788e501ec4cd9d6611 Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 28 May 2012 10:49:05 +0200 -Subject: [PATCH 05/25] dvdplayer: allow rewinding at end of stream, do a seek +Subject: [PATCH 05/21] dvdplayer: allow rewinding at end of stream, do a seek after rewind --- @@ -754,7 +754,7 @@ Subject: [PATCH 05/25] dvdplayer: allow rewinding at end of stream, do a seek 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 448489f..77fe434 100644 +index 73181a4..90e9a30 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -1793,7 +1793,7 @@ void CDVDPlayer::HandlePlaySpeed() @@ -780,18 +780,18 @@ index 448489f..77fe434 100644 // audioplayer, stops outputing audio to audiorendere, but still tries to // sleep an correct amount for each packet -From 2e81d7be6bf7cdfdae9f475e5edf2b16e64f88ad Mon Sep 17 00:00:00 2001 +From 5ab5287cb2328a0baea889ae09a35da4778ee05f Mon Sep 17 00:00:00 2001 From: xbmc Date: Mon, 20 Aug 2012 16:06:39 +0200 -Subject: [PATCH 06/25] dvdplayer: observe pts counter overflow +Subject: [PATCH 06/21] dvdplayer: observe pts counter overflow --- .../cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 197 ++++++++++++++++++++- - xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h | 4 + - 2 files changed, 200 insertions(+), 1 deletion(-) + xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h | 3 + + 2 files changed, 199 insertions(+), 1 deletion(-) diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index 03cd1d7..080b3d2 100644 +index b835fa8..3217fcd 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -18,7 +18,6 @@ @@ -810,9 +810,9 @@ index 03cd1d7..080b3d2 100644 #include "stdint.h" #endif #include "DVDDemuxFFmpeg.h" -@@ -447,6 +447,9 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) - - CreateStreams(); +@@ -476,6 +476,9 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo, bool filein + if (isMpegts && GetNrOfStreams() == 0) + m_program = 0; + m_bPtsWrapChecked = false; + m_bPtsWrap = false; @@ -820,7 +820,7 @@ index 03cd1d7..080b3d2 100644 return true; } -@@ -587,6 +590,12 @@ double CDVDDemuxFFmpeg::ConvertTimestamp(int64_t pts, int den, int num) +@@ -616,6 +619,12 @@ double CDVDDemuxFFmpeg::ConvertTimestamp(int64_t pts, int den, int num) if (pts == (int64_t)AV_NOPTS_VALUE) return DVD_NOPTS_VALUE; @@ -833,7 +833,7 @@ index 03cd1d7..080b3d2 100644 // do calculations in floats as they can easily overflow otherwise // we don't care for having a completly exact timestamp anyway double timestamp = (double)pts * num / den; -@@ -726,6 +735,24 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() +@@ -762,6 +771,24 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() m_pkt.pkt.pts = AV_NOPTS_VALUE; } @@ -858,7 +858,7 @@ index 03cd1d7..080b3d2 100644 // copy contents into our own packet pPacket->iSize = m_pkt.pkt.size; -@@ -859,7 +886,16 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) +@@ -895,7 +922,16 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) ret = av_seek_frame(m_pFormatContext, -1, seek_pts, backwords ? AVSEEK_FLAG_BACKWARD : 0); if(ret >= 0) @@ -875,7 +875,7 @@ index 03cd1d7..080b3d2 100644 } if(m_iCurrentPts == DVD_NOPTS_VALUE) -@@ -878,6 +914,165 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) +@@ -914,6 +950,165 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) return (ret >= 0); } @@ -1042,7 +1042,7 @@ index 03cd1d7..080b3d2 100644 { CSingleLock lock(m_critSection); diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -index 08eb3df..dd89584 100644 +index 48f0a69..bdc84b2 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h @@ -102,6 +102,7 @@ class CDVDDemuxFFmpeg : public CDVDDemux @@ -1053,20 +1053,19 @@ index 08eb3df..dd89584 100644 bool SeekByte(int64_t pos); int GetStreamLength(); CDemuxStream* GetStream(int iStreamId); -@@ -159,5 +160,8 @@ class CDVDDemuxFFmpeg : public CDVDDemux - AVPacket pkt; // packet ffmpeg returned - int result; // result from av_read_packet - }m_pkt; -+ +@@ -165,5 +166,7 @@ class CDVDDemuxFFmpeg : public CDVDDemux + + bool m_streaminfo; + bool m_checkvideo; + bool m_bPtsWrap, m_bPtsWrapChecked; + int64_t m_iStartTime, m_iMaxTime, m_iEndTime; }; -From 2ac324956cdd7283736c4b588f728e1aa9da96c8 Mon Sep 17 00:00:00 2001 +From 9196a5855f87acb79020c600566ad597f1990582 Mon Sep 17 00:00:00 2001 From: xbmc Date: Tue, 2 Oct 2012 13:02:10 +0200 -Subject: [PATCH 07/25] dvdplayer: avoid short screen flicker caused by +Subject: [PATCH 07/21] dvdplayer: avoid short screen flicker caused by unnecessary reconfigure of renderer --- @@ -1096,10 +1095,10 @@ index 391d802..0fe775f 100644 || ( m_output.extended_format != pPicture->extended_format ) || ( m_output.color_matrix != pPicture->color_matrix && pPicture->color_matrix != 0 ) // don't reconfigure on unspecified -From a05882b6d2a1962ebd01fb9b9a86f40e92679cde Mon Sep 17 00:00:00 2001 +From acb0644901944e2a9760bbd5ad9f2cbb4bcc576f Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 11 Oct 2012 12:05:50 +0200 -Subject: [PATCH 08/25] vdpau: advanced settings for auto deinterlacing +Subject: [PATCH 08/21] vdpau: advanced settings for auto deinterlacing --- xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp | 8 ++++---- @@ -1108,7 +1107,7 @@ Subject: [PATCH 08/25] vdpau: advanced settings for auto deinterlacing 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 94c9188..1845198 100644 +index e5e7970..8c353af 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1958,10 +1958,10 @@ EINTERLACEMETHOD CMixer::GetDeinterlacingMethod(bool log /* = false */) @@ -1127,7 +1126,7 @@ index 94c9188..1845198 100644 if (deint != -1) { diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index 888ede3..59d7b3a 100644 +index ba97f5f..d75913e 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -156,6 +156,8 @@ void CAdvancedSettings::Initialize() @@ -1162,10 +1161,10 @@ index f58142f..d35354a 100644 bool m_videoVDPAUdeintSkipChromaHD; bool m_musicUseTimeSeeking; -From e78ce4260d4213e5f42d4e187a530d791615205e Mon Sep 17 00:00:00 2001 +From e531b548282a87ef399eefc1d867f91cd8a2fab0 Mon Sep 17 00:00:00 2001 From: xbmc Date: Fri, 2 Nov 2012 13:20:03 +0100 -Subject: [PATCH 09/25] player: fix rewind +Subject: [PATCH 09/21] player: fix rewind --- xbmc/cores/dvdplayer/DVDMessage.h | 5 ++++- @@ -1213,7 +1212,7 @@ index a365821..07366df 100644 class CDVDMsgPlayerSeekChapter : public CDVDMsg diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 77fe434..f25056b 100644 +index 90e9a30..0e700f4 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -1794,11 +1794,13 @@ void CDVDPlayer::HandlePlaySpeed() @@ -1318,10 +1317,10 @@ index 77fe434..f25056b 100644 UpdatePlayState(0); diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index 32f350b..b0c916d 100644 +index dac00e9..9bcfc02 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.h +++ b/xbmc/cores/dvdplayer/DVDPlayer.h -@@ -345,7 +345,7 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer +@@ -339,7 +339,7 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer bool GetCachingTimes(double& play_left, double& cache_left, double& file_offset); @@ -1330,7 +1329,7 @@ index 32f350b..b0c916d 100644 void HandleMessages(); void HandlePlaySpeed(); -@@ -399,8 +399,9 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer +@@ -393,8 +393,9 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer int m_playSpeed; struct SSpeedState { @@ -1377,17 +1376,17 @@ index a38a9c3..4e1b3d6 100644 unsigned int m_dropRequests; }; -From 56b5f384f3b3f5fbc0685c6d059ccb5d68f62a34 Mon Sep 17 00:00:00 2001 +From 30a6db94de2121f8c933df5e1f53a5402877916f Mon Sep 17 00:00:00 2001 From: xbmc Date: Thu, 28 Mar 2013 20:50:59 +0100 -Subject: [PATCH 10/25] fix incorrect display of fps when dr kicks in +Subject: [PATCH 10/21] fix incorrect display of fps when dr kicks in --- xbmc/Application.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp -index 186ea7f..cc7bfb1 100644 +index b456d77..28339f5 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -2299,10 +2299,11 @@ void CApplication::Render() @@ -1404,17 +1403,17 @@ index 186ea7f..cc7bfb1 100644 g_renderManager.UpdateResolution(); -From 92851b04c17d86b322aa198458e584c017fde86e Mon Sep 17 00:00:00 2001 +From 52f5df248b827ba1102a8fb73a63ab57015c313f Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 25 Jul 2013 17:18:13 +0200 -Subject: [PATCH 11/25] ActiveAE: slightly reduce buffer size +Subject: [PATCH 11/21] ActiveAE: slightly reduce buffer size --- xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index 2d013c8..7810ecc 100644 +index 91da985..4b9cd11 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -32,8 +32,8 @@ using namespace ActiveAE; @@ -1429,10 +1428,10 @@ index 2d013c8..7810ecc 100644 void CEngineStats::Reset(unsigned int sampleRate) -From ddf280da98ceffa4d97e5ec206b6907ff64cf8f2 Mon Sep 17 00:00:00 2001 +From ad38713092703b739998f35313d5b2fdfcf6e88d Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sun, 4 Aug 2013 10:11:16 +0200 -Subject: [PATCH 12/25] Revert "vdpau: comment some features that will be added +Subject: [PATCH 12/21] Revert "vdpau: comment some features that will be added later" This reverts commit e00b4f65864d623ab4d2e9e5c06db138e661f1cf. @@ -1441,7 +1440,7 @@ This reverts commit e00b4f65864d623ab4d2e9e5c06db138e661f1cf. 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 1845198..2bfea1a 100644 +index 8c353af..33ec1f4 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1085,8 +1085,7 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame) @@ -1485,581 +1484,10 @@ index 1845198..2bfea1a 100644 m_mixersteps = 1; } -From 27ca61ac257864ade2e03b8758c68f05102defa8 Mon Sep 17 00:00:00 2001 -From: Marcel Groothuis -Date: Thu, 5 Dec 2013 22:02:50 +0100 -Subject: [PATCH 13/25] ffmpeg demuxer: faster channel change for PVR addons - without internal demuxing (such as MediaPortal, ArgusTV, MythTV, NextPVR) - Credits: FernetMenta, Davilla, Popcornmix, Whaupt - ---- - .../cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 185 +++++++++++++++++++-- - xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h | 7 +- - .../dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp | 13 +- - 3 files changed, 184 insertions(+), 21 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index 080b3d2..c01bc11 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -@@ -74,6 +74,8 @@ static const struct StereoModeConversionMap WmvToInternalStereoModeMap[] = - {} - }; - -+#define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE) -+ - void CDemuxStreamAudioFFmpeg::GetStreamInfo(std::string& strInfo) - { - if(!m_stream) return; -@@ -175,6 +177,8 @@ CDVDDemuxFFmpeg::CDVDDemuxFFmpeg() : CDVDDemux() - m_program = UINT_MAX; - m_pkt.result = -1; - memset(&m_pkt.pkt, 0, sizeof(AVPacket)); -+ m_streaminfo = true; /* set to true if we want to look for streams before playback */ -+ m_checkvideo = false; - } - - CDVDDemuxFFmpeg::~CDVDDemuxFFmpeg() -@@ -195,10 +199,11 @@ bool CDVDDemuxFFmpeg::Aborted() - return false; - } - --bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) -+bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo) - { - AVInputFormat* iformat = NULL; - std::string strFile; -+ m_streaminfo = streaminfo; - m_iCurrentPts = DVD_NOPTS_VALUE; - m_speed = DVD_PLAYSPEED_NORMAL; - m_program = UINT_MAX; -@@ -209,8 +214,6 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) - m_pInput = pInput; - strFile = m_pInput->GetFileName(); - -- bool streaminfo = true; /* set to true if we want to look for streams before playback*/ -- - if( m_pInput->GetContent().length() > 0 ) - { - std::string content = m_pInput->GetContent(); -@@ -405,13 +408,19 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) - if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->seekable == 0) - av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0); - -+ if (iformat && (strcmp(iformat->name, "mpegts") == 0)) -+ { -+ m_pFormatContext->max_analyze_duration = 500000; -+ m_checkvideo = true; -+ } -+ - // we need to know if this is matroska or avi later - m_bMatroska = strncmp(m_pFormatContext->iformat->name, "matroska", 8) == 0; // for "matroska.webm" - m_bAVI = strcmp(m_pFormatContext->iformat->name, "avi") == 0; - -- if (streaminfo) -+ if (m_streaminfo) - { -- /* too speed up dvd switches, only analyse very short */ -+ /* to speed up dvd switches, only analyse very short */ - if(m_pInput->IsStreamType(DVDSTREAM_TYPE_DVD)) - av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0); - -@@ -433,7 +442,19 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput) - } - } - CLog::Log(LOGDEBUG, "%s - av_find_stream_info finished", __FUNCTION__); -+ -+ if (m_checkvideo) -+ { -+ // make sure we start video with an i-frame -+ ResetVideoStreams(); -+ } - } -+ else -+ { -+ m_program = 0; -+ m_checkvideo = true; -+ } -+ - // reset any timeout - m_timeout.SetInfinite(); - -@@ -487,7 +508,7 @@ void CDVDDemuxFFmpeg::Reset() - { - CDVDInputStream* pInputStream = m_pInput; - Dispose(); -- Open(pInputStream); -+ Open(pInputStream, m_streaminfo); - } - - void CDVDDemuxFFmpeg::Flush() -@@ -681,25 +702,32 @@ DemuxPacket* CDVDDemuxFFmpeg::Read() - } - else - { -+ ParsePacket(&m_pkt.pkt); -+ - AVStream *stream = m_pFormatContext->streams[m_pkt.pkt.stream_index]; - -- if (m_program != UINT_MAX) -+ if (IsVideoReady()) - { -- /* check so packet belongs to selected program */ -- for (unsigned int i = 0; i < m_pFormatContext->programs[m_program]->nb_stream_indexes; i++) -+ if (m_program != UINT_MAX) - { -- if(m_pkt.pkt.stream_index == (int)m_pFormatContext->programs[m_program]->stream_index[i]) -+ /* check so packet belongs to selected program */ -+ for (unsigned int i = 0; i < m_pFormatContext->programs[m_program]->nb_stream_indexes; i++) - { -- pPacket = CDVDDemuxUtils::AllocateDemuxPacket(m_pkt.pkt.size); -- break; -+ if(m_pkt.pkt.stream_index == (int)m_pFormatContext->programs[m_program]->stream_index[i]) -+ { -+ pPacket = CDVDDemuxUtils::AllocateDemuxPacket(m_pkt.pkt.size); -+ break; -+ } - } -- } - -- if (!pPacket) -- bReturnEmpty = true; -+ if (!pPacket) -+ bReturnEmpty = true; -+ } -+ else -+ pPacket = CDVDDemuxUtils::AllocateDemuxPacket(m_pkt.pkt.size); - } - else -- pPacket = CDVDDemuxUtils::AllocateDemuxPacket(m_pkt.pkt.size); -+ bReturnEmpty = true; - - if (pPacket) - { -@@ -1683,3 +1711,128 @@ std::string CDVDDemuxFFmpeg::ConvertCodecToInternalStereoMode(const std::string - } - return ""; - } -+ -+void CDVDDemuxFFmpeg::ParsePacket(AVPacket *pkt) -+{ -+ AVStream *st = m_pFormatContext->streams[pkt->stream_index]; -+ CDemuxStream *stream = GetStreamInternal(pkt->stream_index); -+ -+ // if the stream is new, tell ffmpeg to parse the stream -+ if (!stream && !st->parser) -+ { -+ st->need_parsing = AVSTREAM_PARSE_FULL; -+ } -+ -+ // split extradata -+ if(st->parser && st->parser->parser->split && !st->codec->extradata) -+ { -+ int i = st->parser->parser->split(st->codec, pkt->data, pkt->size); -+ if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) -+ { -+ // Found extradata, fill it in. This will cause -+ // a new stream to be created and used. -+ st->codec->extradata_size = i; -+ st->codec->extradata = (uint8_t*)av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); -+ if (st->codec->extradata) -+ { -+ CLog::Log(LOGDEBUG, "CDVDDemuxFFmpeg::Read() fetching extradata, extradata_size(%d)", st->codec->extradata_size); -+ memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size); -+ memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE); -+ } -+ else -+ { -+ st->codec->extradata_size = 0; -+ } -+ } -+ } -+ -+ // for video we need a decoder to get desired information into codec context -+ if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->codec->extradata && -+ (!st->codec->width || st->codec->pix_fmt == PIX_FMT_NONE)) -+ { -+ // open a decoder, it will be cleared down by ffmpeg on closing the stream -+ if (!st->codec->codec) -+ { -+ const AVCodec* codec; -+ AVDictionary *thread_opt = NULL; -+ codec = avcodec_find_decoder(st->codec->codec_id); -+ // Force thread count to 1 since the h264 decoder will not extract -+ // SPS and PPS to extradata during multi-threaded decoding -+ av_dict_set(&thread_opt, "threads", "1", 0); -+ avcodec_open2(st->codec, codec, &thread_opt); -+ -+ av_dict_free(&thread_opt); -+ } -+ -+ // We don't need to actually decode here -+ // we just want to transport SPS data into codec context -+ st->codec->skip_idct = AVDISCARD_ALL; -+ st->codec->skip_frame = AVDISCARD_ALL; -+ st->codec->skip_loop_filter = AVDISCARD_ALL; -+ -+ // We are looking for an IDR frame -+ AVFrame picture; -+ memset(&picture, 0, sizeof(AVFrame)); -+ picture.pts = picture.pkt_dts = picture.pkt_pts = picture.best_effort_timestamp = AV_NOPTS_VALUE; -+ picture.pkt_pos = -1; -+ picture.key_frame = 1; -+ picture.format = -1; -+ -+ int got_picture = 0; -+ avcodec_decode_video2(st->codec, &picture, &got_picture, pkt); -+ } -+} -+ -+bool CDVDDemuxFFmpeg::IsVideoReady() -+{ -+ AVStream *st; -+ bool hasVideo = false; -+ -+ if(!m_checkvideo) -+ return true; -+ -+ if(m_program != UINT_MAX) -+ { -+ for (unsigned int i = 0; i < m_pFormatContext->programs[m_program]->nb_stream_indexes; i++) -+ { -+ int idx = m_pFormatContext->programs[m_program]->stream_index[i]; -+ st = m_pFormatContext->streams[idx]; -+ if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) -+ { -+ if (st->codec->width && st->codec->pix_fmt != PIX_FMT_NONE) -+ return true; -+ hasVideo = true; -+ } -+ } -+ } -+ else -+ { -+ for (unsigned int i = 0; i < m_pFormatContext->nb_streams; i++) -+ { -+ st = m_pFormatContext->streams[i]; -+ if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) -+ { -+ if (st->codec->width && st->codec->pix_fmt != PIX_FMT_NONE) -+ return true; -+ hasVideo = true; -+ } -+ } -+ } -+ return !hasVideo; -+} -+ -+void CDVDDemuxFFmpeg::ResetVideoStreams() -+{ -+ AVStream *st; -+ for (unsigned int i = 0; i < m_pFormatContext->nb_streams; i++) -+ { -+ st = m_pFormatContext->streams[i]; -+ if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) -+ { -+ if (st->codec->extradata) -+ av_free(st->codec->extradata); -+ st->codec->extradata = NULL; -+ st->codec->width = 0; -+ } -+ } -+} -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -index dd89584..82bb553 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -@@ -91,7 +91,7 @@ class CDVDDemuxFFmpeg : public CDVDDemux - CDVDDemuxFFmpeg(); - virtual ~CDVDDemuxFFmpeg(); - -- bool Open(CDVDInputStream* pInput); -+ bool Open(CDVDInputStream* pInput, bool streaminfo = true); - void Dispose(); - void Reset(); - void Flush(); -@@ -130,6 +130,9 @@ class CDVDDemuxFFmpeg : public CDVDDemux - CDemuxStream* GetStreamInternal(int iStreamId); - void CreateStreams(unsigned int program = UINT_MAX); - void DisposeStreams(); -+ void ParsePacket(AVPacket *pkt); -+ bool IsVideoReady(); -+ void ResetVideoStreams(); - - AVDictionary *GetFFMpegOptionsFromURL(const CURL &url); - double ConvertTimestamp(int64_t pts, int den, int num); -@@ -163,5 +166,7 @@ class CDVDDemuxFFmpeg : public CDVDDemux - - bool m_bPtsWrap, m_bPtsWrapChecked; - int64_t m_iStartTime, m_iMaxTime, m_iEndTime; -+ bool m_streaminfo; -+ bool m_checkvideo; - }; - -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -index ca689d0..f383563 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -@@ -99,26 +99,31 @@ CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream) - } - #endif - -+ bool streaminfo = true; /* Look for streams before playback */ - if (pInputStream->IsStreamType(DVDSTREAM_TYPE_PVRMANAGER)) - { - CDVDInputStreamPVRManager* pInputStreamPVR = (CDVDInputStreamPVRManager*)pInputStream; - CDVDInputStream* pOtherStream = pInputStreamPVR->GetOtherStream(); -+ -+ /* Don't parse the streaminfo for live streams to reduce the channel switch time */ -+ bool liveStream = (pInputStream->GetFileName().substr(0, 14) == "pvr://channels"); -+ streaminfo = !liveStream; -+ - if(pOtherStream) - { - /* Used for MediaPortal PVR addon (uses PVR otherstream for playback of rtsp streams) */ - if (pOtherStream->IsStreamType(DVDSTREAM_TYPE_FFMPEG)) - { - auto_ptr demuxer(new CDVDDemuxFFmpeg()); -- if(demuxer->Open(pOtherStream)) -+ if(demuxer->Open(pOtherStream, streaminfo)) - return demuxer.release(); - else - return NULL; - } - } - -- std::string filename = pInputStream->GetFileName(); - /* Use PVR demuxer only for live streams */ -- if (filename.substr(0, 14) == "pvr://channels") -+ if (liveStream) - { - boost::shared_ptr client; - if (g_PVRClients->GetPlayingClient(client) && -@@ -134,7 +139,7 @@ CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream) - } - - auto_ptr demuxer(new CDVDDemuxFFmpeg()); -- if(demuxer->Open(pInputStream)) -+ if(demuxer->Open(pInputStream, streaminfo)) - return demuxer.release(); - else - return NULL; - -From 47f461d2d4903ee389672905410a894ec07b9194 Mon Sep 17 00:00:00 2001 -From: Wolfgang Haupt -Date: Thu, 5 Dec 2013 22:11:57 +0100 -Subject: [PATCH 14/25] DVDFactoryDemuxer: skip streaminfo for udp tcp and - pvr-channels - ---- - .../dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp | 14 ++++++--- - xbmc/utils/URIUtils.cpp | 35 ++++++++++++++++++++++ - xbmc/utils/URIUtils.h | 4 +++ - 3 files changed, 49 insertions(+), 4 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -index f383563..d6580fd 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -@@ -105,9 +105,9 @@ CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream) - CDVDInputStreamPVRManager* pInputStreamPVR = (CDVDInputStreamPVRManager*)pInputStream; - CDVDInputStream* pOtherStream = pInputStreamPVR->GetOtherStream(); - -- /* Don't parse the streaminfo for live streams to reduce the channel switch time */ -- bool liveStream = (pInputStream->GetFileName().substr(0, 14) == "pvr://channels"); -- streaminfo = !liveStream; -+ /* Don't parse the streaminfo for some cases of streams to reduce the channel switch time */ -+ bool useFastswitch = URIUtils::IsUsingFastSwitch(pInputStream->GetFileName()); -+ streaminfo = !useFastswitch; - - if(pOtherStream) - { -@@ -123,7 +123,7 @@ CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream) - } - - /* Use PVR demuxer only for live streams */ -- if (liveStream) -+ if (URIUtils::IsPVRChannel(pInputStream->GetFileName())) - { - boost::shared_ptr client; - if (g_PVRClients->GetPlayingClient(client) && -@@ -138,6 +138,12 @@ CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream) - } - } - -+ if (pInputStream->IsStreamType(DVDSTREAM_TYPE_FFMPEG)) -+ { -+ bool useFastswitch = URIUtils::IsUsingFastSwitch(pInputStream->GetFileName()); -+ streaminfo = !useFastswitch; -+ } -+ - auto_ptr demuxer(new CDVDDemuxFFmpeg()); - if(demuxer->Open(pInputStream, streaminfo)) - return demuxer.release(); -diff --git a/xbmc/utils/URIUtils.cpp b/xbmc/utils/URIUtils.cpp -index 6346cee..ab12a4f 100644 ---- a/xbmc/utils/URIUtils.cpp -+++ b/xbmc/utils/URIUtils.cpp -@@ -814,6 +814,36 @@ bool URIUtils::IsFTP(const CStdString& strFile) - IsProtocol(strFile2, "ftps"); - } - -+bool URIUtils::IsUDP(const CStdString& strFile) -+{ -+ CStdString strFile2(strFile); -+ -+ if (IsStack(strFile)) -+ strFile2 = CStackDirectory::GetFirstStackedFile(strFile); -+ -+ return StringUtils::StartsWithNoCase(strFile2, "udp:"); -+} -+ -+bool URIUtils::IsTCP(const CStdString& strFile) -+{ -+ CStdString strFile2(strFile); -+ -+ if (IsStack(strFile)) -+ strFile2 = CStackDirectory::GetFirstStackedFile(strFile); -+ -+ return StringUtils::StartsWithNoCase(strFile2, "tcp:"); -+} -+ -+bool URIUtils::IsPVRChannel(const CStdString& strFile) -+{ -+ CStdString strFile2(strFile); -+ -+ if (IsStack(strFile)) -+ strFile2 = CStackDirectory::GetFirstStackedFile(strFile); -+ -+ return StringUtils::StartsWithNoCase(strFile2, "pvr://channels"); -+} -+ - bool URIUtils::IsDAV(const CStdString& strFile) - { - CStdString strFile2(strFile); -@@ -1297,3 +1327,8 @@ bool URIUtils::UpdateUrlEncoding(std::string &strFilename) - strFilename = newFilename; - return true; - } -+ -+bool URIUtils::IsUsingFastSwitch(const CStdString& strFile) -+{ -+ return IsUDP(strFile) || IsTCP(strFile) || IsPVRChannel(strFile); -+} -diff --git a/xbmc/utils/URIUtils.h b/xbmc/utils/URIUtils.h -index 667f6d3..0094709 100644 ---- a/xbmc/utils/URIUtils.h -+++ b/xbmc/utils/URIUtils.h -@@ -119,6 +119,8 @@ class URIUtils - static bool IsDOSPath(const CStdString &path); - static bool IsDVD(const CStdString& strFile); - static bool IsFTP(const CStdString& strFile); -+ static bool IsUDP(const CStdString& strFile); -+ static bool IsTCP(const CStdString& strFile); - static bool IsHD(const CStdString& strFileName); - static bool IsHDHomeRun(const CStdString& strFile); - static bool IsSlingbox(const CStdString& strFile); -@@ -159,6 +161,8 @@ class URIUtils - static bool IsAndroidApp(const CStdString& strFile); - static bool IsLibraryFolder(const CStdString& strFile); - static bool IsLibraryContent(const std::string& strFile); -+ static bool IsPVRChannel(const CStdString& strFile); -+ static bool IsUsingFastSwitch(const CStdString& strFile); - - static void AddSlashAtEnd(std::string& strFolder); - static bool HasSlashAtEnd(const std::string& strFile, bool checkURL = false); - -From 5167c945e8093329df9d8765f6f2512b5a89057b Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 18 Jul 2014 10:39:07 +0200 -Subject: [PATCH 15/25] fast channel switch, make sure extradata is decoded - ---- - xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index c01bc11..d38bfab 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -@@ -1767,7 +1767,8 @@ void CDVDDemuxFFmpeg::ParsePacket(AVPacket *pkt) - // We don't need to actually decode here - // we just want to transport SPS data into codec context - st->codec->skip_idct = AVDISCARD_ALL; -- st->codec->skip_frame = AVDISCARD_ALL; -+ // extradata is not decoded if skip_frame >= AVDISCARD_NONREF -+// st->codec->skip_frame = AVDISCARD_ALL; - st->codec->skip_loop_filter = AVDISCARD_ALL; - - // We are looking for an IDR frame - -From fe091d5111f8629c06875692466f029b1a808ce7 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Wed, 23 Jul 2014 15:07:37 +0200 -Subject: [PATCH 16/25] ffmpeg demuxer: allow a stream change if pat/pmt was - not seen on open - ---- - xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 16 +++++++++++++++- - 1 file changed, 15 insertions(+), 1 deletion(-) - -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index d38bfab..2332b1b 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -@@ -408,10 +408,12 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo) - if (iformat && (strcmp(iformat->name, "mjpeg") == 0) && m_ioContext->seekable == 0) - av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0); - -+ bool isMpegts = false; - if (iformat && (strcmp(iformat->name, "mpegts") == 0)) - { - m_pFormatContext->max_analyze_duration = 500000; - m_checkvideo = true; -+ isMpegts = true; - } - - // we need to know if this is matroska or avi later -@@ -466,7 +468,13 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo) - - UpdateCurrentPTS(); - -- CreateStreams(); -+ // in case of mpegts and we have not seen pat/pmt, defer creation of streams -+ if (!isMpegts || m_pFormatContext->nb_programs > 0) -+ CreateStreams(); -+ -+ // allow IsProgramChange to return true -+ if (isMpegts && GetNrOfStreams() == 0) -+ m_program = 0; - - m_bPtsWrapChecked = false; - m_bPtsWrap = false; -@@ -1657,6 +1665,9 @@ bool CDVDDemuxFFmpeg::IsProgramChange() - if (m_program == UINT_MAX) - return false; - -+ if (m_program == 0 && !m_pFormatContext->nb_programs) -+ return false; -+ - if(m_pFormatContext->programs[m_program]->nb_stream_indexes != m_streams.size()) - return true; - -@@ -1792,6 +1803,9 @@ bool CDVDDemuxFFmpeg::IsVideoReady() - if(!m_checkvideo) - return true; - -+ if (m_program == 0 && !m_pFormatContext->nb_programs) -+ return false; -+ - if(m_program != UINT_MAX) - { - for (unsigned int i = 0; i < m_pFormatContext->programs[m_program]->nb_stream_indexes; i++) - -From 470c8eb28016538b492ee5620866ebc5654d7ef3 Mon Sep 17 00:00:00 2001 +From e4a53b5d59db44951ff6432742049acdb039adfa Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Tue, 28 Jan 2014 10:05:26 +0100 -Subject: [PATCH 17/25] xbmc pr 3080 +Subject: [PATCH 13/21] xbmc pr 3080 --- xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 8 ++++++++ @@ -2085,10 +1513,10 @@ index 2d955c2..245ef50 100644 * Setting it correctly would allow CorePNG decoding. */ avpkt.flags = AV_PKT_FLAG_KEY; -From 49d80fdd62c4d8e47a4652cb02c395d3188b3dbb Mon Sep 17 00:00:00 2001 +From 5ac82d336d51759b84c8df2fb8c6814713ddaf25 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Tue, 11 Feb 2014 18:15:06 +0100 -Subject: [PATCH 18/25] ActiveAE: add some debug logging +Subject: [PATCH 14/21] ActiveAE: add some debug logging --- xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp | 6 ++++++ @@ -2113,34 +1541,10 @@ index 7acc0d0..fec0313 100644 return copied; } -From 694643868e6f78d3125119a11eed8fdd2e3daa1d Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sat, 26 Jul 2014 09:54:06 +0200 -Subject: [PATCH 19/25] ffmpeg: adapt depreciated attribute - max_analyze_duration - ---- - xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index 2332b1b..edaa006 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -@@ -411,7 +411,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo) - bool isMpegts = false; - if (iformat && (strcmp(iformat->name, "mpegts") == 0)) - { -- m_pFormatContext->max_analyze_duration = 500000; -+ av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0); - m_checkvideo = true; - isMpegts = true; - } - -From ac5244853ebc6fd0aa79bf75e9bd1956dffffc25 Mon Sep 17 00:00:00 2001 +From 00046bd3f234c310f09ed5a53a29bfcbf0adfab3 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Sat, 23 Aug 2014 11:42:31 +0200 -Subject: [PATCH 20/25] dvdplayer: rename codec ctrl flags +Subject: [PATCH 15/21] dvdplayer: rename codec ctrl flags --- xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h | 14 ++++++++------ @@ -2196,7 +1600,7 @@ index 245ef50..67f0e80 100644 } else diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp -index 2bfea1a..165f103 100644 +index 33ec1f4..300b901 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDPAU.cpp @@ -1085,7 +1085,7 @@ int CDecoder::Decode(AVCodecContext *avctx, AVFrame *pFrame) @@ -2252,10 +1656,10 @@ index 6250d55..c216ce5 100644 if (iDropDirective & EOS_DROPPED) { -From f6615d23ef0f0ac13c2096b759362429ac9e0a71 Mon Sep 17 00:00:00 2001 +From a8459a22976d1f0a3fa41d23951580169ca0ce16 Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Fri, 13 Jun 2014 14:37:16 +0200 -Subject: [PATCH 21/25] VAAPI: implement codec control flags +Subject: [PATCH 16/21] VAAPI: implement codec control flags --- .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 21 ++++++++++++++++++--- @@ -2303,7 +1707,7 @@ index 67f0e80..2984847 100644 pDvdVideoPicture->pts = DVD_NOPTS_VALUE; diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp -index 743f5e8..e2141c4 100644 +index 8b5b5b8..84b0142 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp @@ -733,6 +733,8 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame) @@ -2315,7 +1719,7 @@ index 743f5e8..e2141c4 100644 } int retval = 0; -@@ -1702,8 +1704,8 @@ bool COutput::PreferPP() +@@ -1699,8 +1701,8 @@ bool COutput::PreferPP() void COutput::InitCycle() { uint64_t latency; @@ -2326,7 +1730,7 @@ index 743f5e8..e2141c4 100644 m_config.stats->SetCanSkipDeint(false); -@@ -1711,7 +1713,8 @@ void COutput::InitCycle() +@@ -1708,7 +1710,8 @@ void COutput::InitCycle() EINTERLACEMETHOD method = CMediaSettings::Get().GetCurrentVideoSettings().m_InterlaceMethod; bool interlaced = m_currentPicture.DVDPic.iFlags & DVP_FLAG_INTERLACED; @@ -2336,7 +1740,7 @@ index 743f5e8..e2141c4 100644 (mode == VS_DEINTERLACEMODE_AUTO && interlaced))) { if((method == VS_INTERLACEMETHOD_AUTO && interlaced) -@@ -2546,6 +2549,7 @@ bool CVppPostproc::AddPicture(CVaapiDecodedPicture &pic) +@@ -2542,6 +2545,7 @@ bool CVppPostproc::AddPicture(CVaapiDecodedPicture &pic) m_decodedPics.push_front(pic); m_frameCount++; m_step = 0; @@ -2344,7 +1748,7 @@ index 743f5e8..e2141c4 100644 return true; } -@@ -2590,6 +2594,13 @@ bool CVppPostproc::Filter(CVaapiProcessedPicture &outPic) +@@ -2586,6 +2590,13 @@ bool CVppPostproc::Filter(CVaapiProcessedPicture &outPic) } outPic.DVDPic = it->DVDPic; @@ -2359,10 +1763,10 @@ index 743f5e8..e2141c4 100644 VAProcFilterParameterBufferDeinterlacing *filterParams; VABufferID pipelineBuf; -From 8ad0f303b09823a775a2d1a48e635c3122c17446 Mon Sep 17 00:00:00 2001 +From 1c09a6f01af923dd427d612085225547d52d46ec Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Thu, 4 Sep 2014 09:25:48 +0200 -Subject: [PATCH 22/25] consider rounding errors in dropping control +Subject: [PATCH 17/21] consider rounding errors in dropping control --- xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 2 +- @@ -2382,179 +1786,641 @@ index c216ce5..7235cb4 100644 CDroppingStats::CGain gain; gain.gain = iGain; -From 308c3fc42ae20111aea01ff2b17680b9c7401913 Mon Sep 17 00:00:00 2001 +From 836b6b8bf9db684d2da80b8a731cda1cad936ceb Mon Sep 17 00:00:00 2001 From: Rainer Hochecker -Date: Sat, 27 Sep 2014 08:23:38 +0200 -Subject: [PATCH 23/25] fastswitch: do not reduce time to analyze when looking - for metadata +Date: Sun, 28 Sep 2014 13:52:11 +0200 +Subject: [PATCH 18/21] pthreads: use mutex protocol PTHREAD_PRIO_INHERIT --- - xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp | 4 ++-- - xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h | 2 +- - xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp | 4 ++-- - xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.h | 2 +- - xbmc/cores/dvdplayer/DVDFileInfo.cpp | 6 +++--- - 5 files changed, 9 insertions(+), 9 deletions(-) + xbmc/threads/platform/pthreads/Implementation.cpp | 1 + + 1 file changed, 1 insertion(+) -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -index edaa006..3217fcd 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp -@@ -199,7 +199,7 @@ bool CDVDDemuxFFmpeg::Aborted() +diff --git a/xbmc/threads/platform/pthreads/Implementation.cpp b/xbmc/threads/platform/pthreads/Implementation.cpp +index 628db54..123526d 100644 +--- a/xbmc/threads/platform/pthreads/Implementation.cpp ++++ b/xbmc/threads/platform/pthreads/Implementation.cpp +@@ -38,6 +38,7 @@ namespace XbmcThreads + { + pthread_mutexattr_init(&recursiveAttr); + pthread_mutexattr_settype(&recursiveAttr,PTHREAD_MUTEX_RECURSIVE); ++ pthread_mutexattr_setprotocol(&recursiveAttr,PTHREAD_PRIO_INHERIT); + alreadyCalled = true; + } + return true; // note, we never call destroy. + +From 39d509822eb5868fd66e3b844f3869f77fc95a82 Mon Sep 17 00:00:00 2001 +From: Rainer Hochecker +Date: Sat, 4 Oct 2014 21:25:31 +0200 +Subject: [PATCH 19/21] vaapi: lock gfx context on pre-cleanup + +--- + xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +index 84b0142..c89333b 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +@@ -612,6 +612,7 @@ long CDecoder::Release() + CSingleLock lock(m_DecoderSection); + CLog::Log(LOGNOTICE,"VAAPI::Release pre-cleanup"); + ++ CSingleLock lock1(g_graphicsContext); + Message *reply; + if (m_vaapiOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::PRECLEANUP, + &reply, + +From f1d71b41d302e72f41a77736b54f8e6ad6e19f3d Mon Sep 17 00:00:00 2001 +From: Rainer Hochecker +Date: Tue, 7 Oct 2014 11:46:12 +0200 +Subject: [PATCH 20/21] vaapi: glIsSync, glIsTexture seem to unreliable on + Intel + +--- + xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +index c89333b..9c58eaa 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +@@ -1962,7 +1962,7 @@ bool COutput::ProcessSyncPicture() + #ifdef GL_ARB_sync + if (pic->usefence) + { +- if (glIsSync(pic->fence)) ++ if (pic->fence) + { + GLint state; + GLsizei length; +@@ -2115,7 +2115,7 @@ void COutput::ReleaseBufferPool(bool precleanup) + if (pic->usefence) + { + #ifdef GL_ARB_sync +- while (glIsSync(pic->fence)) ++ while (pic->fence) + { + GLint state; + GLsizei length; +@@ -2123,6 +2123,7 @@ void COutput::ReleaseBufferPool(bool precleanup) + if(state == GL_SIGNALED || timeout.IsTimePast()) + { + glDeleteSync(pic->fence); ++ pic->fence = None; + } + else + { +@@ -2148,7 +2149,8 @@ void COutput::ReleaseBufferPool(bool precleanup) + if (precleanup && pic->valid) + continue; + +- if (glIsTexture(pic->texture)) ++ ++ if (pic->texture) + { + glDeleteTextures(1, &pic->texture); + glXDestroyPixmap(m_Display, pic->glPixmap); + +From a5e5cfeb6c00d85365ada7254a9d7a21708a137e Mon Sep 17 00:00:00 2001 +From: Rainer Hochecker +Date: Sat, 4 Oct 2014 13:53:35 +0200 +Subject: [PATCH 21/21] vaapi: workaround intel bugs + +--- + xbmc/cores/VideoRenderers/LinuxRendererGL.cpp | 3 + + xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 231 +++++++++++++++++-------- + xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h | 28 ++- + 3 files changed, 189 insertions(+), 73 deletions(-) + +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +index 7859949..9b5d0a9 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +@@ -2541,6 +2541,9 @@ bool CLinuxRendererGL::UploadVAAPITexture(int index) + return false; + } + ++ if (!vaapi->CopyGlx()) ++ return false; ++ + plane.id = vaapi->texture; + + // in stereoscopic mode sourceRect may only +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +index 9c58eaa..849e26a 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +@@ -417,6 +417,12 @@ bool CVideoSurfaces::HasFree() + return !m_freeSurfaces.empty(); + } + ++int CVideoSurfaces::NumFree() ++{ ++ CSingleLock lock(m_section); ++ return m_freeSurfaces.size(); ++} ++ + bool CVideoSurfaces::HasRefs() + { + CSingleLock lock(m_section); +@@ -740,7 +746,6 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame) + + int retval = 0; + uint16_t decoded, processed, render; +- int vapipe; + bool vpp; + Message *msg; + while (m_vaapiOutput.m_controlPort.ReceiveInMessage(&msg)) +@@ -758,8 +763,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame) + while (!retval) + { + // first fill the buffers to keep vaapi busy +- vapipe = vpp ? decoded + processed : decoded; +- if (vapipe < 4 && m_videoSurfaces.HasFree()) ++ if (decoded < 2 && processed < 3 && m_videoSurfaces.HasFree()) + { + retval |= VC_BUFFER; + } +@@ -797,8 +801,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame) + msg->Release(); + } + +- vapipe = vpp ? decoded + processed : decoded; +- if (vapipe < 4 && m_videoSurfaces.HasFree()) ++ if (decoded < 2 && processed < 3 && m_videoSurfaces.HasFree()) + { + retval |= VC_BUFFER; + } +@@ -1088,6 +1091,10 @@ void CDecoder::ReturnRenderPicture(CVaapiRenderPicture *renderPic) + m_vaapiOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPIC, &renderPic, sizeof(renderPic)); + } + ++void CDecoder::ReturnProcPicture(int id) ++{ ++ m_vaapiOutput.m_dataPort.SendOutMessage(COutputDataProtocol::RETURNPROCPIC, &id, sizeof(int)); ++} + + //----------------------------------------------------------------------------- + // RenderPicture +@@ -1129,6 +1136,69 @@ void CVaapiRenderPicture::ReturnUnused() + vaapi->ReturnRenderPicture(this); + } + ++bool CVaapiRenderPicture::CopyGlx() ++{ ++ CSingleLock lock(renderPicSection); ++ ++ if (glx.bound == true) ++ return true; ++ ++ if (glx.procPic.source == CVaapiProcessedPicture::SKIP_SRC || ++ glx.procPic.source == CVaapiProcessedPicture::VPP_SRC) ++ { ++ unsigned int colorStandard; ++ switch(glx.procPic.DVDPic.color_matrix) ++ { ++ case AVCOL_SPC_BT709: ++ colorStandard = VA_SRC_BT709; ++ break; ++ case AVCOL_SPC_BT470BG: ++ case AVCOL_SPC_SMPTE170M: ++ colorStandard = VA_SRC_BT601; ++ break; ++ case AVCOL_SPC_SMPTE240M: ++ case AVCOL_SPC_FCC: ++ case AVCOL_SPC_UNSPECIFIED: ++ case AVCOL_SPC_RGB: ++ default: ++ if(texWidth > 1000) ++ colorStandard = VA_SRC_BT709; ++ else ++ colorStandard = VA_SRC_BT601; ++ } ++ ++ if (vaSyncSurface(glx.vadsp, glx.procPic.videoSurface) != VA_STATUS_SUCCESS) ++ return false; ++ ++ if (vaPutSurface(glx.vadsp, ++ glx.procPic.videoSurface, ++ glx.pixmap, ++ 0,0, ++ texWidth, texHeight, ++ 0,0, ++ texWidth, texHeight, ++ NULL,0, ++ VA_FRAME_PICTURE | colorStandard) != VA_STATUS_SUCCESS) ++ { ++ return false; ++ } ++ ++ XSync(glx.x11dsp, false); ++ glEnable(glx.textureTarget); ++ glBindTexture(glx.textureTarget, texture); ++ glx.glXBindTexImageEXT(glx.x11dsp, glx.glPixmap, GLX_FRONT_LEFT_EXT, NULL); ++ glBindTexture(glx.textureTarget, 0); ++ glDisable(glx.textureTarget); ++ ++ glx.bound = true; ++ ++ vaapi->ReturnProcPicture(glx.procPic.id); ++ glx.procPic.id = -1; ++ } ++ ++ return true; ++} ++ + void CVaapiRenderPicture::Sync() + { + #ifdef GL_ARB_sync +@@ -1143,6 +1213,15 @@ void CVaapiRenderPicture::Sync() + fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + } + #endif ++ ++ if (DVDPic.format == RENDER_FMT_VAAPI && glx.bound) ++ { ++ glEnable(glx.textureTarget); ++ glBindTexture(glx.textureTarget, texture); ++ glx.glXReleaseTexImageEXT(glx.x11dsp, glx.glPixmap, GLX_FRONT_LEFT_EXT); ++ glBindTexture(glx.textureTarget, 0); ++ glDisable(glx.textureTarget); ++ } + } + + //----------------------------------------------------------------------------- +@@ -1274,6 +1353,11 @@ void COutput::StateMachine(int signal, Protocol *port, Message *msg) + pic = *((CVaapiRenderPicture**)msg->data); + QueueReturnPicture(pic); + return; ++ case COutputDataProtocol::RETURNPROCPIC: ++ int id; ++ id = *((int*)msg->data); ++ ProcessReturnProcPicture(id); ++ return; + default: + break; + } +@@ -1360,6 +1444,12 @@ void COutput::StateMachine(int signal, Protocol *port, Message *msg) + m_controlPort.SendInMessage(COutputControlProtocol::STATS); + m_extTimeout = 0; + return; ++ case COutputDataProtocol::RETURNPROCPIC: ++ int id; ++ id = *((int*)msg->data); ++ ProcessReturnProcPicture(id); ++ m_extTimeout = 0; ++ return; + default: + break; + } +@@ -1488,7 +1578,7 @@ void COutput::StateMachine(int signal, Protocol *port, Message *msg) + m_config.stats->DecProcessed(); + m_bufferPool.processedPics.pop_front(); + outPic = ProcessPicture(procPic); +- ReleaseProcessedPicture(procPic); ++ //ReleaseProcessedPicture(procPic); + if (outPic) + { + m_config.stats->IncRender(); +@@ -1675,8 +1765,15 @@ void COutput::Flush() + + bool COutput::HasWork() + { +- if ((!m_bufferPool.freeRenderPics.empty() && !m_bufferPool.processedPics.empty()) || +- (!m_bufferPool.decodedPics.empty() && m_bufferPool.processedPics.size() < 4)) ++ // send a pic to renderer ++ if (!m_bufferPool.freeRenderPics.empty() && !m_bufferPool.processedPics.empty()) ++ return true; ++ ++ bool ppWantsPic = true; ++ if (m_pp) ++ ppWantsPic = m_pp->WantsPic(); ++ ++ if (!m_bufferPool.decodedPics.empty() && m_bufferPool.processedPics.size() < 4 && ppWantsPic) + return true; + + return false; +@@ -1689,6 +1786,9 @@ bool COutput::PreferPP() + if (!m_pp) + return true; + ++ if (!m_pp->WantsPic()) ++ return false; ++ + if (!m_pp->DoesSync() && m_bufferPool.processedPics.size() < 4) + return true; + +@@ -1808,53 +1908,11 @@ CVaapiRenderPicture* COutput::ProcessPicture(CVaapiProcessedPicture &pic) + if (pic.source == CVaapiProcessedPicture::SKIP_SRC || + pic.source == CVaapiProcessedPicture::VPP_SRC) + { +- unsigned int colorStandard; +- switch(pic.DVDPic.color_matrix) +- { +- case AVCOL_SPC_BT709: +- colorStandard = VA_SRC_BT709; +- break; +- case AVCOL_SPC_BT470BG: +- case AVCOL_SPC_SMPTE170M: +- colorStandard = VA_SRC_BT601; +- break; +- case AVCOL_SPC_SMPTE240M: +- case AVCOL_SPC_FCC: +- case AVCOL_SPC_UNSPECIFIED: +- case AVCOL_SPC_RGB: +- default: +- if(m_config.surfaceWidth > 1000) +- colorStandard = VA_SRC_BT709; +- else +- colorStandard = VA_SRC_BT601; +- } +- +- if (!CheckSuccess(vaSyncSurface(m_config.dpy, pic.videoSurface))) +- return NULL; +- +- XLockDisplay(m_Display); +- if (!CheckSuccess(vaPutSurface(m_config.dpy, +- pic.videoSurface, +- retPic->pixmap, +- 0,0, +- m_config.vidWidth, m_config.vidHeight, +- 0,0, +- m_config.outWidth, m_config.outHeight, +- NULL,0, +- VA_FRAME_PICTURE | colorStandard))) +- { +- return NULL; +- } +- XUnlockDisplay(m_Display); +- +- XSync(m_config.x11dsp, false); +- glEnable(m_textureTarget); +- glBindTexture(m_textureTarget, retPic->texture); +- glXBindTexImageEXT(m_Display, retPic->glPixmap, GLX_FRONT_LEFT_EXT, NULL); +- glBindTexture(m_textureTarget, 0); +- glDisable(m_textureTarget); +- ++ pic.id = m_bufferPool.procPicId++; ++ m_bufferPool.processedPicsAway.push_back(pic); + retPic->DVDPic.format = RENDER_FMT_VAAPI; ++ retPic->glx.procPic = pic; ++ retPic->glx.bound = false; + } + else if (pic.source == CVaapiProcessedPicture::FFMPEG_SRC) + { +@@ -1917,6 +1975,18 @@ void COutput::DropVppProcessedPictures() + else + ++it; + } ++ ++ it = m_bufferPool.processedPicsAway.begin(); ++ while (it != m_bufferPool.processedPicsAway.end()) ++ { ++ if (it->source == CVaapiProcessedPicture::VPP_SRC) ++ { ++ it = m_bufferPool.processedPicsAway.erase(it); ++ } ++ else ++ ++it; ++ } ++ + m_controlPort.SendInMessage(COutputControlProtocol::STATS); + } + +@@ -2014,16 +2084,22 @@ void COutput::ProcessReturnPicture(CVaapiRenderPicture *pic) + if (pic->avFrame) + av_frame_unref(pic->avFrame); + +- if (pic->DVDPic.format == RENDER_FMT_VAAPI) ++ ProcessReturnProcPicture(pic->glx.procPic.id); ++ pic->valid = false; ++} ++ ++void COutput::ProcessReturnProcPicture(int id) ++{ ++ std::deque::iterator it; ++ for (it=m_bufferPool.processedPicsAway.begin(); it!=m_bufferPool.processedPicsAway.end(); ++it) + { +- glEnable(m_textureTarget); +- glBindTexture(m_textureTarget, pic->texture); +- glXReleaseTexImageEXT(m_Display, pic->glPixmap, GLX_FRONT_LEFT_EXT); +- glBindTexture(m_textureTarget, 0); +- glDisable(m_textureTarget); ++ if (it->id == id) ++ { ++ ReleaseProcessedPicture(*it); ++ m_bufferPool.processedPicsAway.erase(it); ++ break; ++ } + } +- +- pic->valid = false; + } + + bool COutput::EnsureBufferPool() +@@ -2069,32 +2145,39 @@ bool COutput::EnsureBufferPool() + { + pic = m_bufferPool.allRenderPics[i]; + +- pic->pixmap = XCreatePixmap(m_Display, ++ pic->glx.pixmap = XCreatePixmap(m_Display, + m_Window, + m_config.outWidth, + m_config.outHeight, + wndattribs.depth); +- if (!pic->pixmap) ++ if (!pic->glx.pixmap) + { + CLog::Log(LOGERROR, "VAAPI::COutput::EnsureBufferPool - Unable to create XPixmap"); + return false; + } + + // create gl pixmap +- pic->glPixmap = glXCreatePixmap(m_Display, fbConfigs[fbConfigIndex], pic->pixmap, pixmapAttribs); ++ pic->glx.glPixmap = glXCreatePixmap(m_Display, fbConfigs[fbConfigIndex], pic->glx.pixmap, pixmapAttribs); + +- if (!pic->glPixmap) ++ if (!pic->glx.glPixmap) + { + CLog::Log(LOGINFO, "VAAPI::COutput::EnsureBufferPool - Could not create glPixmap"); + return false; + } + + glGenTextures(1, &pic->texture); ++ pic->glx.vadsp = m_config.dpy; ++ pic->glx.x11dsp = m_Display; ++ pic->glx.glXBindTexImageEXT = glXBindTexImageEXT; ++ pic->glx.glXReleaseTexImageEXT = glXReleaseTexImageEXT; ++ pic->glx.textureTarget = m_textureTarget; + + pic->avFrame = av_frame_alloc(); + pic->valid = false; + } + ++ m_bufferPool.procPicId = 0; ++ + CLog::Log(LOGNOTICE, "VAAPI::COutput::InitBufferPool - Surfaces created"); + return true; + } +@@ -2153,8 +2236,8 @@ void COutput::ReleaseBufferPool(bool precleanup) + if (pic->texture) + { + glDeleteTextures(1, &pic->texture); +- glXDestroyPixmap(m_Display, pic->glPixmap); +- XFreePixmap(m_Display, pic->pixmap); ++ glXDestroyPixmap(m_Display, pic->glx.glPixmap); ++ XFreePixmap(m_Display, pic->glx.pixmap); + pic->texture = None; + } + av_frame_free(&pic->avFrame); +@@ -2193,7 +2276,6 @@ bool COutput::GLInit() + + glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXBindTexImageEXT"); + glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glXGetProcAddress((GLubyte *) "glXReleaseTexImageEXT"); +- + return true; + } + +@@ -2377,7 +2459,7 @@ bool CVppPostproc::PreInit(CVaapiConfig &config, SDiMethods *methods) + + // create surfaces + VASurfaceID surfaces[32]; +- int nb_surfaces = 5; ++ int nb_surfaces = NUM_RENDER_PICS; + if (!CheckSuccess(vaCreateSurfaces(m_config.dpy, + VA_RT_FORMAT_YUV420, + m_config.surfaceWidth, +@@ -2794,6 +2876,15 @@ bool CVppPostproc::DoesSync() return false; } --bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo) -+bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo, bool fileinfo) ++bool CVppPostproc::WantsPic() ++{ ++ // need at least 2 for deinterlacing ++ if (m_videoSurfaces.NumFree() > 1) ++ return true; ++ ++ return false; ++} ++ + bool CVppPostproc::CheckSuccess(VAStatus status) { - AVInputFormat* iformat = NULL; - std::string strFile; -@@ -409,7 +409,7 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo) - av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0); - - bool isMpegts = false; -- if (iformat && (strcmp(iformat->name, "mpegts") == 0)) -+ if (iformat && (strcmp(iformat->name, "mpegts") == 0) && !fileinfo) + if (status != VA_STATUS_SUCCESS) +diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h +index c45e97d..6b2b67a 100644 +--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h ++++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h +@@ -144,6 +144,7 @@ struct CVaapiProcessedPicture + DVDVideoPicture DVDPic; + VASurfaceID videoSurface; + AVFrame *frame; ++ int id; + enum { - av_opt_set_int(m_pFormatContext, "analyzeduration", 500000, 0); - m_checkvideo = true; -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -index 82bb553..f8a2008 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.h -@@ -91,7 +91,7 @@ class CDVDDemuxFFmpeg : public CDVDDemux - CDVDDemuxFFmpeg(); - virtual ~CDVDDemuxFFmpeg(); - -- bool Open(CDVDInputStream* pInput, bool streaminfo = true); -+ bool Open(CDVDInputStream* pInput, bool streaminfo = true, bool fileinfo = false); - void Dispose(); - void Reset(); - void Flush(); -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -index d6580fd..343651c 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.cpp -@@ -39,7 +39,7 @@ - using namespace std; - using namespace PVR; - --CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream) -+CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream, bool fileinfo) - { - if (!pInputStream) - return NULL; -@@ -145,7 +145,7 @@ CDVDDemux* CDVDFactoryDemuxer::CreateDemuxer(CDVDInputStream* pInputStream) - } - - auto_ptr demuxer(new CDVDDemuxFFmpeg()); -- if(demuxer->Open(pInputStream, streaminfo)) -+ if(demuxer->Open(pInputStream, streaminfo, fileinfo)) - return demuxer.release(); - else - return NULL; -diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.h -index 2f5f07a..8281d28 100644 ---- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.h -+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDFactoryDemuxer.h -@@ -26,5 +26,5 @@ class CDVDInputStream; - class CDVDFactoryDemuxer - { - public: -- static CDVDDemux* CreateDemuxer(CDVDInputStream* pInputStream); -+ static CDVDDemux* CreateDemuxer(CDVDInputStream* pInputStream, bool fileinfo = false); + VPP_SRC, +@@ -153,6 +154,19 @@ struct CVaapiProcessedPicture + bool crop; }; -diff --git a/xbmc/cores/dvdplayer/DVDFileInfo.cpp b/xbmc/cores/dvdplayer/DVDFileInfo.cpp -index 03e23f8..7ab72f3 100644 ---- a/xbmc/cores/dvdplayer/DVDFileInfo.cpp -+++ b/xbmc/cores/dvdplayer/DVDFileInfo.cpp -@@ -67,7 +67,7 @@ bool CDVDFileInfo::GetFileDuration(const std::string &path, int& duration) - if (!input->Open(path.c_str(), "")) - return false; -- demux.reset(CDVDFactoryDemuxer::CreateDemuxer(input.get())); -+ demux.reset(CDVDFactoryDemuxer::CreateDemuxer(input.get(), true)); - if (!demux.get()) - return false; ++struct VaapiGlx ++{ ++ Display *x11dsp; ++ VADisplay vadsp; ++ Pixmap pixmap; ++ GLXPixmap glPixmap; ++ GLenum textureTarget; ++ PFNGLXBINDTEXIMAGEEXTPROC glXBindTexImageEXT; ++ PFNGLXRELEASETEXIMAGEEXTPROC glXReleaseTexImageEXT; ++ CVaapiProcessedPicture procPic; ++ bool bound; ++}; ++ + /** + * Ready to render textures + * Sent from COutput back to CDecoder +@@ -168,6 +182,7 @@ class CVaapiRenderPicture + : texWidth(0), texHeight(0), texture(None), valid(false), vaapi(NULL), avFrame(NULL), + usefence(false), refCount(0), renderPicSection(section) { fence = None; } + void Sync(); ++ bool CopyGlx(); + DVDVideoPicture DVDPic; + int texWidth, texHeight; + CRect crop; +@@ -182,8 +197,7 @@ class CVaapiRenderPicture + bool usefence; + GLsync fence; + int refCount; +- Pixmap pixmap; +- GLXPixmap glPixmap; ++ VaapiGlx glx; + CCriticalSection &renderPicSection; + }; -@@ -126,7 +126,7 @@ bool CDVDFileInfo::ExtractThumb(const std::string &strPath, +@@ -204,8 +218,10 @@ struct VaapiBufferPool + std::deque freeRenderPics; + std::deque syncRenderPics; + std::deque processedPics; ++ std::deque processedPicsAway; + std::deque decodedPics; + CCriticalSection renderPicSec; ++ int procPicId; + }; - try + class COutputControlProtocol : public Protocol +@@ -235,6 +251,7 @@ class COutputDataProtocol : public Protocol { -- pDemuxer = CDVDFactoryDemuxer::CreateDemuxer(pInputStream); -+ pDemuxer = CDVDFactoryDemuxer::CreateDemuxer(pInputStream, true); - if(!pDemuxer) - { - delete pInputStream; -@@ -346,7 +346,7 @@ bool CDVDFileInfo::GetFileStreamDetails(CFileItem *pItem) - return false; - } - -- CDVDDemux *pDemuxer = CDVDFactoryDemuxer::CreateDemuxer(pInputStream); -+ CDVDDemux *pDemuxer = CDVDFactoryDemuxer::CreateDemuxer(pInputStream, true); - if (pDemuxer) + NEWFRAME = 0, + RETURNPIC, ++ RETURNPROCPIC, + }; + enum InSignal { - bool retVal = DemuxerToStreamDetails(pInputStream, pDemuxer, pItem->GetVideoInfoTag()->m_streamDetails, strFileNameAndPath); - -From 1bf377ff76d30c6082f5ee5b5b63a8d928e5a423 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Sat, 4 Oct 2014 15:22:09 +0200 -Subject: [PATCH 25/25] fix limited range for picture viewer, OpenGL part only - ---- - xbmc/pictures/SlideShowPicture.cpp | 34 +++++++++++++++++++++++++++++++++- - 1 file changed, 33 insertions(+), 1 deletion(-) - -diff --git a/xbmc/pictures/SlideShowPicture.cpp b/xbmc/pictures/SlideShowPicture.cpp -index 0af8fa0..0db6c01 100644 ---- a/xbmc/pictures/SlideShowPicture.cpp -+++ b/xbmc/pictures/SlideShowPicture.cpp -@@ -808,8 +808,9 @@ void CSlideShowPic::Render(float *x, float *y, CBaseTexture* pTexture, color_t c - g_graphicsContext.BeginPaint(); - if (pTexture) - { -+ int unit = 0; - pTexture->LoadToGPU(); -- pTexture->BindToUnit(0); -+ pTexture->BindToUnit(unit++); +@@ -276,6 +293,7 @@ class COutput : private CThread + CVaapiRenderPicture* ProcessPicture(CVaapiProcessedPicture &pic); + void QueueReturnPicture(CVaapiRenderPicture *pic); + void ProcessReturnPicture(CVaapiRenderPicture *pic); ++ void ProcessReturnProcPicture(int id); + bool ProcessSyncPicture(); + void ReleaseProcessedPicture(CVaapiProcessedPicture &pic); + void DropVppProcessedPictures(); +@@ -332,6 +350,7 @@ class CVideoSurfaces + int Size(); + bool HasFree(); + bool HasRefs(); ++ int NumFree(); + protected: + std::map m_state; + std::list m_freeSurfaces; +@@ -393,7 +412,7 @@ class CDecoder + virtual void Close(); + virtual long Release(); + virtual bool CanSkipDeint(); +- virtual unsigned GetAllowedReferences() { return 5; } ++ virtual unsigned GetAllowedReferences() { return 4; } - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_BLEND); // Turn Blending On -@@ -821,6 +822,37 @@ void CSlideShowPic::Render(float *x, float *y, CBaseTexture* pTexture, color_t c - glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - glTexEnvf(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); - glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); -+ -+ if(g_Windowing.UseLimitedColor()) -+ { -+ // compress range -+ pTexture->BindToUnit(unit++); // dummy bind -+ const GLfloat rgba1[4] = {(235.0 - 16.0f) / 255.0f, (235.0 - 16.0f) / 255.0f, (235.0 - 16.0f) / 255.0f, 0.0f}; -+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE , GL_COMBINE); -+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, rgba1); -+ glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB , GL_MODULATE); -+ glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB , GL_PREVIOUS); -+ glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE1_RGB , GL_CONSTANT); -+ glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB , GL_SRC_COLOR); -+ glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_RGB , GL_SRC_COLOR); -+ -+ glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA , GL_REPLACE); -+ glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA , GL_PREVIOUS); -+ -+ // transition -+ pTexture->BindToUnit(unit++); // dummy bind -+ const GLfloat rgba2[4] = {16.0f / 255.0f, 16.0f / 255.0f, 16.0f / 255.0f, 0.0f}; -+ glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE , GL_COMBINE); -+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, rgba2); -+ glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB , GL_ADD); -+ glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB , GL_PREVIOUS); -+ glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE1_RGB , GL_CONSTANT); -+ glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB , GL_SRC_COLOR); -+ glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_RGB , GL_SRC_COLOR); -+ -+ glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA , GL_REPLACE); -+ glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_ALPHA , GL_PREVIOUS); -+ } - } - else - glDisable(GL_TEXTURE_2D); + virtual int Check(AVCodecContext* avctx); + virtual const std::string Name() { return "vaapi"; } +@@ -410,6 +429,7 @@ class CDecoder + bool CheckStatus(VAStatus vdp_st, int line); + void FiniVAAPIOutput(); + void ReturnRenderPicture(CVaapiRenderPicture *renderPic); ++ void ReturnProcPicture(int id); + long ReleasePicReference(); + bool CheckSuccess(VAStatus status); + +@@ -458,6 +478,7 @@ class CPostproc + virtual void Flush() = 0; + virtual bool Compatible(EINTERLACEMETHOD method) = 0; + virtual bool DoesSync() = 0; ++ virtual bool WantsPic() {return true;} + protected: + CVaapiConfig m_config; + int m_step; +@@ -497,6 +518,7 @@ class CVppPostproc : public CPostproc + void Flush(); + bool Compatible(EINTERLACEMETHOD method); + bool DoesSync(); ++ bool WantsPic(); + protected: + bool CheckSuccess(VAStatus status); + void Dispose(); diff --git a/packages/mediacenter/xbmc/patches/xbmc-996.01-Dolby-TrueHD_audio_with_Atmos.patch b/packages/mediacenter/xbmc/patches/xbmc-996.01-Dolby-TrueHD_audio_with_Atmos.patch deleted file mode 100644 index b99733680b..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-996.01-Dolby-TrueHD_audio_with_Atmos.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 6e5461cc577376fe6efa291549d6987883a07123 Mon Sep 17 00:00:00 2001 -From: Anssi Hannula -Date: Sun, 21 Sep 2014 19:26:42 +0300 -Subject: [PATCH] AEStreamInfo: Handle sync headers with extension blocks - -Fixes passthrough of Dolby TrueHD audio with Atmos. - -Behavior based on FFmpeg patch "mlpdec: support major sync headers with -optional extension blocks" by Hendrik Leppkes. ---- - xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp | 17 ++++++++++++++--- - 1 file changed, 14 insertions(+), 3 deletions(-) - -diff --git a/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp b/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp -index 08e375b..73b84f3 100644 ---- a/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp -+++ b/xbmc/cores/AudioEngine/Utils/AEStreamInfo.cpp -@@ -666,10 +666,21 @@ unsigned int CAEStreamInfo::SyncTrueHD(uint8_t *data, unsigned int size) - if (rate == 0xF) - continue; - -+ unsigned int major_sync_size = 28; -+ if (data[29] & 1) -+ { -+ /* extension(s) present, look up count */ -+ int extension_count = data[30] >> 4; -+ major_sync_size += 2 + extension_count * 2; -+ } -+ -+ if (left < 4 + major_sync_size) -+ return skip; -+ - /* verify the crc of the audio unit */ -- uint16_t crc = av_crc(m_crcTrueHD, 0, data + 4, 24); -- crc ^= (data[29] << 8) | data[28]; -- if (((data[31] << 8) | data[30]) != crc) -+ uint16_t crc = av_crc(m_crcTrueHD, 0, data + 4, major_sync_size - 4); -+ crc ^= (data[4 + major_sync_size - 3] << 8) | data[4 + major_sync_size - 4]; -+ if (((data[4 + major_sync_size - 1] << 8) | data[4 + major_sync_size - 2]) != crc) - continue; - - /* get the sample rate and substreams, we have a valid master audio unit */ diff --git a/packages/mediacenter/xbmc/patches/xbmc-999.95-fix-build.patch b/packages/mediacenter/xbmc/patches/xbmc-999.95-fix-build.patch deleted file mode 100644 index eaa9cfa134..0000000000 --- a/packages/mediacenter/xbmc/patches/xbmc-999.95-fix-build.patch +++ /dev/null @@ -1,43 +0,0 @@ -commit 3f472ab8a09d2dfc724fa667646ce47159d8c166 -Author: wolfgar -Date: Thu Sep 25 02:50:27 2014 +0200 - - Undef EGL_KHR_reusable_sync when imx support is enabled as - egl*SyncKHR declarations will conflict - -diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp -index 1300a7f..c747118 100644 ---- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp -+++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp -@@ -79,23 +79,25 @@ static PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR; - static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES; - #endif - --#if defined(EGL_KHR_reusable_sync) --static PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; --static PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; --static PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR; --#endif -- - #ifdef HAS_IMXVPU - #include "windowing/egl/EGLWrapper.h" - #include "DVDCodecs/Video/DVDVideoCodecIMX.h" - - #define GL_VIV_NV12 0x8FC1 -+#undef EGL_KHR_reusable_sync - typedef void (GL_APIENTRYP PFNGLTEXDIRECTVIVMAPPROC) (GLenum Target, GLsizei Width, GLsizei Height, GLenum Format, GLvoid ** Logical, const GLuint * Physical); - typedef void (GL_APIENTRYP PFNGLTEXDIRECTINVALIDATEVIVPROC) (GLenum Target); - static PFNGLTEXDIRECTVIVMAPPROC glTexDirectVIVMap; - static PFNGLTEXDIRECTINVALIDATEVIVPROC glTexDirectInvalidateVIV; - #endif - -+#if defined(EGL_KHR_reusable_sync) -+static PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; -+static PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; -+static PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR; -+#endif -+ -+ - #if defined(TARGET_ANDROID) - #include "DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.h" - #endif