mirror of https://gitee.com/openkylin/linux.git
[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: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Jean-François Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
51e23be284
commit
eb3fb7c963
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue