示例#1
0
static GstFlowReturn
gst_colorconvert_transform_ip (GstBaseTransform * base_transform,
    GstBuffer * buf)
{
  GstColorconvert *li;
  CogFrame *frame;
  CogFrame *vf;

  g_return_val_if_fail (GST_IS_COLORCONVERT (base_transform), GST_FLOW_ERROR);
  li = GST_COLORCONVERT (base_transform);

  frame = gst_cog_buffer_wrap (gst_buffer_ref (buf),
      li->format, li->width, li->height);

  vf = cog_virt_frame_new_unpack (cog_frame_ref (frame));
  vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_444,
      COG_CHROMA_SITE_MPEG2, 2);
  vf = cog_virt_frame_new_color_transform (vf);
  if (frame->format == COG_FRAME_FORMAT_YUYV) {
    vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_422,
        COG_CHROMA_SITE_MPEG2, 2);
    vf = cog_virt_frame_new_pack_YUY2 (vf);
  } else if (frame->format == COG_FRAME_FORMAT_UYVY) {
    vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_422,
        COG_CHROMA_SITE_MPEG2, 2);
    vf = cog_virt_frame_new_pack_UYVY (vf);
  } else if (frame->format == COG_FRAME_FORMAT_AYUV) {
    vf = cog_virt_frame_new_pack_AYUV (vf);
  } else if (frame->format == COG_FRAME_FORMAT_U8_420) {
    vf = cog_virt_frame_new_subsample (vf, COG_FRAME_FORMAT_U8_420,
        COG_CHROMA_SITE_MPEG2, 2);
  } else {
    g_assert_not_reached ();
  }

  cog_virt_frame_render (vf, frame);

  cog_frame_unref (frame);
  cog_frame_unref (vf);

  return GST_FLOW_OK;
}
示例#2
0
static GstFlowReturn
gst_cogdownsample_transform (GstBaseTransform * base_transform,
    GstBuffer * inbuf, GstBuffer * outbuf)
{
  GstCogdownsample *compress;
  CogFrame *outframe;
  int width, height;
  uint32_t format;
  CogFrame *frame;

  g_return_val_if_fail (GST_IS_COGDOWNSAMPLE (base_transform), GST_FLOW_ERROR);
  compress = GST_COGDOWNSAMPLE (base_transform);

  gst_structure_get_fourcc (gst_caps_get_structure (inbuf->caps, 0),
      "format", &format);
  gst_structure_get_int (gst_caps_get_structure (inbuf->caps, 0),
      "width", &width);
  gst_structure_get_int (gst_caps_get_structure (inbuf->caps, 0),
      "height", &height);

  switch (format) {
    case GST_MAKE_FOURCC ('I', '4', '2', '0'):
      frame = cog_frame_new_from_data_I420 (GST_BUFFER_DATA (inbuf),
          width, height);
      outframe = cog_frame_new_from_data_I420 (GST_BUFFER_DATA (outbuf),
          width / 2, height / 2);
      break;
    case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):
      frame = cog_frame_new_from_data_YV12 (GST_BUFFER_DATA (inbuf),
          width, height);
      outframe = cog_frame_new_from_data_YV12 (GST_BUFFER_DATA (outbuf),
          width / 2, height / 2);
      break;
    case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
      frame = cog_frame_new_from_data_YUY2 (GST_BUFFER_DATA (inbuf),
          width, height);
      outframe = cog_frame_new_from_data_YUY2 (GST_BUFFER_DATA (outbuf),
          width / 2, height / 2);
      break;
    case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
      frame = cog_frame_new_from_data_UYVY (GST_BUFFER_DATA (inbuf),
          width, height);
      outframe = cog_frame_new_from_data_UYVY (GST_BUFFER_DATA (outbuf),
          width / 2, height / 2);
      break;
    case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'):
      frame = cog_frame_new_from_data_AYUV (GST_BUFFER_DATA (inbuf),
          width, height);
      outframe = cog_frame_new_from_data_AYUV (GST_BUFFER_DATA (outbuf),
          width / 2, height / 2);
      break;
    default:
      g_assert_not_reached ();
  }

  frame = cog_virt_frame_new_unpack (frame);
  frame = cog_virt_frame_new_horiz_downsample (frame, 3);
  frame = cog_virt_frame_new_vert_downsample (frame, 2);

  switch (format) {
    case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
      frame = cog_virt_frame_new_pack_YUY2 (frame);
      break;
    case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'):
      frame = cog_virt_frame_new_pack_UYVY (frame);
      break;
    case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'):
      frame = cog_virt_frame_new_pack_AYUV (frame);
      break;
    default:
      break;
  }

  cog_virt_frame_render (frame, outframe);
  cog_frame_unref (frame);
  cog_frame_unref (outframe);

  return GST_FLOW_OK;
}
示例#3
0
static GstFlowReturn
gst_logoinsert_transform_ip (GstBaseTransform * base_transform, GstBuffer * buf)
{
  GstLogoinsert *li;
  CogFrame *frame;

  g_return_val_if_fail (GST_IS_LOGOINSERT (base_transform), GST_FLOW_ERROR);
  li = GST_LOGOINSERT (base_transform);

  if (li->argb_frame == NULL)
    return GST_FLOW_OK;

  frame = gst_cog_buffer_wrap (gst_buffer_ref (buf),
      li->format, li->width, li->height);

  if (li->overlay_frame == NULL) {
    CogFrame *f;

    f = cog_virt_frame_extract_alpha (cog_frame_ref (li->argb_frame));
    f = cog_virt_frame_new_subsample (f, frame->format,
        COG_CHROMA_SITE_MPEG2, 2);
    li->alpha_frame = cog_frame_realize (f);

    f = cog_virt_frame_new_unpack (cog_frame_ref (li->argb_frame));
    f = cog_virt_frame_new_color_matrix_RGB_to_YCbCr (f, COG_COLOR_MATRIX_SDTV,
        8);
    f = cog_virt_frame_new_subsample (f, frame->format,
        COG_CHROMA_SITE_MPEG2, 2);
    li->overlay_frame = cog_frame_realize (f);
  }

  if (1) {
    int i, j;
    int k;
    guint8 *dest;
    guint8 *src;
    guint8 *alpha;
    int offset_x, offset_y;

    for (k = 0; k < 3; k++) {
      offset_x = frame->components[k].width -
          li->alpha_frame->components[k].width;
      offset_y = frame->components[k].height -
          li->alpha_frame->components[k].height;

      for (j = 0; j < li->overlay_frame->components[k].height; j++) {
        dest = COG_FRAME_DATA_GET_LINE (frame->components + k, j + offset_y);
        src = COG_FRAME_DATA_GET_LINE (li->overlay_frame->components + k, j);
        alpha = COG_FRAME_DATA_GET_LINE (li->alpha_frame->components + k, j);

#define oil_divide_255(x) ((((x)+128) + (((x)+128)>>8))>>8)

        for (i = 0; i < li->overlay_frame->components[k].width; i++) {
          dest[i + offset_x] =
              oil_divide_255 (src[i] * alpha[i] + dest[i + offset_x] * (255 -
                  alpha[i]));
        }
      }
    }
  }

  cog_frame_unref (frame);

  return GST_FLOW_OK;
}