diff options
author | Carl Fürstenberg <azatoth@gmail.com> | 2011-04-21 23:25:41 +0400 |
---|---|---|
committer | Carl Fürstenberg <azatoth@gmail.com> | 2011-04-21 23:25:41 +0400 |
commit | 4b764922e0436ba0e2815184fc2edcd83b1631af (patch) | |
tree | 6f95635a2b38936ab910b606a950e0254e0fdee8 | |
parent | 80511d1075511d00c2569cfc444fe6f6521b5d80 (diff) | |
parent | 3816b90203d6d8c1b4581a33b15215b035e56802 (diff) |
Merge commit '3816b90203d6d8c1b4581a33b15215b035e56802'v1.0.19.1
-rw-r--r-- | minidlnatypes.h | 1 | ||||
-rw-r--r-- | scanner.c | 4 | ||||
-rw-r--r-- | upnpglobalvars.h | 2 | ||||
-rw-r--r-- | upnphttp.c | 5 | ||||
-rw-r--r-- | upnpsoap.c | 184 |
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 }; @@ -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" @@ -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; @@ -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, "<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, "<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\">" + "http://%s:%d/MediaItems/%s.%s" + "</res>", + 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, "<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\">" - "http://%s:%d/MediaItems/%s.%s" - "</res>", - 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, "</item>"); } |