/*******************************************************************
                    MPEG-2 Video Interface
 *******************************************************************/
#include <winbase.h>

#ifndef MPEG2VIDEO_H
#define MPEG2VIDEO_H

#include "video_stream.h"
#include "sequence_header.h"
#include "picture_header.h"
#include "frame.h"
#include "gop.h"
#include "picture.h"
#include "mc.h"
#include "idct.h"

typedef struct {
	__int64                     index;
	int                         i_frame;
	BGR_CONVERSION_PARAMETER    prm;
} OUTPUT_PARAMETER;

typedef struct {
	__int64                     index;
	int                         i_frame;
	unsigned char              *data;

	void                       *prev;
	void                       *next;
} BGR_BUFFER_ELEMENT;

typedef struct {
	BGR_BUFFER_ELEMENT         *head;
	BGR_BUFFER_ELEMENT         *tail;
	int                         i_frame_count;
} BGR_BUFFER;

typedef struct {
	VIDEO_STREAM                bitstream;
	SEQUENCE_HEADER             seq;
	PICTURE_HEADER              pic;
	READ_PICTURE_HEADER_OPTION  pic_opt;
	
	FIND_GOP                    fg;
	GOP                         current;
	
	MC_BUFFER                   dec_buf;
	DECODE_PICTURE_PARAMETER    dec_prm;

	int                         remap;

	OUTPUT_PARAMETER            fwd_prm;
	OUTPUT_PARAMETER            cur_prm;
	OUTPUT_PARAMETER            bwd_prm;

	FRAME2BGR                   frm2bgr;
	
	BGR_BUFFER                  out_buf;
	
	__int64                     total;
    int                         rate;
    int                         scale;

	CRITICAL_SECTION            lock;
} MPEG2VIDEO;
	
#ifdef __cplusplus
extern "C" {
#endif

#ifndef MPEG2VIDEO_C	
extern int open_mpeg2video(char *path, MPEG2VIDEO *out);
extern int close_mpeg2video(MPEG2VIDEO *p);
extern int read_frame(MPEG2VIDEO *in, unsigned char **out, __int64 frame);
#endif

#ifdef __cplusplus
}
#endif

#endif