#ifndef __ICodec_H
#define __ICodec_H

#include "IStream.h"
#include "Desc.h"

// on exit b is non zero when it still needs some data
typedef const _kernel_oserror* (*ICodec_Accept)(IStream* s, const Desc*);
typedef const _kernel_oserror* (*ICodec_Load)(IStream* s);
typedef const _kernel_oserror* (*ICodec_Unload)(IStream* s);
typedef const _kernel_oserror* (*ICodec_IsReady)(IStream* s, bool* b);
typedef const _kernel_oserror* (*ICodec_BufferSizes)(IStream* s, int* size, int* filled);
typedef const _kernel_oserror* (*ICodec_InError)(IStream* s);
typedef const _kernel_oserror* (*ICodec_ReadPos)(IStream* s, int64_t* time);
typedef const _kernel_oserror* (*ICodec_ReadDuration)(IStream* s, int64_t* time);
typedef const _kernel_oserror* (*ICodec_SetPos)(IStream* s, int64_t time);
typedef const _kernel_oserror* (*ICodec_ClearInput)(IStream* s);
typedef const _kernel_oserror* (*ICodec_Process)(IStream* s);
typedef int (*ICodec_Lister)(IStream* s);

struct ICodec
{
	const char*         Name;
	ICodec_Accept       Accept;
	ICodec_Load         Load;
	ICodec_Unload       Unload;
	ICodec_IsReady      IsReady;
	ICodec_BufferSizes  BufferSizes;
	ICodec_InError      InError;
	ICodec_ReadPos      ReadPos;
	ICodec_ReadDuration ReadDuration;
	ICodec_SetPos       SetPos;
	ICodec_ClearInput   ClearInput;
	ICodec_Process      Process;
	ICodec_Process      ExtProcess;
	ICodec_Lister       Lister;
};

#endif
