ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/external/subpack/multimedia/minidlna/patches/001-dont-build-po-files.patch b/external/subpack/multimedia/minidlna/patches/001-dont-build-po-files.patch
new file mode 100644
index 0000000..f16514c
--- /dev/null
+++ b/external/subpack/multimedia/minidlna/patches/001-dont-build-po-files.patch
@@ -0,0 +1,22 @@
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -17,7 +17,7 @@
+ 
+ AM_CFLAGS = -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
+ 
+-SUBDIRS=po
++SUBDIRS=
+ 
+ sbin_PROGRAMS = minidlnad
+ check_PROGRAMS = testupnpdescgen
+--- a/configure.ac
++++ b/configure.ac
+@@ -658,6 +658,5 @@ case "$target_os" in
+ esac
+ 
+ 
+-AC_OUTPUT([ po/Makefile.in
+-Makefile
+-])
++AC_CONFIG_FILES([Makefile])
++AC_OUTPUT
diff --git a/external/subpack/multimedia/minidlna/patches/005-added-support-RMVB.patch b/external/subpack/multimedia/minidlna/patches/005-added-support-RMVB.patch
new file mode 100644
index 0000000..ddf354f
--- /dev/null
+++ b/external/subpack/multimedia/minidlna/patches/005-added-support-RMVB.patch
@@ -0,0 +1,55 @@
+From e4a045e92b864dc148ca46be94668c5b67132405 Mon Sep 17 00:00:00 2001
+From: VergLsm <vision.lsm.2012@gmail.com>
+Date: Fri, 31 Jan 2020 10:01:12 +0000
+Subject: [PATCH] Added support RMVB.
+
+---
+ metadata.c       | 4 ++++
+ upnpglobalvars.h | 3 ++-
+ utils.c          | 3 +++
+ 3 files changed, 9 insertions(+), 1 deletion(-)
+
+--- a/metadata.c
++++ b/metadata.c
+@@ -862,6 +862,10 @@ GetVideoMetadata(const char *path, const
+ 			xasprintf(&m.mime, "video/x-matroska");
+ 		else if( strcmp(ctx->iformat->name, "flv") == 0 )
+ 			xasprintf(&m.mime, "video/x-flv");
++		else if( strcmp(ctx->iformat->name, "rm") == 0 )
++			xasprintf(&m.mime, "video/x-pn-realvideo");
++		else if( strcmp(ctx->iformat->name, "rmvb") == 0 )
++			xasprintf(&m.mime, "video/x-pn-realvideo");
+ 		if( m.mime )
+ 			goto video_no_dlna;
+ 
+--- a/upnpglobalvars.h
++++ b/upnpglobalvars.h
+@@ -172,7 +172,8 @@
+ 	"http-get:*:audio/x-wav:*," \
+ 	"http-get:*:audio/x-flac:*," \
+ 	"http-get:*:audio/x-dsd:*," \
+-	"http-get:*:application/ogg:*"
++	"http-get:*:application/ogg:*,"\
++	"http-get:*:video/x-pn-realvideo:*"
+ 
+ #define DLNA_FLAG_DLNA_V1_5      0x00100000
+ #define DLNA_FLAG_HTTP_STALLING  0x00200000
+--- a/utils.c
++++ b/utils.c
+@@ -377,6 +377,8 @@ mime_to_ext(const char * mime)
+ 				return "3gp";
+ 			else if( strncmp(mime+6, "x-tivo-mpeg", 11) == 0 )
+ 				return "TiVo";
++			else if( strcmp(mime+6, "x-pn-realvideo") == 0 )
++				return "rm";
+ 			break;
+ 		case 'i':
+ 			if( strcmp(mime+6, "jpeg") == 0 )
+@@ -401,6 +403,7 @@ is_video(const char * file)
+ 		ends_with(file, ".m2t") || ends_with(file, ".mkv")   ||
+ 		ends_with(file, ".vob") || ends_with(file, ".ts")    ||
+ 		ends_with(file, ".flv") || ends_with(file, ".xvid")  ||
++		ends_with(file, ".rm") || ends_with(file, ".rmvb")  ||
+ #ifdef TIVO_SUPPORT
+ 		ends_with(file, ".TiVo") ||
+ #endif
diff --git a/external/subpack/multimedia/minidlna/patches/020-wrap_container_definitions_into_a_structure.patch b/external/subpack/multimedia/minidlna/patches/020-wrap_container_definitions_into_a_structure.patch
new file mode 100644
index 0000000..859e9f4
--- /dev/null
+++ b/external/subpack/multimedia/minidlna/patches/020-wrap_container_definitions_into_a_structure.patch
@@ -0,0 +1,118 @@
+From e0065b8343bc963a89556449e00f1d20086cc1f1 Mon Sep 17 00:00:00 2001
+From: Daniel Kamil Kozar <dkk089@gmail.com>
+Date: Sat, 15 Dec 2018 16:26:37 +0100
+Subject: [PATCH] Wrap container definitions into a structure
+
+---
+ containers.c | 25 +++++++++++++++++++++++++
+ containers.h |  8 ++++++++
+ scanner.c    | 33 ++++++---------------------------
+ 3 files changed, 39 insertions(+), 27 deletions(-)
+
+--- a/containers.c
++++ b/containers.c
+@@ -23,6 +23,31 @@
+ #include "containers.h"
+ #include "log.h"
+ 
++const struct container_s containers[] = {
++		{ "0","-1",   "root" },
++		{ MUSIC_ID, "0", "Music" },
++		{ MUSIC_ALL_ID, MUSIC_ID, "All Music" },
++		{ MUSIC_GENRE_ID, MUSIC_ID, "Genre" },
++		{ MUSIC_ARTIST_ID, MUSIC_ID, "Artist" },
++		{ MUSIC_ALBUM_ID, MUSIC_ID, "Album" },
++		{ MUSIC_DIR_ID, MUSIC_ID, "Folders" },
++		{ MUSIC_PLIST_ID, MUSIC_ID, "Playlists" },
++
++		{ VIDEO_ID, "0", "Video" },
++		{ VIDEO_ALL_ID, VIDEO_ID, "All Video" },
++		{ VIDEO_DIR_ID, VIDEO_ID, "Folders" },
++
++		{ IMAGE_ID, "0", "Pictures" },
++		{ IMAGE_ALL_ID, IMAGE_ID, "All Pictures" },
++		{ IMAGE_DATE_ID, IMAGE_ID, "Date Taken" },
++		{ IMAGE_CAMERA_ID, IMAGE_ID, "Camera" },
++		{ IMAGE_DIR_ID, IMAGE_ID, "Folders" },
++
++		{ BROWSEDIR_ID, "0", "Browse Folders" },
++
++		{ 0, 0, 0 }
++};
++
+ #define NINETY_DAYS "7776000"
+ 
+ const char *music_id = MUSIC_ID;
+--- a/containers.h
++++ b/containers.h
+@@ -16,6 +16,14 @@
+  * along with MiniDLNA. If not, see <http://www.gnu.org/licenses/>.
+  */
+ 
++struct container_s {
++	const char *object_id;
++	const char *parent_id;
++	const char *name;
++};
++
++extern const struct container_s containers[];
++
+ struct magic_container_s {
+ 	const char *name;
+ 	const char *objectid_match;
+--- a/scanner.c
++++ b/scanner.c
+@@ -529,30 +529,7 @@ insert_file(const char *name, const char
+ int
+ CreateDatabase(void)
+ {
+-	int ret, i;
+-	const char *containers[] = { "0","-1",   "root",
+-	                        MUSIC_ID, "0", _("Music"),
+-	                    MUSIC_ALL_ID, MUSIC_ID, _("All Music"),
+-	                  MUSIC_GENRE_ID, MUSIC_ID, _("Genre"),
+-	                 MUSIC_ARTIST_ID, MUSIC_ID, _("Artist"),
+-	                  MUSIC_ALBUM_ID, MUSIC_ID, _("Album"),
+-	                    MUSIC_DIR_ID, MUSIC_ID, _("Folders"),
+-	                  MUSIC_PLIST_ID, MUSIC_ID, _("Playlists"),
+-
+-	                        VIDEO_ID, "0", _("Video"),
+-	                    VIDEO_ALL_ID, VIDEO_ID, _("All Video"),
+-	                    VIDEO_DIR_ID, VIDEO_ID, _("Folders"),
+-
+-	                        IMAGE_ID, "0", _("Pictures"),
+-	                    IMAGE_ALL_ID, IMAGE_ID, _("All Pictures"),
+-	                   IMAGE_DATE_ID, IMAGE_ID, _("Date Taken"),
+-	                 IMAGE_CAMERA_ID, IMAGE_ID, _("Camera"),
+-	                    IMAGE_DIR_ID, IMAGE_ID, _("Folders"),
+-
+-	                    BROWSEDIR_ID, "0", _("Browse Folders"),
+-			0 };
+-
+-	ret = sql_exec(db, create_objectTable_sqlite);
++	int ret = sql_exec(db, create_objectTable_sqlite);
+ 	if( ret != SQLITE_OK )
+ 		goto sql_failed;
+ 	ret = sql_exec(db, create_detailTable_sqlite);
+@@ -576,16 +553,18 @@ CreateDatabase(void)
+ 	ret = sql_exec(db, "INSERT into SETTINGS values ('UPDATE_ID', '0')");
+ 	if( ret != SQLITE_OK )
+ 		goto sql_failed;
+-	for( i=0; containers[i]; i=i+3 )
++	for( int i=0; containers[i].name; ++i )
+ 	{
++		const struct container_s *c = &containers[i];
++		const char *name = _(c->name);
+ 		ret = sql_exec(db, "INSERT into OBJECTS (OBJECT_ID, PARENT_ID, DETAIL_ID, CLASS, NAME)"
+ 		                   " values "
+ 		                   "('%s', '%s', %lld, 'container.storageFolder', '%q')",
+-		                   containers[i], containers[i+1], GetFolderMetadata(containers[i+2], NULL, NULL, NULL, 0), containers[i+2]);
++		                   c->object_id, c->parent_id, GetFolderMetadata(name, NULL, NULL, NULL, 0), name);
+ 		if( ret != SQLITE_OK )
+ 			goto sql_failed;
+ 	}
+-	for( i=0; magic_containers[i].objectid_match; i++ )
++	for( int i=0; magic_containers[i].objectid_match; i++ )
+ 	{
+ 		struct magic_container_s *magic = &magic_containers[i];
+ 		if (!magic->name)
diff --git a/external/subpack/multimedia/minidlna/patches/030-mark_all_instances_of_magic_container_s_as_const.patch b/external/subpack/multimedia/minidlna/patches/030-mark_all_instances_of_magic_container_s_as_const.patch
new file mode 100644
index 0000000..84a8188
--- /dev/null
+++ b/external/subpack/multimedia/minidlna/patches/030-mark_all_instances_of_magic_container_s_as_const.patch
@@ -0,0 +1,125 @@
+From d297624e533d6d4274c750e3769749c3d7f121c8 Mon Sep 17 00:00:00 2001
+From: Daniel Kamil Kozar <dkk089@gmail.com>
+Date: Sat, 15 Dec 2018 16:34:30 +0100
+Subject: [PATCH] Mark all instances of magic_container_s as const
+
+---
+ containers.c | 38 +++++++++++++++++++-------------------
+ containers.h |  6 +++---
+ scanner.c    |  2 +-
+ upnpsoap.c   |  6 +++---
+ 4 files changed, 26 insertions(+), 26 deletions(-)
+
+--- a/containers.c
++++ b/containers.c
+@@ -50,23 +50,23 @@ const struct container_s containers[] =
+ 
+ #define NINETY_DAYS "7776000"
+ 
+-const char *music_id = MUSIC_ID;
+-const char *music_all_id = MUSIC_ALL_ID;
+-const char *music_genre_id = MUSIC_GENRE_ID;
+-const char *music_artist_id = MUSIC_ARTIST_ID;
+-const char *music_album_id = MUSIC_ALBUM_ID;
+-const char *music_plist_id = MUSIC_PLIST_ID;
+-const char *music_dir_id = MUSIC_DIR_ID;
+-const char *video_id = VIDEO_ID;
+-const char *video_all_id = VIDEO_ALL_ID;
+-const char *video_dir_id = VIDEO_DIR_ID;
+-const char *image_id = IMAGE_ID;
+-const char *image_all_id = IMAGE_ALL_ID;
+-const char *image_date_id = IMAGE_DATE_ID;
+-const char *image_camera_id = IMAGE_CAMERA_ID;
+-const char *image_dir_id = IMAGE_DIR_ID;
++static const char *music_id = MUSIC_ID;
++static const char *music_all_id = MUSIC_ALL_ID;
++static const char *music_genre_id = MUSIC_GENRE_ID;
++static const char *music_artist_id = MUSIC_ARTIST_ID;
++static const char *music_album_id = MUSIC_ALBUM_ID;
++static const char *music_plist_id = MUSIC_PLIST_ID;
++static const char *music_dir_id = MUSIC_DIR_ID;
++static const char *video_id = VIDEO_ID;
++static const char *video_all_id = VIDEO_ALL_ID;
++static const char *video_dir_id = VIDEO_DIR_ID;
++static const char *image_id = IMAGE_ID;
++static const char *image_all_id = IMAGE_ALL_ID;
++static const char *image_date_id = IMAGE_DATE_ID;
++static const char *image_camera_id = IMAGE_CAMERA_ID;
++static const char *image_dir_id = IMAGE_DIR_ID;
+ 
+-struct magic_container_s magic_containers[] =
++const struct magic_container_s magic_containers[] =
+ {
+ 	/* Alternate root container */
+ 	{ NULL,
+@@ -149,7 +149,7 @@ struct magic_container_s magic_container
+ 	{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0 }
+ };
+ 
+-struct magic_container_s *
++const struct magic_container_s *
+ in_magic_container(const char *id, int flags, const char **real_id)
+ {
+ 	size_t len;
+@@ -179,7 +179,7 @@ in_magic_container(const char *id, int f
+ 	return NULL;
+ }
+ 
+-struct magic_container_s *
++const struct magic_container_s *
+ check_magic_container(const char *id, int flags)
+ {
+ 	int i;
+--- a/containers.h
++++ b/containers.h
+@@ -38,7 +38,7 @@ struct magic_container_s {
+ 	int required_flags;
+ };
+ 
+-extern struct magic_container_s magic_containers[];
++extern const struct magic_container_s magic_containers[];
+ 
+-struct magic_container_s *in_magic_container(const char *id, int flags, const char **real_id);
+-struct magic_container_s *check_magic_container(const char *id, int flags);
++const struct magic_container_s *in_magic_container(const char *id, int flags, const char **real_id);
++const struct magic_container_s *check_magic_container(const char *id, int flags);
+--- a/scanner.c
++++ b/scanner.c
+@@ -566,7 +566,7 @@ CreateDatabase(void)
+ 	}
+ 	for( int i=0; magic_containers[i].objectid_match; i++ )
+ 	{
+-		struct magic_container_s *magic = &magic_containers[i];
++		const struct magic_container_s *magic = &magic_containers[i];
+ 		if (!magic->name)
+ 			continue;
+ 		if( sql_get_int_field(db, "SELECT 1 from OBJECTS where OBJECT_ID = '%s'", magic->objectid_match) == 0 )
+--- a/upnpsoap.c
++++ b/upnpsoap.c
+@@ -804,7 +804,7 @@ add_res(char *size, char *duration, char
+ }
+ 
+ static int
+-get_child_count(const char *object, struct magic_container_s *magic)
++get_child_count(const char *object, const struct magic_container_s *magic)
+ {
+ 	int ret;
+ 
+@@ -1301,7 +1301,7 @@ BrowseContentDirectory(struct upnphttp *
+ 			"<Result>"
+ 			"&lt;DIDL-Lite"
+ 			CONTENT_DIRECTORY_SCHEMAS;
+-	struct magic_container_s *magic;
++	const struct magic_container_s *magic;
+ 	char *zErrMsg = NULL;
+ 	char *sql, *ptr;
+ 	struct Response args;
+@@ -1823,7 +1823,7 @@ SearchContentDirectory(struct upnphttp *
+ 			"<Result>"
+ 			"&lt;DIDL-Lite"
+ 			CONTENT_DIRECTORY_SCHEMAS;
+-	struct magic_container_s *magic;
++	const struct magic_container_s *magic;
+ 	char *zErrMsg = NULL;
+ 	char *sql, *ptr;
+ 	struct Response args;
diff --git a/external/subpack/multimedia/minidlna/patches/040-heroes.patch b/external/subpack/multimedia/minidlna/patches/040-heroes.patch
new file mode 100644
index 0000000..74a3e24
--- /dev/null
+++ b/external/subpack/multimedia/minidlna/patches/040-heroes.patch
@@ -0,0 +1,25 @@
+From 972fb2bbfdb7118551da45c5828c9e74be581fc4 Mon Sep 17 00:00:00 2001
+From: Daniel Kamil Kozar <dkk089@gmail.com>
+Date: Sat, 15 Dec 2018 21:55:52 +0100
+Subject: [PATCH] What about David Bowie's "Heroes"?
+
+---
+ utils.c | 7 -------
+ 1 file changed, 7 deletions(-)
+
+--- a/utils.c
++++ b/utils.c
+@@ -87,13 +87,6 @@ trim(char *str)
+ 		len--;
+ 	}
+ 
+-	if (str[0] == '"' && str[len-1] == '"')
+-	{
+-		str[0] = '\0';
+-		str[len-1] = '\0';
+-		str++;
+-	}
+-
+ 	return str;
+ }
+ 
diff --git a/external/subpack/multimedia/minidlna/patches/060-reduce_duplication_in_sql_c.patch b/external/subpack/multimedia/minidlna/patches/060-reduce_duplication_in_sql_c.patch
new file mode 100644
index 0000000..c237217
--- /dev/null
+++ b/external/subpack/multimedia/minidlna/patches/060-reduce_duplication_in_sql_c.patch
@@ -0,0 +1,192 @@
+From be9de8b2e0864b46498496af9ffdc31c0e7b764a Mon Sep 17 00:00:00 2001
+From: Daniel Kamil Kozar <dkk089@gmail.com>
+Date: Sun, 16 Dec 2018 14:21:58 +0100
+Subject: [PATCH] Reduce duplication in sql.c
+
+---
+ sql.c | 166 ++++++++++++++++++++--------------------------------------
+ 1 file changed, 58 insertions(+), 108 deletions(-)
+
+--- a/sql.c
++++ b/sql.c
+@@ -65,122 +65,72 @@ sql_get_table(sqlite3 *db, const char *s
+ 	return ret;
+ }
+ 
++#define sql_get_field(type, column_get_fn) \
++		va_list		ap;\
++		int		counter, result;\
++		char		*sql;\
++		type		ret;\
++		sqlite3_stmt	*stmt;\
++		\
++		va_start(ap, fmt);\
++		sql = sqlite3_vmprintf(fmt, ap);\
++		va_end(ap);\
++\
++		/*DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); */ \
++\
++		switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))\
++		{\
++			case SQLITE_OK:\
++				break;\
++			default:\
++				DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);\
++				sqlite3_free(sql);\
++				return -1;\
++		}\
++\
++		for (counter = 0;\
++		     ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;\
++		     counter++) {\
++			/* While SQLITE_BUSY has a built in timeout,\
++			 * SQLITE_LOCKED does not, so sleep */\
++			if (result == SQLITE_LOCKED)\
++				sleep(1);\
++		}\
++\
++		switch (result)\
++		{\
++			case SQLITE_DONE:\
++				/* no rows returned */\
++				ret = 0;\
++				break;\
++			case SQLITE_ROW:\
++				if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)\
++				{\
++					ret = 0;\
++					break;\
++				}\
++				ret = column_get_fn(stmt, 0);\
++				break;\
++			default:\
++				DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);\
++				ret = -1;\
++				break;\
++		}\
++		sqlite3_free(sql);\
++		sqlite3_finalize(stmt);\
++\
++		return ret;
++
+ int
+ sql_get_int_field(sqlite3 *db, const char *fmt, ...)
+ {
+-	va_list		ap;
+-	int		counter, result;
+-	char		*sql;
+-	int		ret;
+-	sqlite3_stmt	*stmt;
+-	
+-	va_start(ap, fmt);
+-	sql = sqlite3_vmprintf(fmt, ap);
+-	va_end(ap);
+-
+-	//DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql);
+-
+-	switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))
+-	{
+-		case SQLITE_OK:
+-			break;
+-		default:
+-			DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);
+-			sqlite3_free(sql);
+-			return -1;
+-	}
+-
+-	for (counter = 0;
+-	     ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;
+-	     counter++) {
+-		/* While SQLITE_BUSY has a built in timeout,
+-		 * SQLITE_LOCKED does not, so sleep */
+-		if (result == SQLITE_LOCKED)
+-			sleep(1);
+-	}
+-
+-	switch (result)
+-	{
+-		case SQLITE_DONE:
+-			/* no rows returned */
+-			ret = 0;
+-			break;
+-		case SQLITE_ROW:
+-			if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)
+-			{
+-				ret = 0;
+-				break;
+-			}
+-			ret = sqlite3_column_int(stmt, 0);
+-			break;
+-		default:
+-			DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);
+-			ret = -1;
+-			break;
+-	}
+-	sqlite3_free(sql);
+-	sqlite3_finalize(stmt);
+-
+-	return ret;
++	sql_get_field(int, sqlite3_column_int)
+ }
+ 
+ int64_t
+ sql_get_int64_field(sqlite3 *db, const char *fmt, ...)
+ {
+-	va_list		ap;
+-	int		counter, result;
+-	char		*sql;
+-	int64_t		ret;
+-	sqlite3_stmt	*stmt;
+-	
+-	va_start(ap, fmt);
+-	sql = sqlite3_vmprintf(fmt, ap);
+-	va_end(ap);
+-
+-	//DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql);
+-
+-	switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))
+-	{
+-		case SQLITE_OK:
+-			break;
+-		default:
+-			DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);
+-			sqlite3_free(sql);
+-			return -1;
+-	}
+-
+-	for (counter = 0;
+-	     ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;
+-	     counter++) {
+-		/* While SQLITE_BUSY has a built in timeout,
+-		 * SQLITE_LOCKED does not, so sleep */
+-		if (result == SQLITE_LOCKED)
+-			sleep(1);
+-	}
+-
+-	switch (result)
+-	{
+-		case SQLITE_DONE:
+-			/* no rows returned */
+-			ret = 0;
+-			break;
+-		case SQLITE_ROW:
+-			if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)
+-			{
+-				ret = 0;
+-				break;
+-			}
+-			ret = sqlite3_column_int64(stmt, 0);
+-			break;
+-		default:
+-			DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);
+-			ret = -1;
+-			break;
+-	}
+-	sqlite3_free(sql);
+-	sqlite3_finalize(stmt);
+-
+-	return ret;
++	sql_get_field(int64_t, sqlite3_column_int64)
+ }
+ 
+ char *
diff --git a/external/subpack/multimedia/minidlna/patches/070-return-void.patch b/external/subpack/multimedia/minidlna/patches/070-return-void.patch
new file mode 100644
index 0000000..ec0e6d3
--- /dev/null
+++ b/external/subpack/multimedia/minidlna/patches/070-return-void.patch
@@ -0,0 +1,19 @@
+From ce34745bb19a649c8570ef0a3da9ffd5e941548e Mon Sep 17 00:00:00 2001
+From: Daniel Kamil Kozar <dkk089@gmail.com>
+Date: Sun, 30 Dec 2018 22:49:50 +0100
+Subject: [PATCH] No return in a function returning non-void
+
+---
+ upnpdescgen.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/upnpdescgen.c
++++ b/upnpdescgen.c
+@@ -525,6 +525,7 @@ genXML(char * str, int * len, int * tmpl
+ 			pile[top].eltname = eltname;
+ 		}
+ 	}
++	return str;
+ }
+ 
+ /* genRootDesc() :