#ifndef PROBE_H #define PROBE_H #include "language.h" #define PROBE_STREAM_LIMIT 64 #define PROBE_CHAPTER_LIMIT 256 #define PROBE_ATTACHMENT_LIMIT 64 #define PROBE_TAG_LIMIT 64 typedef enum { SUBTITLE_TEXT, SUBTITLE_ASS, SUBTITLE_BITMAP, } SubtitleKind; enum { DISPOSITION_DEFAULT = 1u << 0, DISPOSITION_FORCED = 1u << 1, DISPOSITION_HEARING_IMPAIRED = 1u << 2, DISPOSITION_VISUAL_IMPAIRED = 1u << 3, DISPOSITION_COMMENT = 1u << 4, DISPOSITION_ORIGINAL = 1u << 5, DISPOSITION_DUB = 1u << 6, DISPOSITION_LYRICS = 1u << 7, DISPOSITION_KARAOKE = 1u << 8, DISPOSITION_CLEAN_EFFECTS = 1u << 9, DISPOSITION_ATTACHED_PIC = 1u << 10, DISPOSITION_TIMED_THUMBNAILS = 1u << 11, DISPOSITION_NON_DIEGETIC = 1u << 12, DISPOSITION_CAPTIONS = 1u << 13, DISPOSITION_DESCRIPTIONS = 1u << 14, DISPOSITION_METADATA = 1u << 15, DISPOSITION_DEPENDENT = 1u << 16, DISPOSITION_STILL_IMAGE = 1u << 17, DISPOSITION_MULTILAYER = 1u << 18, }; typedef struct { ValueType type; size_t stream_index; bool duration_known; double duration; char codec_name[32]; SubtitleKind subtitle_kind; char language[32]; char title[128]; unsigned dispositions; } ProbeStream; typedef struct { double start; double end; char title[128]; } ProbeChapter; typedef struct { size_t stream_index; char filename[128]; char mimetype[64]; } ProbeAttachment; typedef struct { char key[64]; char value[256]; } ProbeTag; typedef struct { bool has_video; bool has_audio; bool has_subtitles; bool video_duration_known; bool audio_duration_known; double video_duration; double audio_duration; bool subtitle_duration_known; double subtitle_duration; ProbeStream streams[PROBE_STREAM_LIMIT]; size_t stream_count; ProbeChapter chapters[PROBE_CHAPTER_LIMIT]; size_t chapter_count; ProbeAttachment attachments[PROBE_ATTACHMENT_LIMIT]; size_t attachment_count; ProbeTag tags[PROBE_TAG_LIMIT]; size_t tag_count; } ProbeResult; typedef bool (*ProbeRunner)(const char* path, ProbeResult* result, void* context, Error* error); typedef struct ProbeCacheEntry ProbeCacheEntry; typedef struct { Arena arena; ProbeCacheEntry* entries; ProbeRunner runner; void* runner_context; size_t invocation_count; } ProbeCache; void probe_cache_init(ProbeCache* cache, ProbeRunner runner, void* context); bool probe_cache_get(ProbeCache* cache, const char* path, ProbeResult* result, Error* error); void probe_cache_destroy(ProbeCache* cache); bool probe_run_ffprobe(const char* path, ProbeResult* result, void* context, Error* error); #endif