diff --git a/CMakeLists.txt b/CMakeLists.txt index 2791593..faf7908 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,10 +116,10 @@ if (WITH_SIST2) target_compile_options(sist2 PRIVATE - -O3 +# -O3 # -march=native - -fno-stack-protector - -fomit-frame-pointer +# -fno-stack-protector +# -fomit-frame-pointer ) TARGET_LINK_LIBRARIES( diff --git a/src/main.c b/src/main.c index bbeaac7..b1deacb 100644 --- a/src/main.c +++ b/src/main.c @@ -10,7 +10,7 @@ #define EPILOG "Made by simon987 . Released under GPL-3.0" -static const char *const Version = "1.0.13"; +static const char *const Version = "1.0.14"; static const char *const usage[] = { "sist2 scan [OPTION]... PATH", "sist2 index [OPTION]... INDEX", diff --git a/src/parsing/media.c b/src/parsing/media.c index c4beede..0fa8a17 100644 --- a/src/parsing/media.c +++ b/src/parsing/media.c @@ -107,6 +107,15 @@ AVFrame *read_frame(AVFormatContext *pFormatCtx, AVCodecContext *decoder, int st return frame; } +#define APPEND_TAG_META(doc, tag, keyname) \ + text_buffer_t tex = text_buffer_create(4096); \ + text_buffer_append_string(&tex, tag->value); \ + meta_line_t *meta_tag = malloc(sizeof(meta_line_t) + tex.dyn_buffer.cur); \ + meta_tag->key = keyname; \ + strcpy(meta_tag->strval, tex.dyn_buffer.buf); \ + APPEND_META(doc, meta_tag) \ + text_buffer_destroy(&tex); + void append_audio_meta(AVFormatContext *pFormatCtx, document_t *doc) { AVDictionaryEntry *tag = NULL; @@ -115,35 +124,40 @@ void append_audio_meta(AVFormatContext *pFormatCtx, document_t *doc) { for (; *key; ++key) *key = (char) tolower(*key); if (strcmp(tag->key, "artist") == 0) { - size_t len = strlen(tag->value); - meta_line_t *meta_tag = malloc(sizeof(meta_line_t) + len); - meta_tag->key = MetaArtist; - memcpy(meta_tag->strval, tag->value, len); - APPEND_META(doc, meta_tag) + APPEND_TAG_META(doc, tag, MetaArtist) } else if (strcmp(tag->key, "genre") == 0) { - size_t len = strlen(tag->value); - meta_line_t *meta_tag = malloc(sizeof(meta_line_t) + len); - meta_tag->key = MetaGenre; - memcpy(meta_tag->strval, tag->value, len); - APPEND_META(doc, meta_tag) + APPEND_TAG_META(doc, tag, MetaGenre) } else if (strcmp(tag->key, "title") == 0) { - size_t len = strlen(tag->value); - meta_line_t *meta_tag = malloc(sizeof(meta_line_t) + len); - meta_tag->key = MetaTitle; - memcpy(meta_tag->strval, tag->value, len); - APPEND_META(doc, meta_tag) + APPEND_TAG_META(doc, tag, MetaTitle) } else if (strcmp(tag->key, "album_artist") == 0) { - size_t len = strlen(tag->value); - meta_line_t *meta_tag = malloc(sizeof(meta_line_t) + len); - meta_tag->key = MetaAlbumArtist; - memcpy(meta_tag->strval, tag->value, len); - APPEND_META(doc, meta_tag) + APPEND_TAG_META(doc, tag, MetaAlbumArtist) } else if (strcmp(tag->key, "album") == 0) { - size_t len = strlen(tag->value); - meta_line_t *meta_tag = malloc(sizeof(meta_line_t) + len); - meta_tag->key = MetaAlbum; - memcpy(meta_tag->strval, tag->value, len); - APPEND_META(doc, meta_tag) + APPEND_TAG_META(doc, tag, MetaAlbum) + } + } +} + +void append_video_meta(AVFormatContext *pFormatCtx, document_t *doc, int include_audio_tags) { + + meta_line_t *meta_duration = malloc(sizeof(meta_line_t)); + meta_duration->key = MetaMediaDuration; + meta_duration->longval = pFormatCtx->duration / AV_TIME_BASE; + APPEND_META(doc, meta_duration) + + meta_line_t *meta_bitrate = malloc(sizeof(meta_line_t)); + meta_bitrate->key = MetaMediaBitrate; + meta_bitrate->intval = pFormatCtx->bit_rate; + APPEND_META(doc, meta_bitrate) + + AVDictionaryEntry *tag = NULL; + while ((tag = av_dict_get(pFormatCtx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { + char *key = tag->key; + for (; *key; ++key) *key = (char) tolower(*key); + + if (strcmp(tag->key, "title") == 0 && include_audio_tags) { + APPEND_TAG_META(doc, tag, MetaTitle) + } else if (strcmp(tag->key, "comment") == 0) { + APPEND_TAG_META(doc, tag, MetaContent) } } } @@ -207,15 +221,7 @@ void parse_media(const char *filepath, document_t *doc) { if (stream->nb_frames > 1) { //This is a video (not a still image) - meta_line_t *meta_duration = malloc(sizeof(meta_line_t)); - meta_duration->key = MetaMediaDuration; - meta_duration->longval = pFormatCtx->duration / AV_TIME_BASE; - APPEND_META(doc, meta_duration) - - meta_line_t *meta_bitrate = malloc(sizeof(meta_line_t)); - meta_bitrate->key = MetaMediaBitrate; - meta_bitrate->intval = pFormatCtx->bit_rate; - APPEND_META(doc, meta_bitrate) + append_video_meta(pFormatCtx, doc, audio_stream == -1); } if (stream->codecpar->width <= 20 || stream->codecpar->height <= 20) { diff --git a/src/util.c b/src/util.c index efcf60c..45e534c 100644 --- a/src/util.c +++ b/src/util.c @@ -89,6 +89,14 @@ void text_buffer_terminate_string(text_buffer_t *buf) { dyn_buffer_write_char(&buf->dyn_buffer, '\0'); } +int text_buffer_append_string(text_buffer_t *buf, char * str) { + char * ptr = str; + while (*ptr) { + text_buffer_append_char(buf, *ptr++); + } + text_buffer_terminate_string(buf); +} + int text_buffer_append_char(text_buffer_t *buf, int c) { if (SHOULD_IGNORE_CHAR(c)) { diff --git a/src/util.h b/src/util.h index 0e21d08..4096f3c 100644 --- a/src/util.h +++ b/src/util.h @@ -56,6 +56,7 @@ text_buffer_t text_buffer_create(int max_size); void text_buffer_terminate_string(text_buffer_t *buf); +int text_buffer_append_string(text_buffer_t *buf, char * str); int text_buffer_append_char(text_buffer_t *buf, int c); void incremental_put(GHashTable *table, unsigned long inode_no, int mtime);