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

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

V4L/DVB: gspca_ovfx2: drop first frames in stream if not synced



With the ovfx2 bridge sometimes the first few frames in a stream
would be no good, as the bridge and sensor are not in complete hsync /
vsync yet. This can easily be detected by checking the framesize. So if the
framesize is short and it is one of the 1ste 3 frames after an sd_start,
drop it.

Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent ccfb3028
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ struct sd {
#define QUALITY_DEF 50

	__u8 stopped;		/* Streaming is temporarily paused */
	__u8 first_frame;

	__u8 frame_rate;	/* current Framerate */
	__u8 clockdiv;		/* clockdiv override */
@@ -3961,6 +3962,8 @@ static int sd_start(struct gspca_dev *gspca_dev)
	sd_reset_snapshot(gspca_dev);
	sd->snapshot_pressed = 0;

	sd->first_frame = 3;

	ret = ov51x_restart(sd);
	if (ret < 0)
		goto out;
@@ -4153,13 +4156,25 @@ static void ovfx2_pkt_scan(struct gspca_dev *gspca_dev,
			u8 *data,			/* isoc packet */
			int len)			/* iso packet length */
{
	struct sd *sd = (struct sd *) gspca_dev;
	struct gspca_frame *frame;

	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);

	/* A short read signals EOF */
	if (len < OVFX2_BULK_SIZE) {
		gspca_frame_add(gspca_dev, LAST_PACKET, data, len);
		/* If the frame is short, and it is one of the first ones
		   the sensor and bridge are still syncing, so drop it. */
		if (sd->first_frame) {
			sd->first_frame--;
			frame = gspca_get_i_frame(gspca_dev);
			if (!frame || (frame->data_end - frame->data) <
				  (sd->gspca_dev.width * sd->gspca_dev.height))
				gspca_dev->last_packet_type = DISCARD_PACKET;
		}
		gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
		gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
		return;
	}
	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
}

static void sd_pkt_scan(struct gspca_dev *gspca_dev,