Gstreamer中caps的交集比较特殊,有一个函数是:gst_caps_intersect_full()
GstCaps *
gst_caps_intersect_full(GstCaps *caps1, GstCaps *caps2,
GstCapsIntersectMode mode)
{
switch (mode)
{
case GST_CAPS_INTERSECT_FIRST:
retCaps = gst_caps_intersect_first(caps1, caps2);
case GST_CAPS_INTERSECT_ZIG_ZAG:
retCaps = gst_caps_intersect_zig_zag(caps1, caps2);
}
return retCaps;
}
有两种模式,但是结果都一样,下面看一个案例:
caps1:
video/x-raw, \
format=(string){ NV16_10LE32, NV12_10LE32, NV16, YUY2, YVYU, UABGR, ARGB, GRAY8 }, \
width=(int)[ 1, 2147483647 ], \
height=(int)[ 1, 2147483647 ], \
framerate=(fraction)[ 0/1, 2147483647/1 ]
caps2:
video/x-raw, \
format=(string){ ABGR64_LE, GRAY16_BE, GRAY10_LE32, GRAY8, NV16 }, \
width=(int)[ 1, 32767 ], \
height=(int)[ 1, 32767 ], \
framerate=(fraction)[ 0/1, 2147483647/1 ];
video/x-raw(ANY), \
format=(string){ ABGR64},\
width=(int)[ 1, 32767 ], \
height=(int)[ 1, 32767 ], \
framerate=(fraction)[ 0/1, 2147483647/1 ]
它们俩的交集是:
video/x-raw, \
format=(string){ ABGR64_LE},
width=(int)[ 1, 32767 ], \
height=(int)[ 1, 32767 ], \
framerate=(fraction)[ 0/1, 2147483647/1 ]
从上面案例可以看出,交集首先是对每个caps中的gst_struct名称进行对比,名称一样的才进行 ,比如上面video/x-raw,,caps2中的video/x-raw(ANY)在caps1中没有同名称的gst_struct,所以直接就忽略了,然后只对caps1和caps2中的video/x-raw进行交集,交集的时候对内部相同的key进行交集,比如format交集以后就只有ABGR64_LE了,
要继续往下看,重点在后面
接着再看一个:
caps1:
video/x-h264, \
width=(int)[ 1, 2147483647 ], \
height=(int)[ 1, 2147483647 ], \
framerate=(fraction)[ 0/1, 2147483647/1 ]
caps2:
video/x-h264, \
alignment=(string)au, \
stream-format=(string)byte-stream, \
width=(int)[ 1, 2147483647 ], \
height=(int)[ 1, 2147483647 ]
它俩交集:
video/x-h264, \
width=(int)[ 1, 2147483647 ], \
height=(int)[ 1, 2147483647 ], \
framerate=(fraction)[ 0/1, 2147483647/1 ], \
alignment=(string)au, \
stream-format=(string)byte-stream
从结果看到两个video/x-h264的key进行了并集,就是说gst_caps_intersect_full(caps1,caps2,GST_CAPS_INTERSECT_FIRST)
后交集是对同名称的key中的value进行交集,但是对于caps1和caps2中的key进行并集。
其实想想也是可以明白的,key多一点也没事,大不了不用,那就把caps1和caps2包含的所有key都包含进来,只对两个caps中的同key进行交集就可以了。