* Rework the Sony video support hacks by using multiple res elements.
* Throw in some extra Toshiba Regza support while we're at it.
This commit is contained in:
parent
e72c9d0a08
commit
414b3dffc8
@ -69,6 +69,7 @@ enum client_types {
|
|||||||
ESonyBDP,
|
ESonyBDP,
|
||||||
ESonyBravia,
|
ESonyBravia,
|
||||||
ERokuSoundBridge,
|
ERokuSoundBridge,
|
||||||
|
EToshibaTV,
|
||||||
EStandardDLNA150 = 100
|
EStandardDLNA150 = 100
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -314,6 +314,11 @@ intervening space) by either an integer or the keyword "infinite". */
|
|||||||
h->req_client = EMediaRoom;
|
h->req_client = EMediaRoom;
|
||||||
h->reqflags |= FLAG_MS_PFS;
|
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'))
|
else if(strstrc(p, "DLNADOC/1.50", '\r'))
|
||||||
{
|
{
|
||||||
h->req_client = EStandardDLNA150;
|
h->req_client = EStandardDLNA150;
|
||||||
|
184
upnpsoap.c
184
upnpsoap.c
@ -551,18 +551,17 @@ parse_sort_criteria(char * sortCriteria, int * error)
|
|||||||
return order;
|
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 ret;
|
||||||
int dstw = reqw;
|
int dstw = reqw;
|
||||||
int dsth = reqh;
|
int dsth = reqh;
|
||||||
char str_buf[256];
|
char str_buf[256];
|
||||||
|
|
||||||
|
|
||||||
if( passed_args->flags & FLAG_NO_RESIZE )
|
if( passed_args->flags & FLAG_NO_RESIZE )
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
ret = sprintf(str_buf, "<res ");
|
ret = sprintf(str_buf, "<res ");
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
@ -588,6 +587,55 @@ static void add_resized_res(int srcw, int srch, int reqw, int reqh, char *dlna_p
|
|||||||
passed_args->size += ret;
|
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," \
|
#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.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," \
|
" d.ALBUM, d.GENRE, d.COMMENT, d.CHANNELS, d.TRACK, d.DATE, d.RESOLUTION," \
|
||||||
@ -679,20 +727,6 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
strcpy(mime+8, "mkv");
|
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' )
|
else if( *mime == 'a' )
|
||||||
{
|
{
|
||||||
@ -820,48 +854,8 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
passed_args->size += ret;
|
passed_args->size += ret;
|
||||||
}
|
}
|
||||||
ret = sprintf(str_buf, "<res ");
|
add_res(size, duration, bitrate, sampleFrequency, nrAudioChannels,
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
resolution, dlna_buf, mime, detailID, ext, passed_args);
|
||||||
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;
|
|
||||||
if( (*mime == 'i') && (passed_args->client != EFreeBox) ) {
|
if( (*mime == 'i') && (passed_args->client != EFreeBox) ) {
|
||||||
#if 1 //JPEG_RESIZE
|
#if 1 //JPEG_RESIZE
|
||||||
int srcw = atoi(strsep(&resolution, "x"));
|
int srcw = atoi(strsep(&resolution, "x"));
|
||||||
@ -882,6 +876,76 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
passed_args->size += ret;
|
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>");
|
ret = sprintf(str_buf, "</item>");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user