* Better handling for extremely large JPEGs: expose the full image, JPEG_LRG, JPEG_SM, and thumbnail if the image is >4096x4096.
This commit is contained in:
parent
5465380a6d
commit
7c62467398
81
upnpsoap.c
81
upnpsoap.c
@ -485,6 +485,37 @@ 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)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int dstw = reqw;
|
||||||
|
int dsth = reqh;
|
||||||
|
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( passed_args->filter & FILTER_RES_RESOLUTION )
|
||||||
|
{
|
||||||
|
dstw = reqw;
|
||||||
|
dsth = ((((reqw<<10)/srcw)*srch)>>10);
|
||||||
|
if( dsth > reqh ) {
|
||||||
|
dsth = reqh;
|
||||||
|
dstw = (((reqh<<10)/srch) * srcw>>10);
|
||||||
|
}
|
||||||
|
ret = sprintf(str_buf, "resolution=\"%dx%d\" ", dstw, dsth);
|
||||||
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
|
passed_args->size += ret;
|
||||||
|
}
|
||||||
|
ret = sprintf(str_buf, "protocolInfo=\"http-get:*:image/jpeg:DLNA.ORG_PN=%s\">"
|
||||||
|
"http://%s:%d/Resized/%s.jpg?width=%d,height=%d"
|
||||||
|
"</res>",
|
||||||
|
dlna_pn, lan_addr[0].str, runtime_vars.port,
|
||||||
|
detailID, dstw, dsth);
|
||||||
|
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," \
|
||||||
@ -666,7 +697,7 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
}
|
}
|
||||||
if( passed_args->filter & FILTER_RES ) {
|
if( passed_args->filter & FILTER_RES ) {
|
||||||
mime_to_ext(mime, ext);
|
mime_to_ext(mime, ext);
|
||||||
if( (passed_args->client == EFreeBox) && tn && atoi(tn) && dlna_pn ) {
|
if( (passed_args->client == EFreeBox) && tn && atoi(tn) ) {
|
||||||
ret = sprintf(str_buf, "<res protocolInfo=\"http-get:*:%s:%s\">"
|
ret = sprintf(str_buf, "<res protocolInfo=\"http-get:*:%s:%s\">"
|
||||||
"http://%s:%d/Thumbnails/%s.jpg"
|
"http://%s:%d/Thumbnails/%s.jpg"
|
||||||
"</res>",
|
"</res>",
|
||||||
@ -714,47 +745,20 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
"http://%s:%d/MediaItems/%s.%s"
|
"http://%s:%d/MediaItems/%s.%s"
|
||||||
"</res>",
|
"</res>",
|
||||||
mime, dlna_buf, lan_addr[0].str, runtime_vars.port, detailID, ext);
|
mime, dlna_buf, lan_addr[0].str, runtime_vars.port, detailID, ext);
|
||||||
#if 1 //JPEG_RESIZE
|
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
||||||
if( *mime == 'i' ) {
|
passed_args->size += ret;
|
||||||
int reqw = 0, reqh = 0;
|
if( (*mime == 'i') && (passed_args->client != EFreeBox) ) {
|
||||||
if( dlna_pn && (!strncmp(dlna_pn, "JPEG_L", 6) || !strncmp(dlna_pn, "JPEG_M", 6)) ) {
|
#if 1 //JPEG_RESIZE
|
||||||
reqw = 640;
|
|
||||||
reqh = 480;
|
|
||||||
}
|
|
||||||
else if( !dlna_pn ) {
|
|
||||||
reqw = 4096;
|
|
||||||
reqh = 4096;
|
|
||||||
}
|
|
||||||
if( reqw ) {
|
|
||||||
int srcw = atoi(strsep(&resolution, "x"));
|
int srcw = atoi(strsep(&resolution, "x"));
|
||||||
int srch = atoi(resolution);
|
int srch = atoi(resolution);
|
||||||
int dstw = reqw;
|
if( !dlna_pn ) {
|
||||||
int dsth = ((((reqw<<10)/srcw)*srch)>>10);
|
add_resized_res(srcw, srch, 4096, 4096, "JPEG_LRG", detailID, passed_args);
|
||||||
if( dsth > reqh ) {
|
|
||||||
dsth = reqh;
|
|
||||||
dstw = (((reqh<<10)/srch) * srcw>>10);
|
|
||||||
}
|
}
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
if( !dlna_pn || !strncmp(dlna_pn, "JPEG_L", 6) || !strncmp(dlna_pn, "JPEG_M", 6) ) {
|
||||||
passed_args->size += ret;
|
add_resized_res(srcw, srch, 640, 480, "JPEG_SM", detailID, passed_args);
|
||||||
ret = sprintf(str_buf, "<res ");
|
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
|
||||||
passed_args->size += ret;
|
|
||||||
if( passed_args->filter & FILTER_RES_RESOLUTION ) {
|
|
||||||
ret = sprintf(str_buf, "resolution=\"%dx%d\" ", dstw, dsth);
|
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
|
||||||
passed_args->size += ret;
|
|
||||||
}
|
}
|
||||||
ret = sprintf(str_buf, "protocolInfo=\"http-get:*:%s:DLNA.ORG_PN=JPEG_%s\">"
|
#endif
|
||||||
"http://%s:%d/Resized/%s.jpg?width=%d,height=%d"
|
if( tn && atoi(tn) ) {
|
||||||
"</res>",
|
|
||||||
mime, (reqw==640)?"SM":"LRG", lan_addr[0].str, runtime_vars.port,
|
|
||||||
detailID, dstw, dsth);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
memcpy(passed_args->resp+passed_args->size, &str_buf, ret+1);
|
|
||||||
passed_args->size += ret;
|
|
||||||
if( tn && atoi(tn) && (passed_args->client != EFreeBox) && dlna_pn ) {
|
|
||||||
ret = sprintf(str_buf, "<res protocolInfo=\"http-get:*:%s:%s\">"
|
ret = sprintf(str_buf, "<res protocolInfo=\"http-get:*:%s:%s\">"
|
||||||
"http://%s:%d/Thumbnails/%s.jpg"
|
"http://%s:%d/Thumbnails/%s.jpg"
|
||||||
"</res>",
|
"</res>",
|
||||||
@ -763,6 +767,7 @@ callback(void *args, int argc, char **argv, char **azColName)
|
|||||||
passed_args->size += ret;
|
passed_args->size += ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ret = sprintf(str_buf, "</item>");
|
ret = sprintf(str_buf, "</item>");
|
||||||
}
|
}
|
||||||
else if( strncmp(class, "container", 9) == 0 )
|
else if( strncmp(class, "container", 9) == 0 )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user