@@ -948,3 +948,45 @@ int v4l2_subdev_supports_v4l2_ctrl(struct media_device *media,
return 0;
}
+
+enum v4l2_subdev_fmt_mismatch v4l2_subdev_format_compare(
+ struct v4l2_mbus_framefmt *fmt1,
+ struct v4l2_mbus_framefmt *fmt2)
+{
+ if (fmt1 == NULL || fmt2 == NULL)
+ return 0;
+
+ if (fmt1->width != fmt2->width) {
+ printf("width mismatch (fmt1: %d, fmt2: %d)\n",
+ fmt1->width, fmt2->width);
+ return FMT_MISMATCH_WIDTH;
+ }
+
+ if (fmt1->height != fmt2->height) {
+ printf("height mismatch (fmt1: %d, fmt2: %d)\n",
+ fmt1->height, fmt2->height);
+ return FMT_MISMATCH_HEIGHT;
+ }
+
+ if (fmt1->code != fmt2->code) {
+ printf("mbus code mismatch (fmt1: %s, fmt2: %s)\n",
+ v4l2_subdev_pixelcode_to_string(fmt1->code),
+ v4l2_subdev_pixelcode_to_string(fmt2->code));
+ return FMT_MISMATCH_CODE;
+ }
+
+ if (fmt1->field != fmt2->field) {
+ printf("field mismatch (fmt1: %d, fmt2: %d)\n",
+ fmt1->field, fmt2->field);
+ return FMT_MISMATCH_FIELD;
+ }
+
+ if (fmt1->colorspace != fmt2->colorspace) {
+ printf("colorspace mismatch (fmt1: %s, fmt2: %s)\n",
+ v4l2_subdev_colorspace_to_string(fmt1->colorspace),
+ v4l2_subdev_colorspace_to_string(fmt2->colorspace));
+ return FMT_MISMATCH_COLORSPACE;
+ }
+
+ return FMT_MISMATCH_NONE;
+}
@@ -28,6 +28,15 @@ struct media_device;
struct media_entity;
struct media_device;
+enum v4l2_subdev_fmt_mismatch {
+ FMT_MISMATCH_NONE = 0,
+ FMT_MISMATCH_WIDTH,
+ FMT_MISMATCH_HEIGHT,
+ FMT_MISMATCH_CODE,
+ FMT_MISMATCH_FIELD,
+ FMT_MISMATCH_COLORSPACE,
+};
+
struct v4l2_subdev {
int fd;
unsigned int fd_owner:1;
@@ -342,5 +351,17 @@ const enum v4l2_mbus_pixelcode *v4l2_subdev_pixelcode_list(
int v4l2_subdev_supports_v4l2_ctrl(struct media_device *device,
struct media_entity *entity,
__u32 ctrl_id);
+/**
+ * @brief Compare mbus formats
+ * @param fmt1 - 1st mbus format to compare.
+ * @param fmt2 - 2nd mbus format to compare.
+ *
+ * Check whether two mbus formats are compatible.
+ *
+ * @return 1 if formats are compatible, 0 otherwise.
+ */
+enum v4l2_subdev_fmt_mismatch v4l2_subdev_format_compare(
+ struct v4l2_mbus_framefmt *fmt1,
+ struct v4l2_mbus_framefmt *fmt2);
#endif