/*
** dec_if.h - common decoder interface for nsvplay/nsvplayx
**
** Copyright (C) 2001-2003 Nullsoft, Inc.
**
** This software is provided 'as-is', without any express or implied warranty.  
** In no event will the authors be held liable for any damages arising from the use of this software.
**
** Permission is granted to anyone to use this software for any purpose, including commercial 
** applications, and to alter it and redistribute it freely, subject to the following restrictions:
**  1. The origin of this software must not be misrepresented; you must not claim that you wrote the 
**     original software. If you use this software in a product, an acknowledgment in the product 
**     documentation would be appreciated but is not required.
**  2. Altered source versions must be plainly marked as such, and must not be misrepresented as 
**     being the original software.
**  3. This notice may not be removed or altered from any source distribution.
**
*/

#ifndef _NSV_DEC_IF_H_
#define _NSV_DEC_IF_H_

#ifndef _WA_IPC_H_ // these are also defined in Winamp/wa_ipc.h
struct YV12_PLANE {
	unsigned char*	baseAddr;
	long			rowBytes;
} ;

struct YV12_PLANES {
	YV12_PLANE	y;
	YV12_PLANE	u;
	YV12_PLANE	v;
} ;
#endif

class IVideoDecoder
{
  public:
    virtual ~IVideoDecoder() { }

    // decode returns 0 on success
    // but *out can be NULL, meaning no new frame is available,
    // but all is well
    virtual int decode(int need_kf, 
            void *in, int in_len, 
            void **out, // out is set to a pointer to data
            unsigned int *out_type, // 'Y','V','1','2' is currently defined
            int *is_kf)=0;
    virtual void flush()=0;
};

class IAudioDecoder
{
  public:
    virtual ~IAudioDecoder() { }

    // returns -1 on error, 0 on success (done with data in 'in'), 1 on success
    // but to pass 'in' again next time around.
    virtual int decode(void *in, int in_len, 
                       void *out, int *out_len, // out_len is read and written to
                       unsigned int out_fmt[8])=0; // out_fmt is written to
                                                   // ex: 'PCM ', srate, nch, bps
                                                   // or 'NONE' :)
    virtual void flush()=0;
};

class IAudioOutput
{
  public:
    virtual ~IAudioOutput() { }
    virtual int canwrite()=0; // returns bytes writeable
    virtual void write(void *buf, int len)=0;
    virtual unsigned long long getpos()=0;
    virtual unsigned long long getwritepos()=0;
    virtual void flush(unsigned int newtime)=0;
    virtual int isplaying(void) { return 1; }
    virtual void pause(int pause) { }
    virtual void setvolume(int volume) { }
    virtual void setpan(int pan) { }
    virtual void getdescstr(char *buf) { *buf=0; }
};


/*
** The DLL must export one of these symbols (unmangled, i.e. using extern "C).
**
** IAudioDecoder *CreateAudioDecoder(unsigned int type, IAudioOutput **output);
** IVideoDecoder *CreateVideoDecoder(int w, int h, double framerate, unsigned int type, int *flip);
**
** the functions should return NULL if the conversion is not possible (or 
** is not the correct format)
**
** The DLL must be in <program files>\common files\nsv, and must be named
** nsvdec_*.dll.
** 
*/

#endif//_NSV_DEC_IF_H_