Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/azatoth/minidlna.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Fürstenberg <azatoth@gmail.com>2011-04-21 23:25:41 +0400
committerCarl Fürstenberg <azatoth@gmail.com>2011-04-21 23:25:41 +0400
commit4b764922e0436ba0e2815184fc2edcd83b1631af (patch)
tree6f95635a2b38936ab910b606a950e0254e0fdee8
parent80511d1075511d00c2569cfc444fe6f6521b5d80 (diff)
parent3816b90203d6d8c1b4581a33b15215b035e56802 (diff)
Merge commit '3816b90203d6d8c1b4581a33b15215b035e56802'v1.0.19.1
-rw-r--r--minidlnatypes.h1
-rw-r--r--scanner.c4
-rw-r--r--upnpglobalvars.h2
-rw-r--r--upnphttp.c5
-rw-r--r--upnpsoap.c184
5 files changed, 133 insertions, 63 deletions
diff --git a/minidlnatypes.h b/minidlnatypes.h
index 2343c32..e4c8a90 100644
--- a/minidlnatypes.h
+++ b/minidlnatypes.h
@@ -71,6 +71,7 @@ enum client_types {
ESonyBDP,
ESonyBravia,
ERokuSoundBridge,
+ EToshibaTV,
EStandardDLNA150 = 100
};
diff --git a/scanner.c b/scanner.c
index 46b17e1..19e5c52 100644
--- a/scanner.c
+++ b/scanner.c
@@ -281,7 +281,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
strcpy(last_artist.name, artist);
last_artistAlbum.name[0] = '\0';
/* Add this file to the "- All Albums -" container as well */
- container = insert_container(_("- All Albums -"), last_artist.parentID, NULL, "person.musicArtist", artist, genre, NULL);
+ container = insert_container(_("- All Albums -"), last_artist.parentID, NULL, "album", artist, genre, NULL);
sprintf(last_artistAlbumAll.parentID, "%s$%llX", last_artist.parentID, container>>32);
last_artistAlbumAll.objectID = (int)container;
}
@@ -322,7 +322,7 @@ insert_containers(const char * name, const char *path, const char * refID, const
strcpy(last_genre.name, genre);
last_genreArtist.name[0] = '\0';
/* Add this file to the "- All Artists -" container as well */
- container = insert_container(_("- All Artists -"), last_genre.parentID, NULL, "person.musicArtist", NULL, genre, NULL);
+ container = insert_container(_("- All Artists -"), last_genre.parentID, NULL, "person", NULL, genre, NULL);
sprintf(last_genreArtistAll.parentID, "%s$%llX", last_genre.parentID, container>>32);
last_genreArtistAll.objectID = (int)container;
}
diff --git a/upnpglobalvars.h b/upnpglobalvars.h
index 0763fca..4fed4f3 100644
--- a/upnpglobalvars.h
+++ b/upnpglobalvars.h
@@ -58,7 +58,7 @@
#include <sqlite3.h>
-#define MINIDLNA_VERSION "1.0.19"
+#define MINIDLNA_VERSION "1.0.19.1"
#ifdef NETGEAR
# define SERVER_NAME "ReadyDLNA"
diff --git a/upnphttp.c b/upnphttp.c
index 9d3ad5a..360528c 100644
--- a/upnphttp.c
+++ b/upnphttp.c
@@ -316,6 +316,11 @@ intervening space) by either an integer or the keyword "infinite". */
h->req_client = EMediaRoom;
h->reqflags |= FLAG_MS_PFS;
}
+ else if(strstrc(p, "UPnP/1.0 DLNADOC/1.50 Intel_SDK_for_UPnP_devices/1.2", '\r'))
+ {
+ h->req_client = EToshibaTV;
+ h->reqflags |= FLAG_DLNA;
+ }
else if(strstrc(p, "DLNADOC/1.50", '\r'))
{
h->req_client = EStandardDLNA150;
diff --git a/upnpsoap.c b/upnpsoap.c
index ad23ad0..2c734e3 100644
--- a/upnpsoap.c
+++ b/upnpsoap.c
@@ -553,18 +553,17 @@ parse_sort_criteria(char * sortCriteria, int * error)
return order;
}
-static void add_resized_res(int srcw, int srch, int reqw, int reqh, char *dlna_pn, char *detailID, struct Response *passed_args)
+inline static void
+add_resized_res(int srcw, int srch, int reqw, int reqh, char *dlna_pn,
+ char *detailID, struct Response *passed_args)
{
int ret;
int dstw = reqw;
int dsth = reqh;
char str_buf[256];
-
if( passed_args->flags & FLAG_NO_RESIZE )
- {
return;
- }
ret = sprintf(str_buf, "&lt;res ");
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
@@ -590,6 +589,55 @@ static void add_resized_res(int srcw, int srch, int reqw, int reqh, char *dlna_p
passed_args->size += ret;
}
+inline static void
+add_res(char *size, char *duration, char *bitrate, char *sampleFrequency,
+ char *nrAudioChannels, char *resolution, char *dlna_pn, char *mime,
+ char *detailID, char *ext, struct Response *passed_args)
+{
+ int ret;
+ char str_buf[256];
+
+ ret = sprintf(str_buf, "&lt;res ");
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+ if( size && (passed_args->filter & FILTER_RES_SIZE) ) {
+ ret = sprintf(str_buf, "size=\"%s\" ", size);
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+ }
+ if( duration && (passed_args->filter & FILTER_RES_DURATION) ) {
+ ret = sprintf(str_buf, "duration=\"%s\" ", duration);
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+ }
+ if( bitrate && (passed_args->filter & FILTER_RES_BITRATE) ) {
+ ret = sprintf(str_buf, "bitrate=\"%s\" ", bitrate);
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+ }
+ if( sampleFrequency && (passed_args->filter & FILTER_RES_SAMPLEFREQUENCY) ) {
+ ret = sprintf(str_buf, "sampleFrequency=\"%s\" ", sampleFrequency);
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+ }
+ if( nrAudioChannels && (passed_args->filter & FILTER_RES_NRAUDIOCHANNELS) ) {
+ ret = sprintf(str_buf, "nrAudioChannels=\"%s\" ", nrAudioChannels);
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+ }
+ if( resolution && (passed_args->filter & FILTER_RES_RESOLUTION) ) {
+ ret = sprintf(str_buf, "resolution=\"%s\" ", resolution);
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+ }
+ ret = snprintf(str_buf, sizeof(str_buf), "protocolInfo=\"http-get:*:%s:%s\"&gt;"
+ "http://%s:%d/MediaItems/%s.%s"
+ "&lt;/res&gt;",
+ mime, dlna_pn, lan_addr[0].str, runtime_vars.port, detailID, ext);
+ memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
+ passed_args->size += ret;
+}
+
#define SELECT_COLUMNS "SELECT o.OBJECT_ID, o.PARENT_ID, o.REF_ID, o.DETAIL_ID, o.CLASS," \
" d.SIZE, d.TITLE, d.DURATION, d.BITRATE, d.SAMPLERATE, d.ARTIST," \
" d.ALBUM, d.GENRE, d.COMMENT, d.CHANNELS, d.TRACK, d.DATE, d.RESOLUTION," \
@@ -681,20 +729,6 @@ callback(void *args, int argc, char **argv, char **azColName)
strcpy(mime+8, "mkv");
}
}
- else if( passed_args->client == ESonyBDP || passed_args->client == ESonyBravia )
- {
- if( passed_args->client == ESonyBDP &&
- (strcmp(mime+6, "x-matroska") == 0 ||
- strcmp(mime+6, "mpeg") == 0) )
- {
- strcpy(mime+6, "divx");
- }
- /* BRAVIA KDL-##*X### series TVs do natively support AVC/AC3 in TS, but
- require profile to be renamed (applies to _T and _ISO variants also) */
- modifyString(dlna_buf, "AVC_TS_MP_SD_AC3", "AVC_TS_HD_50_AC3", 0);
- modifyString(dlna_buf, "AVC_TS_MP_HD_AC3", "AVC_TS_HD_50_AC3", 0);
- modifyString(dlna_buf, "AVC_TS_HP_HD_AC3", "AVC_TS_HD_50_AC3", 0);
- }
}
else if( *mime == 'a' )
{
@@ -822,48 +856,8 @@ callback(void *args, int argc, char **argv, char **azColName)
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
passed_args->size += ret;
}
- ret = sprintf(str_buf, "&lt;res ");
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
- if( size && (passed_args->filter & FILTER_RES_SIZE) ) {
- ret = sprintf(str_buf, "size=\"%s\" ", size);
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
- }
- if( duration && (passed_args->filter & FILTER_RES_DURATION) ) {
- ret = sprintf(str_buf, "duration=\"%s\" ", duration);
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
- }
- if( bitrate && (passed_args->filter & FILTER_RES_BITRATE) ) {
- if( passed_args->flags & FLAG_MS_PFS )
- ret = sprintf(str_buf, "bitrate=\"%d\" ", atoi(bitrate)/1024);
- else
- ret = sprintf(str_buf, "bitrate=\"%s\" ", bitrate);
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
- }
- if( sampleFrequency && (passed_args->filter & FILTER_RES_SAMPLEFREQUENCY) ) {
- ret = sprintf(str_buf, "sampleFrequency=\"%s\" ", sampleFrequency);
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
- }
- if( nrAudioChannels && (passed_args->filter & FILTER_RES_NRAUDIOCHANNELS) ) {
- ret = sprintf(str_buf, "nrAudioChannels=\"%s\" ", nrAudioChannels);
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
- }
- if( resolution && (passed_args->filter & FILTER_RES_RESOLUTION) ) {
- ret = sprintf(str_buf, "resolution=\"%s\" ", resolution);
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
- }
- ret = sprintf(str_buf, "protocolInfo=\"http-get:*:%s:%s\"&gt;"
- "http://%s:%d/MediaItems/%s.%s"
- "&lt;/res&gt;",
- mime, dlna_buf, lan_addr[0].str, runtime_vars.port, detailID, ext);
- memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
- passed_args->size += ret;
+ add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
+ resolution, dlna_buf, mime, detailID, ext, passed_args);
if( (*mime == 'i') && (passed_args->client != EFreeBox) ) {
#if 1 //JPEG_RESIZE
int srcw = atoi(strsep(&resolution, "x"));
@@ -884,6 +878,76 @@ callback(void *args, int argc, char **argv, char **azColName)
passed_args->size += ret;
}
}
+ else if( *mime == 'v' ) {
+ switch( passed_args->client ) {
+ case EToshibaTV:
+ if( dlna_pn &&
+ (strncmp(dlna_pn, "MPEG_TS_HD_NA", 13) == 0 ||
+ strncmp(dlna_pn, "MPEG_TS_SD_NA", 13) == 0 ||
+ strncmp(dlna_pn, "AVC_TS_MP_HD_AC3", 16) == 0))
+ {
+ sprintf(dlna_buf, "DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=01;DLNA.ORG_CI=0");
+ add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
+ resolution, dlna_buf, mime, detailID, ext, passed_args);
+ }
+ break;
+ case ESonyBDP:
+ if( dlna_pn &&
+ (strncmp(dlna_pn, "AVC_TS", 6) == 0 ||
+ strncmp(dlna_pn, "MPEG_TS", 7) == 0) )
+ {
+ if( strncmp(dlna_pn, "MPEG_TS_SD_NA", 13) != 0 )
+ {
+ sprintf(dlna_buf, "DLNA.ORG_PN=MPEG_TS_SD_NA;DLNA.ORG_OP=01;DLNA.ORG_CI=0");
+ add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
+ resolution, dlna_buf, mime, detailID, ext, passed_args);
+ }
+ if( strncmp(dlna_pn, "MPEG_TS_SD_EU", 13) != 0 )
+ {
+ sprintf(dlna_buf, "DLNA.ORG_PN=MPEG_TS_SD_EU;DLNA.ORG_OP=01;DLNA.ORG_CI=0");
+ add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
+ resolution, dlna_buf, mime, detailID, ext, passed_args);
+ }
+ }
+ else if( (dlna_pn &&
+ (strncmp(dlna_pn, "AVC_MP4", 7) == 0 ||
+ strncmp(dlna_pn, "MPEG4_P2_MP4", 12) == 0)) ||
+ strcmp(mime+6, "x-matroska") == 0 ||
+ strcmp(mime+6, "x-msvideo") == 0 ||
+ strcmp(mime+6, "mpeg") == 0 )
+ {
+ strcpy(mime+6, "avi");
+ if( !dlna_pn || strncmp(dlna_pn, "MPEG_PS_NTSC", 12) != 0 )
+ {
+ sprintf(dlna_buf, "DLNA.ORG_PN=MPEG_PS_NTSC;DLNA.ORG_OP=01;DLNA.ORG_CI=0");
+ add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
+ resolution, dlna_buf, mime, detailID, ext, passed_args);
+ }
+ if( !dlna_pn || strncmp(dlna_pn, "MPEG_PS_PAL", 11) != 0 )
+ {
+ sprintf(dlna_buf, "DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=01;DLNA.ORG_CI=0");
+ add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
+ resolution, dlna_buf, mime, detailID, ext, passed_args);
+ }
+ }
+ break;
+ case ESonyBravia:
+ /* BRAVIA KDL-##*X### series TVs do natively support AVC/AC3 in TS, but
+ require profile to be renamed (applies to _T and _ISO variants also) */
+ if( dlna_pn &&
+ (strncmp(dlna_pn, "AVC_TS_MP_SD_AC3", 16) == 0 ||
+ strncmp(dlna_pn, "AVC_TS_MP_HD_AC3", 16) == 0 ||
+ strncmp(dlna_pn, "AVC_TS_HP_HD_AC3", 16) == 0))
+ {
+ sprintf(dlna_buf, "DLNA.ORG_PN=AVC_TS_HD_50_AC3;DLNA.ORG_OP=01;DLNA.ORG_CI=0");
+ add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
+ resolution, dlna_buf, mime, detailID, ext, passed_args);
+ }
+ break;
+ default:
+ break;
+ }
+ }
}
ret = sprintf(str_buf, "&lt;/item&gt;");
}