|
217
|
1 #ifndef MEDIA_PROCESSOR_H
|
|
|
2 #define MEDIA_PROCESSOR_H
|
|
|
3
|
|
|
4 #include <stdbool.h>
|
|
|
5 #include <stddef.h>
|
|
|
6
|
|
|
7 // Media types
|
|
|
8 typedef enum {
|
|
|
9 MEDIA_TYPE_UNKNOWN = 0,
|
|
|
10 MEDIA_TYPE_IMAGE,
|
|
|
11 MEDIA_TYPE_VIDEO,
|
|
|
12 MEDIA_TYPE_AUDIO,
|
|
|
13 } MediaType;
|
|
|
14
|
|
|
15 // Processing status
|
|
|
16 typedef enum {
|
|
|
17 MEDIA_STATUS_PENDING = 0,
|
|
|
18 MEDIA_STATUS_PROCESSING,
|
|
|
19 MEDIA_STATUS_COMPLETED,
|
|
|
20 MEDIA_STATUS_FAILED,
|
|
|
21 } MediaStatus;
|
|
|
22
|
|
|
23 // Result of a processing operation
|
|
|
24 typedef struct {
|
|
|
25 MediaStatus status;
|
|
|
26 char* error_message;
|
|
|
27
|
|
|
28 // For images
|
|
|
29 char* original_path; // Path to original file
|
|
|
30 char* webp_path; // Path to WebP version
|
|
|
31
|
|
|
32 // For videos
|
|
|
33 char* hls_playlist; // Path to .m3u8 file
|
|
|
34 char* thumbnail_path; // Path to thumbnail
|
|
|
35 double duration; // Duration in seconds
|
|
|
36 } MediaResult;
|
|
|
37
|
|
|
38 // Processing options
|
|
|
39 typedef struct {
|
|
|
40 // Output directory (required)
|
|
|
41 const char* output_dir;
|
|
|
42
|
|
|
43 // Image options
|
|
|
44 int image_quality; // 0-100, default 80
|
|
|
45 int image_max_width; // 0 = no limit
|
|
|
46 int image_max_height; // 0 = no limit
|
|
|
47
|
|
|
48 // Video options
|
|
|
49 int video_segment_duration; // HLS segment duration, default 6
|
|
|
50 int video_bitrate; // kbps, 0 = auto
|
|
|
51 int video_max_width; // 0 = no limit
|
|
|
52 int video_max_height; // 0 = no limit
|
|
|
53 bool generate_thumbnail; // default true
|
|
|
54 } MediaProcessorOpts;
|
|
|
55
|
|
|
56 // Initialize processor options with defaults
|
|
|
57 MediaProcessorOpts media_processor_opts_default(const char* output_dir);
|
|
|
58
|
|
|
59 // Detect media type from file extension
|
|
|
60 MediaType media_detect_type(const char* filename);
|
|
|
61
|
|
|
62 // Get MIME type string
|
|
|
63 const char* media_type_to_mime(MediaType type);
|
|
|
64
|
|
|
65 // Process a single file (auto-detects type)
|
|
|
66 // Returns a MediaResult that must be freed with media_result_free()
|
|
|
67 MediaResult* media_process_file(const char* input_path, const char* id, MediaProcessorOpts* opts);
|
|
|
68
|
|
|
69 // Process image specifically
|
|
|
70 MediaResult* media_process_image(const char* input_path, const char* id, MediaProcessorOpts* opts);
|
|
|
71
|
|
|
72 // Process video specifically
|
|
|
73 MediaResult* media_process_video(const char* input_path, const char* id, MediaProcessorOpts* opts);
|
|
|
74
|
|
|
75 // Free a MediaResult
|
|
|
76 void media_result_free(MediaResult* result);
|
|
|
77
|
|
|
78 // Generate a unique ID for a media file
|
|
|
79 char* media_generate_id(void);
|
|
|
80
|
|
|
81 // Utility: Copy file to destination
|
|
|
82 bool media_copy_file(const char* src, const char* dst);
|
|
|
83
|
|
|
84 // Utility: Get file extension (returns pointer into filename, do not free)
|
|
|
85 const char* media_get_extension(const char* filename);
|
|
|
86
|
|
|
87 // Utility: Check if path is safe (no directory traversal)
|
|
|
88 bool media_path_is_safe(const char* path);
|
|
|
89
|
|
|
90 #endif // MEDIA_PROCESSOR_H
|