/*
 INTEL CONFIDENTIAL
 Copyright 2009 Intel Corporation All Rights Reserved.
 The source code contained or described herein and all documents related to the source code ("Material") are owned by Intel Corporation or its suppliers or licensors. Title to the Material remains with Intel Corporation or its suppliers and licensors. The Material contains trade secrets and proprietary and confidential information of Intel or its suppliers and licensors. The Material is protected by worldwide copyright and trade secret laws and treaty provisions. No part of the Material may be used, copied, reproduced, modified, published, uploaded, posted, transmitted, distributed, or disclosed in any way without Intel’s prior express written permission.

 No license under any patent, copyright, trade secret or other intellectual property right is granted to or conferred upon you by disclosure or delivery of the Materials, either expressly, by implication, inducement, estoppel or otherwise. Any license under such intellectual property rights must be express and approved by Intel in writing.
 */

#ifndef __MIX_VIDEOFORMAT_H__
#define __MIX_VIDEOFORMAT_H__

#include <va/va.h>
#include <glib-object.h>
#include "vbp_loader.h"
#include "mixvideodef.h"
#include <mixdrmparams.h>
#include "mixvideoconfigparamsdec.h"
#include "mixvideodecodeparams.h"
#include "mixvideoframe.h"
#include "mixframemanager.h"
#include "mixsurfacepool.h"
#include "mixbuffer.h"
#include "mixbufferpool.h"
#include "mixvideoformatqueue.h"

G_BEGIN_DECLS

// Redefine the Handle defined in vbp_loader.h
#define	VBPhandle	Handle

/*
 * Type macros.
 */
#define MIX_TYPE_VIDEOFORMAT                  (mix_videoformat_get_type ())
#define MIX_VIDEOFORMAT(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIX_TYPE_VIDEOFORMAT, MixVideoFormat))
#define MIX_IS_VIDEOFORMAT(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIX_TYPE_VIDEOFORMAT))
#define MIX_VIDEOFORMAT_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), MIX_TYPE_VIDEOFORMAT, MixVideoFormatClass))
#define MIX_IS_VIDEOFORMAT_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), MIX_TYPE_VIDEOFORMAT))
#define MIX_VIDEOFORMAT_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), MIX_TYPE_VIDEOFORMAT, MixVideoFormatClass))

typedef struct _MixVideoFormat MixVideoFormat;
typedef struct _MixVideoFormatClass MixVideoFormatClass;

/* vmethods typedef */

typedef MIX_RESULT (*MixVideoFmtGetCapsFunc)(MixVideoFormat *mix, GString *msg);
typedef MIX_RESULT (*MixVideoFmtInitializeFunc)(MixVideoFormat *mix,
		MixVideoConfigParamsDec * config_params,
                MixFrameManager * frame_mgr,
		MixBufferPool * input_buf_pool,
		MixSurfacePool ** surface_pool,
		VADisplay va_display);
typedef MIX_RESULT (*MixVideoFmtDecodeFunc)(MixVideoFormat *mix, 
		MixBuffer * bufin[], gint bufincnt, 
		MixVideoDecodeParams * decode_params);
typedef MIX_RESULT (*MixVideoFmtFlushFunc)(MixVideoFormat *mix);
typedef MIX_RESULT (*MixVideoFmtEndOfStreamFunc)(MixVideoFormat *mix);
typedef MIX_RESULT (*MixVideoFmtDeinitializeFunc)(MixVideoFormat *mix);

struct _MixVideoFormat {
    /*< public > */
    GObject parent;

    /*< public > */

    /*< private > */
    GMutex *objectlock;
    gboolean initialized;
    MixFrameManager *framemgr;
    MixSurfacePool *surfacepool;
    VADisplay va_display;
    VAContextID va_context;
    VAConfigID va_config;
    VASurfaceID *va_surfaces;
    guint va_num_surfaces;
    VBPhandle parser_handle;
    GString *mime_type;
    guint frame_rate_num;
    guint frame_rate_denom;
    guint picture_width;
    guint picture_height;
    gboolean parse_in_progress;
    gboolean discontinuity_frame_in_progress;
    guint64 current_timestamp;
    MixBufferPool *inputbufpool;
    GQueue *inputbufqueue;    
    gboolean va_initialized;
    gboolean end_picture_pending;
    MixVideoFrame* video_frame;    
    guint extra_surfaces;
    MixVideoConfigParamsDec * config_params;
};

/**
 * MixVideoFormatClass:
 *
 * MI-X Video object class
 */
struct _MixVideoFormatClass {
	/*< public > */
	GObjectClass parent_class;

	/* class members */

	/*< public > */
	MixVideoFmtGetCapsFunc getcaps;
	MixVideoFmtInitializeFunc initialize;
	MixVideoFmtDecodeFunc decode;
	MixVideoFmtFlushFunc flush;
	MixVideoFmtEndOfStreamFunc eos;
	MixVideoFmtDeinitializeFunc deinitialize;
};

/**
 * mix_videoformat_get_type:
 * @returns: type
 *
 * Get the type of object.
 */
GType mix_videoformat_get_type(void);

/**
 * mix_videoformat_new:
 * @returns: A newly allocated instance of #MixVideoFormat
 *
 * Use this method to create new instance of #MixVideoFormat
 */
MixVideoFormat *mix_videoformat_new(void);

/**
 * mix_videoformat_ref:
 * @mix: object to add reference
 * @returns: the MixVideoFormat instance where reference count has been increased.
 *
 * Add reference count.
 */
MixVideoFormat *mix_videoformat_ref(MixVideoFormat * mix);

/**
 * mix_videoformat_unref:
 * @obj: object to unref.
 *
 * Decrement reference count of the object.
 */
#define mix_videoformat_unref(obj) g_object_unref (G_OBJECT(obj))

/* Class Methods */

MIX_RESULT mix_videofmt_getcaps(MixVideoFormat *mix, GString *msg);

MIX_RESULT mix_videofmt_initialize(MixVideoFormat *mix, 
				  MixVideoConfigParamsDec * config_params,
				  MixFrameManager * frame_mgr,
				  MixBufferPool * input_buf_pool,
				  MixSurfacePool ** surface_pool,
				  VADisplay va_display);

MIX_RESULT mix_videofmt_decode(MixVideoFormat *mix, MixBuffer * bufin[],
                gint bufincnt, MixVideoDecodeParams * decode_params);

MIX_RESULT mix_videofmt_flush(MixVideoFormat *mix);

MIX_RESULT mix_videofmt_eos(MixVideoFormat *mix);

MIX_RESULT mix_videofmt_deinitialize(MixVideoFormat *mix);

G_END_DECLS

#endif /* __MIX_VIDEOFORMAT_H__ */
