/*
 *			GPAC - Multimedia Framework C SDK
 *
 *			Authors: Romain Bouqueau
 *			Copyright (c) Telecom ParisTech 2010-20xx
 *					All rights reserved
 *
 *  This file is part of GPAC / Hybrid Media input module
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef _HYB_IN_H
#define _HYB_IN_H

#include <gpac/modules/codec.h>
#include <gpac/modules/service.h>
#include <gpac/constants.h>


typedef enum {
	HYB_STATE_STOPPED  = -2,	/*thread received HYB_STATE_STOP_REQ and stopped*/
	HYB_STATE_STOP_REQ = -1,	/*user asked to stop*/
	HYB_STATE_PAUSE    = 0,		/*default state*/
	//HYB_STATE_PLAY_REQ = 1,	/*user asked to play*/
	HYB_STATE_PLAYING  = 2,		/*thread received HYB_STATE_PLAY_REQ and has started playing*/
} HYB_STATE;

typedef enum {
	HYB_PUSH = 0,	/*threaded*/
	HYB_PULL,		/*not threaded*/
} HYB_DATA_MODE;

/*base structure for media hybridation*/
typedef struct s_GF_HYBMEDIA {

	/*object description*/
	const char* name;

	/* *** static methods *** */

	/*is url handled by this service?*/
	Bool (*CanHandleURL)(const char *url);

	/*retrieve object descriptor*/
	GF_ObjectDescriptor* (*GetOD)(void);


	/* *** other methods *** */

	/*create/destroy the object and all its data*/
	GF_Err (*Connect)   (struct s_GF_HYBMEDIA *self, GF_ClientService *service, const char *url);
	GF_Err (*Disconnect)(struct s_GF_HYBMEDIA *self);

	/*request state from */
	GF_Err (*SetState)(struct s_GF_HYBMEDIA *self, const GF_NET_CHAN_CMD state);

	/*in case data retrieval paradigm is pull these two functions shall not be NULL*/
	GF_Err (*GetData)    (struct s_GF_HYBMEDIA *self, char **out_data_ptr, u32 *out_data_size, GF_SLHeader *out_sl_hdr); /*only available when data_mode is pull*/
	GF_Err (*ReleaseData)(struct s_GF_HYBMEDIA *self); /*only available when data_mode is pull*/


	/* *** statically initialized data *** */

	/*data retrieval mode: HYB_PUSH or HYB_PULL*/
	HYB_DATA_MODE data_mode;

	/*pivate data which type depends on dynamic considerations*/
	void *private_data;


	/* *** dynamically initialized data *** */

	/*object state: play/stop/pause/...*/
	HYB_STATE state;

	/*object carrying us (needed to communicate with the player)*/
	GF_ClientService *owner;
	LPNETCHANNEL channel;

} GF_HYBMEDIA;

#endif
