/*******************************************************************
                    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"
#include "resize.h"

typedef struct {
	__int64                     index;
	int                         i_frame;
	int                         repeat_first_field;
	int                         top_field_first;
} OUTPUT_PARAMETER;

typedef struct {
	__int64                     index;
	int                         i_frame;
	
	FRAME                      *data;

	void                       *prev;
	void                       *next;
} OUT_BUFFER_ELEMENT;

typedef struct {
	OUT_BUFFER_ELEMENT         *head;
	OUT_BUFFER_ELEMENT         *tail;
	int                         i_frame_count;
} OUT_BUFFER;

#define BOTTOM_FIELD_FIRST   0
#define TOP_FIELD_FIRST      1
#define REST_FIELD           2
#define REPEAT_FIELD         3
#define KEEP_FRAME           4

typedef struct {
	__int64                     index;

	int                         i_frame;
	int                         field_status;

	FRAME                      *data;

	void                       *prev;
	void                       *next;
} FIELD_BUFFER_ELEMENT;

typedef struct {
	FIELD_BUFFER_ELEMENT *head;
	FIELD_BUFFER_ELEMENT *tail;
} FIELD_BUFFER;

typedef FRAME *(* FIELD2OUT)(FIELD_BUFFER *, OUT_BUFFER *, __int64);

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;
	int                         resize;
	int                         field_order;

	H_RESIZE_PARAMETER         *hrs_prm;
	
	BGR_CONVERSION_PARAMETER    bgr_prm;

	OUTPUT_PARAMETER            fwd_prm;
	OUTPUT_PARAMETER            cur_prm;
	OUTPUT_PARAMETER            bwd_prm;

	FIELD_BUFFER                fld_buf;
	OUT_BUFFER                  out_buf;

	FIELD2OUT                   fld2out;
	
	UPSAMPLE_CHROMA             upsmp_cr;
	FRAME2BGR                   frm2bgr;

	__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, FRAME **out, __int64 frame);
#endif

#ifdef __cplusplus
}
#endif

#endif