commit 0faba599d2e492ac4aef0d1d187dd4fc0f5a5978
Author: Richard Shaw <hobbes1069(a)gmail.com>
Date: Mon Aug 7 11:24:44 2017 -0500
Update to lates fixes/0.28, v0.28.1-38-geef6a48.
ChangeLog | 367 +++++++++
mythtv-0.28-fixes.patch | 1146 ++++++++++++++++++++++++++-
mythtv.spec | 22 +-
ticket13049-bswap-guard.diff | 13 -
ticket13049-remove-ffmpeg-bswap-change.diff | 26 -
5 files changed, 1512 insertions(+), 62 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 65a9161..60a1502 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,370 @@
+commit eef6a480b0eca5201eec785b0ce57f9a6f4b7fdd
+Author: Peter Bennett <pbennett(a)mythtv.org>
+Date: Wed Jul 12 15:33:31 2017 -0400
+
+ Fix bugs that occur when using a different video mode for playback.
+
+ Fixes these cases where the code does not cater for the video mode
+ changing between GUI and playback.
+ - Playback using xv-blit and maybe others is shown in the wrong size and position.
+ - Playback using OpenGL is displaced downward.
+ - LiveTV using OpenGL is the wrong size.
+ - Program Guide and other screens selected from within LiveTV when using OpenGL
+ are cut off on the right.
+
+ Fixes #7408
+ Fixes #11363
+ Fixes #13054
+
+ (cherry picked from commit 7388b5a60c54d5e812a535bf5212295e512c5c3f)
+
+commit 457a417f407bd38fa0d989f9ca006a5fb3173695
+Author: Roger Siddons <rsiddons(a)mythtv.org>
+Date: Tue Apr 19 12:32:28 2016 +0100
+
+ Services: Fix exception messages
+
+ Some exceptions are thrown as const char* so they are not being logged.
+ Exceptions should be thrown as QStrings.
+
+ (cherry picked from commit 29e2269424b6b84afeb3d68158ada829429a0610)
+
+commit 1c2863c23f9c188b00b59255c5408c0ca06d44f5
+Author: Gary Buhrmaster <gary.buhrmaster(a)gmail.com>
+Date: Wed Nov 9 17:04:40 2016 +0000
+
+ [PATCH] Support tuning via freqid translation for ExternalRecorder
+
+ Signed-off-by: John Poet <jpoet(a)mythtv.org>
+
+ Fixes #12919
+
+ (cherry picked from commit 87140917197b156a5c06ac6ce36eb47de358a313)
+
+commit 392be659b69243ce70311480db82cd111689fc53
+Author: Peter Bennett <pbennett(a)mythtv.org>
+Date: Wed Jun 28 11:21:47 2017 -0400
+
+ Fixes #13059 - Flickering pause on Raspberry Pi.
+
+ (cherry picked from commit 42d4a3146a0658403579ba9446050b3974090b6d)
+
+commit 8f7475b88902052b1eb27f297370d5f4f22b2aff
+Author: Peter Bennett <pbennett(a)mythtv.org>
+Date: Tue Jun 20 19:25:13 2017 -0400
+
+ Fix Raspberry Pi hardware deinterlace
+
+ Fixes #13030
+
+ (cherry picked from commit 4b8862829d98aff2e5baba92ee98e1dd3b505e6b)
+
+commit ec95cbd7f401ab43d4d7c5a7d5b17a0e5021a260
+Author: Stuart Auchterlonie <stuarta(a)mythtv.org>
+Date: Thu Jun 15 11:36:31 2017 +0100
+
+ Refs #13031 - No GL/gl.h on osx
+
+ (cherry picked from commit ab0dfcba5e3b92b90f993148c9449450c40acbff)
+
+commit 6a683aff7834054238413e83b0cf3f832f91cacb
+Author: Stuart Auchterlonie <stuarta(a)mythtv.org>
+Date: Thu Jun 15 11:03:40 2017 +0100
+
+ Refs #13031 - Reorganise the OpenGL includes a bit to fix build issues on arch on
rpi
+
+ (cherry picked from commit 05ad15bab9c11b7f102efc42a435406d7d0157c9)
+
+commit 98550bedeeea666cc412fe3ee9ac3ffa12803ce5
+Author: Stuart Auchterlonie <stuarta(a)mythtv.org>
+Date: Wed Jun 7 09:15:00 2017 +0100
+
+ Refs #13047 - fix check for OSX platforms
+
+ (cherry picked from commit 37c41f1b411070471060b2f2d695e3a1ee8bebe3)
+
+commit 219fbe688eab463cdf1f948270459f47bf9f0885
+Author: Stuart Auchterlonie <stuarta(a)mythtv.org>
+Date: Tue Jun 6 22:55:50 2017 +0100
+
+ Refs #13047 - Windows also has major() and minor() in <sys/types.h>
+
+ (cherry picked from commit 0a8e8423e8cc4d7ced1db96ba58caeb85c5af6e0)
+
+commit b012ff0f6b284969183863d42a6a14eb77ed0a1d
+Author: Stuart Auchterlonie <stuarta(a)mythtv.org>
+Date: Tue Jun 6 22:39:03 2017 +0100
+
+ Refs #13047 - major() and minor() are defined in <sys/sysmacros.h>
+
+ On BSD platforms they remain defined in <sys/types.h>
+
+ (cherry picked from commit eca27c542b70deb58e50ad4581b2d6f6b2e1d3c2)
+
+commit 63ada4ffb865f9cc2d723113dbc5263748e8410f
+Author: John Poet <jpoet(a)mythtv.org>
+Date: Tue Jun 6 12:25:15 2017 -0600
+
+ ProgramInfo::ToMap: Add a copy of 'description' called
'description0'.
+
+ This allows themes to set different characteristics for the description
+ depend on other elements.
+
+ (cherry picked from commit fe0928403e5b544894d22ab614ed69e4430f518d)
+
+commit b3480d043721848bda06d841eca09a6a2149c7e1
+Author: Stuart Auchterlonie <stuarta(a)mythtv.org>
+Date: Mon Jun 5 09:45:34 2017 +0100
+
+ Remove a custom FFmpeg patch for bswap_dbl
+
+ We have been carrying a custom patch for FFmpeg which
+ adds bswap_dbl to the ffmpeg codebase, yet it's not
+ used within ffmpeg, and we also have the same definition
+ in libs/libmythbase/bswap.h:29
+
+ This was causing duplicate function definition errors
+ building on some platforms.
+
+ Rather than carrying an unneeded ffmpeg customization
+ around lets just remove that customization.
+
+ Fixes #13049
+ Refs #12634 <- no longer requires `avoid_bswap_conflict.patch`
+
+ (cherry picked from commit 517216c725bedcff47db908e161abae1dd18e7a3)
+
+commit 2d42863a62dc721e5ddea61a3aedfc414ca4c0ff
+Author: Gary Buhrmaster <gary.buhrmaster(a)gmail.com>
+Date: Fri Jun 2 10:49:33 2017 +0100
+
+ Fixes #13050 - Properly enable symbol visibility for GCC7
+
+ Signed-off-by: Stuart Auchterlonie <stuarta(a)mythtv.org>
+ (cherry picked from commit 1866a820f69162d1ffda724e0173478eeac0f78b)
+
+commit e3b8adeb88e42719ce2acae9eb3a2981a27eba68
+Author: Jonatan Lindblad <jlindblad(a)mythtv.org>
+Date: Thu Jun 1 17:59:39 2017 +0200
+
+ TV: Fix ESCAPE being ignored
+
+ The cause was that lcdVolumeTimerId was never set to 0 after killing it.
+ Since timer IDs are reused by Qt the timer started when ESCAPE was
+ pressed to exit playback could be treated as lcdVolumeTimerId and ending
+ up never being processed. This only happened if the LCD support was
+ enabled and the volume was changed.
+
+ Fixes #12566
+
+ (cherry picked from commit bdbc6363a311f08cdb61eab81d62243b56b7bd12)
+
+commit 4664d5ca42a21548f390cd26bd14500559f0da9e
+Author: Bill Meek <bmeek(a)mythtv.org>
+Date: Thu Jun 1 08:17:04 2017 -0500
+
+ Services API: Dvr/GetTitleInfoList was returning Deleted recordings.
+
+ (cherry picked from commit 08a03c582cbac3927805213fa3a1786ccd05f525)
+
+commit af9826265820668395c64f04179a90dcdf331adb
+Author: Roger Siddons <rsiddons(a)mythtv.org>
+Date: Wed May 10 01:18:44 2017 +0100
+
+ Prevent cutlist editor crash when extending marks
+
+ Code was modifying the container without adjusting the iterator.
+ Fixes #13039
+
+ (cherry picked from commit 9d2f7b67ef004c20c24048922a1f9367c6127399)
+
+commit 2d247dc4600cc11166f056f48058f74252a27419
+Author: Roger Siddons <rsiddons(a)mythtv.org>
+Date: Thu Apr 20 09:26:51 2017 +0100
+
+ Python: Fix bookmarkupdate error
+
+ Python scripts updating a recording with no bookmark elicit:
+ Failed due to: "MySQL error 1292: Incorrect datetime value: '0' for
column 'bookmarkupdate' at row 1"
+
+ The bindings use a default of 0, which is rejected by newer MySQL versions
+
+ (cherry picked from commit 37ef0fa91e7fdffb0edccec288b00471c60f2148)
+
+commit e26a33c69af48399b8c52b1d76872d64a944d137
+Author: Gary Buhrmaster <gary.buhrmaster(a)gmail.com>
+Date: Tue Apr 18 11:10:45 2017 -0400
+
+ Fix parsing of season from xmltv
+
+ Fixes #12786
+
+ Signed-off-by: Peter Bennett <pbennett(a)mythtv.org>
+ (cherry picked from commit 585f509dea5a8e9c7d7e213d4440ebde958e8138)
+
+commit 14f82aa54c2825b58b08499a2f448dd6a155fb05
+Author: Peter Bennett <pbennett(a)mythtv.org>
+Date: Tue Apr 18 10:45:01 2017 -0400
+
+ Fix for LCD device code hanging
+
+ When playing recordings if the audio changes (e.g. number of
+ channels change), it sends a message to the lcd server
+ from the wrong thread.
+ After this no LCD messages get through, but queue indefinitely.
+ The fix uses a slot to ensure messages are send from the
+ correct thread.
+
+ Refs #12566
+ Fixes #12567
+
+ (cherry picked from commit 3cd374dd16d2257485468e0415892d417eb7520a)
+
+commit 0037461751becd40aedd2d3dd8bd2ad5e0836c9f
+Author: Karl Dietz <dekarl(a)mythtv.org>
+Date: Wed Mar 22 22:37:13 2017 +0100
+
+ Set MySQL session mode in Perl bindings
+
+ this allows optimize_mythdb.pl to work against newer (5.7+)
+ versions of MySQL.
+
+ Patch by Michael Dean
+
+ Refs #12871
+
+ (cherry picked from commit 83c67a0c7b5eec295e9cad757ff6edc1438078ff)
+
+commit 70266230d3d3afcf9c356cf503fce210fe67ab07
+Author: Gary Buhrmaster <gary.buhrmaster(a)gmail.com>
+Date: Mon Feb 13 16:19:57 2017 -0700
+
+ Use XMLTV dd_progid data to create seriesid
+
+ The current seriesid processing for XMLTV grabbers using a hash for the
+ title is non-optimal in the (Schedules Direct) case where the seriesid can
+ be more accurately represented (via a supplied dd_progid). The internal
+ datadirect grabber creates such a seriesid from its feeds.
+
+ From some research and discussions with Schedules Direct regarding the
+ gracenote upstream (raw) data, there is a true seriesid available, but
+ passing that through to MythTV, and then adjusting existing data has some
+ challenges (some upstream). And while there are some potential approaches,
+ rather than wait for the perfect, we can do something now which is
+ equivalent to the internal dd grabber.
+
+ This patch creates a better seriesid from a XMLTV source which provides a
+ dd_progid with a seriesid which is compatible with the (internal)
+ DataDirect? grabber (further moving forward to allowing the eventual removal
+ of the internal DD grabber).
+
+ The following patch (based on some initial work by Mr. Poet) creates an
+ appropriate seriesid.
+
+ Note:
+
+ The uniqueid value was added to the code in commit
+ 347ea0319330cb06cf3e418e12e79602c3235bc0 (over a decade ago) however it was
+ never set, and always empty, resulting in some dead code. It appears that
+ the uniqueid may have been intended to serve the same/equivalent purposes of
+ programid (at some point). This patch removes the (dead) uniqueid along the
+ way as part of the larger set of fixes.
+
+ As this patch changes the seriesid for new grabbed programs, those that are
+ using the "this series" matching based on the previous seriesid may run
into
+ some issues. Likely the easiest solution to recommend is to recreate those
+ rules.
+
+ Signed-off-by: John Poet <jpoet(a)mythtv.org>
+ (cherry picked from commit 4e5cf2b4ef875ee578b121be9867ba05da5fab17)
+
+commit 845f6d47b4d904589050a12b67245161339a41e6
+Author: John Poet <jpoet(a)mythtv.org>
+Date: Fri Feb 10 14:54:54 2017 -0700
+
+ Another attempt at preventing mythfilldatabase from inserting duplicate
+ channels.
+
+ In ChannelData::channelList use ChannelUtil::LoadChannels instead of
+ ChannelUtil::GetChannels, as the former seems to be more reliable.
+
+ (cherry picked from commit b25f8c630bbd73602c4bf646c9aa760cb0fb60fc)
+
+commit 3dd03e36ed6df640665e1c8b93944442d9f91406
+Author: John Poet <jpoet(a)mythtv.org>
+Date: Sun Jun 12 01:17:40 2016 -0600
+
+ mythfilldatabase: Also try matching ATSC major.minor when update xmltvid.
+
+ (cherry picked from commit 5933e03efdb136a5bd35f60bdcf24f8a1a32749b)
+
+commit 044b22b95734ee607806ff8cea04e84c5112438d
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Wed Mar 15 10:32:01 2017 +0000
+
+ MythArchive: guard against an empty deleteMap in the thumb image finder
+
+ (cherry picked from commit abb225031b2ece763f773bdf060cfde1ec7abe81)
+
+commit 0bd473036fdb132c6f094eff360de3e444256aeb
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Wed Mar 15 10:29:54 2017 +0000
+
+ MythArchive: update the initial seek amount text on the thumb image finder
+
+ (cherry picked from commit 9572352cc6e267254ede2feea567c088e5d5b7ad)
+
+commit 2622ddd0c7f8e9cd037bbb8da0225975c305fda8
+Author: Paul Harrison <pharrison(a)mythtv.org>
+Date: Wed Mar 15 09:22:03 2017 +0000
+
+ IPTV Tuner: fix recording/playing simultaneous RTSP streams
+
+ Thanks to strenker on the forum for tracking this down.
+
+ (cherry picked from commit b5659411dd7e964c86077f49f6bde29736df680d)
+
+commit 8f13742e18f76ede87e46f1ce12bd00aa40d621b
+Author: Gary Buhrmaster <gary.buhrmaster(a)gmail.com>
+Date: Tue Mar 7 10:02:21 2017 -0500
+
+ Validate the programme starttime/channel early
+
+ If a programme does not have a starttime the (later) attempted
+ insertion of the program into the database will result in a
+ database constraint error. If the program does not have a
+ channel there will be a match error later. Verify both early
+ (perhaps with better log messages).
+
+ Fixes #13011
+
+ Signed-off-by: Peter Bennett <pbennett(a)mythtv.org>
+ (cherry picked from commit ab4513fbb6f50f1402835b5599f6ff79b4b0fd48)
+
+commit 12232f081c672165f67819de8cd9f437c991a082
+Author: Gary Buhrmaster <gary.buhrmaster(a)gmail.com>
+Date: Tue Mar 7 10:00:21 2017 -0500
+
+ Improve fromXMLTVDate processing for mythfilldatabase
+
+ In cases where the system is running in localtime, the
+ current processing will apply timezone validation to
+ the input datetime, which can result in rejection of valid
+ datetimes.
+
+ Fixes #13010
+
+ Signed-off-by: Peter Bennett <pbennett(a)mythtv.org>
+ (cherry picked from commit 841073ea8c1f49e858f5bb6c18e3c0ade04eb512)
+
+commit dc2b2782408f25992f34fad71628ece96f5d9f3a
+Author: John Poet <jpoet(a)mythtv.org>
+Date: Tue May 17 18:20:41 2016 -0600
+
+ mythfilldatabase - xmltvparser.cpp: Fix whitespace.
+
+ (cherry picked from commit 55eb77fda5f4578801d579e9823e7eeb8bb8399c)
+
commit 3255b983b039f26c36cae016f4a522183283837c
Author: Stuart Auchterlonie <stuarta(a)mythtv.org>
Date: Fri Mar 3 15:08:14 2017 +0000
diff --git a/mythtv-0.28-fixes.patch b/mythtv-0.28-fixes.patch
index e0be7b2..870d5f2 100644
--- a/mythtv-0.28-fixes.patch
+++ b/mythtv-0.28-fixes.patch
@@ -1,14 +1,215 @@
- mythtv/libs/libmythbase/loggingserver.cpp | 2 +-
- mythtv/libs/libmythtv/eitfixup.cpp | 2 ++
- mythtv/libs/libmythtv/eithelper.cpp | 17 +++++++++--------
- mythtv/libs/libmythtv/mythavutil.cpp | 15 ++++++++++++++-
- mythtv/libs/libmythupnp/mythxmlclient.cpp | 4 +++-
- mythtv/libs/libmythupnp/soapclient.cpp | 4 +++-
- mythtv/libs/libmythupnp/ssdp.cpp | 4 ++++
- mythtv/libs/libmythupnp/upnp.h | 1 +
- mythtv/programs/mythfrontend/proglist.cpp | 4 ++--
- 9 files changed, 39 insertions(+), 14 deletions(-)
+ .../mytharchive/mytharchive/thumbfinder.cpp | 8 +
+ mythtv/bindings/perl/MythTV.pm | 2 +
+ mythtv/bindings/python/MythTV/dataheap.py | 2 +-
+ mythtv/configure | 15 +-
+ mythtv/external/FFmpeg/libavutil/bswap.h | 15 --
+ mythtv/libs/libmyth/programinfo.cpp | 2 +-
+ mythtv/libs/libmythbase/lcddevice.cpp | 10 +-
+ mythtv/libs/libmythbase/lcddevice.h | 5 +-
+ mythtv/libs/libmythbase/loggingserver.cpp | 2 +-
+ mythtv/libs/libmythtv/deletemap.cpp | 3 +-
+ mythtv/libs/libmythtv/eitfixup.cpp | 2 +
+ mythtv/libs/libmythtv/eithelper.cpp | 17 +-
+ mythtv/libs/libmythtv/iptvtuningdata.h | 2 +-
+ mythtv/libs/libmythtv/mythavutil.cpp | 15 +-
+ mythtv/libs/libmythtv/privatedecoder_omx.cpp | 89 +--------
+ mythtv/libs/libmythtv/privatedecoder_omx.h | 4 -
+ .../libs/libmythtv/recorders/ExternalChannel.cpp | 5 +
+ mythtv/libs/libmythtv/recorders/ExternalChannel.h | 1 +
+ mythtv/libs/libmythtv/tv_play.cpp | 31 +++-
+ mythtv/libs/libmythtv/videoout_omx.cpp | 20 +-
+ mythtv/libs/libmythtv/videoout_omx.h | 1 +
+ mythtv/libs/libmythtv/videoout_opengl.cpp | 19 +-
+ mythtv/libs/libmythtv/videooutwindow.cpp | 8 +
+ mythtv/libs/libmythtv/videooutwindow.h | 1 +
+ mythtv/libs/libmythtv/videosource.cpp | 4 +
+ mythtv/libs/libmythui/mythrender_opengl.h | 3 -
+ mythtv/libs/libmythui/mythrender_opengl1.h | 3 +
+ mythtv/libs/libmythupnp/mythxmlclient.cpp | 4 +-
+ mythtv/libs/libmythupnp/soapclient.cpp | 4 +-
+ mythtv/libs/libmythupnp/ssdp.cpp | 4 +
+ mythtv/libs/libmythupnp/upnp.h | 1 +
+ mythtv/programs/mythbackend/services/content.cpp | 4 +-
+ mythtv/programs/mythbackend/services/dvr.cpp | 2 +-
+ mythtv/programs/mythbackend/services/guide.cpp | 18 +-
+ mythtv/programs/mythbackend/services/myth.cpp | 2 +-
+ mythtv/programs/mythfilldatabase/channeldata.cpp | 39 +++-
+ mythtv/programs/mythfilldatabase/channeldata.h | 6 +-
+ mythtv/programs/mythfilldatabase/xmltvparser.cpp | 205 ++++++++++++---------
+ mythtv/programs/mythfrontend/proglist.cpp | 4 +-
+ 39 files changed, 329 insertions(+), 253 deletions(-)
+diff --git a/mythplugins/mytharchive/mytharchive/thumbfinder.cpp
b/mythplugins/mytharchive/mytharchive/thumbfinder.cpp
+index d2bcdf5..25b3829 100644
+--- a/mythplugins/mytharchive/mytharchive/thumbfinder.cpp
++++ b/mythplugins/mytharchive/mytharchive/thumbfinder.cpp
+@@ -159,6 +159,8 @@ bool ThumbFinder::Create(void)
+
+ connect(m_frameButton, SIGNAL(Clicked()), this, SLOT(updateThumb()));
+
++ m_seekAmountText->SetText(SeekAmounts[m_currentSeek].name);
++
+ BuildFocusList();
+
+ SetFocusWidget(m_imageGrid);
+@@ -274,6 +276,12 @@ void ThumbFinder::loadCutList()
+ delete progInfo;
+ }
+
++ if (m_deleteMap.isEmpty())
++ {
++ LOG(VB_GENERAL, LOG_ERR, "ThumbFinder::loadCutList: Got an empty delete
map");
++ return;
++ }
++
+ // if the first mark is a end mark then add the start mark at the beginning
+ frm_dir_map_t::const_iterator it = m_deleteMap.begin();
+ if (it.value() == MARK_CUT_END)
+diff --git a/mythtv/bindings/perl/MythTV.pm b/mythtv/bindings/perl/MythTV.pm
+index 188fcc0..db196ec 100644
+--- a/mythtv/bindings/perl/MythTV.pm
++++ b/mythtv/bindings/perl/MythTV.pm
+@@ -372,6 +372,8 @@ EOF
+ $self->{'db_user'},
+ $self->{'db_pass'})
+ or die "Cannot connect to database: $!\n\n";
++ $self->{'dbh'}->do("SET SESSION sql_mode = ''")
++ or die "Can't set sql_mode: $!\n\n";
+ $self->{'dbh'}->do("SET time_zone = 'Etc/UTC'")
+ or die "Can't set timezone: $!\n\n";
+
+diff --git a/mythtv/bindings/python/MythTV/dataheap.py
b/mythtv/bindings/python/MythTV/dataheap.py
+index 859e060..4de3085 100644
+--- a/mythtv/bindings/python/MythTV/dataheap.py
++++ b/mythtv/bindings/python/MythTV/dataheap.py
+@@ -283,7 +283,7 @@ class Recorded( CMPRecord, DBDataWrite ):
+ 'commflagged':0, 'recgroup':'Default',
'seriesid':'',
+ 'programid':'',
'lastmodified':'CURRENT_TIMESTAMP',
+ 'filesize':0, 'stars':0,
'previouslyshown':0,
+- 'preserve':0, 'bookmarkupdate':0,
++ 'preserve':0, 'bookmarkupdate':None,
+ 'findid':0, 'deletepending':0,
'transcoder':0,
+ 'timestretch':1, 'recpriority':0,
'playgroup':'Default',
+ 'profile':'No', 'duplicate':1,
'transcoded':0,
+diff --git a/mythtv/configure b/mythtv/configure
+index af0d6a6..5019732 100755
+--- a/mythtv/configure
++++ b/mythtv/configure
+@@ -7618,19 +7618,10 @@ esac
+
+ if enabled gxx; then
+ if enabled symbol_visibility; then
+- # Don't check for patch levels in gcc4 series.
+- # See
https://bugs.launchpad.net/ubuntu/+source/gcc-4.8/+bug/1360404
+- if expr "$gxx_version" : '4\.[2-9]' >/dev/null || expr
"$gxx_version" : '[5-9]\..*\.' >/dev/null; then
+- check_cxxflags -fvisibility-inlines-hidden
+- append CCONFIG "use_hidesyms"
+- else
+- disable symbol_visibility
+- warn "--enable-symbol-visibility requires gcc 4.2 or higher"
+- fi
+- fi
+- if expr "$gxx_version" : '4\.[3-9]' >/dev/null || expr
"$gxx_version" : '[5-9]\..*\.' >/dev/null; then
+- check_cxxflags -Wmissing-declarations
++ check_cxxflags -fvisibility-inlines-hidden
++ append CCONFIG "use_hidesyms"
+ fi
++ check_cxxflags -Wmissing-declarations
+ check_cxxflags -Wno-switch
+ check_cxxflags -Woverloaded-virtual
+ check_cxxflags -funit-at-a-time
+diff --git a/mythtv/external/FFmpeg/libavutil/bswap.h
b/mythtv/external/FFmpeg/libavutil/bswap.h
+index 331d391..91cb795 100644
+--- a/mythtv/external/FFmpeg/libavutil/bswap.h
++++ b/mythtv/external/FFmpeg/libavutil/bswap.h
+@@ -76,21 +76,6 @@ static inline uint64_t av_const av_bswap64(uint64_t x)
+ }
+ #endif
+
+-#ifndef av_bswap_dbl
+-static inline double bswap_dbl(double x)
+-{
+- union {
+- uint32_t l[2];
+- double d;
+- } w, r;
+- w.d = x;
+- r.l[0] = av_bswap32(w.l[1]);
+- r.l[1] = av_bswap32(w.l[0]);
+- return r.d;
+-}
+-#endif
+-
+-
+ // be2ne ... big-endian to native-endian
+ // le2ne ... little-endian to native-endian
+
+diff --git a/mythtv/libs/libmyth/programinfo.cpp b/mythtv/libs/libmyth/programinfo.cpp
+index 56a1a3b..3d7c94d 100644
+--- a/mythtv/libs/libmyth/programinfo.cpp
++++ b/mythtv/libs/libmyth/programinfo.cpp
+@@ -1593,7 +1593,7 @@ void ProgramInfo::ToMap(InfoMap &progMap,
+
+ progMap["titlesubtitle"] = tempSubTitle;
+
+- progMap["description"] = description;
++ progMap["description"] = progMap["description0"] = description;
+
+ if (season > 0 || episode > 0)
+ {
+diff --git a/mythtv/libs/libmythbase/lcddevice.cpp
b/mythtv/libs/libmythbase/lcddevice.cpp
+index f3924d9..1ee9964 100644
+--- a/mythtv/libs/libmythbase/lcddevice.cpp
++++ b/mythtv/libs/libmythbase/lcddevice.cpp
+@@ -77,6 +77,7 @@ LCD::LCD()
+
+ connect(m_retryTimer, SIGNAL(timeout()), this, SLOT(restartConnection()));
+ connect(m_LEDTimer, SIGNAL(timeout()), this, SLOT(outputLEDs()));
++ connect(this, &LCD::sendToServer, this, &LCD::sendToServerSlot,
Qt::QueuedConnection);
+ }
+
+ bool LCD::m_enabled = false;
+@@ -204,13 +205,20 @@ bool LCD::connectToHost(const QString &lhostname, unsigned int
lport)
+ return m_connected;
+ }
+
+-void LCD::sendToServer(const QString &someText)
++void LCD::sendToServerSlot(const QString &someText)
+ {
+ QMutexLocker locker(&m_socketLock);
+
+ if (!m_socket || !m_lcdReady)
+ return;
+
++ if (m_socket->thread() != QThread::currentThread())
++ {
++ LOG(VB_GENERAL, LOG_ERR,
++ "Sending to LCDServer from wrong thread.");
++ return;
++ }
++
+ // Check the socket, make sure the connection is still up
+ if (QAbstractSocket::ConnectedState != m_socket->state())
+ {
+diff --git a/mythtv/libs/libmythbase/lcddevice.h b/mythtv/libs/libmythbase/lcddevice.h
+index b6346ec..c3247b4 100644
+--- a/mythtv/libs/libmythbase/lcddevice.h
++++ b/mythtv/libs/libmythbase/lcddevice.h
+@@ -293,10 +293,13 @@ class MBASE_PUBLIC LCD : public QObject
+ void restartConnection(); // Try to re-establish the connection to
+ // LCDServer every 10 seconds
+ void outputLEDs();
++ void sendToServerSlot(const QString &someText);
++
++signals:
++ void sendToServer(const QString &someText);
+
+ private:
+ bool startLCDServer(void);
+- void sendToServer(const QString &someText);
+ void init();
+ void handleKeyPress(const QString &keyPressed);
+ QString quotedString(const QString &string);
diff --git a/mythtv/libs/libmythbase/loggingserver.cpp
b/mythtv/libs/libmythbase/loggingserver.cpp
index 4ebb705..15aafa2 100644
--- a/mythtv/libs/libmythbase/loggingserver.cpp
@@ -22,6 +223,20 @@ index 4ebb705..15aafa2 100644
{
qLock.unlock();
bool logged = m_logger->logqmsg(*query, item);
+diff --git a/mythtv/libs/libmythtv/deletemap.cpp b/mythtv/libs/libmythtv/deletemap.cpp
+index 1be1a02..adf06c2 100644
+--- a/mythtv/libs/libmythtv/deletemap.cpp
++++ b/mythtv/libs/libmythtv/deletemap.cpp
+@@ -489,7 +489,8 @@ void DeleteMap::NewCut(uint64_t frame)
+ {
+ LOG(VB_PLAYBACK, LOG_INFO, LOC +
+ QString("Deleting bounded marker:
%1").arg(otherframe));
+- Delete(otherframe);
++ it = m_deleteMap.erase(it);
++ m_changed = true;
+ }
+ }
+ }
diff --git a/mythtv/libs/libmythtv/eitfixup.cpp b/mythtv/libs/libmythtv/eitfixup.cpp
index 6c664c9..28b9816 100644
--- a/mythtv/libs/libmythtv/eitfixup.cpp
@@ -67,6 +282,19 @@ index 5b66988..1369cab 100644
fix[ 2112LL << 32 | 2U << 16] = EITFixUp::kFixUK;
fix[ 2116LL << 32 | 2U << 16] = EITFixUp::kFixUK;
fix[ 2301LL << 32 | 2U << 16] = EITFixUp::kFixUK | EITFixUp::kFixHTML;
+diff --git a/mythtv/libs/libmythtv/iptvtuningdata.h
b/mythtv/libs/libmythtv/iptvtuningdata.h
+index c5a3c2e..111052d 100644
+--- a/mythtv/libs/libmythtv/iptvtuningdata.h
++++ b/mythtv/libs/libmythtv/iptvtuningdata.h
+@@ -97,7 +97,7 @@ class MTV_PUBLIC IPTVTuningData
+ const QUrl u = GetDataURL();
+ if (IsHLS())
+ return QString("%1(%2)").arg(u.toString()).arg(GetBitrate(0));
+- if (IsHTTPTS())
++ if (IsHTTPTS() || IsRTSP())
+ return QString("%1").arg(u.toString());
+ return QString("%1:%2:%3")
+ .arg(u.host()).arg(u.userInfo()).arg(u.port()).toLower();
diff --git a/mythtv/libs/libmythtv/mythavutil.cpp b/mythtv/libs/libmythtv/mythavutil.cpp
index afed323..c69c4d2 100644
--- a/mythtv/libs/libmythtv/mythavutil.cpp
@@ -101,6 +329,409 @@ index afed323..c69c4d2 100644
SWS_FAST_BILINEAR, NULL, NULL, NULL);
if (d->swsctx == NULL)
{
+diff --git a/mythtv/libs/libmythtv/privatedecoder_omx.cpp
b/mythtv/libs/libmythtv/privatedecoder_omx.cpp
+index b2999ad..f644ed5 100644
+--- a/mythtv/libs/libmythtv/privatedecoder_omx.cpp
++++ b/mythtv/libs/libmythtv/privatedecoder_omx.cpp
+@@ -92,9 +92,6 @@ void PrivateDecoderOMX::GetDecoders(render_opts &opts)
+ PrivateDecoderOMX::PrivateDecoderOMX() :
+ m_videc(gCoreContext->GetSetting("OMXVideoDecode", VIDEO_DECODE),
*this),
+ m_filter(0), m_bStartTime(false),
+-#ifdef USING_BROADCOM
+- m_eMode(OMX_InterlaceFieldsInterleavedUpperFirst), m_bRepeatFirstField(false),
+-#endif
+ m_avctx(0),
+ m_lock(QMutex::Recursive), m_bSettingsChanged(false),
+ m_bSettingsHaveChanged(false)
+@@ -888,6 +885,7 @@ int PrivateDecoderOMX::GetBufferedFrame(AVStream *stream, AVFrame
*picture)
+ OMX_BUFFERHEADERTYPE *hdr = m_obufs.takeFirst();
+ m_lock.unlock();
+
++ OMX_U32 nFlags = hdr->nFlags;
+ if (hdr->nFlags & ~OMX_BUFFERFLAG_ENDOFFRAME)
+ LOG(VB_PLAYBACK, LOG_DEBUG, LOC +
+ QString("Decoded frame flags=%1").arg(HeaderFlags(hdr->nFlags))
);
+@@ -1019,39 +1017,15 @@ int PrivateDecoderOMX::GetBufferedFrame(AVStream *stream, AVFrame
*picture)
+ if (ret)
+ {
+ #ifdef USING_BROADCOM
+- switch (m_eMode)
+- {
+- case OMX_InterlaceProgressive:
+- picture->interlaced_frame = 0;
+- picture->top_field_first = 0;
+- break;
+- case OMX_InterlaceFieldSingleUpperFirst:
+- /* The data is interlaced, fields sent
+- * separately in temporal order, with upper field first */
+- picture->interlaced_frame = 1;
+- picture->top_field_first = 1;
+- break;
+- case OMX_InterlaceFieldSingleLowerFirst:
+- picture->interlaced_frame = 1;
+- picture->top_field_first = 0;
+- break;
+- case OMX_InterlaceFieldsInterleavedUpperFirst:
+- /* The data is interlaced, two fields sent together line
+- * interleaved, with the upper field temporally earlier */
++ if (nFlags & OMX_BUFFERFLAG_INTERLACED)
+ picture->interlaced_frame = 1;
++ else
++ picture->interlaced_frame = 0;
++ if (nFlags & OMX_BUFFERFLAG_TOP_FIELD_FIRST)
+ picture->top_field_first = 1;
+- break;
+- case OMX_InterlaceFieldsInterleavedLowerFirst:
+- picture->interlaced_frame = 1;
++ else
+ picture->top_field_first = 0;
+- break;
+- case OMX_InterlaceMixed:
+- /* The stream may contain a mixture of progressive
+- * and interlaced frames */
+- picture->interlaced_frame = 1;
+- break;
+- }
+- picture->repeat_pict = m_bRepeatFirstField;
++ picture->repeat_pict = 0;
+ #endif // USING_BROADCOM
+
+ if (!frame)
+@@ -1128,55 +1102,6 @@ OMX_ERRORTYPE PrivateDecoderOMX::SettingsChanged(AVCodecContext
*avctx)
+ .arg(Error2String(e)));
+
+ #ifdef USING_BROADCOM
+- OMX_CONFIG_INTERLACETYPE inter;
+- e = GetInterlace(inter, index);
+- if (e == OMX_ErrorNone)
+- {
+- LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("%1%2")
+- .arg(Interlace2String(inter.eMode))
+- .arg(inter.bRepeatFirstField ? " rpt 1st" : "") );
+-
+- m_bRepeatFirstField = inter.bRepeatFirstField;
+- m_eMode = inter.eMode;
+-#if 0 // Can't change interlacing setting, at least not on RPi
+- switch (inter.eMode)
+- {
+- case OMX_InterlaceProgressive:
+- break;
+-
+- case OMX_InterlaceFieldSingleUpperFirst:
+- case OMX_InterlaceFieldSingleLowerFirst:
+- break;
+-
+- case OMX_InterlaceFieldsInterleavedUpperFirst:
+- /* The data is interlaced, two fields sent together line
+- * interleaved, with the upper field temporally earlier */
+- inter.eMode = OMX_InterlaceFieldSingleUpperFirst;
+- break;
+- case OMX_InterlaceFieldsInterleavedLowerFirst:
+- inter.eMode = OMX_InterlaceFieldSingleLowerFirst;
+- break;
+-
+- case OMX_InterlaceMixed:
+- inter.eMode = OMX_InterlaceFieldSingleUpperFirst;
+- break;
+- }
+-
+- if (m_eMode != inter.eMode)
+- {
+- e = m_videc.SetConfig(OMX_IndexConfigCommonInterlace, &inter);
+- if (e == OMX_ErrorNone)
+- m_eMode = inter.eMode;
+- else
+- LOG(VB_PLAYBACK, LOG_ERR, LOC + QString(
+- "Set ConfigCommonInterlace error %1")
+- .arg(Error2String(e)));
+- }
+-#endif
+- }
+-#endif // USING_BROADCOM
+-
+-#ifdef USING_BROADCOM
+ if (VERBOSE_LEVEL_CHECK(VB_PLAYBACK, LOG_INFO))
+ {
+ OMX_CONFIG_POINTTYPE aspect;
+diff --git a/mythtv/libs/libmythtv/privatedecoder_omx.h
b/mythtv/libs/libmythtv/privatedecoder_omx.h
+index 7fe28eb..6a00506 100644
+--- a/mythtv/libs/libmythtv/privatedecoder_omx.h
++++ b/mythtv/libs/libmythtv/privatedecoder_omx.h
+@@ -70,10 +70,6 @@ class PrivateDecoderOMX : public PrivateDecoder, private
OMXComponentCtx
+ OMXComponent m_videc;
+ AVBitStreamFilterContext *m_filter;
+ bool m_bStartTime;
+-#ifdef USING_BROADCOM
+- OMX_INTERLACETYPE m_eMode;
+- bool m_bRepeatFirstField;
+-#endif
+ AVCodecContext *m_avctx;
+
+ QMutex mutable m_lock; // Protects data following
+diff --git a/mythtv/libs/libmythtv/recorders/ExternalChannel.cpp
b/mythtv/libs/libmythtv/recorders/ExternalChannel.cpp
+index 604819c..5d44f8d 100644
+--- a/mythtv/libs/libmythtv/recorders/ExternalChannel.cpp
++++ b/mythtv/libs/libmythtv/recorders/ExternalChannel.cpp
+@@ -95,6 +95,11 @@ bool ExternalChannel::Tune(const QString &channum)
+ return true;
+ }
+
++bool ExternalChannel::Tune(const QString &freqid, int /*finetune*/)
++{
++ return ExternalChannel::Tune(freqid);
++}
++
+ bool ExternalChannel::EnterPowerSavingMode(void)
+ {
+ Close();
+diff --git a/mythtv/libs/libmythtv/recorders/ExternalChannel.h
b/mythtv/libs/libmythtv/recorders/ExternalChannel.h
+index d74e5a9..da3b79f 100644
+--- a/mythtv/libs/libmythtv/recorders/ExternalChannel.h
++++ b/mythtv/libs/libmythtv/recorders/ExternalChannel.h
+@@ -29,6 +29,7 @@ class ExternalChannel : public DTVChannel
+ using DTVChannel::Tune;
+ virtual bool Tune(const DTVMultiplex&) { return true; }
+ virtual bool Tune(const QString &channum);
++ virtual bool Tune(const QString &freqid, int /*finetune*/);
+
+ virtual bool EnterPowerSavingMode(void);
+
+diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
+index d6367a6..12fa839 100644
+--- a/mythtv/libs/libmythtv/tv_play.cpp
++++ b/mythtv/libs/libmythtv/tv_play.cpp
+@@ -2601,15 +2601,21 @@ void TV::HandleStateChange(PlayerContext *mctx, PlayerContext
*ctx)
+ {
+ if (!ctx->IsPIP())
+ GetMythUI()->DisableScreensaver();
+- MythMainWindow *mainWindow = GetMythMainWindow();
+- mainWindow->setBaseSize(player_bounds.size());
+- mainWindow->setMinimumSize(
+- (db_use_fixed_size) ? player_bounds.size() : QSize(16, 16));
+- mainWindow->setMaximumSize(
+- (db_use_fixed_size) ? player_bounds.size() :
+- QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
+- mainWindow->setGeometry(player_bounds);
+- mainWindow->ResizePainterWindow(player_bounds.size());
++ bool switchMode = gCoreContext->GetNumSetting("UseVideoModes", 0);
++ // player_bounds is not applicable when switching modes so
++ // skip this logic in that case.
++ if (!switchMode)
++ {
++ MythMainWindow *mainWindow = GetMythMainWindow();
++ mainWindow->setBaseSize(player_bounds.size());
++ mainWindow->setMinimumSize(
++ (db_use_fixed_size) ? player_bounds.size() : QSize(16, 16));
++ mainWindow->setMaximumSize(
++ (db_use_fixed_size) ? player_bounds.size() :
++ QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
++ mainWindow->setGeometry(player_bounds);
++ mainWindow->ResizePainterWindow(player_bounds.size());
++ }
+ // PGB Do not disable the GUI when using openmax renderer,
+ // to ensure that space next to letterbox pictures
+ // is painted.
+@@ -3296,6 +3302,7 @@ void TV::HandleLCDVolumeTimerEvent()
+
+ QMutexLocker locker(&timerIdLock);
+ KillTimer(lcdVolumeTimerId);
++ lcdVolumeTimerId = 0;
+ }
+
+ int TV::StartTimer(int interval, int line)
+@@ -9867,7 +9874,11 @@ void TV::customEvent(QEvent *e)
+ mctx->UnlockDeletePlayer(__FILE__, __LINE__);
+ ReturnPlayerLock(mctx);
+
+- if (!db_use_gui_size_for_tv || !db_use_fixed_size)
++ // player_bounds is not applicable when switching modes so
++ // skip this logic in that case.
++ bool switchMode = gCoreContext->GetNumSetting("UseVideoModes", 0);
++ if (!switchMode
++ && (!db_use_gui_size_for_tv || !db_use_fixed_size))
+ {
+ mwnd->setMinimumSize(QSize(16, 16));
+ mwnd->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
+diff --git a/mythtv/libs/libmythtv/videoout_omx.cpp
b/mythtv/libs/libmythtv/videoout_omx.cpp
+index 3c5c448..63a5c3f 100644
+--- a/mythtv/libs/libmythtv/videoout_omx.cpp
++++ b/mythtv/libs/libmythtv/videoout_omx.cpp
+@@ -286,7 +286,8 @@ VideoOutputOMX::VideoOutputOMX() :
+ m_render(gCoreContext->GetSetting("OMXVideoRender", VIDEO_RENDER),
*this),
+ m_imagefx(gCoreContext->GetSetting("OMXVideoFilter", IMAGE_FX),
*this),
+ m_context(0),
+- m_backgroundscreen(0), m_glOsdThread(0), m_changed(false)
++ m_backgroundscreen(0), m_glOsdThread(0), m_changed(false),
++ m_videoPaused(false)
+ {
+ #ifdef OSD_EGL
+ m_osdpainter = 0;
+@@ -755,6 +756,10 @@ void VideoOutputOMX::UpdatePauseFrame(int64_t &disp_timecode)
+ CopyFrame(&av_pause_frame, used_frame);
+ }
+
++ // Suppress deinterlace while paused to prevent the jiggles.
++ av_pause_frame.interlaced_frame = 0;
++ av_pause_frame.top_field_first = 0;
++
+ disp_timecode = av_pause_frame.disp_timecode;
+ }
+
+@@ -773,9 +778,11 @@ void VideoOutputOMX::ProcessFrame(VideoFrame *frame, OSD *osd,
+ return;
+ }
+
++ m_videoPaused = false;
+ if (!frame)
+ {
+ // Rotate pause frames
++ m_videoPaused = true;
+ vbuffers.Enqueue(kVideoBuffer_pause, vbuffers.Dequeue(kVideoBuffer_pause));
+ frame = vbuffers.GetScratchFrame();
+ CopyFrame(frame, &av_pause_frame);
+@@ -877,7 +884,18 @@ void VideoOutputOMX::Show(FrameScanType scan)
+
+ hdr->nFilledLen = frame->offsets[2] + (frame->offsets[1] >> 2);
+ hdr->nFlags = OMX_BUFFERFLAG_ENDOFFRAME;
++ if (frame->interlaced_frame)
++ hdr->nFlags |= OMX_BUFFERFLAG_INTERLACED;
++ if (frame->top_field_first)
++ hdr->nFlags |= OMX_BUFFERFLAG_TOP_FIELD_FIRST;
+ OMXComponent &cmpnt = m_imagefx.IsValid() ? m_imagefx : m_render;
++ // Paused - do not display anything unless softblend set
++ if (m_videoPaused && GetOSDRenderer() != "softblend")
++ {
++ // fake out that the buffer was already emptied
++ EmptyBufferDone(cmpnt, hdr);
++ return;
++ }
+ OMX_ERRORTYPE e = OMX_EmptyThisBuffer(cmpnt.Handle(), hdr);
+ if (e != OMX_ErrorNone)
+ {
+diff --git a/mythtv/libs/libmythtv/videoout_omx.h b/mythtv/libs/libmythtv/videoout_omx.h
+index fb162d1..5ecdcdb 100644
+--- a/mythtv/libs/libmythtv/videoout_omx.h
++++ b/mythtv/libs/libmythtv/videoout_omx.h
+@@ -88,6 +88,7 @@ class VideoOutputOMX : public VideoOutput, private OMXComponentCtx
+ MythScreenType *m_backgroundscreen;
+ GlOsdThread *m_glOsdThread;
+ bool m_changed;
++ bool m_videoPaused;
+ };
+
+ #endif // ndef VIDEOOUT_OMX_H
+diff --git a/mythtv/libs/libmythtv/videoout_opengl.cpp
b/mythtv/libs/libmythtv/videoout_opengl.cpp
+index 7a13935..a743e92 100644
+--- a/mythtv/libs/libmythtv/videoout_opengl.cpp
++++ b/mythtv/libs/libmythtv/videoout_opengl.cpp
+@@ -363,7 +363,24 @@ bool VideoOutputOpenGL::SetupOpenGL(void)
+ if (!gl_context)
+ return false;
+
+- const QRect dvr = window.GetDisplayVisibleRect();
++ QRect dvr = window.GetDisplayVisibleRect();
++
++ MythMainWindow *mainWin = GetMythMainWindow();
++ QSize mainSize = mainWin->size();
++
++ // If the Video screen mode has vertically less pixels
++ // than the GUI screen mode - OpenGL coordinate adjustments
++ // must be made to put the video at the top of the display
++ // area instead of at the bottom.
++ if (dvr.height() < mainSize.height())
++ dvr.setTop(dvr.top()-mainSize.height()+dvr.height());
++
++ // If the Video screen mode has horizontally less pixels
++ // than the GUI screen mode - OpenGL width must be set
++ // as the higher GUI width so that the Program Guide
++ // invoked from playback is not cut off.
++ if (dvr.width() < mainSize.width())
++ dvr.setWidth(mainSize.width());
+
+ if (video_codec_id == kCodec_NONE)
+ {
+diff --git a/mythtv/libs/libmythtv/videooutwindow.cpp
b/mythtv/libs/libmythtv/videooutwindow.cpp
+index 78993b5..0ea9a17 100644
+--- a/mythtv/libs/libmythtv/videooutwindow.cpp
++++ b/mythtv/libs/libmythtv/videooutwindow.cpp
+@@ -93,6 +93,12 @@ VideoOutWindow::VideoOutWindow() :
+ gCoreContext->GetNumSetting("yScanDisplacement", 0));
+ db_use_gui_size = gCoreContext->GetNumSetting("GuiSizeForTV", 0);
+
++ populateGeometry();
++}
++
++void VideoOutWindow::populateGeometry(void)
++{
++ qApp->processEvents();
+ QDesktopWidget *desktop = NULL;
+ if (qobject_cast<QApplication*>(qApp))
+ desktop = QApplication::desktop();
+@@ -489,6 +495,8 @@ bool VideoOutWindow::Init(const QSize &new_video_dim_buf,
+ AspectOverrideMode new_aspectoverride,
+ AdjustFillMode new_adjustfill)
+ {
++ // Refresh the geometry in case the video mode has changed
++ populateGeometry();
+ display_visible_rect = db_use_gui_size ? new_display_visible_rect :
+ screen_geom;
+
+diff --git a/mythtv/libs/libmythtv/videooutwindow.h
b/mythtv/libs/libmythtv/videooutwindow.h
+index 0d5b04d..93aef00 100644
+--- a/mythtv/libs/libmythtv/videooutwindow.h
++++ b/mythtv/libs/libmythtv/videooutwindow.h
+@@ -68,6 +68,7 @@ class VideoOutWindow
+ void SetNeedRepaint(bool needRepaint)
+ { needrepaint = needRepaint; }
+
++ void populateGeometry(void);
+ // Gets
+ bool IsVideoScalingAllowed(void) const { return db_scaling_allowed; }
+ /// \brief Returns if videooutput is embedding
+diff --git a/mythtv/libs/libmythtv/videosource.cpp
b/mythtv/libs/libmythtv/videosource.cpp
+index 97618ad..0b530ae 100644
+--- a/mythtv/libs/libmythtv/videosource.cpp
++++ b/mythtv/libs/libmythtv/videosource.cpp
+@@ -3,7 +3,11 @@
+ // Standard UNIX C headers
+ #include <unistd.h>
+ #include <fcntl.h>
++#if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) ||
defined(_WIN32)
+ #include <sys/types.h>
++#else
++#include <sys/sysmacros.h>
++#endif
+ #include <sys/stat.h>
+
+ // C++ headers
+diff --git a/mythtv/libs/libmythui/mythrender_opengl.h
b/mythtv/libs/libmythui/mythrender_opengl.h
+index adaf302..a18c515 100644
+--- a/mythtv/libs/libmythui/mythrender_opengl.h
++++ b/mythtv/libs/libmythui/mythrender_opengl.h
+@@ -19,9 +19,6 @@
+ #ifdef USING_X11
+ #define GLX_GLXEXT_PROTOTYPES
+ #define XMD_H 1
+-#ifndef GL_ES_VERSION_2_0
+-#include <GL/gl.h>
+-#endif
+ #undef GLX_ARB_get_proc_address
+ #endif // USING_X11
+
+diff --git a/mythtv/libs/libmythui/mythrender_opengl1.h
b/mythtv/libs/libmythui/mythrender_opengl1.h
+index ce651df..53e25fe 100644
+--- a/mythtv/libs/libmythui/mythrender_opengl1.h
++++ b/mythtv/libs/libmythui/mythrender_opengl1.h
+@@ -3,6 +3,9 @@
+
+ #include "mythrender_opengl.h"
+ #include "mythrender_opengl_defs1.h"
++#if !defined(Q_OS_MAC)
++#include <GL/gl.h>
++#endif
+
+ class MUI_PUBLIC MythRenderOpenGL1 : public MythRenderOpenGL
+ {
diff --git a/mythtv/libs/libmythupnp/mythxmlclient.cpp
b/mythtv/libs/libmythupnp/mythxmlclient.cpp
index 45d7497..c6fe011 100644
--- a/mythtv/libs/libmythupnp/mythxmlclient.cpp
@@ -160,6 +791,501 @@ index 4b0457f..acc2bd9 100644
} UPnPResultCode;
+diff --git a/mythtv/programs/mythbackend/services/content.cpp
b/mythtv/programs/mythbackend/services/content.cpp
+index 1f5cd1b..5eea0ae 100644
+--- a/mythtv/programs/mythbackend/services/content.cpp
++++ b/mythtv/programs/mythbackend/services/content.cpp
+@@ -503,7 +503,7 @@ QFileInfo Content::GetPreviewImage( int nRecordedId,
+ if (!sFormat.isEmpty()
+ &&
!QImageWriter::supportedImageFormats().contains(sFormat.toLower().toLocal8Bit()))
+ {
+- throw "GetPreviewImage: Specified 'Format' is not
supported.";
++ throw QString("GetPreviewImage: Specified 'Format' is not
supported.");
+ }
+
+ // ----------------------------------------------------------------------
+@@ -1081,7 +1081,7 @@ DTC::LiveStreamInfo *Content::AddVideoLiveStream( int nId,
+ int nSampleRate )
+ {
+ if (nId < 0)
+- throw( "Id is invalid" );
++ throw QString( "Id is invalid" );
+
+ VideoMetadataListManager::VideoMetadataPtr metadata =
+ VideoMetadataListManager::loadOneFromDatabase(nId);
+diff --git a/mythtv/programs/mythbackend/services/dvr.cpp
b/mythtv/programs/mythbackend/services/dvr.cpp
+index 605dd48..abdf07d 100644
+--- a/mythtv/programs/mythbackend/services/dvr.cpp
++++ b/mythtv/programs/mythbackend/services/dvr.cpp
+@@ -741,7 +741,7 @@ DTC::TitleInfoList* Dvr::GetTitleInfoList()
+ "SELECT title, inetref, count(title) as count "
+ " FROM recorded AS r "
+ " JOIN recgroups AS g ON r.recgroupid = g.recgroupid "
+- " WHERE g.recgroup != 'LiveTV' "
++ " WHERE g.recgroup NOT IN ('Deleted', 'LiveTV') "
+ " AND r.deletepending = 0 "
+ " GROUP BY title, inetref "
+ " ORDER BY title");
+diff --git a/mythtv/programs/mythbackend/services/guide.cpp
b/mythtv/programs/mythbackend/services/guide.cpp
+index cd2e61e..c349e8c 100644
+--- a/mythtv/programs/mythbackend/services/guide.cpp
++++ b/mythtv/programs/mythbackend/services/guide.cpp
+@@ -53,16 +53,16 @@ DTC::ProgramGuide *Guide::GetProgramGuide( const QDateTime
&rawStartTime ,
+ int nCount)
+ {
+ if (!rawStartTime.isValid())
+- throw( "StartTime is invalid" );
++ throw QString( "StartTime is invalid" );
+
+ if (!rawEndTime.isValid())
+- throw( "EndTime is invalid" );
++ throw QString( "EndTime is invalid" );
+
+ QDateTime dtStartTime = rawStartTime.toUTC();
+ QDateTime dtEndTime = rawEndTime.toUTC();
+
+ if (dtEndTime < dtStartTime)
+- throw( "EndTime is before StartTime");
++ throw QString( "EndTime is before StartTime");
+
+ if (nStartIndex <= 0)
+ nStartIndex = 0;
+@@ -179,16 +179,16 @@ DTC::ProgramList* Guide::GetProgramList(int
nStartIndex,
+ bool bDescending)
+ {
+ if (!rawStartTime.isNull() && !rawStartTime.isValid())
+- throw( "StartTime is invalid" );
++ throw QString( "StartTime is invalid" );
+
+ if (!rawEndTime.isNull() && !rawEndTime.isValid())
+- throw( "EndTime is invalid" );
++ throw QString( "EndTime is invalid" );
+
+ QDateTime dtStartTime = rawStartTime;
+ QDateTime dtEndTime = rawEndTime;
+
+ if (!rawEndTime.isNull() && dtEndTime < dtStartTime)
+- throw( "EndTime is before StartTime");
++ throw QString( "EndTime is before StartTime");
+
+ MSqlQuery query(MSqlQuery::InitCon());
+
+@@ -333,9 +333,9 @@ DTC::Program* Guide::GetProgramDetails( int nChanId,
+
+ {
+ if (!(nChanId > 0))
+- throw( "Channel ID is invalid" );
++ throw QString( "Channel ID is invalid" );
+ if (!rawStartTime.isValid())
+- throw( "StartTime is invalid" );
++ throw QString( "StartTime is invalid" );
+
+ QDateTime dtStartTime = rawStartTime.toUTC();
+
+@@ -506,7 +506,7 @@ QStringList Guide::GetStoredSearches( const QString& sType )
+
+ if (iType == kNoSearch)
+ {
+- //throw( "Invalid Type" );
++ //throw QString( "Invalid Type" );
+ return keywordList;
+ }
+
+diff --git a/mythtv/programs/mythbackend/services/myth.cpp
b/mythtv/programs/mythbackend/services/myth.cpp
+index d7a3a83..f0744a8 100644
+--- a/mythtv/programs/mythbackend/services/myth.cpp
++++ b/mythtv/programs/mythbackend/services/myth.cpp
+@@ -437,7 +437,7 @@ QDateTime Myth::ParseISODateString(const QString&
DateTimeString)
+ QDateTime dateTime = QDateTime().fromString(DateTimeString, Qt::ISODate);
+
+ if (!dateTime.isValid())
+- throw( "Unable to parse DateTimeString" );
++ throw QString( "Unable to parse DateTimeString" );
+
+ return dateTime;
+ }
+diff --git a/mythtv/programs/mythfilldatabase/channeldata.cpp
b/mythtv/programs/mythfilldatabase/channeldata.cpp
+index c0ee522..9825c4e 100644
+--- a/mythtv/programs/mythfilldatabase/channeldata.cpp
++++ b/mythtv/programs/mythfilldatabase/channeldata.cpp
+@@ -128,27 +128,31 @@ QString ChannelData::normalizeChannelKey(const QString
&chanName) const
+ return result;
+ }
+
+-QHash<QString, ChannelInfo> ChannelData::channelList(int sourceId)
++ChannelList ChannelData::channelList(int sourceId)
+ {
+- QHash<QString, ChannelInfo> retList;
++ ChannelList retList;
+
+- ChannelInfoList channelList = ChannelUtil::GetChannels(sourceId, false);
++ uint avail = 0;
++ ChannelInfoList channelList = ChannelUtil::LoadChannels(0, 0, avail, false,
++ ChannelUtil::kChanOrderByChanNum,
++ ChannelUtil::kChanGroupByChanid,
++ sourceId);
+
+ ChannelInfoList::iterator it = channelList.begin();
+ for ( ; it != channelList.end(); ++it)
+ {
+ QString chanName = (*it).name;
+ QString key = normalizeChannelKey(chanName);
+- retList[key] = (*it);
++ retList.insert(key, *it);
+ }
+
+ return retList;
+ }
+
+ ChannelInfo ChannelData::FindMatchingChannel(const ChannelInfo &chanInfo,
+- QHash<QString, ChannelInfo> existingChannels) const
++ ChannelList existingChannels) const
+ {
+- QHash<QString, ChannelInfo>::iterator it;
++ ChannelList::iterator it;
+ for (it = existingChannels.begin(); it != existingChannels.end(); ++it)
+ {
+ if ((*it).xmltvid == chanInfo.xmltvid)
+@@ -158,6 +162,27 @@ ChannelInfo ChannelData::FindMatchingChannel(const ChannelInfo
&chanInfo,
+ QString searchKey = normalizeChannelKey(chanInfo.name);
+ ChannelInfo existChan = existingChannels.value(searchKey);
+
++ if (existChan.chanid < 1)
++ {
++ // Check if it is ATSC
++ int chansep = chanInfo.channum.indexOf(QRegExp("\\D"));
++ if (chansep > 0)
++ {
++ // Populate xmltvid for scanned ATSC channels
++ uint major = chanInfo.channum.left(chansep).toInt();
++ uint minor = chanInfo.channum.right
++ (chanInfo.channum.length() - (chansep + 1)).toInt();
++
++ for (it = existingChannels.begin();
++ it != existingChannels.end(); ++it)
++ {
++ if ((*it).atsc_major_chan == major &&
++ (*it).atsc_minor_chan == minor)
++ return (*it);
++ }
++ }
++ }
++
+ return existChan;
+ }
+
+@@ -169,7 +194,7 @@ void ChannelData::handleChannels(int id, ChannelInfoList *chanlist)
+ return;
+ }
+
+- QHash<QString, ChannelInfo> existingChannels = channelList(id);
++ ChannelList existingChannels = channelList(id);
+ QString fileprefix = SetupIconCacheDirectory();
+
+ QDir::setCurrent(fileprefix);
+diff --git a/mythtv/programs/mythfilldatabase/channeldata.h
b/mythtv/programs/mythfilldatabase/channeldata.h
+index 978ec8c..af0aa1c 100644
+--- a/mythtv/programs/mythfilldatabase/channeldata.h
++++ b/mythtv/programs/mythfilldatabase/channeldata.h
+@@ -7,6 +7,8 @@
+ // libmythtv
+ #include "channelinfo.h"
+
++using ChannelList = QMultiHash<QString, ChannelInfo>;
++
+ class ChannelData
+ {
+ public:
+@@ -21,8 +23,8 @@ class ChannelData
+ unsigned int chanid);
+
+ ChannelInfo FindMatchingChannel(const ChannelInfo &chanInfo,
+- QHash<QString, ChannelInfo> existingChannels) const;
+- QHash<QString, ChannelInfo> channelList(int sourceId);
++ ChannelList existingChannels) const;
++ ChannelList channelList(int sourceId);
+ QString normalizeChannelKey(const QString &chanName) const;
+
+ public:
+diff --git a/mythtv/programs/mythfilldatabase/xmltvparser.cpp
b/mythtv/programs/mythfilldatabase/xmltvparser.cpp
+index 62a3a13..21bf5b8 100644
+--- a/mythtv/programs/mythfilldatabase/xmltvparser.cpp
++++ b/mythtv/programs/mythfilldatabase/xmltvparser.cpp
+@@ -131,82 +131,107 @@ static void fromXMLTVDate(QString ×tr, QDateTime
&dt)
+ return;
+ }
+
+- QStringList split = timestr.split(" ");
++ QStringList split = timestr.split(" ", QString::SkipEmptyParts);
+ QString ts = split[0];
+- QDateTime tmpDT;
+- tmpDT.setTimeSpec(Qt::LocalTime);
+-
+- // UTC/GMT, just strip
+- if (ts.endsWith('Z'))
+- ts.truncate(ts.length()-1);
+-
+- if (ts.length() == 14)
+- {
+- tmpDT = QDateTime::fromString(ts, "yyyyMMddHHmmss");
+- }
+- else if (ts.length() == 12)
+- {
+- tmpDT = QDateTime::fromString(ts, "yyyyMMddHHmm");
+- }
+- else if (ts.length() == 8)
+- {
+- tmpDT = QDateTime::fromString(ts, "yyyyMMdd");
+- }
+- else if (ts.length() == 6)
++ QDate tmpDate;
++ QTime tmpTime;
++ QString tzoffset;
++
++ // Process the TZ offset (if any)
++ if (split.size() > 1)
+ {
+- tmpDT = QDateTime::fromString(ts, "yyyyMM");
++ tzoffset = split[1];
++ // These shouldn't be required and they aren't ISO 8601 but the
++ // xmltv spec mentions these and just these so handle them just in
++ // case
++ if (tzoffset == "GMT" || tzoffset == "UTC")
++ tzoffset = "+0000";
++ else if (tzoffset == "BST")
++ tzoffset = "+0100";
+ }
+- else if (ts.length() == 4)
++ else
+ {
+- tmpDT = QDateTime::fromString(ts, "yyyy");
++ // We will accept a datetime with a trailing Z as being explicit
++ if (ts.endsWith('Z'))
++ {
++ tzoffset = "+0000";
++ ts.truncate(ts.length()-1);
++ }
++ else
++ {
++ tzoffset = "+0000";
++ static bool warned_once_on_implicit_utc = false;
++ if (!warned_once_on_implicit_utc)
++ {
++ LOG(VB_XMLTV, LOG_WARNING, "No explicit time zone found, "
++ "guessing implicit UTC! Please consider enhancing "
++ "the guide source to provide explicit UTC or local "
++ "time instead.");
++ warned_once_on_implicit_utc = true;
++ }
++ }
+ }
+
+- if (!tmpDT.isValid())
++ // Process the date part
++ QString tsDate = ts.left(8);
++ if (tsDate.length() == 8)
++ tmpDate = QDate::fromString(tsDate, "yyyyMMdd");
++ else if (tsDate.length() == 6)
++ tmpDate = QDate::fromString(tsDate, "yyyyMM");
++ else if (tsDate.length() == 4)
++ tmpDate = QDate::fromString(tsDate, "yyyy");
++ if (!tmpDate.isValid())
+ {
+- LOG(VB_GENERAL, LOG_ERR,
+- QString("Ignoring unknown timestamp format: %1")
+- .arg(ts));
++ LOG(VB_XMLTV, LOG_ERR,
++ QString("Invalid datetime (date) in XMLTV data, ignoring: %1")
++ .arg(timestr));
+ return;
+ }
+-
+- if (split.size() > 1)
++
++ // Process the time part (if any)
++ if (ts.length() > 8)
+ {
+- QString tmp = split[1].trimmed();
+-
+- // These shouldn't be required and they aren't ISO 8601 but the
+- // xmltv spec mentions these and just these so handle them just in
+- // case
+- if (tmp == "GMT" || tmp == "UTC")
+- tmp = "+0000";
+- else if (tmp == "BST")
+- tmp = "+0100";
+-
+- // While this seems like a hack, it's better than what was done before
+- QString isoDateString = QString("%1
%2").arg(tmpDT.toString(Qt::ISODate))
+- .arg(tmp);
+- // Work around Qt bug where zero offset dates are flagged as LocalTime
+- tmpDT = QDateTime::fromString(isoDateString, Qt::ISODate);
+- if (tmpDT.timeSpec() == Qt::LocalTime)
+- tmpDT.setTimeSpec(Qt::UTC);
+- dt = tmpDT.toUTC();
++ QString tsTime = ts.mid(8);
++ if (tsTime.length() == 6)
++ tmpTime = QTime::fromString(tsTime, "HHmmss");
++ else if (tsTime.length() == 4)
++ tmpTime = QTime::fromString(tsTime, "HHmm");
++ else if (tsTime.length() == 2)
++ tmpTime = QTime::fromString(tsTime, "HH");
++ if (!tmpTime.isValid())
++ {
++ // Time part exists, but is (somehow) invalid
++ LOG(VB_XMLTV, LOG_ERR,
++ QString("Invalid datetime (time) in XMLTV data, ignoring:
%1")
++ .arg(timestr));
++ return;
++ }
+ }
+-
+- if (!dt.isValid())
+- {
+- static bool warned_once_on_implicit_utc = false;
+- if (!warned_once_on_implicit_utc)
++
++ QDateTime tmpDT = QDateTime(tmpDate, tmpTime, Qt::UTC);
++ if (!tmpDT.isValid())
+ {
+- LOG(VB_XMLTV, LOG_ERR, "No explicit time zone found, "
+- "guessing implicit UTC! Please consider enhancing "
+- "the guide source to provice explicit UTC or local "
+- "time instead.");
+- warned_once_on_implicit_utc = true;
++ LOG(VB_XMLTV, LOG_ERR,
++ QString("Invalid datetime (combination of date/time) "
++ "in XMLTV data, ignoring: %1").arg(timestr));
++ return;
+ }
+- dt = tmpDT;
++
++ // While this seems like a hack, it's better than what was done before
++ QString isoDateString = tmpDT.toString(Qt::ISODate);
++ if (isoDateString.endsWith('Z')) // Should always be Z, but ...
++ isoDateString.truncate(isoDateString.length()-1);
++ isoDateString += tzoffset;
++ dt = QDateTime::fromString(isoDateString, Qt::ISODate).toUTC();
++
++ if (!dt.isValid())
++ {
++ LOG(VB_XMLTV, LOG_ERR,
++ QString("Invalid datetime (zone offset) in XMLTV data, "
++ "ignoring: %1").arg(timestr));
++ return;
+ }
+
+- dt.setTimeSpec(Qt::UTC);
+-
+ timestr = MythDate::toString(dt, MythDate::kFilename);
+ }
+
+@@ -277,8 +302,7 @@ static void parseAudio(QDomElement &element, ProgInfo *pginfo)
+
+ ProgInfo *XMLTVParser::parseProgram(QDomElement &element)
+ {
+- QString uniqueid, season, episode, totalepisodes;
+- int dd_progid_done = 0;
++ QString programid, season, episode, totalepisodes;
+ ProgInfo *pginfo = new ProgInfo();
+
+ QString text = element.attribute("start", "");
+@@ -451,8 +475,11 @@ ProgInfo *XMLTVParser::parseProgram(QDomElement &element)
+ int idx = episodenum.indexOf('.');
+ if (idx != -1)
+ episodenum.remove(idx, 1);
+- pginfo->programId = episodenum;
+- dd_progid_done = 1;
++ programid = episodenum;
++ /* Only EPisodes and SHows are part of a series for SD */
++ if (programid.startsWith(QString("EP")) ||
++ programid.startsWith(QString("SH")))
++ pginfo->seriesId = QString("EP") +
programid.mid(2,8);
+ }
+ else if (info.attribute("system") == "xmltv_ns")
+ {
+@@ -462,6 +489,7 @@ ProgInfo *XMLTVParser::parseProgram(QDomElement &element)
+ totalepisodes = episode.section('/',1,1).trimmed();
+ episode = episode.section('/',0,0).trimmed();
+ season = episodenum.section('.',0,0).trimmed();
++ season = season.section('/',0,0).trimmed();
+ QString part(episodenum.section('.',2,2));
+ QString partnumber(part.section('/',0,0).trimmed());
+ QString parttotal(part.section('/',1,1).trimmed());
+@@ -549,22 +577,20 @@ ProgInfo *XMLTVParser::parseProgram(QDomElement &element)
+ && ProgramInfo::kCategorySeries != pginfo->categoryType)
+ pginfo->airdate = current_year;
+
+- /* Let's build ourself a programid */
+- QString programid;
++ if (programid.isEmpty())
++ {
+
+- if (ProgramInfo::kCategoryMovie == pginfo->categoryType)
+- programid = "MV";
+- else if (ProgramInfo::kCategorySeries == pginfo->categoryType)
+- programid = "EP";
+- else if (ProgramInfo::kCategorySports == pginfo->categoryType)
+- programid = "SP";
+- else
+- programid = "SH";
++ /* Let's build ourself a programid */
++
++ if (ProgramInfo::kCategoryMovie == pginfo->categoryType)
++ programid = "MV";
++ else if (ProgramInfo::kCategorySeries == pginfo->categoryType)
++ programid = "EP";
++ else if (ProgramInfo::kCategorySports == pginfo->categoryType)
++ programid = "SP";
++ else
++ programid = "SH";
+
+- if (!uniqueid.isEmpty()) // we already have a unique id ready for use
+- programid.append(uniqueid);
+- else
+- {
+ QString seriesid = QString::number(ELFHash(pginfo->title.toUtf8()));
+ pginfo->seriesId = seriesid;
+ programid.append(seriesid);
+@@ -602,8 +628,8 @@ ProgInfo *XMLTVParser::parseProgram(QDomElement &element)
+ programid.clear();
+ }
+ }
+- if (dd_progid_done == 0)
+- pginfo->programId = programid;
++
++ pginfo->programId = programid;
+
+ return pginfo;
+ }
+@@ -662,7 +688,21 @@ bool XMLTVParser::parseFile(
+ {
+ ProgInfo *pginfo = parseProgram(e);
+
+- if (pginfo->startts == pginfo->endts)
++ if (!(pginfo->starttime.isValid()))
++ {
++ LOG(VB_GENERAL, LOG_WARNING, QString("Invalid programme (%1),
"
++ "invalid start time,
"
++ "skipping")
++ .arg(pginfo->title));
++ }
++ else if (pginfo->channel.isEmpty())
++ {
++ LOG(VB_GENERAL, LOG_WARNING, QString("Invalid programme (%1),
"
++ "missing channel, "
++ "skipping")
++ .arg(pginfo->title));
++ }
++ else if (pginfo->startts == pginfo->endts)
+ {
+ LOG(VB_GENERAL, LOG_WARNING, QString("Invalid programme (%1),
"
+ "identical start and end
"
+@@ -712,4 +752,3 @@ bool XMLTVParser::parseFile(
+
+ return true;
+ }
+-
diff --git a/mythtv/programs/mythfrontend/proglist.cpp
b/mythtv/programs/mythfrontend/proglist.cpp
index 37e4506..ebd94c1 100644
--- a/mythtv/programs/mythfrontend/proglist.cpp
diff --git a/mythtv.spec b/mythtv.spec
index 7570f9b..99c7621 100644
--- a/mythtv.spec
+++ b/mythtv.spec
@@ -1,7 +1,3 @@
-# Does not currently build on ppc
-#
https://code.mythtv.org/trac/ticket/13049
-#ExcludeArch: ppc64 ppc64le
-
# Specfile for building MythTV and MythPlugins RPMs from a git checkout.
#
# by: Chris Petersen <cpetersen(a)mythtv.org>
@@ -64,7 +60,7 @@
%define desktop_vendor RPMFusion
# MythTV Version string -- preferably the output from git describe
-%define vers_string v0.28.1-23-gaf98262
+%define vers_string v0.28.1-38-geef6a48
%define branch fixes/0.28
# Git revision and branch ID
@@ -85,7 +81,7 @@ Version: 0.28.1
%if "%{branch}" == "master"
Release: 0.5.git.%{_gitrev}%{?dist}
%else
-Release: 5%{?dist}
+Release: 6%{?dist}
%endif
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -137,7 +133,6 @@ Source0:
https://github.com/MythTV/%{name}/archive/v%{version}.tar.gz#/%{name}
# Also update ChangeLog with git log v0.28..HEAD > ChangeLog
# and update define vers_string to v0.28-52-ge6a60f7 with git describe
Patch0: mythtv-0.28-fixes.patch
-Patch1: ticket13049-remove-ffmpeg-bswap-change.diff
Source10: PACKAGE-LICENSING
Source11: ChangeLog
@@ -282,7 +277,7 @@ BuildRequires: python2-devel
%if 0%{?fedora}
BuildRequires: python2-mysql
%else
-BuildRequires: MySQL-python
+BuildRequires: MySQL-python
%endif
BuildRequires: python-urlgrabber
%endif
@@ -502,8 +497,9 @@ Requires: freetype, lame
Requires: perl(XML::Simple)
Requires: mythtv-common = %{version}-%{release}
Requires: mythtv-base-themes = %{version}
+Requires: mariadb >= 5
Requires: python-MythTV
-Requires: google-droid-sans-mono-fonts
+%{?fedora:Requires: google-droid-sans-mono-fonts}
%{?fedora:Recommends: mesa-vdpau-drivers}
Provides: mythtv-frontend-api = %{mythfeapiver}
@@ -782,14 +778,11 @@ on demand content.
################################################################################
%prep
-%setup -q -n %{name}-%{version}
+%autosetup -p1 -n %{name}-%{version}
# Remove compiled python file
#find -name *.pyc -exec rm -f {} \;
-%patch0 -p1
-%patch1 -p1
-
# Install ChangeLog
install -m 0644 %{SOURCE11} .
@@ -1355,6 +1348,9 @@ exit 0
%changelog
+* Sun Aug 6 2017 Richard Shaw <hobbes1069(a)gmail.com> - 0.28.1-6
+- Update to lates fixes/0.28, v0.28.1-38-geef6a48.
+
* Mon Jun 19 2017 Paul Howarth <paul(a)city-fan.org> - 0.28.1-5
- Perl 5.26 rebuild