diff options
Diffstat (limited to 'Src/nsavi/seektable.h')
-rw-r--r-- | Src/nsavi/seektable.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/Src/nsavi/seektable.h b/Src/nsavi/seektable.h new file mode 100644 index 00000000..44007fd7 --- /dev/null +++ b/Src/nsavi/seektable.h @@ -0,0 +1,55 @@ +#pragma once +#include <map> +#include "../nsavi/avi_header.h" + +//#define SEEK_TABLE_STORE_CHUNK_HEADER +namespace nsavi +{ + struct HeaderList; + struct SeekEntry + { + SeekEntry(int dummy=0) : timestamp(0), absolute(false) {} + int timestamp; // in miliseconds + bool absolute; + uint64_t file_position = 0; +#ifdef SEEK_TABLE_STORE_CHUNK_HEADER + uint32_t chunk_id; // chunk ID at file_position, used to verify seeking + uint32_t chunk_size; // chunk size at file_position, used to verify seeking +#endif + uint64_t stream_time = 0; // actually allocated to header_list->stream_list_size + }; + +class SeekTable +{ +public: + SeekTable(int stream_number, bool require_keyframes, const nsavi::HeaderList *header_list); + ~SeekTable(); + enum + { + SEEK_WHATEVER=0, + SEEK_FORWARD=1, + SEEK_BACKWARD=2, + }; + const SeekEntry *GetSeekPoint(int ×tamp_ms, int current_ms=0, int seek_direction=SEEK_WHATEVER); + void AddIndex(const IDX1 *index); + void AddIndex(const INDX *index, uint64_t start_time); + + // returns a recommend place to go hunting for an idx1, indx or ix## chunk + // usually based on indx super chunks already found in header_list + bool GetIndexLocation(int timestamp, uint64_t *position, uint64_t *start_time); + + typedef std::map<int, SeekEntry> SeekEntries; // mapped to timestamp in milliseconds + SeekEntries seek_entries; + std::map<const void *, bool> data_processed; // TODO: make nu::Set + const nsavi::HeaderList *header_list; + int stream_number; // which stream number is this Seek Table associated with + bool require_keyframes; // whether or not the master stream requires keyframes + const nsavi::STRH *stream; + const nsavi::AVISUPERINDEX *super_index; + uint32_t indices_processed; + uint64_t super_index_duration; +}; + + + +}
\ No newline at end of file |