metadata: get rid of some unnecessary mallocs

This commit is contained in:
Justin Maggard 2014-05-16 11:07:43 -07:00
parent 2ab6d21dbf
commit bb9d584a86
2 changed files with 35 additions and 42 deletions

View File

@ -55,10 +55,6 @@
#define FLAG_MIME 0x00000100 #define FLAG_MIME 0x00000100
#define FLAG_DURATION 0x00000200 #define FLAG_DURATION 0x00000200
#define FLAG_RESOLUTION 0x00000400 #define FLAG_RESOLUTION 0x00000400
#define FLAG_BITRATE 0x00000800
#define FLAG_FREQUENCY 0x00001000
#define FLAG_CHANNELS 0x00002000
#define FLAG_ROTATION 0x00004000
/* Audio profile flags */ /* Audio profile flags */
enum audio_profiles { enum audio_profiles {
@ -261,14 +257,6 @@ free_metadata(metadata_t *m, uint32_t flags)
free(m->duration); free(m->duration);
if( flags & FLAG_RESOLUTION ) if( flags & FLAG_RESOLUTION )
free(m->resolution); free(m->resolution);
if( flags & FLAG_BITRATE )
free(m->bitrate);
if( flags & FLAG_FREQUENCY )
free(m->frequency);
if( flags & FLAG_CHANNELS )
free(m->channels);
if( flags & FLAG_ROTATION )
free(m->rotation);
} }
int64_t int64_t
@ -568,24 +556,21 @@ GetImageMetadata(const char *path, char *name)
e = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_ORIENTATION); e = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_ORIENTATION);
if( e ) if( e )
{ {
int rotate;
switch( exif_get_short(e->data, exif_data_get_byte_order(ed)) ) switch( exif_get_short(e->data, exif_data_get_byte_order(ed)) )
{ {
case 3: case 3:
rotate = 180; m.rotation = 180;
break; break;
case 6: case 6:
rotate = 90; m.rotation = 90;
break; break;
case 8: case 8:
rotate = 270; m.rotation = 270;
break; break;
default: default:
rotate = 0; m.rotation = 0;
break; break;
} }
if( rotate )
xasprintf(&m.rotation, "%d", rotate);
} }
if( ed->size ) if( ed->size )
@ -649,7 +634,7 @@ no_exifdata:
" (PATH, TITLE, SIZE, TIMESTAMP, DATE, RESOLUTION," " (PATH, TITLE, SIZE, TIMESTAMP, DATE, RESOLUTION,"
" ROTATION, THUMBNAIL, CREATOR, DLNA_PN, MIME) " " ROTATION, THUMBNAIL, CREATOR, DLNA_PN, MIME) "
"VALUES" "VALUES"
" (%Q, '%q', %lld, %ld, %Q, %Q, %Q, %d, %Q, %Q, %Q);", " (%Q, '%q', %lld, %ld, %Q, %Q, %u, %d, %Q, %Q, %Q);",
path, name, (long long)file.st_size, file.st_mtime, m.date, m.resolution, path, name, (long long)file.st_size, file.st_mtime, m.date, m.resolution,
m.rotation, thumb, m.creator, m.dlna_pn, m.mime); m.rotation, thumb, m.creator, m.dlna_pn, m.mime);
if( ret != SQLITE_OK ) if( ret != SQLITE_OK )
@ -712,7 +697,7 @@ GetVideoMetadata(const char *path, char *name)
continue; continue;
} }
else if( video_stream == -1 && else if( video_stream == -1 &&
!lav_is_thumbnail_stream(ctx->streams[i], &video.image, &video.image_size) && !lav_is_thumbnail_stream(ctx->streams[i], &m.thumb_data, &m.thumb_size) &&
ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ) ctx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO )
{ {
video_stream = i; video_stream = i;
@ -811,8 +796,8 @@ GetVideoMetadata(const char *path, char *name)
DPRINTF(E_DEBUG, L_METADATA, "Unhandled audio codec [0x%X]\n", ac->codec_id); DPRINTF(E_DEBUG, L_METADATA, "Unhandled audio codec [0x%X]\n", ac->codec_id);
break; break;
} }
xasprintf(&m.frequency, "%u", ac->sample_rate); m.frequency = ac->sample_rate;
xasprintf(&m.channels, "%u", ac->channels); m.channels = ac->channels;
} }
if( vc ) if( vc )
{ {
@ -822,7 +807,7 @@ GetVideoMetadata(const char *path, char *name)
DPRINTF(E_DEBUG, L_METADATA, "Container: '%s' [%s]\n", ctx->iformat->name, basepath); DPRINTF(E_DEBUG, L_METADATA, "Container: '%s' [%s]\n", ctx->iformat->name, basepath);
xasprintf(&m.resolution, "%dx%d", vc->width, vc->height); xasprintf(&m.resolution, "%dx%d", vc->width, vc->height);
if( ctx->bit_rate > 8 ) if( ctx->bit_rate > 8 )
xasprintf(&m.bitrate, "%u", ctx->bit_rate / 8); m.bitrate = ctx->bit_rate / 8;
if( ctx->duration > 0 ) { if( ctx->duration > 0 ) {
duration = (int)(ctx->duration / AV_TIME_BASE); duration = (int)(ctx->duration / AV_TIME_BASE);
hours = (int)(duration / 3600); hours = (int)(duration / 3600);
@ -1458,6 +1443,11 @@ GetVideoMetadata(const char *path, char *name)
m.creator = m.artist; m.creator = m.artist;
free_flags &= ~FLAG_CREATOR; free_flags &= ~FLAG_CREATOR;
} }
if (!m.thumb_data)
{
m.thumb_data = video.image;
m.thumb_size = video.image_size;
}
} }
} }
#ifndef NETGEAR #ifndef NETGEAR
@ -1542,7 +1532,7 @@ video_no_dlna:
if( !m.title ) if( !m.title )
m.title = strdup(name); m.title = strdup(name);
album_art = find_album_art(path, video.image, video.image_size); album_art = find_album_art(path, m.thumb_data, m.thumb_size);
freetags(&video); freetags(&video);
lav_close(ctx); lav_close(ctx);
@ -1550,7 +1540,7 @@ video_no_dlna:
" (PATH, SIZE, TIMESTAMP, DURATION, DATE, CHANNELS, BITRATE, SAMPLERATE, RESOLUTION," " (PATH, SIZE, TIMESTAMP, DURATION, DATE, CHANNELS, BITRATE, SAMPLERATE, RESOLUTION,"
" TITLE, CREATOR, ARTIST, GENRE, COMMENT, DLNA_PN, MIME, ALBUM_ART) " " TITLE, CREATOR, ARTIST, GENRE, COMMENT, DLNA_PN, MIME, ALBUM_ART) "
"VALUES" "VALUES"
" (%Q, %lld, %ld, %Q, %Q, %Q, %Q, %Q, %Q, '%q', %Q, %Q, %Q, %Q, %Q, '%q', %lld);", " (%Q, %lld, %ld, %Q, %Q, %u, %u, %u, %Q, '%q', %Q, %Q, %Q, %Q, %Q, '%q', %lld);",
path, (long long)file.st_size, file.st_mtime, m.duration, path, (long long)file.st_size, file.st_mtime, m.duration,
m.date, m.channels, m.bitrate, m.frequency, m.resolution, m.date, m.channels, m.bitrate, m.frequency, m.resolution,
m.title, m.creator, m.artist, m.genre, m.comment, m.dlna_pn, m.title, m.creator, m.artist, m.genre, m.comment, m.dlna_pn,

View File

@ -25,22 +25,25 @@
#define __METADATA_H__ #define __METADATA_H__
typedef struct metadata_s { typedef struct metadata_s {
char *title; char * title;
char *artist; char * artist;
char *creator; char * creator;
char *album; char * album;
char *genre; char * genre;
char *comment; char * comment;
char *channels; unsigned int disc;
char *bitrate; unsigned int track;
char *frequency; unsigned int channels;
char *bps; unsigned int bitrate;
char *resolution; unsigned int frequency;
char *rotation; unsigned int rotation;
char *duration; char * resolution;
char *date; char * duration;
char *mime; char * date;
char *dlna_pn; char * mime;
char * dlna_pn;
int thumb_size;
uint8_t * thumb_data;
} metadata_t; } metadata_t;
typedef enum { typedef enum {