OggStream
Goals
- Abstract:
- application (app) can be nothing more than a gui frontend to liboggstream
- allows very simple media players, editors, and stream systems to be developed
- minimizes duplicated effort (and thus faster deployment)
- ensures consistant Ogg support for all media players (ie, chaining, seeking, etc)
- can also be used to just decode codecs, choosing to handle file/stream receiving
- application (app) can be nothing more than a gui frontend to liboggstream
- Technical:
- apps need to know information about a stream;
- what codecs it contains
- what it's total length is (or non-seekable)
- apps need to be able to exchange uncompressed data with the library for encoding/decoding
- for non-transcoding operations (ie, streaming), apps also need to be able to exchange raw codec packets
- when meta/effects codecs are available, apps need to be able to access "processed" and "unprocessed" data
- support multiple "protocol" plugins (ie, file, http, etc)
- must provide buffered/cached info for app. (ie, for seek bar to show buffer status)
- makes it easy to show holes in stream
- allow app to provide data through "pipe" or "memory" protocol plugin
- must provide buffered/cached info for app. (ie, for seek bar to show buffer status)
- "Auto Update" system for automatic plugin search/installation from central site
- list licenses and restrictions
- it should prefer Xiph, then Free, then Proprietary, and finally Commercial
- this can either be based on their country or simply run with US IP law
- Linux-based systems can use distro-specific installation method (Gentoo can use Portage, Redhat use RPM, etc)
- list licenses and restrictions
- apps need to know information about a stream;
API
The _init function starts the process by telling liboggstream what is being put into it and what is needed from it.
extern oggstream_state *oggstream_create(void);
extern int oggstream_destroy(*oggstream_state);
extern int oggstream_init(oggstream_state *oss,
int num_inputs,
os_input *inputs
int num_outputs,
os_output *outputs);
struct os_input {
char *method;
void *address; /* Pointer type depends on method */
};
struct os_output {
char *method;
void *address; /* Pointer type depends on method */
/* this is missing format preference, is this the right place? */
};