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;
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;
}
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);
}
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);
}
}