upnpsoap: Use scaled thumbnails when rotation is needed

Embedded thumbnails may have an undesirable orientation, so
we should do our own scaling with inline rotation if the
thumbnail image needs to be rotated.
This commit is contained in:
Justin Maggard 2014-12-11 17:03:35 -08:00
parent 7fe24ae1bc
commit 3c4c35b49c
2 changed files with 12 additions and 7 deletions

View File

@ -1646,6 +1646,8 @@ SendResp_resizedimg(struct upnphttp * h, char * object)
} }
DPRINTF(E_INFO, L_HTTP, "Serving resized image for ObjectId: %lld [%s]\n", id, file_path); DPRINTF(E_INFO, L_HTTP, "Serving resized image for ObjectId: %lld [%s]\n", id, file_path);
if( rotate )
DPRINTF(E_DEBUG, L_HTTP, "Rotating image %d degrees\n", rotate);
switch( rotate ) switch( rotate )
{ {
case 90: case 90:

View File

@ -715,9 +715,12 @@ object_exists(const char *object)
#define COLUMNS "o.DETAIL_ID, o.CLASS," \ #define COLUMNS "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," \
" d.THUMBNAIL, d.CREATOR, d.DLNA_PN, d.MIME, d.ALBUM_ART, d.DISC " " d.THUMBNAIL, d.CREATOR, d.DLNA_PN, d.MIME, d.ALBUM_ART, d.ROTATION, d.DISC "
#define SELECT_COLUMNS "SELECT o.OBJECT_ID, o.PARENT_ID, o.REF_ID, " COLUMNS #define SELECT_COLUMNS "SELECT o.OBJECT_ID, o.PARENT_ID, o.REF_ID, " COLUMNS
#define NON_ZERO(x) (x && atoi(x))
#define IS_ZERO(x) (!x || !atoi(x))
static int static int
callback(void *args, int argc, char **argv, char **azColName) callback(void *args, int argc, char **argv, char **azColName)
{ {
@ -725,7 +728,7 @@ callback(void *args, int argc, char **argv, char **azColName)
char *id = argv[0], *parent = argv[1], *refID = argv[2], *detailID = argv[3], *class = argv[4], *size = argv[5], *title = argv[6], char *id = argv[0], *parent = argv[1], *refID = argv[2], *detailID = argv[3], *class = argv[4], *size = argv[5], *title = argv[6],
*duration = argv[7], *bitrate = argv[8], *sampleFrequency = argv[9], *artist = argv[10], *album = argv[11], *duration = argv[7], *bitrate = argv[8], *sampleFrequency = argv[9], *artist = argv[10], *album = argv[11],
*genre = argv[12], *comment = argv[13], *nrAudioChannels = argv[14], *track = argv[15], *date = argv[16], *resolution = argv[17], *genre = argv[12], *comment = argv[13], *nrAudioChannels = argv[14], *track = argv[15], *date = argv[16], *resolution = argv[17],
*tn = argv[18], *creator = argv[19], *dlna_pn = argv[20], *mime = argv[21], *album_art = argv[22]; *tn = argv[18], *creator = argv[19], *dlna_pn = argv[20], *mime = argv[21], *album_art = argv[22], *rotate = argv[23];
char dlna_buf[128]; char dlna_buf[128];
const char *ext; const char *ext;
struct string_s *str = passed_args->str; struct string_s *str = passed_args->str;
@ -905,7 +908,7 @@ callback(void *args, int argc, char **argv, char **azColName)
if( strncmp(id, MUSIC_PLIST_ID, strlen(MUSIC_PLIST_ID)) == 0 ) { if( strncmp(id, MUSIC_PLIST_ID, strlen(MUSIC_PLIST_ID)) == 0 ) {
track = strrchr(id, '$')+1; track = strrchr(id, '$')+1;
} }
if( track && atoi(track) && (passed_args->filter & FILTER_UPNP_ORIGINALTRACKNUMBER) ) { if( NON_ZERO(track) && (passed_args->filter & FILTER_UPNP_ORIGINALTRACKNUMBER) ) {
ret = strcatf(str, "<upnp:originalTrackNumber>%s</upnp:originalTrackNumber>", track); ret = strcatf(str, "<upnp:originalTrackNumber>%s</upnp:originalTrackNumber>", track);
} }
if( passed_args->filter & FILTER_RES ) { if( passed_args->filter & FILTER_RES ) {
@ -923,7 +926,7 @@ callback(void *args, int argc, char **argv, char **azColName)
if( srcw > 640 || srch > 480 ) if( srcw > 640 || srch > 480 )
add_resized_res(srcw, srch, 640, 480, "JPEG_SM", detailID, passed_args); add_resized_res(srcw, srch, 640, 480, "JPEG_SM", detailID, passed_args);
} }
if( !(passed_args->flags & FLAG_RESIZE_THUMBS) && tn && atoi(tn) ) { if( !(passed_args->flags & FLAG_RESIZE_THUMBS) && NON_ZERO(tn) && IS_ZERO(rotate) ) {
ret = strcatf(str, "<res protocolInfo=\"http-get:*:%s:%s\">" ret = strcatf(str, "<res protocolInfo=\"http-get:*:%s:%s\">"
"http://%s:%d/Thumbnails/%s.jpg" "http://%s:%d/Thumbnails/%s.jpg"
"</res>", "</res>",
@ -1022,7 +1025,7 @@ callback(void *args, int argc, char **argv, char **azColName)
} }
} }
} }
if( album_art && atoi(album_art) ) if( NON_ZERO(album_art) )
{ {
/* Video and audio album art is handled differently */ /* Video and audio album art is handled differently */
if( *mime == 'v' && (passed_args->filter & FILTER_RES) && !(passed_args->flags & FLAG_MS_PFS) ) { if( *mime == 'v' && (passed_args->filter & FILTER_RES) && !(passed_args->flags & FLAG_MS_PFS) ) {
@ -1044,7 +1047,7 @@ callback(void *args, int argc, char **argv, char **azColName)
ret = strcatf(str, "<upnp:album>%s</upnp:album>", "[No Keywords]"); ret = strcatf(str, "<upnp:album>%s</upnp:album>", "[No Keywords]");
/* EVA2000 doesn't seem to handle embedded thumbnails */ /* EVA2000 doesn't seem to handle embedded thumbnails */
if( !(passed_args->flags & FLAG_RESIZE_THUMBS) && tn && atoi(tn) ) { if( !(passed_args->flags & FLAG_RESIZE_THUMBS) && NON_ZERO(tn) && IS_ZERO(rotate) ) {
ret = strcatf(str, "<upnp:albumArtURI>" ret = strcatf(str, "<upnp:albumArtURI>"
"http://%s:%d/Thumbnails/%s.jpg" "http://%s:%d/Thumbnails/%s.jpg"
"</upnp:albumArtURI>", "</upnp:albumArtURI>",
@ -1091,7 +1094,7 @@ callback(void *args, int argc, char **argv, char **azColName)
if( artist && (passed_args->filter & FILTER_UPNP_ARTIST) ) { if( artist && (passed_args->filter & FILTER_UPNP_ARTIST) ) {
ret = strcatf(str, "<upnp:artist>%s</upnp:artist>", artist); ret = strcatf(str, "<upnp:artist>%s</upnp:artist>", artist);
} }
if( album_art && atoi(album_art) && (passed_args->filter & FILTER_UPNP_ALBUMARTURI) ) { if( NON_ZERO(album_art) && (passed_args->filter & FILTER_UPNP_ALBUMARTURI) ) {
ret = strcatf(str, "<upnp:albumArtURI "); ret = strcatf(str, "<upnp:albumArtURI ");
if( passed_args->filter & FILTER_UPNP_ALBUMARTURI_DLNA_PROFILEID ) { if( passed_args->filter & FILTER_UPNP_ALBUMARTURI_DLNA_PROFILEID ) {
ret = strcatf(str, "dlna:profileID=\"JPEG_TN\" xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\""); ret = strcatf(str, "dlna:profileID=\"JPEG_TN\" xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\"");