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;
};
}
|