#ifndef __LIBMIX_INTEL_IMAGE_ENCODER_H__
#define __LIBMIX_INTEL_IMAGE_ENCODER_H__

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <va/va.h>
#include <va/va_android.h>
#include <va/va_tpi.h>
#include <va/va_enc_jpeg.h>

#define INTEL_IMAGE_ENCODER_DEFAULT_QUALITY 90
#define INTEL_IMAGE_ENCODER_MAX_QUALITY 100
#define INTEL_IMAGE_ENCODER_MIN_QUALITY 1
#define INTEL_IMAGE_ENCODER_MAX_BUFFERS 64
#define INTEL_IMAGE_ENCODER_REQUIRED_STRIDE 64
#ifndef VA_FOURCC_YV16
#define VA_FOURCC_YV16 0x36315659
#endif
#define SURFACE_TYPE_USER_PTR 0x00000004
#define SURFACE_TYPE_GRALLOC 0x00100000

class IntelImageEncoder {
public:
	IntelImageEncoder(void);
	~IntelImageEncoder(void) {};

	/*
	 * initializeEncoder initializes Intel JPEG HW encoder,
	 * only needs to be called once at booting unless errors happen.
	 * Return zero for success and non-zero for failure.
	 */
	int initializeEncoder(void);

	/*
	 * createSourceSurface creates a surface for encoding.
	 * based on the input buffer taking source image data.
	 * This can be called after the encoder is initialized.
	 * Parameters:
	 * source_type: the type of source buffer:
	 *              SURFACE_TYPE_USER_PTR for malloced buffer;
	 *              SURFACE_TYPE_GRALLOC for gralloced buffer.
	 * source_buffer: the input source buffer address, which
	 *                must be aligned to page-size
	 * width: the width of source image data
	 * height: the height of source image data
	 * stride: the stride of source image data
	 * fourcc: the fourcc value of source, VA_RT_FORMAT_YUV420
	 *         and VA_RT_FORMAT_YUV422 are supported.
	 * image_seqp: the pointer to a returned image sequential
	 *             number to identity an image and its surface.
	 * Return zero for success and non-zero for failure.
	 */
	int createSourceSurface(int source_type, void *source_buffer,
				unsigned int width,unsigned int height,
				unsigned int stride, unsigned int fourcc,
				int *image_seqp);

	/*
	 * createContext creates the encoding context,
	 * based on the parameters of a existing surface.
	 * This can be called after the encoder is initialized
	 * and at least one surface is created.
	 * Parameters:
	 * first_image_seq: the sequential number of image/surface
	 *                  to be based to create context,
	 *                  the created context will be set to its
	 *                  parameters: width, height, stride & fourcc.
	 * max_coded_sizep: the returned pointer to the max coded buffer.
	 *                  size for references, given the current context.
	 * Return zero for success and non-zero for failure.
	 */
	int createContext(int first_image_seq, unsigned int *max_coded_sizep);
	int createContext(unsigned int *max_coded_sizep)
	{
		return this->createContext(0, max_coded_sizep);
	}

	/*
	 * setQuality changes the current quality value,
	 * whose default value is 90.
	 * This can be called after the encoder is initialized.
	 * Parameters:
	 * new_quality: the new quality value to be set.
	 * Return zero for success and non-zero for failure.
	 */
	int setQuality(unsigned int new_quality);

	/*
	 * encode triggers an image/surface's JPEG encoding.
	 * This can be called after the encoder is initialize
	 * and context is created.
	 * Parameters:
	 * image_seq: the sequential number of an image/surface
	 *            to be encoded. This has not to be the same
	 *            as the one used to create context, but it
	 *            has to be of the same parameters.
	 *            If a surface with different paras needs to
	 *            be encoded, another context based on its
	 *            parameters is needed.
	 * new_quality: the new quality value to be set.
	 * Return zero for success and non-zero for failure.
	 */
	int encode(int image_seq, unsigned int new_quality);
	int encode(int image_seq)
	{
		return this->encode(image_seq, quality);
	}
	int encode(void)
	{
		return this->encode(0, quality);
	}

	/*
	 * getCoded waits for the current encoding task's completion.
	 * Only one encoding task can be triggered under an instance
	 * of IntelImageEncoder at any minute.
	 * This has not be called right after encode is called,
	 * instead, this can be called any minutes after the encoding
	 * is triggered to support both synced/asynced encoding usage.
	 * Parameters:
	 * user_coded_buf: the input buffer to take coded data.
	 *                 After getCoded is returned with no errors,
	 *                 this buffer will have the coded JPEG in it.
	 * user_coded_buf_size: the size of input buffer.
	 *                      If too small, an error'll be returned.
	 * coded_data_sizep: the returned pointer to the actual size
	 *                   value of coded JPEG.
	 * Return zero for success and non-zero for failure.
	 */
	int getCoded(void *user_coded_buf,
			unsigned int user_coded_buf_size,
			unsigned int *coded_data_sizep);

	int destroySourceSurface(int image_seq);
	int destroyContext(void);
	int deinitializeEncoder(void);

private:
	typedef enum {
		LIBVA_UNINITIALIZED = 0,
		LIBVA_INITIALIZED,
		LIBVA_CONTEXT_CREATED,
		LIBVA_ENCODING,
	}IntelImageEncoderStatus;

	/* Valid since LIBVA_UNINITIALIZED */
	IntelImageEncoderStatus encoder_status;
	unsigned int quality;

	/* Valid Since LIBVA_INITIALIZED */
	VADisplay va_dpy;
	VAConfigAttrib va_configattrib;

	/* Valid if a surface is created */
	unsigned int images_count;
	VASurfaceID va_surfaceid[INTEL_IMAGE_ENCODER_MAX_BUFFERS];
	unsigned int surface_width[INTEL_IMAGE_ENCODER_MAX_BUFFERS];
	unsigned int surface_height[INTEL_IMAGE_ENCODER_MAX_BUFFERS];
	unsigned int surface_fourcc[INTEL_IMAGE_ENCODER_MAX_BUFFERS];

	/* Valid since LIBVA_CONTEXT_CREATED */
	VAConfigID va_configid;
	VAContextID va_contextid;
	unsigned int context_width;
	unsigned int context_height;
	unsigned int context_fourcc;
	VABufferID va_codedbufferid;
	unsigned int coded_buf_size;

	/* Valid since LIBVA_ENCODING */
	int reserved_image_seq;
};

#endif /* __LIBMIX_INTEL_IMAGE_ENCODER_H__ */
