/*--------------------------------------------------------------------------
Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of Code Aurora nor
      the names of its contributors may be used to endorse or promote
      products derived from this software without specific prior written
      permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------*/
#ifndef __OMX_VENC__H
#define __OMX_VENC__H

#include <unistd.h>
#include "omx_video_base.h"
#ifdef _COPPER_
#include "video_encoder_device_copper.h"
#else
#include "video_encoder_device.h"
#endif

extern "C" {
  OMX_API void * get_omx_component_factory_fn(void);
}

class omx_venc: public omx_video
{
public:
  omx_venc(); //constructor
  ~omx_venc(); //des
  static int async_message_process (void *context, void* message);
  OMX_ERRORTYPE component_init(OMX_STRING role);
  OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
                              OMX_INDEXTYPE  paramIndex,
                              OMX_PTR        paramData);
  OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
                           OMX_INDEXTYPE  configIndex,
                           OMX_PTR        configData);
  OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
  //OMX strucutres
  OMX_U32 m_nVenc_format;
  class venc_dev *handle;

private:
  OMX_U32 dev_stop(void);
  OMX_U32 dev_pause(void);
  OMX_U32 dev_start(void);
  OMX_U32 dev_flush(unsigned);
  OMX_U32 dev_resume(void);
  OMX_U32 dev_start_done(void);
  OMX_U32 dev_stop_done(void);
  bool dev_use_buf( void *,unsigned,unsigned);
  bool dev_free_buf( void *,unsigned);
  bool dev_empty_buf(void *, void *,unsigned,unsigned);
  bool dev_fill_buf(void *, void *,unsigned,unsigned);
  bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
  bool dev_set_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32);
  bool update_profile_level();
  bool dev_get_seq_hdr(void *, unsigned, unsigned *);
  bool dev_loaded_start(void);
  bool dev_loaded_stop(void);
  bool dev_loaded_start_done(void);
  bool dev_loaded_stop_done(void);
};

#endif //__OMX_VENC__H
