/* i.Mx GStreamer fbdev plugin
 * Copyright 2017 NXP
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <unistd.h>
#include <stdint.h>
#include <signal.h>
#include <string.h>
#include <sys/time.h>
#include <stdlib.h>

#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>

#include <gst/allocators/gstdmabuf.h>
#include <gst/allocators/gstallocatorphymem.h>
#include <gst/allocators/gstphysmemory.h>
#ifdef USE_ION
#include <gst/allocators/gstionmemory.h>
#endif

#include "gstimxfbdevsink.h"
#include "gstimxcommon.h"
#include "gstimxvideooverlay.h"

GST_DEBUG_CATEGORY (imx_fbdevsink_debug);
#define GST_CAT_DEFAULT imx_fbdevsink_debug

enum
{
  PROP_0,
  PROP_DEVICE,
  PROP_ROTATE_METHOD,
  PROP_VIDEO_DIRECTION,
  PROP_FORCE_ASPECT_RATIO
};

static GstFlowReturn gst_imx_fbdevsink_show_frame (GstVideoSink * videosink,
    GstBuffer * buff);

static gboolean gst_imx_fbdevsink_start (GstBaseSink * bsink);
static gboolean gst_imx_fbdevsink_stop (GstBaseSink * bsink);

static GstCaps *gst_imx_fbdevsink_getcaps (GstBaseSink * bsink, GstCaps * filter);
static gboolean gst_imx_fbdevsink_setcaps (GstBaseSink * bsink, GstCaps * caps);

static void gst_imx_fbdevsink_finalize (GObject * object);
static void gst_imx_fbdevsink_set_property (GObject * object,
    guint prop_id, const GValue * value, GParamSpec * pspec);
static void gst_imx_fbdevsink_get_property (GObject * object,
    guint prop_id, GValue * value, GParamSpec * pspec);
static GstStateChangeReturn gst_imx_fbdevsink_change_state (GstElement * element,
    GstStateChange transition);

/* FIXME: when pan display support, change this marco */
#define DISPLAY_NUM_BUFFERS (1)

/* FIXME: how to support 10 bit */
#define VIDEO_CAPS "{BGRA, NV12, YVYU, UYVY, VYUY}"

#define BG_DEVICE "/dev/fb0"
#define ISALIGNED(a, b) (!(a & (b-1)))
#define ALIGNTO(a, b) ((a + (b-1)) & (~(b-1)))
#define ALIGNMENT (8)
#define MAX_BUFFERS 30
#define MIN_BUFFERS 3

static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
    GST_PAD_SINK,
    GST_PAD_ALWAYS,
    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (VIDEO_CAPS))
    );

GST_IMPLEMENT_VIDEO_OVERLAY_METHODS (GstImxFBDEVSink, gst_imx_fbdevsink);

static gboolean
imx_fbdevsink_update_video_geo(GstElement * object, GstVideoRectangle win_rect)
{
  GstImxFBDEVSink *fbdevsink = GST_IMX_FBDEVSINK (object);

  if (win_rect.w <= 0 || win_rect.h <= 0) {
    return TRUE;
  }

  GST_OBJECT_LOCK (fbdevsink);
  if (fbdevsink->video_geo.x == win_rect.x && fbdevsink->video_geo.y == win_rect.y &&
      fbdevsink->video_geo.w == win_rect.w && fbdevsink->video_geo.h == win_rect.h) {
    GST_OBJECT_UNLOCK (fbdevsink);
    return TRUE;
  }

  fbdevsink->video_geo.x = win_rect.x;
  fbdevsink->video_geo.y = win_rect.y;
  fbdevsink->video_geo.w = win_rect.w;
  fbdevsink->video_geo.h = win_rect.h;

  GST_INFO_OBJECT(fbdevsink, "resize to (%d - %d) * (%d x %d)",
      fbdevsink->video_geo.x, fbdevsink->video_geo.y,
      fbdevsink->video_geo.w, fbdevsink->video_geo.h);

  fbdevsink->need_reconfigure = TRUE;

  GST_OBJECT_UNLOCK (fbdevsink);

  if (((GstBaseSink*)fbdevsink)->eos || GST_STATE(object) == GST_STATE_PAUSED) {
    gst_imx_fbdevsink_show_frame((GstVideoSink *)fbdevsink, fbdevsink->last_buffer);
  }

  return TRUE;
}

static void
imx_fbdevsink_config_global_alpha(GObject * object, guint alpha)
{
  /* FIXME: nothing to do here */
}

static void
imx_fbdevsink_config_color_key(GObject * object, gboolean enable, guint color_key)
{
  /* FIXME: nothing to do here */
}

/* should call with GST_OBJECT_LOCK */
static gboolean
gst_imx_fbdevsink_output_config (GstImxFBDEVSink *fbdevsink)
{
  GstVideoRectangle src = {0, };
  GstVideoRectangle dst = {0, };
  GstVideoRectangle result = {0, };

  if (fbdevsink->keep_ratio) {
    dst.w = fbdevsink->video_geo.w;
    dst.h = fbdevsink->video_geo.h;

    if (fbdevsink->method == GST_VIDEO_ORIENTATION_90R
        || fbdevsink->method == GST_VIDEO_ORIENTATION_90L) {
      src.h = fbdevsink->width;
      src.w = fbdevsink->height;
    } else {
      src.w = fbdevsink->width;
      src.h = fbdevsink->height;
    }
    
    gst_video_sink_center_rect (src, dst, &result, TRUE);

    result.x += fbdevsink->video_geo.x;
    result.y += fbdevsink->video_geo.y;
  } else {
    result = fbdevsink->video_geo;
  }

  GST_INFO_OBJECT(fbdevsink, "keep_ratio %s output (%d - %d) * (%d x %d)",
      fbdevsink->keep_ratio ? "TRUE" : "FALSE",
      result.x, result.y, result.w, result.h);

#if 0
  fbdevsink->varinfo.reserved [0] = result.x;
  fbdevsink->varinfo.reserved [1] = result.y;
  fbdevsink->varinfo.reserved [2] = result.w;
  fbdevsink->varinfo.reserved [3] = result.h;

  /* FIXME: add rotate configure when api ready */
  if (ioctl (fbdevsink->fd, FBIOPUT_VSCREENINFO, &fbdevsink->varinfo) < 0) {
    GST_DEBUG_OBJECT(fbdevsink, "put var failed");
    return FALSE;
  }
#endif

  fbdevsink->need_reconfigure = FALSE;

  return TRUE;
}

static gboolean
gst_imx_fbdevsink_cropmeta_changed_and_set (GstVideoCropMeta *src, GstVideoCropMeta *dest)
{
  if (!src || !dest)
    return FALSE;

  if (src->x != dest->x || src->y != dest->y || src->width != dest->width || src->height != dest->height) {
    dest->x = src->x;
    dest->y = src->y;
    dest->width = src->width;
    dest->height = src->height;
    return TRUE;
  }

  return FALSE;
}

static void
gst_imx_fbdevsink_video_direction_interface_init (GstVideoDirectionInterface *
    iface)
{
  /* We implement the video-direction property */
}

#define parent_class gst_imx_fbdevsink_parent_class
G_DEFINE_TYPE_WITH_CODE (GstImxFBDEVSink, gst_imx_fbdevsink, GST_TYPE_VIDEO_SINK,
    G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY,
        gst_imx_fbdevsink_video_overlay_interface_init);
    G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_DIRECTION,
        gst_imx_fbdevsink_video_direction_interface_init));

static void
gst_imx_fbdevsink_init (GstImxFBDEVSink * fbdevsink)
{
  fbdevsink->last_buffer = NULL;
  fbdevsink->pool = NULL;
  fbdevsink->allocator = NULL;
  fbdevsink->keep_ratio = TRUE;
  fbdevsink->imxoverlay = gst_imx_video_overlay_init ((GstElement *)fbdevsink,
                                              imx_fbdevsink_update_video_geo,
                                              imx_fbdevsink_config_color_key,
                                              imx_fbdevsink_config_global_alpha);
}

static GstCaps *
gst_imx_fbdevsink_getcaps (GstBaseSink * bsink, GstCaps * filter)
{
  GstImxFBDEVSink *fbdevsink;
  GstCaps *caps;

  fbdevsink = GST_IMX_FBDEVSINK (bsink);

  caps = gst_static_pad_template_get_caps (&sink_template);

  if (filter != NULL) {
    GstCaps *icaps;

    icaps = gst_caps_intersect (caps, filter);
    gst_caps_unref (caps);
    caps = icaps;
  }

  return caps;
}

static void
_dump_varinfo (GstImxFBDEVSink *fbdevsink, struct fb_var_screeninfo * varinfo)
{
  GST_DEBUG_OBJECT(fbdevsink, "xres %d", varinfo->xres);
  GST_DEBUG_OBJECT(fbdevsink, "yres %d", varinfo->yres);
  GST_DEBUG_OBJECT(fbdevsink, "xres_v %d", varinfo->xres_virtual);
  GST_DEBUG_OBJECT(fbdevsink, "yres_v %d", varinfo->yres_virtual);
  GST_DEBUG_OBJECT(fbdevsink, "xoffset %d", varinfo->xoffset);
  GST_DEBUG_OBJECT(fbdevsink, "yoffset %d", varinfo->yoffset);
  GST_DEBUG_OBJECT(fbdevsink, "bits_per_pixel %d", varinfo->bits_per_pixel);
  GST_DEBUG_OBJECT(fbdevsink, "grayscale %d", varinfo->grayscale);
}


static gboolean
gst_imx_fbdevsink_setcaps (GstBaseSink * bsink, GstCaps * caps)
{
  GstImxFBDEVSink *fbdevsink;
  GstStructure *structure;
  const GValue *fps;

  fbdevsink = GST_IMX_FBDEVSINK (bsink);

  GST_DEBUG_OBJECT (fbdevsink, "set caps %" GST_PTR_FORMAT, caps);
  
  gst_video_info_from_caps(&fbdevsink->vinfo, caps);

  fbdevsink->width = GST_VIDEO_INFO_WIDTH (&fbdevsink->vinfo);
  fbdevsink->height = GST_VIDEO_INFO_HEIGHT (&fbdevsink->vinfo);

  fbdevsink->vfmt = GST_VIDEO_INFO_FORMAT (&fbdevsink->vinfo);
  
  /* get the variable screen info */
  if (ioctl (fbdevsink->fd, FBIOGET_VSCREENINFO, &fbdevsink->stored) < 0)
    return FALSE;

  fbdevsink->varinfo = fbdevsink->stored;
  fbdevsink->var_stored = TRUE;

  GST_DEBUG_OBJECT (fbdevsink, "start to configure display");
  /* FIXME: remove this condition when fb0 can be used */
  if (strcmp (fbdevsink->device, "/dev/fb0") != 0) {
    fbdevsink->varinfo.xoffset = 0;
    fbdevsink->varinfo.xres = fbdevsink->width;
    fbdevsink->varinfo.xres_virtual = fbdevsink->width;
    fbdevsink->varinfo.yoffset = 0;
    fbdevsink->varinfo.yres = fbdevsink->height;
    fbdevsink->varinfo.yres_virtual = fbdevsink->height * DISPLAY_NUM_BUFFERS;
    fbdevsink->varinfo.activate |= FB_ACTIVATE_FORCE;
    fbdevsink->varinfo.grayscale = gst_video_format_to_fourcc (fbdevsink->vfmt); 

    GST_DEBUG_OBJECT (fbdevsink, "resolution (%d x %d) format %s",
        fbdevsink->width, fbdevsink->height,
        gst_video_format_to_string(fbdevsink->vfmt));

    if (ioctl (fbdevsink->fd, FBIOPUT_VSCREENINFO, &fbdevsink->varinfo) < 0) {
      GST_DEBUG_OBJECT(fbdevsink, "put var failed");
      return FALSE;
    }
    GST_DEBUG_OBJECT (fbdevsink, "configure display successfully");
  }
  
  /* get the fixed screen info */
  if (ioctl (fbdevsink->fd, FBIOGET_FSCREENINFO, &fbdevsink->fixinfo) < 0)
    return FALSE;

  if (ioctl (fbdevsink->fd, FBIOGET_VSCREENINFO, &fbdevsink->varinfo) < 0)
    return FALSE;

  _dump_varinfo (fbdevsink, &fbdevsink->varinfo);

  if (fbdevsink->video_geo.w == 0) {
    fbdevsink->video_geo.w = fbdevsink->display_width;
    fbdevsink->video_geo.h = fbdevsink->display_height;
  }
  
  return TRUE;
}

static gboolean
gst_imx_fbdevsink_setup_buffer_pool (GstImxFBDEVSink *fbdevsink, GstCaps *caps)
{
  GstStructure *structure;
  GstVideoInfo info;

  if (fbdevsink->pool) {
    GST_DEBUG_OBJECT (fbdevsink, "already have a pool (%p)", fbdevsink->pool);
    return TRUE;
  }

  if (!gst_video_info_from_caps (&info, caps)) {
    GST_ERROR_OBJECT (fbdevsink, "invalid caps.");
    return FALSE;
  }

  fbdevsink->pool = gst_video_buffer_pool_new ();
  if (!fbdevsink->pool) {
    GST_ERROR_OBJECT (fbdevsink, "New video buffer pool failed");
    return FALSE;
  }
  GST_DEBUG_OBJECT (fbdevsink, "create buffer pool (%p)", fbdevsink->pool);

  if (!fbdevsink->allocator) {
#ifdef USE_ION
    fbdevsink->allocator = gst_ion_allocator_obtain ();
#endif
    if (!fbdevsink->allocator) {
      GST_ERROR_OBJECT (fbdevsink, "New allocator failed");
      return FALSE;
    }
    GST_DEBUG_OBJECT (fbdevsink, "create allocator (%p)", fbdevsink->allocator);
  }

  structure = gst_buffer_pool_get_config (fbdevsink->pool);

  /* buffer alignment configuration */
  if (!ISALIGNED (fbdevsink->width, ALIGNMENT) || !ISALIGNED (fbdevsink->height, ALIGNMENT)) {
    GstVideoAlignment alignment;

    memset (&alignment, 0, sizeof (GstVideoAlignment));
    alignment.padding_right = ALIGNTO (fbdevsink->width, ALIGNMENT) - fbdevsink->width;
    alignment.padding_bottom = ALIGNTO (fbdevsink->height, ALIGNMENT) - fbdevsink->height;

    GST_DEBUG_OBJECT (fbdevsink, "align buffer pool, w(%d) h(%d), padding_right (%d), padding_bottom (%d)",
        fbdevsink->width, fbdevsink->height, alignment.padding_right, alignment.padding_bottom);

    gst_buffer_pool_config_add_option (structure, GST_BUFFER_POOL_OPTION_VIDEO_META);
    gst_buffer_pool_config_add_option (structure, GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
    gst_buffer_pool_config_set_video_alignment (structure, &alignment);
  }

  gst_buffer_pool_config_set_params (structure, caps, info.size, MIN_BUFFERS, MAX_BUFFERS);
  gst_buffer_pool_config_set_allocator (structure, fbdevsink->allocator, NULL);
  if (!gst_buffer_pool_set_config (fbdevsink->pool, structure)) {
    GST_ERROR_OBJECT (fbdevsink, "set buffer pool failed");
    return FALSE;
  }

  return TRUE;
}

static gboolean
gst_imx_fbdevsink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
{
  GstImxFBDEVSink *fbdevsink = GST_IMX_FBDEVSINK (bsink);
  guint size = 0;
  GstCaps *caps;
  gboolean need_pool;
  GstCaps *pcaps;
  GstStructure *config;

  gst_query_parse_allocation (query, &caps, &need_pool);

  if (need_pool) {
    if (caps == NULL) {
      GST_ERROR_OBJECT (fbdevsink, "no caps specified");
      return FALSE;
    }

    GST_DEBUG_OBJECT (fbdevsink, "prosal set caps %" GST_PTR_FORMAT, caps);

    if (fbdevsink->pool) {
      // check caps, if caps not change, reuse previous pool
      config = gst_buffer_pool_get_config (fbdevsink->pool);
      gst_buffer_pool_config_get_params (config, &pcaps, &size, NULL, NULL);

      if (!gst_caps_is_equal (pcaps, caps)) {
        if (fbdevsink->last_buffer) {
          gst_buffer_unref (fbdevsink->last_buffer);
          fbdevsink->last_buffer = NULL;
        }

        gst_buffer_pool_set_active (fbdevsink->pool, FALSE);
        gst_object_unref (fbdevsink->pool);
        fbdevsink->pool = NULL;
      }
      gst_structure_free (config);
    }

    if (!fbdevsink->pool) {
      if (gst_imx_fbdevsink_setup_buffer_pool (fbdevsink, caps) < 0) {
        GST_ERROR_OBJECT (fbdevsink, "setup buffer pool failed");
        return FALSE;
      }
    }

    if (fbdevsink->pool) {
      config = gst_buffer_pool_get_config (fbdevsink->pool);
      gst_buffer_pool_config_get_params (config, &pcaps, &size, NULL, NULL);
      gst_structure_free (config);

      GST_INFO_OBJECT (fbdevsink, "propose_allocation, pool (%p)", fbdevsink->pool);

      gst_query_add_allocation_pool (query, fbdevsink->pool, size, MIN_BUFFERS, MAX_BUFFERS);
      gst_query_add_allocation_param (query, fbdevsink->allocator, NULL);
    } else {
      return FALSE;
    }
  }

  gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
  gst_query_add_allocation_meta (query, GST_VIDEO_CROP_META_API_TYPE, NULL);
  /* FIXME: add allocation meta for modifier format */
#if 0
  guint64 drm_modifier = 1;
  gst_query_add_allocation_dmabuf_meta (query, drm_modifier);
#endif
  return TRUE;
}

static GstFlowReturn
gst_imx_fbdevsink_show_frame (GstVideoSink * videosink, GstBuffer * buf)
{
  GstFlowReturn ret = GST_FLOW_OK;
  GstImxFBDEVSink *fbdevsink;
  GstMapInfo map;
  gint i, fb_size, n_mem;
  GstMemory *in_mem;
  GstVideoCropMeta *cropmeta = NULL;
  guintptr phys_addr = 0;;
  gint dma_fd;

  fbdevsink = GST_IMX_FBDEVSINK (videosink);
 
  if (!buf){
    GST_ERROR_OBJECT (fbdevsink, "invalid video buffer");
    return GST_FLOW_ERROR;
  }
  
  GST_DEBUG_OBJECT (fbdevsink, "buffer type phy %d dma %d",
      gst_buffer_is_phymem (buf),
      gst_is_dmabuf_memory (gst_buffer_peek_memory (buf, 0)));

  gst_buffer_ref (buf);

  /* FIXME: add cropmeta configure to display */
  cropmeta = gst_buffer_get_video_crop_meta (buf);
  if (gst_imx_fbdevsink_cropmeta_changed_and_set (cropmeta, &fbdevsink->cropmeta)){
  }

  in_mem = gst_buffer_peek_memory (buf, 0);
  if (gst_buffer_is_phymem (buf)) { 
    phys_addr = gst_phys_memory_get_phys_addr (in_mem);
  } else if (gst_is_dmabuf_memory (in_mem)){
    dma_fd = gst_dmabuf_memory_get_fd (in_mem);
    phys_addr = phy_addr_from_fd (dma_fd);
  } else { /* allocate dmabuf from buffer pool */
    GstBuffer *temp = NULL;
    GstVideoFrame frame1, frame2;
      
    GST_DEBUG_OBJECT(fbdevsink, "do buffer copy");

    gst_video_frame_map (&frame1, &fbdevsink->vinfo, buf, GST_MAP_READ);

    GstCaps *new_caps = gst_video_info_to_caps(&frame1.info);
    gst_video_info_from_caps(&fbdevsink->vinfo, new_caps); //update the size info

    if (!fbdevsink->pool) {
      gst_imx_fbdevsink_setup_buffer_pool (fbdevsink, new_caps);
      gst_caps_unref (new_caps);

      if (!fbdevsink->pool)
        return GST_FLOW_ERROR;
      
      GST_DEBUG_OBJECT(fbdevsink, "creating buffer pool %p", fbdevsink->pool);
    } else {
      gst_caps_unref (new_caps);
    }

    if (!gst_buffer_pool_is_active (fbdevsink->pool)) {
      if (gst_buffer_pool_set_active (fbdevsink->pool, TRUE) != TRUE) {
        GST_ERROR_OBJECT (fbdevsink, "active pool (%p) failed", fbdevsink->pool);
        return GST_FLOW_ERROR;
      }
    }

    gst_buffer_pool_acquire_buffer (fbdevsink->pool, &temp, NULL);
    if (!temp) {
      GST_ERROR_OBJECT (fbdevsink, "acquire buffer from pool failed");
      return GST_FLOW_ERROR;
    }

    gst_video_frame_map (&frame2, &fbdevsink->vinfo, temp, GST_MAP_WRITE);
    gst_video_frame_copy (&frame2, &frame1);
    gst_video_frame_unmap (&frame1);
    gst_video_frame_unmap (&frame2);

    GstVideoMeta *meta = gst_buffer_get_video_meta(buf);
    if (meta) {
      gst_buffer_add_video_meta(temp, meta->flags,
                                meta->format, meta->width, meta->height);
    }

    gst_buffer_unref (buf);
    buf = temp;
    in_mem = gst_buffer_peek_memory (buf, 0);
    dma_fd = gst_dmabuf_memory_get_fd (in_mem);
    phys_addr = phy_addr_from_fd (dma_fd);
  }

  /* config video geo and direction */
  GST_OBJECT_LOCK (fbdevsink);
  if (fbdevsink->need_reconfigure)
    gst_imx_fbdevsink_output_config (fbdevsink);
  GST_OBJECT_UNLOCK (fbdevsink);

  GST_DEBUG_OBJECT (fbdevsink, "pan display buffer paddr %x", phys_addr);
  if (phys_addr) {
    fbdevsink->varinfo.reserved[0] = phys_addr;
    if (ioctl(fbdevsink->fd, FBIOPAN_DISPLAY, &fbdevsink->varinfo) < 0) {
      GST_ERROR_OBJECT (fbdevsink, "pan display failed");
    }
  }
  GST_DEBUG_OBJECT (fbdevsink, "pan display successfully");

  if (fbdevsink->frame_showed == 0) {
    if (strcmp (fbdevsink->device, "/dev/fb0") != 0) {
      ioctl(fbdevsink->fd, FBIOBLANK, FB_BLANK_UNBLANK);
      fbdevsink->unblanked = TRUE;
    }
  }

  if (fbdevsink->last_buffer)
    gst_buffer_unref (fbdevsink->last_buffer);

  fbdevsink->last_buffer = buf;
  fbdevsink->frame_showed ++;

  return GST_FLOW_OK;
}

static gboolean
gst_imx_fbdevsink_start (GstBaseSink * bsink)
{
  GstImxFBDEVSink *fbdevsink;
  int fd;
  struct fb_var_screeninfo scrinfo;

  fbdevsink = GST_IMX_FBDEVSINK (bsink);

  fd = open (BG_DEVICE, O_RDWR);
  if (fd < 0) {
    GST_ERROR_OBJECT (fbdevsink, "can not open background device %s", BG_DEVICE);
    return FALSE;
  }

  if (ioctl (fd, FBIOGET_VSCREENINFO, &scrinfo) < 0) {
    GST_ERROR_OBJECT ("Get var of %s failed", BG_DEVICE);
    close (fd);
    return FALSE;
  }

  fbdevsink->display_width = scrinfo.xres;
  fbdevsink->display_height = scrinfo.yres;
  close (fd);

  /* default to use fb1 */
  if (!fbdevsink->device) {
    fbdevsink->device = g_strdup ("/dev/fb1");
  }

  fbdevsink->fd = open (fbdevsink->device, O_RDWR);

  if (fbdevsink->fd == -1) {
    GST_ERROR_OBJECT (fbdevsink, "can not open video device %s", fbdevsink->device);
    return FALSE;
  }

  return TRUE;
}

static gboolean
gst_imx_fbdevsink_stop (GstBaseSink * bsink)
{
  GstImxFBDEVSink *fbdevsink;

  fbdevsink = GST_IMX_FBDEVSINK (bsink);

  if (strcmp (fbdevsink->device, "/dev/fb0") != 0 && fbdevsink->unblanked)
    ioctl(fbdevsink->fd, FBIOBLANK, FB_BLANK_NORMAL);

  if (fbdevsink->var_stored) {
    if (ioctl (fbdevsink->fd, FBIOPUT_VSCREENINFO, &fbdevsink->stored) < 0) {
      GST_DEBUG("put var failed");
      return FALSE;
    }
  }
  
  if (close (fbdevsink->fd))
    return FALSE;

  return TRUE;
}

static void
gst_imx_fbdevsink_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstImxFBDEVSink *fbdevsink;

  fbdevsink = GST_IMX_FBDEVSINK (object);

  switch (prop_id) {
    case PROP_DEVICE:{
      g_free (fbdevsink->device);
      fbdevsink->device = g_value_dup_string (value);
      break;
    }
    case PROP_ROTATE_METHOD:
    case PROP_VIDEO_DIRECTION:{
      GST_OBJECT_LOCK (fbdevsink);
      fbdevsink->method = g_value_get_enum (value);
      fbdevsink->need_reconfigure = TRUE;
      GST_OBJECT_UNLOCK (fbdevsink);
      break;
    }
    case PROP_FORCE_ASPECT_RATIO:{
      fbdevsink->keep_ratio = g_value_get_boolean (value);
      break;
    }
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}


static void
gst_imx_fbdevsink_get_property (GObject * object, guint prop_id, GValue * value,
    GParamSpec * pspec)
{
  GstImxFBDEVSink *fbdevsink;

  fbdevsink = GST_IMX_FBDEVSINK (object);

  switch (prop_id) {
    case PROP_DEVICE:{
      g_value_set_string (value, fbdevsink->device);
      break;
    }
    case PROP_ROTATE_METHOD:
    case PROP_VIDEO_DIRECTION:{
      GST_OBJECT_LOCK (fbdevsink);
      g_value_set_enum (value, fbdevsink->method);
      GST_OBJECT_UNLOCK (fbdevsink);
      break;
    }
    case PROP_FORCE_ASPECT_RATIO:{
      g_value_set_boolean (value, fbdevsink->keep_ratio);
      break;
    }
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}

static GstStateChangeReturn
gst_imx_fbdevsink_change_state (GstElement * element, GstStateChange transition)
{
  GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;

  g_return_val_if_fail (GST_IS_IMX_FBDEVSINK (element), GST_STATE_CHANGE_FAILURE);

  GstImxFBDEVSink *fbdevsink = GST_IMX_FBDEVSINK (element);

  GST_DEBUG_OBJECT (fbdevsink, "changing state: %s => %s",
      gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
      gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));

  switch (transition) {
    case GST_STATE_CHANGE_NULL_TO_READY:
      break;
    case GST_STATE_CHANGE_READY_TO_PAUSED:
      fbdevsink->frame_showed = 0;
      fbdevsink->run_time = 0;
      fbdevsink->need_reconfigure = TRUE;
      fbdevsink->var_stored = FALSE;
      fbdevsink->unblanked = FALSE;
    default:
      break;
  }

  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);

  switch (transition) {
    case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
      fbdevsink->run_time = gst_element_get_start_time (element);
      break;
    case GST_STATE_CHANGE_PAUSED_TO_READY:
      {
        if (fbdevsink->run_time > 0) {
          g_print ("Total showed frames (%lld), device %s, playing for (%"GST_TIME_FORMAT"), fps (%.3f).\n",
              fbdevsink->frame_showed, fbdevsink->device, GST_TIME_ARGS (fbdevsink->run_time),
              (gfloat)GST_SECOND * fbdevsink->frame_showed / fbdevsink->run_time);
        }
        
        fbdevsink->frame_showed = 0;
        fbdevsink->run_time = 0;

        if (fbdevsink->last_buffer)
          gst_buffer_unref (fbdevsink->last_buffer);
        fbdevsink->last_buffer = NULL;

        if (fbdevsink->pool) {
          if (gst_buffer_pool_is_active (fbdevsink->pool)) {
            gst_buffer_pool_set_active (fbdevsink->pool, FALSE);
          }
          gst_object_unref (fbdevsink->pool);
          fbdevsink->pool = NULL;
        }

        if (fbdevsink->allocator) {
          gst_object_unref (fbdevsink->allocator);
          fbdevsink->allocator = NULL;
        }
      }
      break;
    default:
      break;
  }
  return ret;
}

static gboolean
plugin_init (GstPlugin * plugin)
{
  if (HAS_DCSS()) {
    GST_DEBUG_CATEGORY_INIT (imx_fbdevsink_debug, "imxfbdevsink", 0, "Freescale IMX framebuffer video sink element");
    if (!gst_element_register (plugin, "imxfbdevsink", GST_RANK_NONE,
            GST_TYPE_IMX_FBDEVSINK))
      return FALSE;
  } else {
    return FALSE;
  }

  return TRUE;
}

IMX_GST_PLUGIN_DEFINE (imxfbdevsink, "IMX framebuffer device videosink", plugin_init);

static void
gst_imx_fbdevsink_class_init (GstImxFBDEVSinkClass * klass)
{
  GObjectClass *gobject_class;
  GstElementClass *gstelement_class;
  GstBaseSinkClass *basesink_class;
  GstVideoSinkClass *videosink_class;

  gobject_class = (GObjectClass *) klass;
  gstelement_class = (GstElementClass *) klass;
  basesink_class = (GstBaseSinkClass *) klass;
  videosink_class = (GstVideoSinkClass *) klass;

  gobject_class->set_property = gst_imx_fbdevsink_set_property;
  gobject_class->get_property = gst_imx_fbdevsink_get_property;
  gobject_class->finalize = gst_imx_fbdevsink_finalize;

  gstelement_class->change_state =
      GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_change_state);

  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DEVICE,
      g_param_spec_string ("device", "device",
          "The framebuffer device eg: /dev/fb1", NULL, G_PARAM_READWRITE));

  /* this property is for compatible with gplay rotate interface */
  g_object_class_install_property (gobject_class, PROP_ROTATE_METHOD,
      g_param_spec_enum ("rotate-method",
        "rotate method",
        "get/set the rotation of the video",
        GST_TYPE_IMX_ROTATE_METHOD,
        DEFAULT_IMX_ROTATE_METHOD,
        G_PARAM_READWRITE));
  g_object_class_override_property (gobject_class, PROP_VIDEO_DIRECTION,
      "video-direction");

  g_object_class_install_property (gobject_class, PROP_FORCE_ASPECT_RATIO,
      g_param_spec_boolean ("force-aspect-ratio",
        "Force aspect ratio",
        "When enabled, scaling will respect original aspect ratio",
        TRUE,
        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));

  basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_setcaps);
  basesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_getcaps);
  basesink_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_propose_allocation);
  basesink_class->start = GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_start);
  basesink_class->stop = GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_stop);

  videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_imx_fbdevsink_show_frame);

  gst_element_class_set_static_metadata (gstelement_class, "imx fbdev video sink",
      "Sink/Video", "Linux framebuffer videosink for i.Mx",
      IMX_GST_PLUGIN_AUTHOR);

  gst_element_class_add_static_pad_template (gstelement_class, &sink_template);
}

static void
gst_imx_fbdevsink_finalize (GObject * object)
{
  GstImxFBDEVSink *fbdevsink = GST_IMX_FBDEVSINK (object);
  
  if (fbdevsink->imxoverlay) {
    gst_imx_video_overlay_finalize (fbdevsink->imxoverlay);
    fbdevsink->imxoverlay = NULL;
  }

  g_free (fbdevsink->device);

  G_OBJECT_CLASS (parent_class)->finalize (object);
}
