aboutsummaryrefslogtreecommitdiff
path: root/include/FileAnalyzer.hpp
blob: 52cc3286c34d2a64b0755709b6b561027f56c411 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#pragma once

#include <stddef.h>
#include <optional>
#include <string>

namespace QuickMedia {
    class FileAnalyzer;

    struct Dimensions {
        int width;
        int height;
    };

    enum class ContentType {
        UNKNOWN,
        VIDEO_AVI,
        VIDEO_MP4,
        VIDEO_MPEG,
        VIDEO_WEBM,
        VIDEO_FLV,
        VIDEO_WMV,
        AUDIO_BASIC,
        AUDIO_AIFF,
        AUDIO_MPEG,
        AUDIO_MIDI,
        AUDIO_WAVE,
        AUDIO_FLAC,
        AUDIO_VORBIS,
        AUDIO_OPUS,
        IMAGE_JPEG,
        IMAGE_PNG,
        IMAGE_GIF,
        IMAGE_BMP,
        IMAGE_AVIF,
        IMAGE_WEBP
    };

    bool is_content_type_video(ContentType content_type);
    bool is_content_type_audio(ContentType content_type);
    bool is_content_type_image(ContentType content_type);
    const char* content_type_to_string(ContentType content_type);
    bool is_image_ext(const char *ext);
    bool is_video_ext(const char *ext);
    bool is_music_ext(const char *ext);

    // Set |width| or |height| to 0 to disable scaling.
    // TODO: Make this async
    bool video_get_start_frame(const FileAnalyzer &file, const char *destination_path, int width = 0, int height = 0);
    // Set |width| or |height| to 0 to disable scaling.
    // TODO: Make this async
    bool video_get_middle_frame(const FileAnalyzer &file, const char *destination_path, int width = 0, int height = 0);
    
    class FileAnalyzer {
    public:
        FileAnalyzer();
        bool load_file(const char *filepath, bool load_file_metadata = true);
        // Cached
        bool load_metadata();
        
        const std::string& get_filepath() const;
        ContentType get_content_type() const;
        int64_t get_file_size() const;
        std::optional<Dimensions> get_dimensions() const;
        std::optional<double> get_duration_seconds() const;
    private:
        FileAnalyzer(FileAnalyzer&) = delete;
        FileAnalyzer& operator=(FileAnalyzer&) = delete;
    private:
        std::string filepath;
        ContentType content_type;
        int64_t file_size;
        std::optional<Dimensions> dimensions;
        std::optional<double> duration_seconds;
        bool loaded;
        bool metadata_loaded;
    };
}