commit 4b39b1dfc9e3f2c3c16e8e629f47ee1583f32edd
Author: Richard Shaw <hobbes1069(a)gmail.com>
Date: Sun Feb 24 14:30:21 2019 -0600
Update to 30.0 with latest fixes/30.
.gitignore | 2 +
mythtv-ChangeLog | 271 +-
mythtv.spec | 28 +-
sources | 3 +-
v29.1..9f0acf372d.patch | 9065 -----------------------------------------------
v30.0..b774c4140b.patch | 1028 ++++++
6 files changed, 1149 insertions(+), 9248 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index dbb4f51..32fad4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,5 @@ mythtv-0.27.5.tar.gz
/mythtv-29.1.tar.gz
/v29.1..74fff5c285.patch
/v29.1..9f0acf372d.patch
+/mythtv-30.0.tar.gz
+/v30.0..b774c4140b.patch
diff --git a/mythtv-ChangeLog b/mythtv-ChangeLog
index 67f6bdb..899b2ec 100644
--- a/mythtv-ChangeLog
+++ b/mythtv-ChangeLog
@@ -1,226 +1,157 @@
-commit 0849e9959639dd8dfeab0af4ce0dfc166da1f896
-Author: David Hampton <mythtv(a)love2code.net>
-Date: Thu May 10 15:05:38 2018 -0400
-
- Revert "Fix crash in ProgramMapTable::Create"
-
- This reverts commit c2fa4ba7. It is causing failed recordings on
- DVB-S/S2 SAT multiplexes.
-
-commit 5f20e4f3f7e1dc3199888e9004d91b835a78f302
+commit b774c4140b2b9e148ccf699d1ad746bc4c84289c
Author: Peter Bennett <pbennett(a)mythtv.org>
-Date: Wed May 9 19:22:44 2018 -0400
-
- configure: new version of freetype2 does not support freetype-config
-
- freetype2 v2.9.1 uses only pkgconfig and removes support for freetype-config
-
- Fixes #13262
+Date: Sun Feb 10 12:17:53 2019 -0500
-commit c2fa4ba7981032edf6dcafec90d1e64a8139144b
-Author: David Hampton <mythtv(a)love2code.net>
-Date: Mon May 7 22:58:04 2018 -0400
-
- Fix crash in ProgramMapTable::Create
-
- Abort in libmythtv due to accessing beyond the size of the vector.
-
- With at least some recording sources (I am using an OCUR device) it is
- apparently possible to end up having zero descriptors in the stream
- when ProgramMapTable::Create is called, but GCC 8 (and libstdc++) now
- includes AddressSanitizer integration for std::vector, detecting
- out-of-range accesses to a vector, which means that referencing the
- 0th element is now an error (and an abort) even though the called code
- would not typically copy any data.
+ Remove debugging code.
- Patch from Gary Buhrmaster, fixes #13263.
+ Program guide fix included some debugging code.
- (cherry picked from commit 7f00642ba11eb0d9d633a23ce74e5b695c05153e)
+ (cherry picked from commit 7fd7b8443073ab53804b284f69968d37932825cc)
-commit 81d2fb020fd1e6e5c1114ff3e6c02f2e33a78188
-Author: David Hampton <mythtv(a)love2code.net>
-Date: Mon May 7 19:45:09 2018 -0400
+commit c6760c6210597453c140079628a509683b738f54
+Author: Peter Bennett <pbennett(a)mythtv.org>
+Date: Sun Feb 10 11:25:55 2019 -0500
- Fix crash (abort) in MythSocket::ResetReal
+ Guide Grid: Fix missing text when using QT painter
- In libmythbase mythsocket.cpp MythSocket::ResetReal there can be cases
- where there are no bytes to available to read, so the vector is never
- resized to greater than zero, which results in an abort when
- referencing the 1st (non-existant) element which is now checked by
- gcc8 (libstdc++).
+ Grid icons, arrows and record status, caused text to show as blank.
+ Changed to paint the text first, which resolves the issue.
- Patch from Gary Buhrmaster, fixes #13264.
+ Fixes #13398
- (cherry picked from commit 1f78097f0cef0ca15e1b7eee4e94fd17ca3b07b7)
+ (cherry picked from commit f561a3c4b2f8d59df8674849d40e046874aee8a2)
-commit 280138b452c16c3ce02734b57d9245f91002af81
+commit 1c2068c62bd67f5458009a49412e8b50a4bafbe5
Author: David Engel <dengel(a)mythtv.org>
-Date: Wed Apr 25 16:40:24 2018 -0500
+Date: Fri Feb 1 20:04:46 2019 -0600
- Stop active EIT scans from interfering with recordings
-
- Because DiSEqC inputs no longer share file descriptors, extra care
- must be taken with active EIT scans to prevent them from holding an
- open file descripter and causing recordings to fail. This change more
- aggressively stops active scans when recordings are pending and also
- releases all resources when they are stopped.
-
- Many, many, many thanks go to jmwislez at
gmail.com for being so
- patient and trying so many patches to identify and ultimately fix the
- problem.
+ Missed a locking difference in the previous GetPlaybackURL commit.
- Refs #13207
-
- (cherry picked from commit ba4c52b9e5d9a9f31ebbd223c166759235dfd379)
+ (cherry picked from commit 068c9664724122d0b116d29aea31850a4ae85ed6)
-commit 56030f3f2a29ec67ccb2849719070c50d149587a
-Author: Peter Bennett <pbennett(a)mythtv.org>
-Date: Sun Apr 22 21:17:10 2018 -0400
+commit e5672657dce54a8059a2437f5a4899dcc07d3d10
+Author: David Engel <dengel(a)mythtv.org>
+Date: Fri Feb 1 18:37:43 2019 -0600
- Raspberry Pi: Fix problem with startup on recent Raspbian Stretch builds
+ Completely move GetPlaybackURL() to libmythprotoserver.
- There is no longer a libGLESv2.so or libEGL.so installed with raspbian
- so the build will now install links to the new files that provide
- those libraries.
+ It was copied previously but not completely marked as static in both
+ locations. This change completely removes it from the old location so
+ that only the new location is used.
- (cherry picked from commit e1c1e873859276363b429ac0032e90d05b879d8d)
+ (cherry picked from commit 692219f9c9544f0344b69cb3ce053cadd948fa16)
-commit 329c235b572f9aa5de3758ca8b311f225de45d1e
-Author: Peter Bennett <pbennett(a)mythtv.org>
-Date: Wed Apr 11 19:01:21 2018 -0400
+commit f11c5aba6ed1e88c22f1b3b6828fc085e1699b97
+Author: David Engel <dengel(a)mythtv.org>
+Date: Sat Jan 26 11:48:15 2019 -0600
- Raspberry Pi: Fix decoder error on mp4 files
-
- There was test code in OpenMAX support that corrupts
- AVCodecContext. New versions of FFmpeg fail to open the
- codec with that corrupted data in existence.
+ Tweak some VB_FILE log levels to make it more useful at loglevel INTO.
- Fixes #13244
-
- (cherry picked from commit 4a828998bf0cd82430e1854429742a125eb80815)
+ (cherry picked from commit 85dc2a48dff419fe78cc6b9371bc46333247d06e)
-commit 60e40b352ab95a135ec2ab8f9f1ee93b4f9d245e
-Author: Peter Bennett <pbennett(a)mythtv.org>
-Date: Sat Mar 24 14:32:16 2018 -0400
+commit b06510032478ec887fd2491b5f9a5dad415c30f0
+Author: David Engel <dengel(a)mythtv.org>
+Date: Sat Jan 26 11:28:54 2019 -0600
- Raspberry Pi Openmax Audio: Fix swapped channels when using PCM output
+ Don't start RingBuffer thread if it's not open.
- Fixes #13249
+ The RingBuffer thread will exit immediately if the underlying file
+ isn't open. That can cause the thread waiting for it to start to
+ deadlock.
- (cherry picked from commit 5377e5089e243ec282514b6d68afb800c02aca03)
+ (cherry picked from commit 425386b93f3df1ec6872ef845e521c0546e70c61)
-commit bd764db51fed90450a9c96eb2102f2f27b6285ad
-Author: David Hampton <mythtv(a)love2code.net>
-Date: Wed Feb 14 18:01:07 2018 -0500
+commit 4fd4d574c6dacba22233d3eb3e6c9c4564a3c7ac
+Author: David Engel <dengel(a)mythtv.org>
+Date: Fri Jan 25 10:09:50 2019 -0600
- Fix compiler error when compiling with USING_ASI.
+ Restore (cached) call to GetFilesystemInfos() in AutoExpire.
- Cherry picked from master and cut to the single change to correct a
- missing variable in a function definition.
+ A previous change removed it because it was believed to be redundant.
+ It actually is redundant in that it doesn't need to be called again so
+ soon. However, a logic bug left the needed filesystem information
+ empty. Rather than attempt to thread safely re-use the data completely
+ within AutoExpire, restore the call to GetFilesystemInfos() but used
+ the previously cached results.
- (cherry picked from commit cadee49a417edc121d6babaacfabef63e508809e)
+ (cherry picked from commit 193eb990ceb30d6cd69c57972be7f9d380d1368e)
-commit c0ac5283ab2a4af571837520a40cc718e9e842c8
+commit 39794c9b6cfa83a03d0f8b0589f67924a6d0f5a0
Author: David Engel <dengel(a)mythtv.org>
-Date: Fri Mar 16 10:49:38 2018 -0500
+Date: Thu Jan 24 23:39:20 2019 -0600
- Fix issues with inputs that support multiple, physical connections
-
- There was some superflous and flat out wrong code left over from the
- card/input to input conversion that prevented inputs from switching
- among connections like tuner, s-video and composite. Thanks to
- ltskinol(a)gmail.com for doing most of the leg work and testing the
- fixes.
+ Don't double print the log timestamp and level on Android.
- Refs #13247
-
- (cherry picked from commit 1f8cd4dbf9196fd1c8f8e6096fd2ccee24514878)
+ (cherry picked from commit 86ad64b4ef6a044c3e5c439c06cbd2cb3ba5dcb6)
-commit 67e8d62d222e1a9addcd384900d77592ca178ffa
-Author: Peter Bennett <pbennett(a)mythtv.org>
-Date: Thu Mar 8 15:25:51 2018 -0500
+commit 2b8211e8e5d1cd512f96dd31f7cecffc353c19ba
+Author: David Engel <dengel(a)mythtv.org>
+Date: Wed Jan 23 17:12:11 2019 -0600
- Video Playback: Fix external subtitle problem
+ Simpify previous FileSystemInfo caching change.
- Due to an incorrect usage of QString::right, any video which has
- one of the following strings anywhere in the filename after the 4th character
- would not look for external subtitles:
- ass srt ssa sub txt gif png
-
- Fixes #13231
-
- (cherry picked from commit 02de2e4ba39416553d1df8494f1d586b87013c26)
+ (cherry picked from commit ab65230280cbeda555b0b25d79933d27a823540b)
-commit 925ceea0fb269b005ae94381374419b1c8389f5e
-Author: John Poet <jpoet(a)mythtv.org>
-Date: Wed Feb 28 17:02:07 2018 -0700
+commit 6b5490bfab0301c70ab79c313cf6b8369ed3507a
+Author: David Engel <dengel(a)mythtv.org>
+Date: Mon Jan 21 20:55:52 2019 -0600
- ExternalStreamHandler::ProcessCommand: Stop looping after hitting io error limit.
+ Cache FileSystemInfo data to avoid unwanted blocking.
- (cherry picked from commit 03bc275cf9533c8fa9d767598815d720f7dc9efd)
-
-commit 77a0ff883d171d2e8a393b8ff9740d9b2477f4e1
-Author: John Poet <jpoet(a)mythtv.org>
-Date: Sun Feb 25 19:28:57 2018 -0700
-
- ExternIO::KillIfRunning: Fix QString arguments.
+ Change the MainServer to cache updated, FileSystemInfo data and
+ optionally return the cached data when requested. The Scheduler uses
+ this data to decide where to put a recording right before it starts.
+ Previously, an unresponsive, remote filesystem could block the
+ Scheduler for up to several minutes. Now, the Scheduler always uses
+ the cached data to avoid getting blocked. The AutoExpirer does not
+ and should not use the cached data so that the data gets updated
+ periodically.
- (cherry picked from commit f9c9dd44b68c49530a7f84102483a22772b77a9c)
+ (cherry picked from commit df607e9bfcb5cc0798989b2e983e0071cb973ae6)
-commit b33705b0b4f30c5ebb88b2f25699bc16bf6b0a91
-Author: John Poet <jpoet(a)mythtv.org>
-Date: Thu Feb 22 18:51:40 2018 -0700
+commit 18c9bc9c35f7cb58a8b67d7d53ed73a71aaf4994
+Author: David Engel <dengel(a)mythtv.org>
+Date: Mon Jan 21 17:59:58 2019 -0600
- Allow the SignalHandler's StreamHandler to be used by the Recorder.
+ Work around to get A/V subtitles working on Android.
- Currently only supported by the External Recorder, this allows the data seen
- by the Signal Monitor to be used by the recorder. This is helpful for
- 'slow' recorders, and the IPTV recorder would also benifit.
+ fontconfig doesn't yet work for us on Android. For the time being,
+ more explicitly set a font we know should exist. This was adapted
+ from VLC master as of 2019-01-21.
- (cherry picked from commit ed85b14c137f88d0e1da8c1488f460cf68f5d5af)
+ (cherry picked from commit a3d7b79b445457d027710dd6509155753a1aa3a5)
-commit 21d4e9714b6765041e669ee2bea416182ae2d3ce
-Author: John Poet <jpoet(a)mythtv.org>
-Date: Thu Feb 22 17:29:24 2018 -0700
+commit 57e69de0ba76333d9cb6a08c51cd0837c155d94d
+Author: David Engel <dengel(a)mythtv.org>
+Date: Mon Jan 21 17:31:18 2019 -0600
- ExternalStreamHandler: Kill miss-behaving external recorders.
+ Fix libass logging.
- (cherry picked from commit 002c7606372f1657fb4857ad708c055d28275cb7)
-
-commit 00355e29bb289532e0a592cfb04c0b08bd62541c
-Author: John Poet <jpoet(a)mythtv.org>
-Date: Sat Feb 17 17:24:10 2018 -0700
-
- ExternalRecorder: Allow use of the "External Channel Changer".
+ Previously, logs from libass were accumulated until one happened to
+ end with a newline and then all were printed without newlines between
+ them. Now, each log is printed as is as they are received.
- (cherry picked from commit 23d74c719ac440e4c45bf01ae21b8cdd945af483)
+ (cherry picked from commit 7fe5013c90e17cfaac79f343097001d7d248dc35)
-commit 0831e888842125c315906694c092a3012a1bdfd8
-Author: John Poet <jpoet(a)mythtv.org>
-Date: Sat Feb 17 16:44:03 2018 -0700
+commit 44fee4bc8a4a69b2ae2ee09fb6568f47d1f8269d
+Author: Mark Kendall <mark.kendall(a)gmail.com>
+Date: Sat Jan 19 15:15:15 2019 +0000
- ExternalRecorder: Allow user to specify arguments to the external recorder.
+ OpenGLVideo: Fix texture filtering
- FileDevice does not (currently) support arguments to the file, so just let
- the user hand-type in the path.
-
- (cherry picked from commit dab5b5dd0cd971e82a2a50d4378a8e447cffad84)
+ - this was most apparent using the default OpenGL profile and the kernel
+ deinterlacer but would have been impacting quality elsewhere.
-commit 0f4ac3e6539a4eee70ea660c1f361d8c253b7af9
+commit c62e2733944311f3a0adf17e718f5fb60b006991
Author: John Poet <jpoet(a)mythtv.org>
-Date: Sat Feb 17 16:32:16 2018 -0700
+Date: Thu Jan 17 21:25:51 2019 -0700
- External Recorder: Allow user to specify the tunning timeout.
-
- (cherry picked from commit d092966109b9713d84e225da092f780d8f88c33f)
+ Move BottomLine: Allow user to save horizontal adjustments as well.
-commit f25203ca1827d8997e9ea8ebf6cc06de78cad2ab
-Author: Peter Bennett <pbennett(a)mythtv.org>
-Date: Sat Feb 24 14:21:07 2018 -0500
+commit 07fc9359b383b97d84cc756825db9c0f97583d33
+Author: David Engel <dengel(a)mythtv.org>
+Date: Wed Jan 16 23:36:51 2019 -0600
- settings: fix bug where updates are not taking immediate effect
-
- Change to video playback profile was not taking effect.
- Solution: Clear out cached value when updating a setting.
+ Fix issues with recent live TV channels commit.
- (cherry picked from commit e7173e38b8767571a973050512e4afc288785ec5)
+ (cherry picked from commit ccf39fad9213c80ce8b7b4fd79dfa0ff63c090ca)
diff --git a/mythtv.spec b/mythtv.spec
index 1bf48eb..f02b3f2 100644
--- a/mythtv.spec
+++ b/mythtv.spec
@@ -57,12 +57,13 @@
%define desktop_applications mythfrontend mythtv-setup
# MythTV Version string -- preferably the output from git describe
-%define githash 9f0acf372dec880800a57a77d67c19a68dedbd24
+%define githash b774c4140b2b9e148ccf699d1ad746bc4c84289c
%define shorthash %(c=%{githash}; echo ${c:0:10})
-%define vers_string v29.1-53-g9f0acf372d
-%define rel_string .53.20181105git9f0acf372d
+%define vers_string v30.0-15-gb774c4140b
+%define rel_date 20190214
+%define rel_string .%{rel_date}git%{shorthash}
-%define branch fixes/29
+%define branch fixes/30
# Harden build as mythbackend is long running.
%global _hardened_build 1
@@ -71,8 +72,8 @@
# Basic descriptive tags for this package:
#
Name: mythtv
-Version: 29.1
-Release: 30%{?rel_string}%{?dist}
+Version: 30.0
+Release: 1%{?rel_string}%{?dist}
Summary: A digital video recorder (DVR) application
# The primary license is GPLv2+, but bits are borrowed from a number of
@@ -126,7 +127,7 @@ Patch1: %{name}-space_in_GB.patch
%global py_prefix python
%endif
-%if 0%{?fedora} && 0%{?fedora} > 29
+%if 0%{?fedora} && 0%{?fedora} > 30
%global py_prefix python3
%else
%global py_prefix python2
@@ -661,7 +662,7 @@ Provides a PHP-based interface to interacting with MythTV.
%package -n %{py_prefix}-MythTV
Summary: Python2 bindings for MythTV
-%if 0%{?fedora} > 29
+%if 0%{?fedora} > 30
%{?python_provide:%python_provide python3-%{name}}
%else
%{?python_provide:%python_provide python2-%{name}}
@@ -929,7 +930,7 @@ pushd mythtv
--disable-vaapi \
%endif
--enable-bdjava \
-%if 0%{?fedora} > 29
+%if 0%{?fedora} > 30
--python=%{__python3} \
%else
--python=%{__python2} \
@@ -1042,7 +1043,7 @@ pushd mythplugins
--disable-mythnetvision \
%endif
--enable-opengl \
-%if 0%{?fedora} > 29
+%if 0%{?fedora} > 30
--python=%{__python3} \
%else
--python=%{__python2} \
@@ -1145,7 +1146,7 @@ popd
%endif
# Fixes ERROR: ambiguous python shebang in F30
-%if 0%{?fedora} > 29
+%if 0%{?fedora} > 30
find %{buildroot}%{_datadir}/mythtv/ -type f -name "*.py" -exec sed -i
'1s:#!/usr/bin/env python$:#!%{__python3}:' {} ';'
find %{buildroot}%{_datadir}/mythtv/ -type f -name "*.py" -exec sed -i
'1s:#!/usr/bin/python$:#!%{__python3}:' {} ';'
%else
@@ -1325,7 +1326,7 @@ exit 0
%if %{with python}
%files -n %{py_prefix}-MythTV
%{_bindir}/mythpython
-%if 0%{?fedora} > 29
+%if 0%{?fedora} > 30
%{python3_sitelib}/MythTV/
%{python3_sitelib}/MythTV-*.egg-info
%else
@@ -1444,6 +1445,9 @@ exit 0
%changelog
+* Thu Feb 14 2019 Richard Shaw <hobbes1069(a)gmail.com> - 30.0-1
+- Update to 30.0 with latest fixes/30.
+
* Wed Dec 19 2018 Nicolas Chauvet <kwizart(a)gmail.com> -
29.1-30.53.20181105git9f0acf372d
- Mythweb is noarch
diff --git a/sources b/sources
index 0bdee32..9e3eca8 100644
--- a/sources
+++ b/sources
@@ -1 +1,2 @@
-52f47a4288ce95e0edaddab84d5cc901 mythtv-29.1.tar.gz
+7cf06b015e72051412a729be801392ef mythtv-30.0.tar.gz
+526660bbb0c2787784b74ef6d6c1bded v30.0..b774c4140b.patch
diff --git a/v30.0..b774c4140b.patch b/v30.0..b774c4140b.patch
new file mode 100644
index 0000000..fc09889
--- /dev/null
+++ b/v30.0..b774c4140b.patch
@@ -0,0 +1,1028 @@
+From 07fc9359b383b97d84cc756825db9c0f97583d33 Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Wed, 16 Jan 2019 23:36:51 -0600
+Subject: [PATCH 01/15] Fix issues with recent live TV channels commit.
+
+(cherry picked from commit ccf39fad9213c80ce8b7b4fd79dfa0ff63c090ca)
+---
+ mythtv/libs/libmythtv/channelutil.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/mythtv/libs/libmythtv/channelutil.cpp
b/mythtv/libs/libmythtv/channelutil.cpp
+index 1c35d7ca4f0..dc2e412e7d6 100644
+--- a/mythtv/libs/libmythtv/channelutil.cpp
++++ b/mythtv/libs/libmythtv/channelutil.cpp
+@@ -2409,7 +2409,7 @@ ChannelInfoList ChannelUtil::LoadChannels(uint startIndex, uint
count,
+ cond << "channel.sourceid = :SOURCEID ";
+
+ if (liveTVOnly)
+- cond << "channel.livetvorder > 0 ";
++ cond << "capturecard.livetvorder > 0 ";
+
+ if (!cond.isEmpty())
+ sql += QString("WHERE %1").arg(cond.join("AND "));
+@@ -2429,7 +2429,7 @@ ChannelInfoList ChannelUtil::LoadChannels(uint startIndex, uint
count,
+ }
+ else // kChanOrderByLiveTV
+ {
+- sql += "ORDER BY callsign = :CALLSIGN1 AND channum = :CHANNUM, "
++ sql += "ORDER BY callsign = :CALLSIGN1 AND channum = :CHANNUM DESC, "
+ " callsign = :CALLSIGN2 DESC, "
+ " livetvorder, "
+ " channel.recpriority DESC, "
+
+From c62e2733944311f3a0adf17e718f5fb60b006991 Mon Sep 17 00:00:00 2001
+From: John Poet <jpoet(a)mythtv.org>
+Date: Thu, 17 Jan 2019 21:25:51 -0700
+Subject: [PATCH 02/15] Move BottomLine: Allow user to save horizontal
+ adjustments as well.
+
+---
+ mythtv/libs/libmythtv/videooutwindow.cpp | 27 ++++++++++++++++++------
+ 1 file changed, 21 insertions(+), 6 deletions(-)
+
+diff --git a/mythtv/libs/libmythtv/videooutwindow.cpp
b/mythtv/libs/libmythtv/videooutwindow.cpp
+index a38a2786e53..2d7b2a34082 100644
+--- a/mythtv/libs/libmythtv/videooutwindow.cpp
++++ b/mythtv/libs/libmythtv/videooutwindow.cpp
+@@ -952,7 +952,9 @@ void VideoOutWindow::ToggleMoveBottomLine(void)
+ {
+ if (bottomline)
+ {
++ mz_move.setX(0);
+ mz_move.setY(0);
++ mz_scale_h = 1.0;
+ mz_scale_v = 1.0;
+ bottomline = false;
+ }
+@@ -960,11 +962,21 @@ void VideoOutWindow::ToggleMoveBottomLine(void)
+ {
+ const float zf = 0.02;
+
+- int y = gCoreContext->GetNumSetting("OSDMoveBottomLine", 4);
++ int x = gCoreContext->GetNumSetting("OSDMoveXBottomLine", 0);
++ mz_move.setX(x);
++
++ int y = gCoreContext->GetNumSetting("OSDMoveYBottomLine", 5);
+ mz_move.setY(y);
+- double z = static_cast<double>
+- (gCoreContext->GetNumSetting("OSDZoomBottomLine", 112))
/ 100.0;
+- mz_scale_v = snap(z, 1.0f, zf / 2);
++
++ double h = static_cast<double>
++ (gCoreContext->GetNumSetting("OSDScaleHBottomLine",
100)) /
++ 100.0;
++ mz_scale_h = snap(h, 1.0f, zf / 2);
++
++ double v = static_cast<double>
++ (gCoreContext->GetNumSetting("OSDScaleVBottomLine",
112)) /
++ 100.0;
++ mz_scale_v = snap(v, 1.0f, zf / 2);
+
+ bottomline = true;
+ }
+@@ -974,8 +986,11 @@ void VideoOutWindow::ToggleMoveBottomLine(void)
+
+ void VideoOutWindow::SaveBottomLine(void)
+ {
+- gCoreContext->SaveSetting("OSDMoveBottomLine", GetMzMove().y());
+- gCoreContext->SaveSetting("OSDZoomBottomLine", GetMzScaleV() *
100.0f);
++ gCoreContext->SaveSetting("OSDMoveXBottomLine", GetMzMove().x());
++ gCoreContext->SaveSetting("OSDMoveYBottomLine", GetMzMove().y());
++
++ gCoreContext->SaveSetting("OSDScaleHBottomLine", GetMzScaleH() *
100.0f);
++ gCoreContext->SaveSetting("OSDScaleVBottomLine", GetMzScaleV() *
100.0f);
+ }
+
+ QString VideoOutWindow::GetZoomString(void) const
+
+From 44fee4bc8a4a69b2ae2ee09fb6568f47d1f8269d Mon Sep 17 00:00:00 2001
+From: Mark Kendall <mark.kendall(a)gmail.com>
+Date: Sat, 19 Jan 2019 15:15:15 +0000
+Subject: [PATCH 03/15] OpenGLVideo: Fix texture filtering
+
+- this was most apparent using the default OpenGL profile and the kernel
+deinterlacer but would have been impacting quality elsewhere.
+---
+ mythtv/libs/libmythtv/openglvideo.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/mythtv/libs/libmythtv/openglvideo.cpp
b/mythtv/libs/libmythtv/openglvideo.cpp
+index 8b572b8d767..484c3f9a667 100644
+--- a/mythtv/libs/libmythtv/openglvideo.cpp
++++ b/mythtv/libs/libmythtv/openglvideo.cpp
+@@ -297,6 +297,7 @@ void OpenGLVideo::CheckResize(bool deinterlacing, bool allow)
+ {
+ RemoveFilter(kGLFilterResize);
+ AddFilter(kGLFilterBicubic);
++ SetFiltering();
+ return;
+ }
+
+@@ -304,6 +305,7 @@ void OpenGLVideo::CheckResize(bool deinterlacing, bool allow)
+ {
+ RemoveFilter(kGLFilterBicubic);
+ AddFilter(kGLFilterResize);
++ SetFiltering();
+ return;
+ }
+
+
+From 57e69de0ba76333d9cb6a08c51cd0837c155d94d Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Mon, 21 Jan 2019 17:31:18 -0600
+Subject: [PATCH 04/15] Fix libass logging.
+
+Previously, logs from libass were accumulated until one happened to
+end with a newline and then all were printed without newlines between
+them. Now, each log is printed as is as they are received.
+
+(cherry picked from commit 7fe5013c90e17cfaac79f343097001d7d248dc35)
+---
+ mythtv/libs/libmythtv/subtitlescreen.cpp | 21 +++++++--------------
+ 1 file changed, 7 insertions(+), 14 deletions(-)
+
+diff --git a/mythtv/libs/libmythtv/subtitlescreen.cpp
b/mythtv/libs/libmythtv/subtitlescreen.cpp
+index c210b28efd9..6a48414c036 100644
+--- a/mythtv/libs/libmythtv/subtitlescreen.cpp
++++ b/mythtv/libs/libmythtv/subtitlescreen.cpp
+@@ -2335,9 +2335,6 @@ void SubtitleScreen::AddScaledImage(QImage &img, QRect
&pos)
+ #ifdef USING_LIBASS
+ static void myth_libass_log(int level, const char *fmt, va_list vl, void */*ctx*/)
+ {
+- static QString full_line("libass:");
+- static const int msg_len = 255;
+- static QMutex string_lock;
+ uint64_t verbose_mask = VB_GENERAL;
+ LogLevel_t verbose_level = LOG_INFO;
+
+@@ -2366,25 +2363,21 @@ static void myth_libass_log(int level, const char *fmt, va_list
vl, void */*ctx*
+ if (!VERBOSE_LEVEL_CHECK(verbose_mask, verbose_level))
+ return;
+
++ static QMutex string_lock;
+ string_lock.lock();
+
+- char str[msg_len+1];
+- int bytes = vsnprintf(str, msg_len+1, fmt, vl);
++ char str[1024];
++ int bytes = vsnprintf(str, sizeof str, fmt, vl);
+ // check for truncated messages and fix them
+- if (bytes > msg_len)
++ int truncated = bytes - ((sizeof str)-1);
++ if (truncated > 0)
+ {
+ LOG(VB_GENERAL, LOG_ERR,
+ QString("libASS log output truncated %1 of %2 bytes written")
+- .arg(msg_len).arg(bytes));
+- str[msg_len-1] = '\n';
++ .arg(truncated).arg(bytes));
+ }
+
+- full_line += QString(str);
+- if (full_line.endsWith("\n"))
+- {
+- LOG(verbose_mask, verbose_level, full_line.trimmed());
+- full_line.truncate(0);
+- }
++ LOG(verbose_mask, verbose_level, QString("libass: %s").arg(str));
+ string_lock.unlock();
+ }
+
+
+From 18c9bc9c35f7cb58a8b67d7d53ed73a71aaf4994 Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Mon, 21 Jan 2019 17:59:58 -0600
+Subject: [PATCH 05/15] Work around to get A/V subtitles working on Android.
+
+fontconfig doesn't yet work for us on Android. For the time being,
+more explicitly set a font we know should exist. This was adapted
+from VLC master as of 2019-01-21.
+
+(cherry picked from commit a3d7b79b445457d027710dd6509155753a1aa3a5)
+---
+ mythtv/libs/libmythtv/subtitlescreen.cpp | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/mythtv/libs/libmythtv/subtitlescreen.cpp
b/mythtv/libs/libmythtv/subtitlescreen.cpp
+index 6a48414c036..f0322fe1ff8 100644
+--- a/mythtv/libs/libmythtv/subtitlescreen.cpp
++++ b/mythtv/libs/libmythtv/subtitlescreen.cpp
+@@ -2405,7 +2405,17 @@ bool SubtitleScreen::InitialiseAssLibrary(void)
+ if (!m_assRenderer)
+ return false;
+
+- ass_set_fonts(m_assRenderer, nullptr, "sans-serif", 1, nullptr, 1);
++#ifdef Q_OS_ANDROID
++ // fontconfig doesn't yet work for us on Android. For the
++ // time being, more explicitly set a font we know should
++ // exist. This was adapted from VLC master as of 2019-01-21.
++ const char *psz_font = "/system/fonts/DroidSans.ttf";
++ const char *psz_font_family = "Droid Sans";
++#else
++ const char *psz_font = nullptr;
++ const char *psz_font_family = "sans-serif";
++#endif
++ ass_set_fonts(m_assRenderer, psz_font, psz_font_family, 1, nullptr, 1);
+ ass_set_hinting(m_assRenderer, ASS_HINTING_LIGHT);
+ LOG(VB_PLAYBACK, LOG_INFO, LOC + "Initialised libass renderer.");
+ }
+
+From 6b5490bfab0301c70ab79c313cf6b8369ed3507a Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Mon, 21 Jan 2019 20:55:52 -0600
+Subject: [PATCH 06/15] Cache FileSystemInfo data to avoid unwanted blocking.
+
+Change the MainServer to cache updated, FileSystemInfo data and
+optionally return the cached data when requested. The Scheduler uses
+this data to decide where to put a recording right before it starts.
+Previously, an unresponsive, remote filesystem could block the
+Scheduler for up to several minutes. Now, the Scheduler always uses
+the cached data to avoid getting blocked. The AutoExpirer does not
+and should not use the cached data so that the data gets updated
+periodically.
+
+(cherry picked from commit df607e9bfcb5cc0798989b2e983e0071cb973ae6)
+---
+ mythtv/programs/mythbackend/autoexpire.cpp | 14 ++++++++++----
+ mythtv/programs/mythbackend/mainserver.cpp | 15 ++++++++++++++-
+ mythtv/programs/mythbackend/mainserver.h | 5 ++++-
+ mythtv/programs/mythbackend/scheduler.cpp | 22 ++++++++--------------
+ mythtv/programs/mythbackend/scheduler.h | 4 ++--
+ 5 files changed, 38 insertions(+), 22 deletions(-)
+
+diff --git a/mythtv/programs/mythbackend/autoexpire.cpp
b/mythtv/programs/mythbackend/autoexpire.cpp
+index e05ab7cbbe5..415fa1ae25a 100644
+--- a/mythtv/programs/mythbackend/autoexpire.cpp
++++ b/mythtv/programs/mythbackend/autoexpire.cpp
+@@ -141,7 +141,16 @@ void AutoExpire::CalcParams()
+
+ instance_lock.lock();
+ if (main_server)
+- main_server->GetFilesystemInfos(fsInfos);
++ {
++ // The scheduler relies on something forcing the mainserver
++ // fsinfos cache to get updated periodically. Currently, that
++ // is done here. Don't remove or change this invocation
++ // without handling that issue too. It is done this way
++ // because the scheduler thread can't afford to be blocked by
++ // an unresponsive, remote filesystem and the autoexpirer
++ // thrad can.
++ main_server->GetFilesystemInfos(fsInfos, false);
++ }
+ instance_lock.unlock();
+
+ if (fsInfos.empty())
+@@ -414,9 +423,6 @@ void AutoExpire::ExpireRecordings(void)
+
+ LOG(VB_FILE, LOG_INFO, LOC + "ExpireRecordings()");
+
+- if (main_server)
+- main_server->GetFilesystemInfos(fsInfos);
+-
+ if (fsInfos.empty())
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Filesystem Info cache is empty, unable
"
+diff --git a/mythtv/programs/mythbackend/mainserver.cpp
b/mythtv/programs/mythbackend/mainserver.cpp
+index b6ba9bb9c9a..982ad29f004 100644
+--- a/mythtv/programs/mythbackend/mainserver.cpp
++++ b/mythtv/programs/mythbackend/mainserver.cpp
+@@ -5341,8 +5341,17 @@ void MainServer::BackendQueryDiskSpace(QStringList &strlist,
bool consolidated,
+ }
+ }
+
+-void MainServer::GetFilesystemInfos(QList<FileSystemInfo> &fsInfos)
++void MainServer::GetFilesystemInfos(QList<FileSystemInfo> &fsInfos,
++ bool useCache)
+ {
++ // Return cached information if requested.
++ if (useCache)
++ {
++ QMutexLocker locker(&fsInfosCacheLock);
++ fsInfos = fsInfosCache;
++ return;
++ }
++
+ QStringList strlist;
+ FileSystemInfo fsInfo;
+
+@@ -5411,6 +5420,10 @@ void MainServer::GetFilesystemInfos(QList<FileSystemInfo>
&fsInfos)
+ LOG(VB_FILE | VB_SCHEDULE, LOG_INFO, LOC +
+ "--- GetFilesystemInfos directory list end ---");
+ }
++
++ // Save these results to the cache.
++ QMutexLocker locker(&fsInfosCacheLock);
++ fsInfosCache = fsInfos;
+ }
+
+ void MainServer::HandleMoveFile(PlaybackSock *pbs, const QString &storagegroup,
+diff --git a/mythtv/programs/mythbackend/mainserver.h
b/mythtv/programs/mythbackend/mainserver.h
+index 4c6bc0b4b59..f32fe5fa6a6 100644
+--- a/mythtv/programs/mythbackend/mainserver.h
++++ b/mythtv/programs/mythbackend/mainserver.h
+@@ -143,7 +143,8 @@ class MainServer : public QObject, public MythSocketCBs
+ size_t GetCurrentMaxBitrate(void);
+ void BackendQueryDiskSpace(QStringList &strlist, bool consolidated,
+ bool allHosts);
+- void GetFilesystemInfos(QList<FileSystemInfo> &fsInfos);
++ void GetFilesystemInfos(QList<FileSystemInfo> &fsInfos,
++ bool useCache=true);
+
+ int GetExitCode() const { return m_exitCode; }
+
+@@ -352,6 +353,8 @@ class MainServer : public QObject, public MythSocketCBs
+
+ QMap<QString, int> fsIDcache;
+ QMutex fsIDcacheLock;
++ QList<FileSystemInfo> fsInfosCache;
++ QMutex fsInfosCacheLock;
+
+ QMutex m_downloadURLsLock;
+ QMap<QString, QString> m_downloadURLs;
+diff --git a/mythtv/programs/mythbackend/scheduler.cpp
b/mythtv/programs/mythbackend/scheduler.cpp
+index aaacb872054..5368958fda6 100644
+--- a/mythtv/programs/mythbackend/scheduler.cpp
++++ b/mythtv/programs/mythbackend/scheduler.cpp
+@@ -96,8 +96,6 @@ Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *>
*tvList,
+
+ InitInputInfoMap();
+
+- fsInfoCacheFillTime = MythDate::current().addSecs(-1000);
+-
+ if (doRun)
+ {
+ ProgramInfo::CheckProgramIDAuthorities();
+@@ -156,6 +154,9 @@ void Scheduler::Stop(void)
+
+ void Scheduler::SetMainServer(MainServer *ms)
+ {
++ // Make sure we have a good, fsinfo cache before setting
++ // m_mainServer.
++ FillDirectoryInfoCache(ms, false);
+ m_mainServer = ms;
+ }
+
+@@ -2474,8 +2475,6 @@ bool Scheduler::HandleReschedule(void)
+ static_cast<double>(placeTime));
+ LOG(VB_GENERAL, LOG_INFO, msg);
+
+- fsInfoCacheFillTime = MythDate::current().addSecs(-1000);
+-
+ // Write changed entries to oldrecorded.
+ RecIter it = reclist.begin();
+ for ( ; it != reclist.end(); ++it)
+@@ -5152,7 +5151,7 @@ int Scheduler::FillRecordingDir(
+ gCoreContext->GetNumSetting("SGweightRemoteStarting", 0);
+ int maxOverlap = gCoreContext->GetNumSetting("SGmaxRecOverlapMins", 3)
* 60;
+
+- FillDirectoryInfoCache();
++ FillDirectoryInfoCache(m_mainServer, true);
+
+ LOG(VB_FILE | VB_SCHEDULE, LOG_INFO, LOC +
+ "FillRecordingDir: Calculating initial FS Weights.");
+@@ -5587,18 +5586,15 @@ int Scheduler::FillRecordingDir(
+ return fsID;
+ }
+
+-void Scheduler::FillDirectoryInfoCache(bool force)
++void Scheduler::FillDirectoryInfoCache(MainServer *mainServer,
++ bool useMainServerCache)
+ {
+- if ((!force) &&
+- (fsInfoCacheFillTime > MythDate::current().addSecs(-180)))
+- return;
+-
+ QList<FileSystemInfo> fsInfos;
+
+ fsInfoCache.clear();
+
+- if (m_mainServer)
+- m_mainServer->GetFilesystemInfos(fsInfos);
++ if (mainServer)
++ mainServer->GetFilesystemInfos(fsInfos, useMainServerCache);
+
+ QMap <int, bool> fsMap;
+ QList<FileSystemInfo>::iterator it1;
+@@ -5611,8 +5607,6 @@ void Scheduler::FillDirectoryInfoCache(bool force)
+ LOG(VB_FILE, LOG_INFO, LOC +
+ QString("FillDirectoryInfoCache: found %1 unique filesystems")
+ .arg(fsMap.size()));
+-
+- fsInfoCacheFillTime = MythDate::current();
+ }
+
+ void Scheduler::SchedLiveTV(void)
+diff --git a/mythtv/programs/mythbackend/scheduler.h
b/mythtv/programs/mythbackend/scheduler.h
+index b583161483f..5fd1d2fee74 100644
+--- a/mythtv/programs/mythbackend/scheduler.h
++++ b/mythtv/programs/mythbackend/scheduler.h
+@@ -201,7 +201,8 @@ class Scheduler : public MThread, public MythScheduler
+ uint cardid,
+ QString &recording_dir,
+ const RecList &reclist);
+- void FillDirectoryInfoCache(bool force = false);
++ void FillDirectoryInfoCache(MainServer *mainServer,
++ bool useMainServerCache);
+
+ void OldRecordedFixups(void);
+ void ResetDuplicates(uint recordid, uint findid, const QString &title,
+@@ -273,7 +274,6 @@ class Scheduler : public MThread, public MythScheduler
+ bool m_isShuttingDown;
+ MSqlQueryInfo dbConn;
+
+- QDateTime fsInfoCacheFillTime;
+ QMap<QString, FileSystemInfo> fsInfoCache;
+
+ int error;
+
+From 2b8211e8e5d1cd512f96dd31f7cecffc353c19ba Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Wed, 23 Jan 2019 17:12:11 -0600
+Subject: [PATCH 07/15] Simpify previous FileSystemInfo caching change.
+
+(cherry picked from commit ab65230280cbeda555b0b25d79933d27a823540b)
+---
+ mythtv/programs/mythbackend/mainserver.cpp | 6 ++++++
+ mythtv/programs/mythbackend/scheduler.cpp | 12 ++++--------
+ mythtv/programs/mythbackend/scheduler.h | 3 +--
+ 3 files changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/mythtv/programs/mythbackend/mainserver.cpp
b/mythtv/programs/mythbackend/mainserver.cpp
+index 982ad29f004..95243be61c9 100644
+--- a/mythtv/programs/mythbackend/mainserver.cpp
++++ b/mythtv/programs/mythbackend/mainserver.cpp
+@@ -323,7 +323,13 @@ MainServer::MainServer(bool master, int port,
+ deferredDeleteTimer->start(30 * 1000);
+
+ if (sched)
++ {
++ // Make sure we have a good, fsinfo cache before setting
++ // mainServer in the scheduler.
++ QList<FileSystemInfo> fsInfos;
++ GetFilesystemInfos(fsInfos, false);
+ sched->SetMainServer(this);
++ }
+ if (expirer)
+ expirer->SetMainServer(this);
+
+diff --git a/mythtv/programs/mythbackend/scheduler.cpp
b/mythtv/programs/mythbackend/scheduler.cpp
+index 5368958fda6..16cceeeb641 100644
+--- a/mythtv/programs/mythbackend/scheduler.cpp
++++ b/mythtv/programs/mythbackend/scheduler.cpp
+@@ -154,9 +154,6 @@ void Scheduler::Stop(void)
+
+ void Scheduler::SetMainServer(MainServer *ms)
+ {
+- // Make sure we have a good, fsinfo cache before setting
+- // m_mainServer.
+- FillDirectoryInfoCache(ms, false);
+ m_mainServer = ms;
+ }
+
+@@ -5151,7 +5148,7 @@ int Scheduler::FillRecordingDir(
+ gCoreContext->GetNumSetting("SGweightRemoteStarting", 0);
+ int maxOverlap = gCoreContext->GetNumSetting("SGmaxRecOverlapMins", 3)
* 60;
+
+- FillDirectoryInfoCache(m_mainServer, true);
++ FillDirectoryInfoCache();
+
+ LOG(VB_FILE | VB_SCHEDULE, LOG_INFO, LOC +
+ "FillRecordingDir: Calculating initial FS Weights.");
+@@ -5586,15 +5583,14 @@ int Scheduler::FillRecordingDir(
+ return fsID;
+ }
+
+-void Scheduler::FillDirectoryInfoCache(MainServer *mainServer,
+- bool useMainServerCache)
++void Scheduler::FillDirectoryInfoCache(void)
+ {
+ QList<FileSystemInfo> fsInfos;
+
+ fsInfoCache.clear();
+
+- if (mainServer)
+- mainServer->GetFilesystemInfos(fsInfos, useMainServerCache);
++ if (m_mainServer)
++ m_mainServer->GetFilesystemInfos(fsInfos, true);
+
+ QMap <int, bool> fsMap;
+ QList<FileSystemInfo>::iterator it1;
+diff --git a/mythtv/programs/mythbackend/scheduler.h
b/mythtv/programs/mythbackend/scheduler.h
+index 5fd1d2fee74..db956207422 100644
+--- a/mythtv/programs/mythbackend/scheduler.h
++++ b/mythtv/programs/mythbackend/scheduler.h
+@@ -201,8 +201,7 @@ class Scheduler : public MThread, public MythScheduler
+ uint cardid,
+ QString &recording_dir,
+ const RecList &reclist);
+- void FillDirectoryInfoCache(MainServer *mainServer,
+- bool useMainServerCache);
++ void FillDirectoryInfoCache(void);
+
+ void OldRecordedFixups(void);
+ void ResetDuplicates(uint recordid, uint findid, const QString &title,
+
+From 39794c9b6cfa83a03d0f8b0589f67924a6d0f5a0 Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Thu, 24 Jan 2019 23:39:20 -0600
+Subject: [PATCH 08/15] Don't double print the log timestamp and level on
+ Android.
+
+(cherry picked from commit 86ad64b4ef6a044c3e5c439c06cbd2cb3ba5dcb6)
+---
+ mythtv/libs/libmythbase/logging.cpp | 38 ++++++++++++++++++++++++++---
+ 1 file changed, 35 insertions(+), 3 deletions(-)
+
+diff --git a/mythtv/libs/libmythbase/logging.cpp b/mythtv/libs/libmythbase/logging.cpp
+index 92de0eb539b..e127f40ae4d 100644
+--- a/mythtv/libs/libmythbase/logging.cpp
++++ b/mythtv/libs/libmythbase/logging.cpp
+@@ -428,6 +428,7 @@ bool LoggerThread::logConsole(LoggingItem *item)
+
+ item->IncrRef();
+
++#ifndef Q_OS_ANDROID
+ if (item->m_type & kStandardIO)
+ snprintf( line, MAX_STRING_LENGTH, "%s", item->m_message );
+ else
+@@ -462,11 +463,42 @@ bool LoggerThread::logConsole(LoggingItem *item)
+ #endif
+ }
+
+-#ifdef Q_OS_ANDROID
+- __android_log_print(ANDROID_LOG_INFO, "mfe", line);
+-#else
+ int result = write( 1, line, strlen(line) );
+ (void)result;
++
++#else // Q_OS_ANDROID
++
++ android_LogPriority aprio;
++ switch (item->m_level)
++ {
++ case LOG_EMERG:
++ aprio = ANDROID_LOG_FATAL;
++ case LOG_ALERT:
++ case LOG_CRIT:
++ case LOG_ERR:
++ aprio = ANDROID_LOG_ERROR;
++ break;
++ case LOG_WARNING:
++ aprio = ANDROID_LOG_WARN;
++ break;
++ case LOG_NOTICE:
++ case LOG_INFO:
++ aprio = ANDROID_LOG_INFO;
++ break;
++ case LOG_DEBUG:
++ aprio = ANDROID_LOG_DEBUG;
++ break;
++ case LOG_UNKNOWN:
++ default:
++ aprio = ANDROID_LOG_UNKNOWN;
++ break;
++ }
++#if CONFIG_DEBUGTYPE
++ __android_log_print(aprio, "mfe", "%s:%d:%s %s",
item->m_file,
++ item->m_line, item->m_function, item->m_message);
++#else
++ __android_log_print(aprio, "mfe", "%s", item->m_message);
++#endif
+ #endif
+
+ item->DecrRef();
+
+From 4fd4d574c6dacba22233d3eb3e6c9c4564a3c7ac Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Fri, 25 Jan 2019 10:09:50 -0600
+Subject: [PATCH 09/15] Restore (cached) call to GetFilesystemInfos() in
+ AutoExpire.
+
+A previous change removed it because it was believed to be redundant.
+It actually is redundant in that it doesn't need to be called again so
+soon. However, a logic bug left the needed filesystem information
+empty. Rather than attempt to thread safely re-use the data completely
+within AutoExpire, restore the call to GetFilesystemInfos() but used
+the previously cached results.
+
+(cherry picked from commit 193eb990ceb30d6cd69c57972be7f9d380d1368e)
+---
+ mythtv/programs/mythbackend/autoexpire.cpp | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/mythtv/programs/mythbackend/autoexpire.cpp
b/mythtv/programs/mythbackend/autoexpire.cpp
+index 415fa1ae25a..52463638a55 100644
+--- a/mythtv/programs/mythbackend/autoexpire.cpp
++++ b/mythtv/programs/mythbackend/autoexpire.cpp
+@@ -423,6 +423,9 @@ void AutoExpire::ExpireRecordings(void)
+
+ LOG(VB_FILE, LOG_INFO, LOC + "ExpireRecordings()");
+
++ if (main_server)
++ main_server->GetFilesystemInfos(fsInfos, true);
++
+ if (fsInfos.empty())
+ {
+ LOG(VB_GENERAL, LOG_ERR, LOC + "Filesystem Info cache is empty, unable
"
+
+From b06510032478ec887fd2491b5f9a5dad415c30f0 Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Sat, 26 Jan 2019 11:28:54 -0600
+Subject: [PATCH 10/15] Don't start RingBuffer thread if it's not open.
+
+The RingBuffer thread will exit immediately if the underlying file
+isn't open. That can cause the thread waiting for it to start to
+deadlock.
+
+(cherry picked from commit 425386b93f3df1ec6872ef845e521c0546e70c61)
+---
+ mythtv/programs/mythbackend/filetransfer.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/mythtv/programs/mythbackend/filetransfer.cpp
b/mythtv/programs/mythbackend/filetransfer.cpp
+index 29b226f6112..4a879f22341 100644
+--- a/mythtv/programs/mythbackend/filetransfer.cpp
++++ b/mythtv/programs/mythbackend/filetransfer.cpp
+@@ -19,7 +19,7 @@ FileTransfer::FileTransfer(QString &filename, MythSocket *remote,
+ {
+ pginfo = new ProgramInfo(filename);
+ pginfo->MarkAsInUse(true, kFileTransferInUseID);
+- if (rbuffer)
++ if (rbuffer && rbuffer->IsOpen())
+ rbuffer->Start();
+ }
+
+
+From f11c5aba6ed1e88c22f1b3b6828fc085e1699b97 Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Sat, 26 Jan 2019 11:48:15 -0600
+Subject: [PATCH 11/15] Tweak some VB_FILE log levels to make it more useful at
+ loglevel INTO.
+
+(cherry picked from commit 85dc2a48dff419fe78cc6b9371bc46333247d06e)
+---
+ mythtv/libs/libmythbase/storagegroup.cpp | 2 +-
+ mythtv/libs/libmythtv/ringbuffer.cpp | 4 +++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/mythtv/libs/libmythbase/storagegroup.cpp
b/mythtv/libs/libmythbase/storagegroup.cpp
+index 1349f00f7fe..15ff64c4680 100644
+--- a/mythtv/libs/libmythbase/storagegroup.cpp
++++ b/mythtv/libs/libmythbase/storagegroup.cpp
+@@ -615,7 +615,7 @@ QString StorageGroup::FindFile(const QString &filename)
+ if (!recDir.isEmpty())
+ {
+ result = recDir + "/" + filename;
+- LOG(VB_FILE, LOG_DEBUG, LOC +
++ LOG(VB_FILE, LOG_INFO, LOC +
+ QString("FindFile: Found '%1'") .arg(result));
+ }
+ else
+diff --git a/mythtv/libs/libmythtv/ringbuffer.cpp b/mythtv/libs/libmythtv/ringbuffer.cpp
+index bd8aa4f18ed..36ad31099b0 100644
+--- a/mythtv/libs/libmythtv/ringbuffer.cpp
++++ b/mythtv/libs/libmythtv/ringbuffer.cpp
+@@ -1085,7 +1085,7 @@ void RingBuffer::run(void)
+ uint64_t bps = !sr_elapsed ? 1000000001 :
+ (uint64_t)(((double)read_return * 8000.0) /
+ (double)sr_elapsed);
+- LOG(VB_FILE, LOG_INFO, LOC +
++ LOG(VB_FILE, LOG_DEBUG, LOC +
+ QString("safe_read(...@%1, %2) -> %3, took %4 ms %5 avg %6
ms")
+ .arg(rbwposcopy).arg(totfree).arg(read_return)
+ .arg(sr_elapsed)
+@@ -1271,6 +1271,8 @@ void RingBuffer::run(void)
+ rbrlock.unlock();
+ rwlock.unlock();
+
++ LOG(VB_FILE, LOG_INFO, LOC + QString("Exiting readahead thread"));
++
+ RunEpilog();
+ }
+
+
+From e5672657dce54a8059a2437f5a4899dcc07d3d10 Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Fri, 1 Feb 2019 18:37:43 -0600
+Subject: [PATCH 12/15] Completely move GetPlaybackURL() to libmythprotoserver.
+
+It was copied previously but not completely marked as static in both
+locations. This change completely removes it from the old location so
+that only the new location is used.
+
+(cherry picked from commit 692219f9c9544f0344b69cb3ce053cadd948fa16)
+---
+ .../requesthandler/fileserverutil.cpp | 4 +-
+ mythtv/programs/mythbackend/autoexpire.cpp | 2 +-
+ mythtv/programs/mythbackend/backendutil.cpp | 47 -------------------
+ mythtv/programs/mythbackend/backendutil.h | 22 ---------
+ mythtv/programs/mythbackend/encoderlink.cpp | 2 +-
+ mythtv/programs/mythbackend/httpconfig.cpp | 1 -
+ mythtv/programs/mythbackend/mainserver.cpp | 2 +-
+ mythtv/programs/mythbackend/mythbackend.pro | 3 +-
+ mythtv/programs/mythbackend/scheduler.cpp | 1 -
+ .../programs/mythbackend/services/content.cpp | 2 +-
+ 10 files changed, 7 insertions(+), 79 deletions(-)
+ delete mode 100644 mythtv/programs/mythbackend/backendutil.cpp
+ delete mode 100644 mythtv/programs/mythbackend/backendutil.h
+
+diff --git a/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
b/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
+index 3e990f019db..99ed5507318 100644
+--- a/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
++++ b/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
+@@ -39,11 +39,11 @@ void DeleteHandler::Close(void)
+ m_fd = -1;
+ }
+
+-QMap <QString, QString> recordingPathCache;
++static QMap <QString, QString> recordingPathCache;
++static QMutex recordingPathLock;
+
+ QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath)
+ {
+- static QMutex recordingPathLock;
+ QString result = "";
+ QMutexLocker locker(&recordingPathLock);
+ QString cacheKey = QString("%1:%2").arg(pginfo->GetChanID())
+diff --git a/mythtv/programs/mythbackend/autoexpire.cpp
b/mythtv/programs/mythbackend/autoexpire.cpp
+index 52463638a55..b6e16f8e8e8 100644
+--- a/mythtv/programs/mythbackend/autoexpire.cpp
++++ b/mythtv/programs/mythbackend/autoexpire.cpp
+@@ -36,7 +36,7 @@ using namespace std;
+ #include "remoteutil.h"
+ #include "remoteencoder.h"
+ #include "encoderlink.h"
+-#include "backendutil.h"
++#include "requesthandler/fileserverutil.h"
+ #include "mainserver.h"
+ #include "compat.h"
+ #include "mythlogging.h"
+diff --git a/mythtv/programs/mythbackend/backendutil.cpp
b/mythtv/programs/mythbackend/backendutil.cpp
+deleted file mode 100644
+index 7ad22dae16b..00000000000
+--- a/mythtv/programs/mythbackend/backendutil.cpp
++++ /dev/null
+@@ -1,47 +0,0 @@
+-
+-#include <cstdlib> // for llabs
+-
+-#include "mythconfig.h"
+-#if CONFIG_DARWIN || defined(__FreeBSD__)
+-#include <sys/param.h>
+-#include <sys/mount.h>
+-#elif __linux__
+-#include <sys/vfs.h>
+-#endif
+-
+-#include <QMutex>
+-#include <QFile>
+-#include <QMap>
+-
+-#include "backendutil.h"
+-#include "programinfo.h"
+-
+-QMutex recordingPathLock;
+-QMap <QString, QString> recordingPathCache;
+-
+-QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath)
+-{
+- QString result = "";
+- QMutexLocker locker(&recordingPathLock);
+- QString cacheKey = QString("%1:%2").arg(pginfo->GetChanID())
+- .arg(pginfo->GetRecordingStartTime(MythDate::ISODate));
+- if ((recordingPathCache.contains(cacheKey)) &&
+- (QFile::exists(recordingPathCache[cacheKey])))
+- {
+- result = recordingPathCache[cacheKey];
+- if (!storePath)
+- recordingPathCache.remove(cacheKey);
+- }
+- else
+- {
+- locker.unlock();
+- result = pginfo->GetPlaybackURL(false, true);
+- locker.relock();
+- if (storePath && result.startsWith("/"))
+- recordingPathCache[cacheKey] = result;
+- }
+-
+- return result;
+-}
+-
+-/* vim: set expandtab tabstop=4 shiftwidth=4: */
+diff --git a/mythtv/programs/mythbackend/backendutil.h
b/mythtv/programs/mythbackend/backendutil.h
+deleted file mode 100644
+index c43f13953c2..00000000000
+--- a/mythtv/programs/mythbackend/backendutil.h
++++ /dev/null
+@@ -1,22 +0,0 @@
+-#ifndef _BACKENDUTIL_H
+-#define _BACKENDUTIL_H
+-
+-#include <vector>
+-using namespace std;
+-
+-#include <QMap>
+-
+-#include "remoteutil.h"
+-
+-class QStringList;
+-class EncoderLink;
+-
+-void BackendQueryDiskSpace(QStringList &strlist,
+- QMap <int, EncoderLink *> *encoderList,
+- bool consolidated = false, bool allHosts = false);
+-
+-QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath = true);
+-
+-#endif
+-
+-/* vim: set expandtab tabstop=4 shiftwidth=4: */
+diff --git a/mythtv/programs/mythbackend/encoderlink.cpp
b/mythtv/programs/mythbackend/encoderlink.cpp
+index d76301dcbc6..422ce90f35e 100644
+--- a/mythtv/programs/mythbackend/encoderlink.cpp
++++ b/mythtv/programs/mythbackend/encoderlink.cpp
+@@ -11,7 +11,7 @@
+ #include "playbacksock.h"
+ #include "tv_rec.h"
+ #include "mythdate.h"
+-#include "backendutil.h"
++#include "requesthandler/fileserverutil.h"
+ #include "compat.h"
+ #include "referencecounter.h"
+ #include "inputinfo.h" // for InputInfo
+diff --git a/mythtv/programs/mythbackend/httpconfig.cpp
b/mythtv/programs/mythbackend/httpconfig.cpp
+index 48ccff8eb76..24ea02274e0 100644
+--- a/mythtv/programs/mythbackend/httpconfig.cpp
++++ b/mythtv/programs/mythbackend/httpconfig.cpp
+@@ -7,7 +7,6 @@
+
+ // MythTV headers
+ #include "httpconfig.h"
+-#include "backendutil.h"
+ #include "mythcontext.h"
+ #include "mythdb.h"
+ #include "mythdirs.h"
+diff --git a/mythtv/programs/mythbackend/mainserver.cpp
b/mythtv/programs/mythbackend/mainserver.cpp
+index 95243be61c9..6bd01606b3b 100644
+--- a/mythtv/programs/mythbackend/mainserver.cpp
++++ b/mythtv/programs/mythbackend/mainserver.cpp
+@@ -54,7 +54,7 @@ using namespace std;
+ #include "server.h"
+ #include "mthread.h"
+ #include "scheduler.h"
+-#include "backendutil.h"
++#include "requesthandler/fileserverutil.h"
+ #include "programinfo.h"
+ #include "mythtimezone.h"
+ #include "recordinginfo.h"
+diff --git a/mythtv/programs/mythbackend/mythbackend.pro
b/mythtv/programs/mythbackend/mythbackend.pro
+index 6d6e1083c46..9dde76944dc 100644
+--- a/mythtv/programs/mythbackend/mythbackend.pro
++++ b/mythtv/programs/mythbackend/mythbackend.pro
+@@ -27,7 +27,6 @@ QMAKE_CLEAN += $(TARGET)
+ # Input
+ HEADERS += autoexpire.h encoderlink.h filetransfer.h httpstatus.h mainserver.h
+ HEADERS += playbacksock.h scheduler.h server.h backendhousekeeper.h
+-HEADERS += backendutil.h
+ HEADERS += upnpcdstv.h upnpcdsmusic.h upnpcdsvideo.h mediaserver.h
+ HEADERS += internetContent.h main_helpers.h backendcontext.h
+ HEADERS += httpconfig.h mythsettings.h commandlineparser.h
+@@ -45,7 +44,7 @@ HEADERS += services/capture.h services/image.h services/music.h
+
+ SOURCES += autoexpire.cpp encoderlink.cpp filetransfer.cpp httpstatus.cpp
+ SOURCES += main.cpp mainserver.cpp playbacksock.cpp scheduler.cpp server.cpp
+-SOURCES += backendhousekeeper.cpp backendutil.cpp
++SOURCES += backendhousekeeper.cpp
+ SOURCES += upnpcdstv.cpp upnpcdsmusic.cpp upnpcdsvideo.cpp mediaserver.cpp
+ SOURCES += internetContent.cpp main_helpers.cpp backendcontext.cpp
+ SOURCES += httpconfig.cpp mythsettings.cpp commandlineparser.cpp
+diff --git a/mythtv/programs/mythbackend/scheduler.cpp
b/mythtv/programs/mythbackend/scheduler.cpp
+index 16cceeeb641..29aa293a24e 100644
+--- a/mythtv/programs/mythbackend/scheduler.cpp
++++ b/mythtv/programs/mythbackend/scheduler.cpp
+@@ -33,7 +33,6 @@ using namespace std;
+ #include "encoderlink.h"
+ #include "mainserver.h"
+ #include "remoteutil.h"
+-#include "backendutil.h"
+ #include "mythdate.h"
+ #include "exitcodes.h"
+ #include "mythcontext.h"
+diff --git a/mythtv/programs/mythbackend/services/content.cpp
b/mythtv/programs/mythbackend/services/content.cpp
+index 3fddaed4675..cb3afc320c7 100644
+--- a/mythtv/programs/mythbackend/services/content.cpp
++++ b/mythtv/programs/mythbackend/services/content.cpp
+@@ -36,7 +36,7 @@
+ #include "storagegroup.h"
+ #include "programinfo.h"
+ #include "previewgenerator.h"
+-#include "backendutil.h"
++#include "requesthandler/fileserverutil.h"
+ #include "httprequest.h"
+ #include "serviceUtil.h"
+ #include "mythdate.h"
+
+From 1c2068c62bd67f5458009a49412e8b50a4bafbe5 Mon Sep 17 00:00:00 2001
+From: David Engel <dengel(a)mythtv.org>
+Date: Fri, 1 Feb 2019 20:04:46 -0600
+Subject: [PATCH 13/15] Missed a locking difference in the previous
+ GetPlaybackURL commit.
+
+(cherry picked from commit 068c9664724122d0b116d29aea31850a4ae85ed6)
+---
+ .../libs/libmythprotoserver/requesthandler/fileserverutil.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
b/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
+index 99ed5507318..bb79ae3e329 100644
+--- a/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
++++ b/mythtv/libs/libmythprotoserver/requesthandler/fileserverutil.cpp
+@@ -57,7 +57,9 @@ QString GetPlaybackURL(ProgramInfo *pginfo, bool storePath)
+ }
+ else
+ {
++ locker.unlock();
+ result = pginfo->GetPlaybackURL(false, true);
++ locker.relock();
+ if (storePath && result.startsWith("/"))
+ recordingPathCache[cacheKey] = result;
+ }
+
+From c6760c6210597453c140079628a509683b738f54 Mon Sep 17 00:00:00 2001
+From: Peter Bennett <pbennett(a)mythtv.org>
+Date: Sun, 10 Feb 2019 11:25:55 -0500
+Subject: [PATCH 14/15] Guide Grid: Fix missing text when using QT painter
+
+Grid icons, arrows and record status, caused text to show as blank.
+Changed to paint the text first, which resolves the issue.
+
+Fixes #13398
+
+(cherry picked from commit f561a3c4b2f8d59df8674849d40e046874aee8a2)
+---
+ mythtv/libs/libmythui/mythuiguidegrid.cpp | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/mythtv/libs/libmythui/mythuiguidegrid.cpp
b/mythtv/libs/libmythui/mythuiguidegrid.cpp
+index 4fbd523e4a3..3115f675622 100644
+--- a/mythtv/libs/libmythui/mythuiguidegrid.cpp
++++ b/mythtv/libs/libmythui/mythuiguidegrid.cpp
+@@ -329,6 +329,7 @@ void MythUIGuideGrid::DrawSelf(MythPainter *p, int xoffset, int
yoffset,
+ drawBox(p, xoffset, yoffset, data, m_recordingColor, alphaMod);
+ else
+ drawBox(p, xoffset, yoffset, data, m_conflictingColor, alphaMod);
++ drawText(p, xoffset, yoffset, data, alphaMod);
+ }
+ }
+
+@@ -341,10 +342,7 @@ void MythUIGuideGrid::DrawSelf(MythPainter *p, int xoffset, int
yoffset,
+ for (; it != m_allData[i].end(); ++it)
+ {
+ UIGTCon *data = *it;
+- drawText(p, xoffset, yoffset, data, alphaMod);
+-
+- if (data->m_recType != 0 || data->m_arrow != GridTimeNormal)
+- drawRecDecoration(p, xoffset, yoffset, data, alphaMod);
++ drawRecDecoration(p, xoffset, yoffset, data, alphaMod);
+ }
+ }
+ }
+@@ -690,6 +688,9 @@ void MythUIGuideGrid::drawText(MythPainter *p, int xoffset, int
yoffset, UIGTCon
+ if (area.width() <= 0 || area.height() <= 0)
+ return;
+
++const char *msgx = QString("DrawText title=%1")
++ .arg(msg).toLocal8Bit();
++fprintf(stderr,"%s\n", msgx);
+ p->DrawText(area, msg, m_justification, *m_font, alphaMod, area);
+ }
+
+
+From b774c4140b2b9e148ccf699d1ad746bc4c84289c Mon Sep 17 00:00:00 2001
+From: Peter Bennett <pbennett(a)mythtv.org>
+Date: Sun, 10 Feb 2019 12:17:53 -0500
+Subject: [PATCH 15/15] Remove debugging code.
+
+Program guide fix included some debugging code.
+
+(cherry picked from commit 7fd7b8443073ab53804b284f69968d37932825cc)
+---
+ mythtv/libs/libmythui/mythuiguidegrid.cpp | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/mythtv/libs/libmythui/mythuiguidegrid.cpp
b/mythtv/libs/libmythui/mythuiguidegrid.cpp
+index 3115f675622..106314344c8 100644
+--- a/mythtv/libs/libmythui/mythuiguidegrid.cpp
++++ b/mythtv/libs/libmythui/mythuiguidegrid.cpp
+@@ -688,9 +688,6 @@ void MythUIGuideGrid::drawText(MythPainter *p, int xoffset, int
yoffset, UIGTCon
+ if (area.width() <= 0 || area.height() <= 0)
+ return;
+
+-const char *msgx = QString("DrawText title=%1")
+- .arg(msg).toLocal8Bit();
+-fprintf(stderr,"%s\n", msgx);
+ p->DrawText(area, msg, m_justification, *m_font, alphaMod, area);
+ }
+