Ejemplo n.º 1
0
static GstFlowReturn
gst_alpha_color_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf)
{
  GstFlowReturn ret = GST_FLOW_OK;
  GstAlphaColor *alpha;

  alpha = GST_ALPHA_COLOR (btrans);

  /* Transform in place */
  if (alpha->in_rgba)
    transform_rgb (GST_BUFFER_DATA (inbuf), GST_BUFFER_SIZE (inbuf));
  else
    transform_bgr (GST_BUFFER_DATA (inbuf), GST_BUFFER_SIZE (inbuf));

  return ret;
}
Ejemplo n.º 2
0
static gboolean
gst_alpha_color_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
    GstCaps * outcaps)
{
  GstAlphaColor *alpha;
  GstStructure *structure;
  gboolean ret;
  const GValue *fps;
  gint red_mask, alpha_mask;
  gint w, h, depth, bpp;

  alpha = GST_ALPHA_COLOR (btrans);
  structure = gst_caps_get_structure (incaps, 0);

  ret = gst_structure_get_int (structure, "width", &w);
  ret &= gst_structure_get_int (structure, "height", &h);
  fps = gst_structure_get_value (structure, "framerate");
  ret &= (fps != NULL && GST_VALUE_HOLDS_FRACTION (fps));
  ret &= gst_structure_get_int (structure, "red_mask", &red_mask);

  /* make sure these are really full RGBA caps */
  ret &= gst_structure_get_int (structure, "alpha_mask", &alpha_mask);
  ret &= gst_structure_get_int (structure, "depth", &depth);
  ret &= gst_structure_get_int (structure, "bpp", &bpp);

  if (!ret || alpha_mask == 0 || red_mask == 0 || depth != 32 || bpp != 32) {
    GST_DEBUG_OBJECT (alpha, "incomplete or non-RGBA input caps!");
    return FALSE;
  }

  alpha->in_width = w;
  alpha->in_height = h;
  alpha->in_rgba = TRUE;
#if (G_BYTE_ORDER == G_BIG_ENDIAN)
  if (red_mask != 0x000000ff)
#else
  if (red_mask != 0xff000000)
#endif
    alpha->in_rgba = FALSE;

  return TRUE;
}
static GstFlowReturn
gst_alpha_color_transform_frame_ip (GstVideoFilter * filter,
    GstVideoFrame * frame)
{
  GstAlphaColor *alpha = GST_ALPHA_COLOR (filter);

  if (G_UNLIKELY (!alpha->process))
    goto not_negotiated;

  /* Transform in place */
  alpha->process (frame, alpha->matrix);

  return GST_FLOW_OK;

  /* ERRORS */
not_negotiated:
  {
    GST_ERROR_OBJECT (alpha, "Not negotiated yet");
    return GST_FLOW_NOT_NEGOTIATED;
  }
}
static gboolean
gst_alpha_color_set_info (GstVideoFilter * filter, GstCaps * incaps,
    GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info)
{
  GstAlphaColor *alpha = GST_ALPHA_COLOR (filter);
  gboolean in_sdtv, out_sdtv;

  alpha->process = NULL;
  alpha->matrix = NULL;

  if (GST_VIDEO_INFO_WIDTH (in_info) != GST_VIDEO_INFO_WIDTH (out_info) ||
      GST_VIDEO_INFO_HEIGHT (in_info) != GST_VIDEO_INFO_HEIGHT (out_info))
    goto invalid_caps;

  in_sdtv = in_info->colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601;
  out_sdtv = out_info->colorimetry.matrix == GST_VIDEO_COLOR_MATRIX_BT601;

  switch (GST_VIDEO_INFO_FORMAT (in_info)) {
    case GST_VIDEO_FORMAT_ARGB:
      switch (GST_VIDEO_INFO_FORMAT (out_info)) {
        case GST_VIDEO_FORMAT_ARGB:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_BGRA:
          alpha->process = transform_argb_bgra;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_ABGR:
          alpha->process = transform_argb_abgr;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_RGBA:
          alpha->process = transform_argb_rgba;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_AYUV:
          alpha->process = transform_argb_ayuv;
          alpha->matrix =
              out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
              cog_rgb_to_ycbcr_matrix_8bit_hdtv;
          break;
        default:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
      }
      break;
    case GST_VIDEO_FORMAT_BGRA:
      switch (GST_VIDEO_INFO_FORMAT (out_info)) {
        case GST_VIDEO_FORMAT_BGRA:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_ARGB:
          alpha->process = transform_bgra_argb;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_ABGR:
          alpha->process = transform_bgra_abgr;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_RGBA:
          alpha->process = transform_bgra_rgba;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_AYUV:
          alpha->process = transform_bgra_ayuv;
          alpha->matrix =
              out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
              cog_rgb_to_ycbcr_matrix_8bit_hdtv;
          break;
        default:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
      }
      break;
    case GST_VIDEO_FORMAT_ABGR:
      switch (GST_VIDEO_INFO_FORMAT (out_info)) {
        case GST_VIDEO_FORMAT_ABGR:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_RGBA:
          alpha->process = transform_abgr_rgba;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_ARGB:
          alpha->process = transform_abgr_argb;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_BGRA:
          alpha->process = transform_abgr_bgra;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_AYUV:
          alpha->process = transform_abgr_ayuv;
          alpha->matrix =
              out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
              cog_rgb_to_ycbcr_matrix_8bit_hdtv;
          break;
        default:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
      }
      break;
    case GST_VIDEO_FORMAT_RGBA:
      switch (GST_VIDEO_INFO_FORMAT (out_info)) {
        case GST_VIDEO_FORMAT_RGBA:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_ARGB:
          alpha->process = transform_rgba_argb;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_ABGR:
          alpha->process = transform_rgba_abgr;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_BGRA:
          alpha->process = transform_rgba_bgra;
          alpha->matrix = NULL;
          break;
        case GST_VIDEO_FORMAT_AYUV:
          alpha->process = transform_rgba_ayuv;
          alpha->matrix =
              out_sdtv ? cog_rgb_to_ycbcr_matrix_8bit_sdtv :
              cog_rgb_to_ycbcr_matrix_8bit_hdtv;
          break;
        default:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
      }
      break;
    case GST_VIDEO_FORMAT_AYUV:
      switch (GST_VIDEO_INFO_FORMAT (out_info)) {
        case GST_VIDEO_FORMAT_AYUV:
          if (in_sdtv == out_sdtv) {
            alpha->process = transform_ayuv_ayuv;
            alpha->matrix = NULL;
          } else {
            alpha->process = transform_ayuv_ayuv;
            alpha->matrix =
                out_sdtv ? cog_ycbcr_hdtv_to_ycbcr_sdtv_matrix_8bit :
                cog_ycbcr_sdtv_to_ycbcr_hdtv_matrix_8bit;
          }
          break;
        case GST_VIDEO_FORMAT_ARGB:
          alpha->process = transform_ayuv_argb;
          alpha->matrix =
              in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
              cog_ycbcr_to_rgb_matrix_8bit_hdtv;
          break;
        case GST_VIDEO_FORMAT_BGRA:
          alpha->process = transform_ayuv_bgra;
          alpha->matrix =
              in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
              cog_ycbcr_to_rgb_matrix_8bit_hdtv;
          break;
        case GST_VIDEO_FORMAT_ABGR:
          alpha->process = transform_ayuv_abgr;
          alpha->matrix =
              in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
              cog_ycbcr_to_rgb_matrix_8bit_hdtv;
          break;
        case GST_VIDEO_FORMAT_RGBA:
          alpha->process = transform_ayuv_rgba;
          alpha->matrix =
              in_sdtv ? cog_ycbcr_to_rgb_matrix_8bit_sdtv :
              cog_ycbcr_to_rgb_matrix_8bit_hdtv;
          break;
        default:
          alpha->process = NULL;
          alpha->matrix = NULL;
          break;
      }
      break;
    default:
      alpha->process = NULL;
      alpha->matrix = NULL;
      break;
  }

  if (GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_INFO_FORMAT (out_info)
      && in_sdtv == out_sdtv)
    gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (filter), TRUE);
  else if (!alpha->process)
    goto no_process;

  return TRUE;

  /* ERRORS */
invalid_caps:
  {
    GST_DEBUG_OBJECT (alpha, "incomplete or invalid caps");
    return FALSE;
  }
no_process:
  {
    GST_DEBUG_OBJECT (alpha, "could not find process function");
    return FALSE;
  }
}