#pragma once #include #include "mkv_reader.h" #include const uint32_t mkv_segment_cues = 0xc53bb6b; const uint32_t mkv_cues_cuepoint = 0x3b; const uint32_t mkv_cuepoint_cuetime=0x33; const uint32_t mkv_cuepoint_cuetrackpositions = 0x37; const uint32_t mkv_cuetrackpositions_cuetrack= 0x77; const uint32_t mkv_cuetrackpositions_cueclusterposition=0x71; namespace nsmkv { class CueTrackPosition { public: CueTrackPosition() #ifdef WA_VALIDATE : track_found(false), cluster_position_found(false) // block_number_found(false) #endif { track=0; cluster_position=0; block_number=0; } uint64_t track; uint64_t cluster_position; uint64_t block_number; #ifdef WA_VALIDATE bool track_found; bool cluster_position_found; // bool block_number_found; #endif }; class CuePoint { public: CuePoint() #ifdef WA_VALIDATE : cue_time_found(false) #endif { cue_time = 0; } CueTrackPosition *GetPosition(uint64_t track); uint64_t cue_time; typedef std::map CueTrackPositions; // keyed on track number CueTrackPositions cue_track_positions; #ifdef WA_VALIDATE bool cue_time_found; #endif }; class Cues { public: enum { SEEK_WHATEVER=0, SEEK_FORWARD=1, SEEK_BACKWARD=2, }; CuePoint *GetCuePoint(uint64_t when, uint64_t current_time=0, int seek_direction=SEEK_WHATEVER); typedef std::map CuePoints; // use Map on cue_time to ensure order CuePoints cue_points; }; uint64_t ReadCues(MKVReader *reader, uint64_t size, nsmkv::Cues &cues); }