| DRAFT push-pull scheduling |
| -------------------------- |
| |
| Status |
| |
| DRAFT. DEPRECATED by better current implementation. |
| |
| Observations: |
| |
| - The main scheduling mode is chain based scheduling where the source |
| element pushes buffers through the pipeline to the sinks. this is |
| called the push model |
| |
| - In the pull model, some plugin pulls buffers from an upstream peer |
| element before consuming and/or pushing them further downstream. |
| |
| |
| Usages of pull based scheduling: |
| |
| - sinks that pull in data, possibly at fixed intervals driven by some |
| hardware device (audiocard, videodevice, ...). |
| |
| - Efficient random access to resources. Especially useful for certain |
| types of demuxers. |
| |
| |
| API for pull-based scheduling: |
| |
| - an element that wants to pull data from a peer element needs to call |
| the pull_range() method. This methods requires an offset and a size. |
| It is possible to leave the offset and size at -1, indicating that |
| any offset or size is acceptable, this of course removes the advantages |
| of getrange based scheduling. |
| |
| |
| Types of pull based scheduling: |
| |
| - some sources can do random access (file source, ...) |
| |
| - some sources can read a random number of bytes but not at a random |
| offset. (audio cards, ...) Audio cards using a ringbuffer can |
| however do random access in the ringbuffer. |
| |
| - some sources can do random access in a range of bytes but not in |
| another range. (a caching network source). |
| |
| - some sources can do a fixed size data and without an offset. |
| (video sources, ...) |
| |
| |
| Current scheduling decision: |
| |
| - core selects scheduling type starting on sinks by looking at existence |
| of loop function on sinkpad and calling _check_pull_range() on the |
| source pad to activate the pads in push/pull mode. |
| |
| - element proxies pull mode pad activation to peer pad. |
| |
| Problems: |
| |
| - core makes a tough desicion without knowing anything about the |
| element. Some elements are able to deal with a pull_range() |
| without offset while others need full random access. |
| |
| |
| Requirements: |
| |
| - element should be able to select scheduling method itself based on |
| how it can use the peer element pull_range. This includes if the |
| peer can operate with or without offset/size. This also means that |
| the core does not need to select the scheduling method anymore and |
| allows for more efficient scheduling methods adjusted for the |
| particular element. |
| |
| |
| Proposition: |
| |
| - pads are activated without the core selecting a method. |
| |
| - pads queries scheduling mode of peer pad. This query is rather |
| finegrained and allows the element to know if the peer supports |
| offsets and sizes in the get_range function. A proposition for |
| the query is outlined in draft-query.txt. |
| |
| - pad selects scheduling mode and informs the peer pad of this |
| decision. |
| |
| |
| Things to query: |
| |
| - pad can do real random access (downstream peer can ask for offset != -1) |
| - min offset |
| - suggest sequential access |
| - max offset |
| - align: all offsets should be aligned with this value. |
| - pad can give ranges from A to B length (peer can ask for A <= length <= B) |
| - min length |
| - suggested length |
| - max length |
| |
| Use cases: |
| |
| - An audio source can provide random access to the samples queued in its |
| DMA buffer, it however suggests sequential access method. |
| An audio source can provide a random number of samples but prefers |
| reading from the hardware using a fixed segment size. |
| |
| - A caching network source would suggest sequential access but is seekable |
| in the cached region. Applications can query for the already downloaded |
| portion and update the GUI, a seek can be done in that area. |
| |
| - a live video source can only provide buffers sequentialy. It exposes |
| offsets as -1. lengths are also -1. |
| |
| |
| |
| |
| |
| |