Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb3fb7c9 authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

[media] gspca: Add a need_max_bandwidth flag to sd_desc



Some cameras will pretty much entirely fill all the image buffers all the
time even though they are using compression.

This patch adds a flag to sd_desc, which drivers for such cameras can set.

When this flag is set the bandwidth calculation code will no longer
assume that the image buffer size is a worst case and less bandwidth than
imagebufsize * fps will be used on average.

This patch sets this new flag for 3 drivers:
* For spca561 (for rev12a cameras) and nw80x cams as these simply don't work
  when given less bandwidth than imagebufsize * fps.
* For sn9c20x cameras, because these show severy jpeg artifacts when
  given less bandwidth than imagebufsize * fps and since these are usb2
  cameras there is plenty bandwidth anyways.

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarJean-François Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 51e23be2
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -638,7 +638,8 @@ static u32 which_bandwidth(struct gspca_dev *gspca_dev)
	bandwidth = gspca_dev->cam.cam_mode[i].sizeimage;
	bandwidth = gspca_dev->cam.cam_mode[i].sizeimage;


	/* if the image is compressed, estimate its mean size */
	/* if the image is compressed, estimate its mean size */
	if (bandwidth < gspca_dev->cam.cam_mode[i].width *
	if (!gspca_dev->cam.needs_full_bandwidth &&
	    bandwidth < gspca_dev->cam.cam_mode[i].width *
				gspca_dev->cam.cam_mode[i].height)
				gspca_dev->cam.cam_mode[i].height)
		bandwidth = bandwidth * 3 / 8;	/* 0.375 */
		bandwidth = bandwidth * 3 / 8;	/* 0.375 */


+3 −0
Original line number Original line Diff line number Diff line
@@ -69,6 +69,9 @@ struct cam {
	u8 bulk;		/* image transfer by 0:isoc / 1:bulk */
	u8 bulk;		/* image transfer by 0:isoc / 1:bulk */
	u8 npkt;		/* number of packets in an ISOC message
	u8 npkt;		/* number of packets in an ISOC message
				 * 0 is the default value: 32 packets */
				 * 0 is the default value: 32 packets */
	u8 needs_full_bandwidth;/* Set this flag to notify the bandwidth calc.
				 * code that the cam fills all image buffers to
				 * the max, even when using compression. */
};
};


struct gspca_dev;
struct gspca_dev;
+1 −0
Original line number Original line Diff line number Diff line
@@ -1764,6 +1764,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
		webcam = 0;
		webcam = 0;
	sd->webcam = webcam;
	sd->webcam = webcam;
	gspca_dev->cam.ctrls = sd->ctrls;
	gspca_dev->cam.ctrls = sd->ctrls;
	gspca_dev->cam.needs_full_bandwidth = 1;
	sd->ag_cnt = -1;
	sd->ag_cnt = -1;


	/*
	/*
+1 −0
Original line number Original line Diff line number Diff line
@@ -2048,6 +2048,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
	struct cam *cam;
	struct cam *cam;


	cam = &gspca_dev->cam;
	cam = &gspca_dev->cam;
	cam->needs_full_bandwidth = 1;


	sd->sensor = (id->driver_info >> 8) & 0xff;
	sd->sensor = (id->driver_info >> 8) & 0xff;
	sd->i2c_addr = id->driver_info & 0xff;
	sd->i2c_addr = id->driver_info & 0xff;
+1 −0
Original line number Original line Diff line number Diff line
@@ -451,6 +451,7 @@ static int sd_config(struct gspca_dev *gspca_dev,
	}
	}


	cam = &gspca_dev->cam;
	cam = &gspca_dev->cam;
	cam->needs_full_bandwidth = 1;


	sd->chip_revision = id->driver_info;
	sd->chip_revision = id->driver_info;
	if (sd->chip_revision == Rev012A) {
	if (sd->chip_revision == Rev012A) {