kurento源码分析之:AlphaBlending配置端口的布局

static void
configure_port (KmsAlphaBlendingData * port_data)
{
  KmsAlphaBlending *mixer = port_data->mixer;
  GstCaps *filtercaps;
  if (port_data->configured) {
    gint _relative_x, _relative_y, _relative_width, _relative_height;

    //显示的x坐标 port_data->relative_x范围为0-1,一般为小数

   _relative_x = port_data->relative_x * mixer->priv->output_width;

   //显示的y坐标 port_data->relative_y范围为0-1,一般为小数

   _relative_y = port_data->relative_y * mixer->priv->output_height;

     //要显示的视频的宽

     _relative_width = port_data->relative_width * mixer->priv->output_width;

      //要显示视频的高

    _relative_height = port_data->relative_height * mixer->priv->output_height;



    filtercaps =
        gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, "AYUV",
        "width", G_TYPE_INT, _relative_width, "height",
        G_TYPE_INT, _relative_height, "framerate", GST_TYPE_FRACTION, 15, 1,
        NULL);


    if (port_data->videobox != NULL) {
      int left = 0;
      int right = 0;
      int top = 0;
      int bottom = 0;

     //计算要裁剪图片的位置
      if (_relative_x > 0) {
        int width_size =
            (mixer->priv->output_width - (mixer->priv->output_width -
                _relative_x));
        if (_relative_width > width_size) {
          right = (_relative_width - width_size);
        }
      } else {
        left = -1 * _relative_x;
        if ((_relative_width - left) > mixer->priv->output_width) {
          right = (_relative_width - left) - mixer->priv->output_width;
        }
      }

      //计算要裁剪图片的位置
      if (_relative_y > 0) {
        int height_size =
            (mixer->priv->output_height - (mixer->priv->output_height -
                _relative_y));
        if (_relative_height > height_size) {
          bottom = (_relative_height - height_size);
        }
      } else {
        top = -1 * _relative_y;
        if ((_relative_height - top) > mixer->priv->output_height) {
          bottom = (_relative_height - top) - mixer->priv->output_height;
        }

      }

     //算出目标输出视频的宽高后,给videobox进行裁剪,left表示从图片的坐标大小开始裁剪,为0,则左边保持原来的样子,

right,top,bottom依次如此。

      g_object_set (port_data->videobox, "right", right, "left", left, "top",
          top, "bottom", bottom, NULL);
    }
    if (port_data->video_mixer_pad != NULL) {
      int aux_x = _relative_x;
      int aux_y = _relative_y;
      if (aux_x < 0) {//坐标最小为0
        aux_x = 0;
      }

      if (aux_y < 0) {//坐标最小为0
        aux_y = 0;
      }
      将此路视频的布局坐标设置好,设置显示对应视频的位置
      g_object_set (port_data->video_mixer_pad, "xpos", aux_x, "ypos", aux_y,
          "zorder", port_data->z_order, "alpha", 1.0, NULL);
    }

  } 








猜你喜欢

转载自blog.csdn.net/liuweihui521/article/details/80634329