OSDN Git Service

add tstools.
[rec10/rec10-git.git] / tstools / DtsEdit / src / gpac / internal / terminal_dev.h
diff --git a/tstools/DtsEdit/src/gpac/internal/terminal_dev.h b/tstools/DtsEdit/src/gpac/internal/terminal_dev.h
new file mode 100644 (file)
index 0000000..a199064
--- /dev/null
@@ -0,0 +1,844 @@
+/*\r
+ *                     GPAC - Multimedia Framework C SDK\r
+ *\r
+ *                     Copyright (c) Jean Le Feuvre 2000-2005 \r
+ *                                     All rights reserved\r
+ *\r
+ *  This file is part of GPAC / Stream Management sub-project\r
+ *\r
+ *  GPAC is free software; you can redistribute it and/or modify\r
+ *  it under the terms of the GNU Lesser General Public License as published by\r
+ *  the Free Software Foundation; either version 2, or (at your option)\r
+ *  any later version.\r
+ *   \r
+ *  GPAC is distributed in the hope that it will be useful,\r
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ *  GNU Lesser General Public License for more details.\r
+ *   \r
+ *  You should have received a copy of the GNU Lesser General Public\r
+ *  License along with this library; see the file COPYING.  If not, write to\r
+ *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. \r
+ *\r
+ */\r
+\r
+#ifndef _GF_TERMINAL_DEV_H_\r
+#define _GF_TERMINAL_DEV_H_\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+\r
+#include <gpac/terminal.h>\r
+#include <gpac/mpeg4_odf.h>\r
+\r
+#include <gpac/modules/service.h>\r
+#include <gpac/modules/codec.h>\r
+#include <gpac/modules/ipmp.h>\r
+#include <gpac/mediaobject.h>\r
+#include <gpac/thread.h>\r
+\r
+typedef struct _inline_scene GF_InlineScene;\r
+typedef struct _media_manager GF_MediaManager;\r
+typedef struct _object_clock GF_Clock;\r
+typedef struct _es_channel GF_Channel;\r
+typedef struct _generic_codec GF_Codec;\r
+typedef struct _composition_memory GF_CompositionMemory;\r
+\r
+\r
+struct _net_service\r
+{\r
+       /*the module handling this service - must be declared first to typecast with GF_DownlaodSession upon deletion*/\r
+       GF_InputService *ifce;\r
+\r
+       /*the terminal*/\r
+       struct _tag_terminal *term;\r
+       /*service url*/\r
+       char *url;\r
+       /*od_manager owning service, NULL for services created for remote channels*/\r
+       struct _od_manager *owner;\r
+       /*number of attached remote channels ODM (ESD URLs)*/\r
+       u32 nb_ch_users;\r
+       /*number of attached remote ODM (OD URLs)*/\r
+       u32 nb_odm_users;\r
+       \r
+       /*clock objects. Kept at service level since ESID namespace is the service one*/\r
+       GF_List *Clocks;\r
+       /*all downloaders objects used in this service*/\r
+       GF_List *dnloads;\r
+       /*cache asscoiated with service, if any*/\r
+       GF_StreamingCache *cache;\r
+};\r
+\r
+\r
+/*opens service - performs URL concatenation if parent service specified*/\r
+GF_ClientService *gf_term_service_new(GF_Terminal *term, GF_ObjectManager *owner, const char *url, const char *parent_url, GF_Err *ret_code);\r
+/*destroy service*/\r
+void gf_term_service_del(GF_ClientService *nets);\r
+\r
+/*access to the module interfaces - cf net_api.h GF_InputService for details*/\r
+GF_Err gf_term_service_command(GF_ClientService *ns, GF_NetworkCommand *com);\r
+Bool gf_term_service_can_handle_url(GF_ClientService *ns, char *url);\r
+\r
+GF_Err gf_term_channel_get_sl_packet(GF_ClientService *ns, LPNETCHANNEL channel, char **out_data_ptr, u32 *out_data_size, GF_SLHeader *out_sl_hdr, Bool *is_compressed, GF_Err *out_reception_status, Bool *is_new_data);\r
+GF_Err gf_term_channel_release_sl_packet(GF_ClientService *ns, LPNETCHANNEL channel);\r
+\r
+/*cache open/close*/\r
+GF_Err gf_term_service_cache_load(GF_ClientService *ns);\r
+GF_Err gf_term_service_cache_close(GF_ClientService *ns, Bool no_save);\r
+\r
+/*forwards all clocks of the given amount of time. Can only be used when terminal is in paused mode\r
+this is mainly designed for movie dumping in MP4Client*/\r
+GF_Err gf_term_step_clocks(GF_Terminal * term, u32 ms_diff);\r
+\r
+void gf_term_sample_clocks(GF_Terminal *term);\r
+\r
+/*\r
+               Inline scene stuff\r
+*/\r
+struct _inline_scene\r
+{\r
+       /*root OD of the subscene, ALWAYS namespace of the parent scene*/\r
+       struct _od_manager *root_od;\r
+       /*scene codec: top level decoder decoding/generating the scene - can be BIFS, VRML parser, etc*/\r
+       struct _generic_codec *scene_codec;\r
+       /*OD codec - specific to MPEG-4, only present at the inline level (media ressources are always scoped here)*/\r
+       struct _generic_codec *od_codec;\r
+\r
+       /*struct _od_managers used, namespace of this scene. The chain does not have the root_od\r
+       it only contains OD sent through OD UPDATE in the OD stream(s) attached \r
+       to this scene. Remote ODs are not added, only there parents are*/\r
+       GF_List *ODlist;\r
+       /*list of MOs (links between OD and nodes)*/\r
+       GF_List *media_objects;\r
+       /*list of externproto libraries*/\r
+       GF_List *extern_protos;\r
+       /*list of nodes using this inline*/\r
+       GF_List *inline_nodes;\r
+       /*list of extra scene graphs (text streams, generic OSDs, ...)*/\r
+       GF_List *extra_scenes;\r
+       /*inline scene graph*/\r
+       GF_SceneGraph *graph;\r
+       /*graph state - if not attached, no traversing of inline\r
+       0: not attached\r
+       1: attached\r
+       2: temp graph attached. The temp graph is generated when waiting for the first scene AU to be processed\r
+       */\r
+       u32 graph_attached;\r
+       /*togles inline restart - needed because the restart may be triggered from inside the scene or from\r
+       parent scene, hence 2 render passes must be used\r
+       special value 2 means scene URL changes (for anchor navigation*/\r
+       u32 needs_restart;\r
+       /*duration of inline scene*/\r
+       u64 duration;\r
+       /*if not 0, all objects in the scene will run on this clock. Needed in GPAC when clock references do not\r
+       respect object graph (eg IOD depending on external stream for clock)*/\r
+       u16 force_sub_clock_id;\r
+       /*world info node or title node*/\r
+       void *world_info;\r
+\r
+       Bool is_dynamic_scene;\r
+       /*clock for dynamic scene - current assumption is that all selected streams are synchronized in the dyn scene*/\r
+       GF_Clock *dyn_ck;\r
+       /*URLs of current video, audio and subs (we can't store objects since they may be destroyed when seeking)*/\r
+       SFURL visual_url, audio_url, text_url;\r
+       /*set to 1 when single time-line presentation with ONE OD AU is detected - the goal is to prevent\r
+       OD shutdown/startup when seeking. This will also remove unneeded net traffic for AddChannel/RemoveChannel\r
+       like RTSP TEARDOWN/SETUP*/\r
+       Bool static_media_ressources;\r
+\r
+       /*current simulation time of the compositor*/\r
+       Double simulation_time;\r
+\r
+       /*current IRI fragment if any*/\r
+       char *fragment_uri;\r
+\r
+       /*secondary resource scene*/\r
+       Bool secondary_resource;\r
+\r
+       char *redirect_xml_base;\r
+};\r
+\r
+GF_InlineScene *gf_inline_new(GF_InlineScene *parentScene);\r
+void gf_inline_del(GF_InlineScene *is);\r
+struct _od_manager *gf_inline_find_odm(GF_InlineScene *is, u16 OD_ID);\r
+void gf_inline_disconnect(GF_InlineScene *is, Bool for_shutdown);\r
+void gf_inline_remove_object(GF_InlineScene *is, GF_ObjectManager *odm, Bool for_shutdown);\r
+/*browse all (media) channels and send buffering info to the app*/\r
+void gf_inline_buffering_info(GF_InlineScene *is);\r
+void gf_inline_attach_to_compositor(GF_InlineScene *is);\r
+struct _mediaobj *gf_inline_get_media_object(GF_InlineScene *is, MFURL *url, u32 obj_type_hint, Bool lock_timelines);\r
+struct _mediaobj *gf_inline_get_media_object_ex(GF_InlineScene *is, MFURL *url, u32 obj_type_hint, Bool lock_timelines, struct _mediaobj *sync_ref, Bool always_load_new, GF_Node *node_ptr);\r
+void gf_inline_setup_object(GF_InlineScene *is, GF_ObjectManager *odm);\r
+/*restarts inline scene - care has to be taken not to remove the scene while it is traversed*/\r
+void gf_inline_restart(GF_InlineScene *is);\r
+/*updates scene duration based on settings*/\r
+void gf_inline_set_duration(GF_InlineScene *is);\r
+/*locate media object by ODID (non dynamic ODs) or URL (dynamic ODs)*/\r
+struct _mediaobj *gf_inline_find_object(GF_InlineScene *is, u16 ODID, char *url);\r
+/*returns scene time in sec - exact meaning of time depends on standard used*/\r
+Double gf_inline_get_time(void *_is);\r
+/*returns true if the given node DEF name is the url target view (eg blabla#myview)*/\r
+Bool gf_inline_default_scene_viewpoint(GF_Node *node);\r
+/*register extra scene graph for on-screen display*/\r
+void gf_inline_register_extra_graph(GF_InlineScene *is, GF_SceneGraph *extra_scene, Bool do_remove);\r
+/*forces scene size info (without changing pixel metrics) - this may be needed by modules using extra graphs (like timedtext)*/\r
+void gf_inline_force_scene_size(GF_InlineScene *is, u32 width, u32 height);\r
+/*regenerate a scene graph based on available objects - can only be called for dynamic OD streams*/\r
+void gf_inline_regenerate(GF_InlineScene *is);\r
+/*selects given ODM for dynamic scenes*/\r
+void gf_inline_select_object(GF_InlineScene *is, GF_ObjectManager *odm);\r
+/*restarts dynamic scene from given time: scene graph is not reseted, objects are just restarted\r
+instead of closed and reopened. If a media control is present on inline, from_time is overriden by MC range*/\r
+void gf_inline_restart_dynamic(GF_InlineScene *is, u64 from_time);\r
+/*owner inline node has been modified*/\r
+void gf_inline_on_modified(GF_Node *node);\r
+/*returns scene graph associated with an externProto lib - exported for VRML/X3D loaded*/\r
+GF_SceneGraph *gf_inline_get_proto_lib(void *_is, MFURL *lib_url);\r
+/*exported for compositor: handles filtering of "self" parameter indicating anchor only acts on container inline scene\r
+not root one. Returns 1 if handled (cf user.h, navigate event)*/\r
+Bool gf_inline_process_anchor(GF_Node *caller, GF_Event *evt);\r
+/*extern proto fetcher*/\r
+GF_SceneGraph *gf_inline_get_proto_lib(void *SceneCallback, MFURL *lib_url);\r
+void gf_inline_force_scene_size_video(GF_InlineScene *is, GF_MediaObject *mo);\r
+void gf_inline_sample_time(GF_InlineScene *is);\r
+/*compares object URL with another URL - ONLY USE THIS WITH DYNAMIC ODs*/\r
+Bool gf_mo_is_same_url(GF_MediaObject *obj, MFURL *inline_url);\r
+\r
+void gf_mo_update_caps(GF_MediaObject *mo);\r
+\r
+\r
+const char *gf_inline_get_fragment_uri(GF_Node *node);\r
+void gf_inline_set_fragment_uri(GF_Node *node, const char *uri);\r
+\r
+enum\r
+{\r
+       /*threading up to decoder*/\r
+       GF_TERM_THREAD_FREE,\r
+       /*single thread for all decoders*/\r
+       GF_TERM_THREAD_SINGLE,\r
+       /*all media (image, video, audio) decoders are threaded*/\r
+       GF_TERM_THREAD_MULTI,\r
+};\r
+\r
+enum\r
+{\r
+       GF_TERM_RUNNING= 1,\r
+       GF_TERM_DEAD = 1<<1,\r
+       GF_TERM_SINGLE_THREAD = 1<<2,\r
+       GF_TERM_MULTI_THREAD = 1<<3,\r
+       GF_TERM_SYSDEC_RESYNC = 1<<4,\r
+       GF_TERM_SINGLE_CLOCK = 1<<5,\r
+       GF_TERM_DRAW_FRAME = 1<<6\r
+};\r
+\r
+\r
+\r
+struct _tag_terminal\r
+{\r
+       u32 flags;\r
+\r
+       /*callback to user application*/        \r
+       GF_User *user;\r
+       /*scene compositor*/\r
+       struct __tag_compositor *compositor;\r
+       /*file downloader*/\r
+       GF_DownloadManager *downloader;\r
+       /*top level scene*/\r
+       GF_InlineScene *root_scene;\r
+\r
+       /*Media manager*/\r
+       GF_List *codecs;\r
+       /*mutex for decoder access*/\r
+       GF_Mutex *mm_mx;\r
+       /*decoding thread*/\r
+       GF_Thread *mm_thread;\r
+       /*last codec used in mm loop*/\r
+       u32 last_codec;\r
+       /*thread priority*/\r
+       s32 priority;\r
+       u32 cumulated_priority;\r
+       /*frame duration*/\r
+       u32 frame_duration;\r
+\r
+       /*net services*/\r
+       GF_List *net_services;\r
+       /*net services to be destroyed*/\r
+       GF_List *net_services_to_remove;\r
+       /*channels waiting for service CONNECT ack to be setup*/\r
+       GF_List *channels_pending;\r
+       /*media objects pending for stop/play*/\r
+       GF_List *media_queue;\r
+       /*network lock*/\r
+       GF_Mutex *net_mx;\r
+       /*all X3D key/mouse/string sensors*/\r
+       GF_List *x3d_sensors;\r
+       /*all input stream decoders*/\r
+       GF_List *input_streams;\r
+       \r
+       /*options (cf config doc)*/\r
+       Bool enable_cache;\r
+       /*data timeout for network buffering in ms - if no data is received within this timeout\r
+       the initial buffering aborts. */\r
+       u32 net_data_timeout;\r
+\r
+       u32 play_state;\r
+\r
+       u32 reload_state;\r
+       char *reload_url;\r
+\r
+       /*special list used by nodes needing a call to RenderNode but not in the traverese scene graph (VRML/MPEG-4 protos only). \r
+       For these nodes, the traverse effect passed will be NULL. This is only used by InputSensor node at the moment*/\r
+       GF_List *nodes_pending;\r
+\r
+       /*root node of the user prefs*/\r
+       GF_SceneGraph *dcci_doc;\r
+\r
+       GF_List *extensions;\r
+       GF_List *unthreaded_extensions;\r
+};\r
+\r
+\r
+\r
+GF_Err gf_term_init_scheduler(GF_Terminal *term, u32 threading_mode);\r
+void gf_term_stop_scheduler(GF_Terminal *term);\r
+void gf_term_add_codec(GF_Terminal *term, GF_Codec *codec);\r
+void gf_term_remove_codec(GF_Terminal *term, GF_Codec *codec);\r
+void gf_term_start_codec(GF_Codec *codec);\r
+void gf_term_stop_codec(GF_Codec *codec);\r
+void gf_term_set_threading(GF_Terminal *term, u32 mode);\r
+void gf_term_set_priority(GF_Terminal *term, s32 Priority);\r
+\r
+\r
+/*error report function*/\r
+void gf_term_message(GF_Terminal *app, const char *service, const char *message, GF_Err error);\r
+/*creates service for given OD / URL*/\r
+void gf_term_connect_object(GF_Terminal *app, GF_ObjectManager *odm, char *serviceURL, char *parent_url);\r
+/*creates service for given channel / URL*/\r
+GF_Err gf_term_connect_remote_channel(GF_Terminal *app, GF_Channel *ch, char *URL);\r
+\r
+/*called by media manager to perform service maintenance:\r
+servive shutdown: this is needed because service handler may be asynchronous\r
+object Play: this is needed to properly handle multiplexed sources (all channels must be connected before play)\r
+service restart\r
+*/\r
+void gf_term_handle_services(GF_Terminal *app);\r
+/*close service and queue for delete*/\r
+void gf_term_close_services(GF_Terminal *app, GF_ClientService *service);\r
+\r
+/*locks net manager*/\r
+void gf_term_lock_net(GF_Terminal *app, Bool LockIt);\r
+\r
+\r
+/*locks scene compositor*/\r
+void gf_term_lock_compositor(GF_Terminal *app, Bool LockIt);\r
+/*get scene compositor time - FIXME this is not flexible enough for SMIL/Multiple time containers*/\r
+u32 gf_term_get_time(GF_Terminal *term);\r
+/*forces scene composition*/\r
+void gf_term_invalidate_compositor(GF_Terminal *term);\r
+\r
+/*callbacks for scene graph library so that all related ESM nodes are properly instanciated*/\r
+void gf_term_node_callback(void *_is, u32 type, GF_Node *node, void *param);\r
+\r
+/*add/rem node requiring a call to render without being present in traversed graph (VRML/MPEG-4 protos). \r
+For these nodes, the traverse effect passed will be NULL.*/\r
+void gf_term_queue_node_traverse(GF_Terminal *term, GF_Node *node);\r
+void gf_term_unqueue_node_traverse(GF_Terminal *term, GF_Node *node);\r
+\r
+\r
+\r
+/*clock*/\r
+struct _object_clock \r
+{\r
+       u16 clockID;    \r
+       GF_Terminal *term;\r
+       GF_Mutex *mx;\r
+       /*no_time_ctrl : set if ANY stream running on this clock has no time control capabilities - this avoids applying\r
+       mediaControl and others that would break stream dependencies*/\r
+       Bool use_ocr, clock_init, has_seen_eos, no_time_ctrl;\r
+       u32 init_time, StartTime, PauseTime, Paused;\r
+       /*the number of streams buffering on this clock*/\r
+       u32 Buffering;\r
+       /*associated media control if any*/\r
+       struct _media_control *mc;\r
+       /*for MC only (no FlexTime)*/\r
+       Fixed speed;\r
+       u32 discontinuity_time;\r
+       s32 drift;\r
+};\r
+\r
+/*destroys clock*/\r
+void gf_clock_del(GF_Clock *ck);\r
+/*finds a clock by ID or by ES_ID*/\r
+GF_Clock *gf_clock_find(GF_List *Clocks, u16 clockID, u16 ES_ID);\r
+/*attach clock returns a new clock or the clock this stream (ES_ID) depends on (OCR_ES_ID)\r
+hasOCR indicates whether the stream being attached carries object clock references\r
+@clocks: list of clocks in ES namespace (service)\r
+@is: inline scene to solve clock dependencies\r
+*/\r
+GF_Clock *gf_clock_attach(GF_List *clocks, GF_InlineScene *is, u16 OCR_ES_ID, u16 ES_ID, s32 hasOCR);\r
+/*reset clock (only called by channel owning clock)*/\r
+void gf_clock_reset(GF_Clock *ck);\r
+/*stops clock (only called for scene clock)*/\r
+void gf_clock_stop(GF_Clock *ck);\r
+/*return clock time in ms*/\r
+u32 gf_clock_time(GF_Clock *ck);\r
+/*return ellapsed time in ms since start of the clock*/\r
+u32 gf_clock_ellapse_time(GF_Clock *ck);\r
+/*sets clock time - FIXME: drift updates for OCRs*/\r
+void gf_clock_set_time(GF_Clock *ck, u32 TS);\r
+/*return clock time in ms without drift adjustment - used by audio objects only*/\r
+u32 gf_clock_real_time(GF_Clock *ck);\r
+/*pause the clock*/\r
+void gf_clock_pause(GF_Clock *ck);\r
+/*resume the clock*/\r
+void gf_clock_resume(GF_Clock *ck);\r
+/*returns true if clock started*/\r
+Bool gf_clock_is_started(GF_Clock *ck);\r
+/*toggles buffering on (clock is paused at the first stream buffering) */\r
+void gf_clock_buffer_on(GF_Clock *ck);\r
+/*toggles buffering off (clock is paused at the last stream restarting) */\r
+void gf_clock_buffer_off(GF_Clock *ck);\r
+/*set clock speed scaling factor*/\r
+void gf_clock_set_speed(GF_Clock *ck, Fixed speed);\r
+/*set clock drift - used to resync audio*/\r
+void gf_clock_adjust_drift(GF_Clock *ck, s32 ms_drift);\r
+\r
+enum\r
+{\r
+       /*channel is setup and waits for connection request*/\r
+       GF_ESM_ES_SETUP = 0,\r
+       /*waiting for server reply*/\r
+       GF_ESM_ES_WAIT_FOR_ACK,\r
+       /*connection OK*/\r
+       GF_ESM_ES_CONNECTED,\r
+       /*data exchange on this service/channel*/\r
+       GF_ESM_ES_RUNNING,\r
+       /*deconnection OK - a download channel can automatically disconnect when download is done*/\r
+       GF_ESM_ES_DISCONNECTED,\r
+       /*service/channel is not (no longer) available/found and should be removed*/\r
+       GF_ESM_ES_UNAVAILABLE\r
+};\r
+\r
+/*data channel (elementary stream)*/\r
+struct _es_channel \r
+{\r
+       /*security check on channel*/\r
+       u32 chan_id;\r
+       /*service this channel belongs to*/\r
+       GF_ClientService *service;\r
+       /*stream descriptor*/\r
+       GF_ESD *esd;\r
+       /*parent OD for this stream*/\r
+       struct _od_manager *odm;\r
+       u32 es_state;\r
+       Bool is_pulling;\r
+       u32 media_padding_bytes;\r
+       /*IO mutex*/\r
+       GF_Mutex *mx;\r
+       u32 AU_Count;\r
+       /*decoding buffers for push mode*/\r
+       struct _decoding_buffer * AU_buffer_first, * AU_buffer_last;\r
+       /*static decoding buffer for pull mode*/\r
+       struct _decoding_buffer * AU_buffer_pull;\r
+       /*channel buffer flag*/\r
+       Bool BufferOn;\r
+       /*min level to trigger buffering on, max to trigger it off. */\r
+       u32 MinBuffer, MaxBuffer;\r
+       /*amount of buffered media - this is the DTS of the last received AU minus the onject clock time, to make sure\r
+       we always have MaxBuffer ms ready for composition when resuming the clock*/\r
+       s32 BufferTime;\r
+       /*last received AU time - if exceeding a certain time and buffering is on, buffering is turned off.\r
+       This is needed for streams with very short duration (less than buffer time) and stream with only one AU (BIFS/OD)*/\r
+       u32 last_au_time;\r
+       /*Current reassemnbling buffer - currently packets are NOT reordered, only AUs are*/\r
+       char *buffer;\r
+       u32 len, allocSize;\r
+       /*only for last packet of an AU*/\r
+       u8 padingBits;\r
+       Bool IsEndOfStream;\r
+       /*      SL reassembler  */\r
+       /*current AU TSs*/\r
+       u32 DTS, CTS;\r
+       /*AU and Packet seq num info*/\r
+       u32 au_sn, pck_sn;\r
+       u32 max_au_sn, max_pck_sn;\r
+       /*the AU length indicated in the SL Header. */\r
+       u32 AULength;\r
+       /*state indicator: 0 OK, 1: not tuned in, 2: has error and needs RAP*/\r
+       u32 stream_state;\r
+       /*the AU in reception is RAP*/\r
+       Bool IsRap;\r
+       /*signal that next AU is an AU start*/\r
+       Bool NextIsAUStart;\r
+       /*if codec resilient, packet drops are not considered as fatal for AU reconstruction (eg no wait for RAP)*/\r
+       Bool codec_resilient;\r
+       /*when starting a channel, the first AU is ALWAYS fetched when buffering - this forces\r
+       BIFS and OD to be decoded and first frame render, in order to detect media objects that would also need\r
+       buffering - note this doesn't affect the clock, it is still paused if buffering*/\r
+       Bool first_au_fetched;\r
+\r
+       /* used in Carousel, to skip packets until the end of AU */ \r
+       Bool skip_carousel_au;\r
+       \r
+       /* TimeStamp to Media Time mapping*/\r
+       /*TS (in TSResolution) corresponding to the SeedTime of the decoder. Delivered by net, otherwise 0*/\r
+       u64 seed_ts;\r
+       /*media time offset corresponding to SeedTS. This is needed when the channel doesn't own the clock*/\r
+       u32 ts_offset;\r
+       /*scaling factors to remap to timestamps in milliseconds*/\r
+       u64 ts_res;\r
+       Double ocr_scale;\r
+       /*clock driving this stream - currently only CTS is supported (no OCR)*/\r
+       struct _object_clock *clock;\r
+       /*flag for clock init. Only a channel owning the clock will set this flag on clock init*/\r
+       Bool IsClockInit;\r
+\r
+       /*duration of last received AU if any, 0 if not known (most of the time)*/\r
+       u32 au_duration;\r
+       /*A channel with this flag set considers each incoming packet as a complete AU and assigns timestamps \r
+       upon reception matching the reception time, then dispatching it into the decoding buffer (only tested\r
+       with audi video). This flag is turned on by setting esd->slconfig->predefined to 'SLPredef_SkipSL' */\r
+       Bool skip_sl;\r
+\r
+       /*indicates that decoding can be called directly when receiving a complete AU on this channel\r
+       This is used by systems streams in non-seekable (eg broadcast/multicast, MPEG-2 TS multiplexes) to \r
+       make sure resources are setup as fast as possible. If the AU is too early, it will be kept in the \r
+       decoding buffer*/\r
+       Bool dispatch_after_db;\r
+\r
+       /*indicates that decoding is called directly when receiving a packet on this channel\r
+       This is used to bypass SL defragmenting and decoding buffer for EIT internal streams*/\r
+       Bool bypass_sl_and_db;\r
+\r
+       GF_IPMPTool *ipmp_tool;\r
+       Bool is_protected;\r
+\r
+       /*TSs as received from network - these are used for cache storage*/\r
+       u64 net_dts, net_cts;\r
+};\r
+\r
+/*creates a new channel for this stream*/\r
+GF_Channel *gf_es_new(GF_ESD *esd);\r
+/*destroys channel*/\r
+void gf_es_del(GF_Channel *ch);\r
+/*(un)locks channel*/\r
+void gf_es_lock(GF_Channel *ch, u32 LockIt);\r
+/*setup channel for reception of data*/\r
+GF_Err gf_es_start(GF_Channel *ch);\r
+/*stop channel from receiving data*/\r
+GF_Err gf_es_stop(GF_Channel *ch);\r
+/*handles reception of an SL PDU*/\r
+void gf_es_receive_sl_packet(GF_ClientService *serv, GF_Channel *ch, char *StreamBuf, u32 StreamLength, GF_SLHeader *header, GF_Err reception_status);\r
+/*signals end of stream on the channel*/\r
+void gf_es_on_eos(GF_Channel *ch);\r
+/*fetches first AU available for decoding on this channel*/\r
+struct _decoding_buffer *gf_es_get_au(GF_Channel *ch);\r
+/*drops first AU on this channel*/\r
+void gf_es_drop_au(GF_Channel *ch);\r
+/*performs final setup upon connection confirm*/\r
+void gf_es_on_connect(GF_Channel *ch);\r
+/*reconfigure SL for this channel*/\r
+void gf_es_reconfig_sl(GF_Channel *ch, GF_SLConfig *slc);\r
+/*hack for streaming: whenever a time map (media time <-> TS time) event is received on the channel reset decoding buffer\r
+this is needed because all server tested resend packets on already running channel*/\r
+void gf_es_map_time(GF_Channel *ch, Bool reset);\r
+/*dummy channels are used by scene decoders which don't use ESM but load directly the scene graph themselves\r
+these channels are ALWAYS pulling ones, and this function will init the channel clock if needed*/\r
+void gf_es_init_dummy(GF_Channel *ch);\r
+/*setup DRM info*/\r
+void gf_es_config_drm(GF_Channel *ch, GF_NetComDRMConfig *isma_cryp);\r
+\r
+/*\r
+               decoder stuff\r
+*/\r
+enum\r
+{\r
+       /*stop: the decoder is not playing*/\r
+       GF_ESM_CODEC_STOP       =       0,\r
+       /*stop: the decoder is playing*/\r
+       GF_ESM_CODEC_PLAY       =       1,\r
+       /*End Of Stream: when the base layer signals it's done, this triggers media-specific\r
+       handling of the CB. \r
+       For video, the output is kept alive, For audio, the output is reseted (don't want audio loop ;)*/\r
+       GF_ESM_CODEC_EOS        =       2,\r
+       /*pause: the decoder is stoped but the CB is kept intact\r
+       THIS IS NOT USED AS A CODEC STATUS, but only for signaling that the CB shouldn't \r
+       be reseted - the real status of a "paused" decoder is STOP*/\r
+       GF_ESM_CODEC_PAUSE      =       3,\r
+       /*Buffer: transition state: the decoder runs (fetch data/decode) but the clock\r
+       is not running (no composition). This is used for rebuffering channels (rtp...)*/\r
+       GF_ESM_CODEC_BUFFER =   4\r
+};\r
+\r
+enum\r
+{\r
+       GF_ESM_CODEC_HAS_UPSTREAM = 1,\r
+       /*the codec uses the interface from another codec (only used by private scene streams to handle\r
+       any intern sprite/animation streams)*/\r
+       GF_ESM_CODEC_IS_USE = 1<<1,\r
+       /*set for OD codec when static (ressources are declared in OD stream esd a la ISMA*/\r
+       GF_ESM_CODEC_IS_STATIC_OD = 1<<2,\r
+};\r
+\r
+struct _generic_codec \r
+{\r
+       /*codec type (streamType from base layer)*/\r
+       u32 type;\r
+       u32 flags;\r
+       /*current decoder interface */\r
+       GF_BaseDecoder *decio;\r
+       /*composition memory for media streams*/\r
+       struct _composition_memory *CB;\r
+       /*input media channles*/\r
+       GF_List *inChannels;\r
+       /*a pointer to the OD that owns the decoder.*/\r
+       struct _od_manager *odm;\r
+       u32 Status;\r
+       Bool Muted;\r
+       struct _object_clock *ck;\r
+       /*priority of this media object. This is ALWAYS the base layer priority\r
+       PriorityBoost is set when the CB is under critical limit (for now only audio uses the feature)\r
+       and results in a bigger time slice for the codec. Only on/off value for now*/\r
+       u32 Priority, PriorityBoost;\r
+       /*last processed DTS - sanity check for scalability*/\r
+       u32 last_unit_dts;\r
+       /*last processed CTS on base layer - seeking detection*/\r
+       u32 last_unit_cts;\r
+       /*in case the codec performs temporal re-ordering itself*/\r
+       Bool is_reordering;\r
+       u32 prev_au_size;\r
+       u32 bytes_per_sec;\r
+       Double fps;\r
+\r
+       /*statistics*/\r
+       u32 last_stat_start, cur_bit_size;\r
+       u32 avg_bit_rate, max_bit_rate;\r
+       u32 total_dec_time, nb_dec_frames, max_dec_time;\r
+       /*number of droped frames*/\r
+       u32 nb_droped;\r
+\r
+       /*for CTS reconstruction (channels not using SL): we cannot just update timing at each frame, not precise enough \r
+       since we use ms and not microsec TSs*/\r
+       u32 cur_audio_bytes, cur_video_frames;\r
+};\r
+\r
+GF_Codec *gf_codec_new(GF_ObjectManager *odm, GF_ESD *base_layer, s32 PL, GF_Err *e);\r
+void gf_codec_del(GF_Codec *codec);\r
+GF_Err gf_codec_add_channel(GF_Codec *codec, GF_Channel *ch);\r
+/*returns TRUE if stream was present, false otherwise*/\r
+Bool gf_codec_remove_channel(GF_Codec *codec, GF_Channel *ch);\r
+GF_Err gf_codec_process(GF_Codec *codec, u32 TimeAvailable);\r
+GF_Err gf_codec_get_capability(GF_Codec *codec, GF_CodecCapability *cap);\r
+GF_Err gf_codec_set_capability(GF_Codec *codec, GF_CodecCapability cap);\r
+void gf_codec_set_status(GF_Codec *codec, u32 Status);\r
+/*returns a new codec using an existing loaded decoder - only used by private scene to handle != timelines, for \r
+instance when loading a BT with an animation stream*/\r
+GF_Codec *gf_codec_use_codec(GF_Codec *codec, GF_ObjectManager *odm);\r
+\r
+/*OD manager*/\r
+\r
+enum\r
+{\r
+       /*flag set if object cannot be time-controloed*/\r
+       GF_ODM_NO_TIME_CTRL = (1<<1),\r
+       /*flag set if subscene uses parent scene timeline*/\r
+       GF_ODM_INHERIT_TIMELINE = (1<<2),\r
+       /*flag set if object has been redirected*/\r
+       GF_ODM_REMOTE_OD = (1<<3),\r
+       /*flag set if object has profile indications*/\r
+       GF_ODM_HAS_PROFILES = (1<<4),\r
+       /*flag set if object governs profile of inline subscenes*/\r
+       GF_ODM_INLINE_PROFILES = (1<<5),\r
+       /*flag set if object declared by network service, not from OD stream*/\r
+       GF_ODM_NOT_IN_OD_STREAM = (1<<6),\r
+\r
+       /*dynamic flags*/\r
+       \r
+       /*flag set if associated subscene must be regenerated*/\r
+       GF_ODM_REGENERATE_SCENE = (1<<10),\r
+};\r
+\r
+enum\r
+{\r
+       GF_ODM_STATE_STOP,\r
+       GF_ODM_STATE_PLAY,\r
+       GF_ODM_STATE_IN_SETUP,\r
+       GF_ODM_STATE_BLOCKED,\r
+};\r
+\r
+struct _od_manager\r
+{\r
+       /*pointer to terminal*/\r
+       struct _tag_terminal *term;\r
+       /*the service used by this ODM. If the service private data is this ODM, then the service was created for this ODM*/\r
+       GF_ClientService *net_service;\r
+       /*parent scene or NULL for root scene*/\r
+       struct _inline_scene *parentscene;\r
+       /*channels associated with this object (media channels, OCR, IPMP, OCI, etc)*/\r
+       GF_List *channels;\r
+       /*sub scene for inline/animation or NULL */\r
+       struct _inline_scene *subscene;\r
+       /*object codec (media or BIFS for AnimationStream) attached if any*/\r
+       struct _generic_codec *codec;\r
+       /*OCI codec attached if any*/\r
+       struct _generic_codec *oci_codec;\r
+       /*OCR codec attached if any*/\r
+       struct _generic_codec *ocr_codec;\r
+\r
+       /*MPEG-4 object descriptor*/\r
+       GF_ObjectDescriptor *OD;\r
+\r
+       /*exclusive access is required since rendering and media management don't always take place in the same thread*/\r
+       GF_Mutex *mx;\r
+\r
+       u32 flags;\r
+\r
+       /*PLs*/\r
+       u8 Audio_PL, Graphics_PL, OD_PL, Scene_PL, Visual_PL;\r
+       \r
+       /*interface with scene rendering*/\r
+       struct _mediaobj *mo;\r
+       \r
+       /*number of channels with connection not yet acknowledge*/\r
+       u32 pending_channels;\r
+       u32 state;\r
+       /* during playback: timing as evaluated by the composition memory or the scene codec */\r
+       u32 current_time;\r
+       /*full object duration 0 if unknown*/\r
+       u64 duration;\r
+       /*\r
+       upon start: media start time as requested by scene compositor (eg not media control)\r
+       set to -1 upon stop to postpone stop request\r
+       */\r
+       u64 media_start_time, media_stop_time;\r
+\r
+       /*the one and only media control currently attached to this object*/\r
+       struct _media_control *media_ctrl;\r
+       /*the list of media control controling the object*/\r
+       GF_List *mc_stack;\r
+       /*the media sensor(s) attached to this object*/\r
+       GF_List *ms_stack;\r
+};\r
+\r
+\r
+GF_ObjectManager *gf_odm_new();\r
+void gf_odm_del(GF_ObjectManager *ODMan);\r
+void gf_odm_lock(GF_ObjectManager *odm, u32 LockIt);\r
+\r
+/*setup service entry point*/\r
+void gf_odm_setup_entry_point(GF_ObjectManager *odm, const char *sub_url);\r
+/*setup OD*/\r
+void gf_odm_setup_object(GF_ObjectManager *odm, GF_ClientService *parent_serv);\r
+/*disctonnect OD and removes it if desired (otherwise only STOP is propagated)*/\r
+void gf_odm_disconnect(GF_ObjectManager *odman, Bool do_remove);\r
+/*setup an ESD*/\r
+GF_Err gf_odm_setup_es(GF_ObjectManager *odm, GF_ESD *esd, GF_ClientService *service, GF_MediaObject *sync_ref);\r
+/*removes an ESD (this destroys associated channel if any)*/\r
+void gf_odm_remove_es(GF_ObjectManager *odm, u16 ES_ID);\r
+/*set stream duration - updates object duration accordingly*/\r
+void gf_odm_set_duration(GF_ObjectManager *odm, GF_Channel *, u64 stream_duration);\r
+/*signals end of stream on channels*/\r
+void gf_odm_on_eos(GF_ObjectManager *odm, GF_Channel *);\r
+/*start Object streams and queue object for network PLAY*/\r
+void gf_odm_start(GF_ObjectManager *odm);\r
+/*stop OD streams*/\r
+void gf_odm_stop(GF_ObjectManager *odm, Bool force_close);\r
+/*send PLAY request to network - needed to properly handle multiplexed inputs \r
+ONLY called by service handler (media manager thread)*/\r
+void gf_odm_play(GF_ObjectManager *odm);\r
+\r
+/*returns 1 if this is a segment switch, 0 otherwise - takes care of object restart if segment switch*/\r
+Bool gf_odm_check_segment_switch(GF_ObjectManager *odm);\r
+/*pause object (mediaControl use only)*/\r
+void gf_odm_pause(GF_ObjectManager *odm);\r
+/*resume object (mediaControl use only)*/\r
+void gf_odm_resume(GF_ObjectManager *odm);\r
+/*set object speed*/\r
+void gf_odm_set_speed(GF_ObjectManager *odm, Fixed speed);\r
+/*returns the clock of the media stream (video, audio or bifs), NULL otherwise */\r
+struct _object_clock *gf_odm_get_media_clock(GF_ObjectManager *odm);\r
+/*adds segment descriptors targeted by the URL to the list and sort them - the input list must be empty*/\r
+void gf_odm_init_segments(GF_ObjectManager *odm, GF_List *list, MFURL *url);\r
+/*returns true if this OD depends on the given clock*/\r
+Bool gf_odm_shares_clock(GF_ObjectManager *odm, struct _object_clock *ock);\r
+\r
+GF_Segment *gf_odm_find_segment(GF_ObjectManager *odm, char *descName);\r
+/*locks ODM with destruction check - returns 0 if object manager is not attached to object*/\r
+Bool gf_odm_lock_mo(struct _mediaobj *mo);\r
+\r
+\r
+/*GF_MediaObject: link between real object manager and scene. although there is a one-to-one mapping between a \r
+MediaObject and an ObjectManager, we have to keep them seperated in order to handle OD remove commands which destroy\r
+ObjectManagers. */\r
+struct _mediaobj\r
+{\r
+       /*type is as defined in constants.h # GF_MEDIA_OBJECT_* */\r
+       u32 type;\r
+       /*one of the above flags*/\r
+       u32 flags;\r
+\r
+\r
+       /* private to ESM*/\r
+\r
+       /*media object manager - private to the sync engine*/\r
+       struct _od_manager *odm;\r
+       /*OD ID of the object*/\r
+       u32 OD_ID;\r
+       /*OD URL for object not using MPEG4 OD urls*/\r
+       MFURL URLs;\r
+       /*session join*/\r
+       u32 num_open;\r
+       /*shared object restart handling*/\r
+       u32 num_to_restart, num_restart;\r
+       Fixed speed;\r
+\r
+       /*shared object info: if 0 a new frame will be checked, otherwise current is returned*/\r
+       u32 nb_fetch;\r
+       /*frame presentation time*/\r
+       u32 timestamp;\r
+       /*data frame size*/\r
+       u32 framesize;\r
+       /*pointer to data frame */\r
+       char *frame;\r
+       /*nodes currently registered with the media object - used to dispatch MediaAccessEvents*/\r
+       GF_List *nodes;\r
+       /*pointer to the node responsible for the creation of this media object\r
+       ONLY used for scene media type (animationStreams) \r
+       Reset upon creation of the decoder.\r
+       */\r
+       void *node_ptr;\r
+};\r
+\r
+GF_MediaObject *gf_mo_new();\r
+\r
+\r
+/*used for delayed channel setup*/\r
+typedef struct \r
+{\r
+       struct _generic_codec *dec;\r
+       struct _es_channel *ch; \r
+} GF_ChannelSetup;\r
+\r
+/*post-poned channel connect*/\r
+GF_Err gf_odm_post_es_setup(struct _es_channel *ch, struct _generic_codec *dec, GF_Err err);\r
+\r
+/*\r
+       special entry point: specify directly a service interface for service input\r
+*/\r
+void gf_term_attach_service(GF_Terminal *term, GF_InputService *service_hdl);\r
+\r
+/*media access events */\r
+void gf_term_service_media_event(GF_ObjectManager *odm, u32 event_type);\r
+\r
+u32 URL_GetODID(MFURL *url);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+#endif /*_GF_TERMINAL_DEV_H_*/\r
+\r
+\r