| 1) intro |
| -------- |
| |
| For efficient and accurate seeking, a plugin typically needs |
| an index of possible seek positions (in time, bytes, samples, ...). |
| |
| The purpose of GstTimecache is to provide an infrastructure for |
| plugins to maintain such an index. |
| |
| By creating a generic interace to this functionality, it is also |
| possible for the application to make use of the generated index. |
| possible use cases are: saving/loading of indexes, obtain an |
| overview of the indexed stream (where is sample N, where is |
| the keyframe...) |
| |
| |
| This document describes a proposed API for this functionality. |
| |
| |
| 2) Requirements |
| --------------- |
| |
| Bare minimum: |
| |
| - store mappings between format1 and format2 (bytes<->time, |
| samples<->tracks, ...) |
| - update the mappings (add/remove/change entries) |
| - query the index, locate entries. |
| - store arbitrary extra metadata in the timecache (media file, |
| time, author, ...) |
| - set/get cache on elements. |
| |
| Nice to have: |
| |
| - cache groups with varying certainty that are merged. |
| - API to control the indexing process, what gets indexed, how much, |
| ...) |
| - Get notification when a new entry is added, together with an |
| option to turn off in-memory caching, this could be used to |
| do direct-to-disk indexing (for large files) insteda of to-memory. |
| |
| 3) use cases |
| ------------ |
| |
| a) indexing an mpeg systems stream |
| |
| - create an empty timecache object |
| - create filesrc ! mpegparse |
| - set timecache on mpegparse |
| - run the pipeline to EOS |
| - mpegparse will create a mapping from SCR to byte offset |
| and add it to the cache. |
| - read/save timecache |
| |
| b) running an mpeg with a previously created cache |
| |
| - create timecache object from saved index |
| - create filesrc ! mpegparse |
| - set the timecache on mpegparse |
| - run the pipeline, seek, ... |
| - mpegparse uses the timecache to do accurate seek to |
| SCR timestamps. |
| |
| c) indexing an mpeg systems stream, SCR, video and audio elementary |
| streams. |
| |
| - create an empty timecache object |
| - create filesrc ! mpegdemux |
| - set timecache on mpegdemux |
| - run the pipeline to EOS |
| - mpegparse will create a mappings for: |
| * SCR to byte offset |
| * PTS + streamid to byte offset |
| and add it to the cache. |
| - read/save timecache |
| |
| d) complete indexing of mpeg systems streams and audio/video |
| streams. |
| |
| - create 3 empty timecaches |
| - create filesrc ! mpegdemux video_%02d! mpeg2dec |
| mpegdemux0 audio_%02d! mad |
| - set timecaches on mpegdemux, mpeg2dec, mad |
| - run pipeline to EOS |
| - mpegdemux creates timecache for SCR, PTS + streamid |
| - mpeg2dec creates timecache for frames + I/P/B id |
| - mad creates timecache for mpeg audio headers |
| - read/save timecaches |
| |
| seeking in a fully indexed stream: |
| - seek on timestamp in mpeg2dec |
| - mpeg2dec locates previous I frame in cache, does |
| a timeseek on sinkpad |
| - mpegparse uses the cache to convert the timestamp |
| to an offset, then does a seek on offset |
| - filesrc seeks to offset |
| |
| 4) Entry types |
| -------------- |
| |
| - mapping between formats: |
| |
| <padid> <flags> <format> <position>, <format> <position>, ... |
| |
| - metadata, streaminfo, other objects: |
| |
| <padid> <format> <position>, <keyword> gpointer |
| |
| |
| 5) implementation |
| ----------------- |
| |
| We define an abstract base class GstTimeCache with following |
| abstract methods: |
| |
| |
| 6) cache format example |
| ----------------------- |
| |
| We define a binary format for the cache for space/speed reasons. |
| It is entirely possible to create alternative implementations. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |