Exemplo n.º 1
0
static GstFlowReturn
gst_quarktv_transform_frame (GstVideoFilter * vfilter, GstVideoFrame * in_frame,
                             GstVideoFrame * out_frame)
{
    GstQuarkTV *filter = GST_QUARKTV (vfilter);
    gint area;
    guint32 *src, *dest;
    GstClockTime timestamp;
    GstBuffer **planetable;
    gint planes, current_plane;

    timestamp = GST_BUFFER_TIMESTAMP (in_frame->buffer);
    timestamp =
        gst_segment_to_stream_time (&GST_BASE_TRANSFORM (vfilter)->segment,
                                    GST_FORMAT_TIME, timestamp);

    GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT,
                      GST_TIME_ARGS (timestamp));

    if (GST_CLOCK_TIME_IS_VALID (timestamp))
        gst_object_sync_values (GST_OBJECT (filter), timestamp);

    if (G_UNLIKELY (filter->planetable == NULL))
        return GST_FLOW_FLUSHING;

    src = GST_VIDEO_FRAME_PLANE_DATA (in_frame, 0);
    dest = GST_VIDEO_FRAME_PLANE_DATA (out_frame, 0);

    GST_OBJECT_LOCK (filter);
    area = filter->area;
    planetable = filter->planetable;
    planes = filter->planes;
    current_plane = filter->current_plane;

    if (planetable[current_plane])
        gst_buffer_unref (planetable[current_plane]);
    planetable[current_plane] = gst_buffer_ref (in_frame->buffer);

    /* For each pixel */
    while (--area) {
        GstBuffer *rand;

        /* pick a random buffer */
        rand = planetable[(current_plane + (fastrand () >> 24)) % planes];

        /* Copy the pixel from the random buffer to dest, FIXME, slow */
        if (rand)
            gst_buffer_extract (rand, area * 4, &dest[area], 4);
        else
            dest[area] = src[area];
    }

    filter->current_plane--;
    if (filter->current_plane < 0)
        filter->current_plane = planes - 1;
    GST_OBJECT_UNLOCK (filter);

    return GST_FLOW_OK;
}
Exemplo n.º 2
0
static GstFlowReturn
gst_quarktv_transform (GstBaseTransform * trans, GstBuffer * in,
    GstBuffer * out)
{
  GstQuarkTV *filter = GST_QUARKTV (trans);
  gint area;
  guint32 *src, *dest;
  GstFlowReturn ret = GST_FLOW_OK;
  GstClockTime timestamp;
  GstBuffer **planetable;
  gint planes, current_plane;

  timestamp = GST_BUFFER_TIMESTAMP (in);
  timestamp =
      gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, timestamp);

  GST_DEBUG_OBJECT (filter, "sync to %" GST_TIME_FORMAT,
      GST_TIME_ARGS (timestamp));

  if (GST_CLOCK_TIME_IS_VALID (timestamp))
    gst_object_sync_values (G_OBJECT (filter), timestamp);

  if (G_UNLIKELY (filter->planetable == NULL))
    return GST_FLOW_WRONG_STATE;

  GST_OBJECT_LOCK (filter);
  area = filter->area;
  src = (guint32 *) GST_BUFFER_DATA (in);
  dest = (guint32 *) GST_BUFFER_DATA (out);
  planetable = filter->planetable;
  planes = filter->planes;
  current_plane = filter->current_plane;

  if (planetable[current_plane])
    gst_buffer_unref (planetable[current_plane]);
  planetable[current_plane] = gst_buffer_ref (in);

  /* For each pixel */
  while (--area) {
    GstBuffer *rand;

    /* pick a random buffer */
    rand = planetable[(current_plane + (fastrand () >> 24)) % planes];

    /* Copy the pixel from the random buffer to dest */
    dest[area] =
        (rand ? ((guint32 *) GST_BUFFER_DATA (rand))[area] : src[area]);
  }

  filter->current_plane--;
  if (filter->current_plane < 0)
    filter->current_plane = planes - 1;
  GST_OBJECT_UNLOCK (filter);

  return ret;
}
Exemplo n.º 3
0
static void
gst_quarktv_finalize (GObject * object)
{
  GstQuarkTV *filter = GST_QUARKTV (object);

  if (filter->planetable) {
    gst_quarktv_planetable_clear (filter);
    g_free (filter->planetable);
    filter->planetable = NULL;
  }

  G_OBJECT_CLASS (parent_class)->finalize (object);
}
Exemplo n.º 4
0
static gboolean
gst_quarktv_start (GstBaseTransform * trans)
{
  GstQuarkTV *filter = GST_QUARKTV (trans);

  if (filter->planetable) {
    gst_quarktv_planetable_clear (filter);
    g_free (filter->planetable);
  }
  filter->planetable =
      (GstBuffer **) g_malloc0 (filter->planes * sizeof (GstBuffer *));

  return TRUE;
}
Exemplo n.º 5
0
static void
gst_quarktv_get_property (GObject * object, guint prop_id, GValue * value,
    GParamSpec * pspec)
{
  GstQuarkTV *filter = GST_QUARKTV (object);

  switch (prop_id) {
    case PROP_PLANES:
      g_value_set_int (value, filter->planes);
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}
Exemplo n.º 6
0
static gboolean
gst_quarktv_set_info (GstVideoFilter * vfilter, GstCaps * incaps,
                      GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info)
{
    GstQuarkTV *filter = GST_QUARKTV (vfilter);
    gint width, height;

    width = GST_VIDEO_INFO_WIDTH (in_info);
    height = GST_VIDEO_INFO_HEIGHT (in_info);

    gst_quarktv_planetable_clear (filter);
    filter->area = width * height;

    return TRUE;
}
Exemplo n.º 7
0
static void
gst_quarktv_set_property (GObject * object, guint prop_id, const GValue * value,
    GParamSpec * pspec)
{
  GstQuarkTV *filter = GST_QUARKTV (object);

  GST_OBJECT_LOCK (filter);
  switch (prop_id) {
    case PROP_PLANES:
    {
      gint new_n_planes = g_value_get_int (value);
      GstBuffer **new_planetable;
      gint i;

      /* If the number of planes changed, copy across any existing planes */
      if (new_n_planes != filter->planes) {
        new_planetable =
            (GstBuffer **) g_malloc0 (new_n_planes * sizeof (GstBuffer *));

        if (filter->planetable) {
          for (i = 0; (i < new_n_planes) && (i < filter->planes); i++) {
            new_planetable[i] = filter->planetable[i];
          }
          for (; i < filter->planes; i++) {
            if (filter->planetable[i])
              gst_buffer_unref (filter->planetable[i]);
          }
          g_free (filter->planetable);
        }

        filter->planetable = new_planetable;
        filter->planes = new_n_planes;
        filter->current_plane = filter->planes - 1;
      }
      break;
    }
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
  GST_OBJECT_UNLOCK (filter);
}
Exemplo n.º 8
0
static gboolean
gst_quarktv_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
    GstCaps * outcaps)
{
  GstQuarkTV *filter = GST_QUARKTV (btrans);
  GstStructure *structure;
  gboolean ret = FALSE;

  structure = gst_caps_get_structure (incaps, 0);

  GST_OBJECT_LOCK (filter);
  if (gst_structure_get_int (structure, "width", &filter->width) &&
      gst_structure_get_int (structure, "height", &filter->height)) {
    gst_quarktv_planetable_clear (filter);
    filter->area = filter->width * filter->height;
    ret = TRUE;
  }
  GST_OBJECT_UNLOCK (filter);

  return ret;
}