From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sfi-mx-4.v28.ch3.sourceforge.com ([172.29.28.124] helo=mx.sourceforge.net) by h25xhf1.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1MuY7M-000617-Tx for ltp-list@lists.sourceforge.net; Sun, 04 Oct 2009 20:55:44 +0000 Received: from mail00d.mail.t-online.hu ([84.2.42.5]) by 1b2kzd1.ch3.sourceforge.com with esmtp (Exim 4.69) id 1MuY7H-0003iq-6T for ltp-list@lists.sourceforge.net; Sun, 04 Oct 2009 20:55:44 +0000 Message-ID: <4AC90BBF.9040803@freemail.hu> Date: Sun, 04 Oct 2009 22:55:27 +0200 From: =?UTF-8?B?TsOpbWV0aCBNw6FydG9u?= MIME-Version: 1.0 Subject: [LTP] [PATCH] pac_common: redesign function for finding Start Of Frame List-Id: Linux Test Project General Discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ltp-list-bounces@lists.sourceforge.net To: Jean-Francois Moine , Thomas Kaiser , Kyle Guinn , Theodore Kilgore Cc: ltp-list@lists.sourceforge.net, LKML , V4L Mailing List RnJvbTogTcOhcnRvbiBOw6ltZXRoIDxubTEyN0BmcmVlbWFpbC5odT4KClRoZSBvcmlnaW5hbCBp bXBsZW1lbnRhdGlvbiBvZiBwYWNfZmluZF9zb2YoKSBkb2VzIG5vdCBhbHdheXMgZmluZAp0aGUg U3RhcnQgT2YgRnJhbWUgKFNPRikgbWFya2VyLiBSZXBsYWNlIGl0IHdpdGggYSBzdGF0ZSBtYWNo aW5lCmJhc2VkIGRlc2lnbi4KClRoZSBjaGFuZ2Ugd2FzIHRlc3RlZCB3aXRoIExhYnRlYyBXZWJj YW0gMjIwMC4KClNpZ25lZC1vZmYtYnk6IE3DoXJ0b24gTsOpbWV0aCA8bm0xMjdAZnJlZW1haWwu aHU+Ci0tLQotLS0gbGludXgtMi42LjMyLXJjMS5vcmlnL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3Nw Y2EvcGFjX2NvbW1vbi5oCTIwMDktMDktMTAgMDA6MTM6NTkuMDAwMDAwMDAwICswMjAwCisrKyBs aW51eC0yLjYuMzItcmMxL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvcGFjX2NvbW1vbi5oCTIw MDktMTAtMDQgMjE6NDk6MTkuMDAwMDAwMDAwICswMjAwCkBAIC0zMyw2ICszMyw0NSBAQAogc3Rh dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGFjX3NvZl9tYXJrZXJbNV0gPQogCQl7IDB4ZmYsIDB4 ZmYsIDB4MDAsIDB4ZmYsIDB4OTYgfTsKCisvKgorICAgVGhlIGZvbGxvd2luZyBzdGF0ZSBtYWNo aW5lIGZpbmRzIHRoZSBTT0YgbWFya2VyIHNlcXVlbmNlCisgICAweGZmLCAweGZmLCAweDAwLCAw eGZmLCAweDk2IGluIGEgYnl0ZSBzdHJlYW0uCisKKwkgICArLS0tLS0tLS0tLSsKKwkgICB8IDA6 IFNUQVJUIHw8LS0tLS0tLS0tLS0tLS0tXAorCSAgICstLS0tLS0tLS0tKzwtXCAgICAgICAgICAg ICB8CisJICAgICB8ICAgICAgIFwtLS0vb3RoZXJ3aXNlICAgIHwKKwkgICAgIHYgMHhmZiAgICAg ICAgICAgICAgICAgICAgfAorCSAgICstLS0tLS0tLS0tKyBvdGhlcndpc2UgICAgICB8CisJICAg fCAgICAgMSAgICB8LS0tLS0tLS0tLS0tLS0tPioKKwkgICB8ICAgICAgICAgIHwgICAgICAgICAg ICAgICAgXgorCSAgICstLS0tLS0tLS0tKyAgICAgICAgICAgICAgICB8CisJICAgICB8ICAgICAg ICAgICAgICAgICAgICAgICAgIHwKKwkgICAgIHYgMHhmZiAgICAgICAgICAgICAgICAgICAgfAor CSAgICstLS0tLS0tLS0tKzwtXDB4ZmYgICAgICAgICB8CisJLy0+fCAgICAgICAgICB8LS0vICAg ICAgICAgICAgIHwKKwl8ICB8ICAgICAyICAgIHwtLS0tLS0tLS0tLS0tLS0+KgorCXwgIHwgICAg ICAgICAgfCBvdGhlcndpc2UgICAgICBeCisJfCAgKy0tLS0tLS0tLS0rICAgICAgICAgICAgICAg IHwKKwl8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAorCXwgICAgdiAweDAwICAgICAg ICAgICAgICAgICAgICB8CisJfCAgKy0tLS0tLS0tLS0rICAgICAgICAgICAgICAgIHwKKwl8ICB8 ICAgICAzICAgIHwgICAgICAgICAgICAgICAgfAorCXwgIHwgICAgICAgICAgfC0tLS0tLS0tLS0t LS0tLT4qCisJfCAgKy0tLS0tLS0tLS0rIG90aGVyd2lzZSAgICAgIF4KKwl8ICAgIHwgICAgICAg ICAgICAgICAgICAgICAgICAgfAorICAgMHhmZiB8ICAgIHYgMHhmZiAgICAgICAgICAgICAgICAg ICAgfAorCXwgICstLS0tLS0tLS0tKyAgICAgICAgICAgICAgICB8CisJXC0tfCAgICAgNCAgICB8 ICAgICAgICAgICAgICAgIHwKKwkgICB8ICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLworCSAg ICstLS0tLS0tLS0tKyBvdGhlcndpc2UKKwkgICAgIHwKKwkgICAgIHYgMHg5NgorCSAgICstLS0t LS0tLS0tKworCSAgIHwgIEZPVU5EICAgfAorCSAgICstLS0tLS0tLS0tKworKi8KKwogc3RhdGlj IHVuc2lnbmVkIGNoYXIgKnBhY19maW5kX3NvZihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYs CiAJCQkJCXVuc2lnbmVkIGNoYXIgKm0sIGludCBsZW4pCiB7CkBAIC00MSwxNyArODAsNTQgQEAg c3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhY19maW5kX3NvZihzdHJ1YwoKIAkvKiBTZWFyY2ggZm9y IHRoZSBTT0YgbWFya2VyIChmaXhlZCBwYXJ0KSBpbiB0aGUgaGVhZGVyICovCiAJZm9yIChpID0g MDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWlmIChtW2ldID09IHBhY19zb2ZfbWFya2VyW3NkLT5zb2Zf cmVhZF0pIHsKLQkJCXNkLT5zb2ZfcmVhZCsrOwotCQkJaWYgKHNkLT5zb2ZfcmVhZCA9PSBzaXpl b2YocGFjX3NvZl9tYXJrZXIpKSB7CisJCXN3aXRjaCAoc2QtPnNvZl9yZWFkKSB7CisJCWNhc2Ug MDoKKwkJCWlmIChtW2ldID09IDB4ZmYpCisJCQkJc2QtPnNvZl9yZWFkID0gMTsKKwkJCWJyZWFr OworCQljYXNlIDE6CisJCQlpZiAobVtpXSA9PSAweGZmKQorCQkJCXNkLT5zb2ZfcmVhZCA9IDI7 CisJCQllbHNlCisJCQkJc2QtPnNvZl9yZWFkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJ CQlzd2l0Y2ggKG1baV0pIHsKKwkJCWNhc2UgMHgwMDoKKwkJCQlzZC0+c29mX3JlYWQgPSAzOwor CQkJCWJyZWFrOworCQkJY2FzZSAweGZmOgorCQkJCS8qIHN0YXkgaW4gdGhpcyBzdGF0ZSAqLwor CQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzZC0+c29mX3JlYWQgPSAwOworCQkJfQorCQkJ YnJlYWs7CisJCWNhc2UgMzoKKwkJCWlmIChtW2ldID09IDB4ZmYpCisJCQkJc2QtPnNvZl9yZWFk ID0gNDsKKwkJCWVsc2UKKwkJCQlzZC0+c29mX3JlYWQgPSAwOworCQkJYnJlYWs7CisJCWNhc2Ug NDoKKwkJCXN3aXRjaCAobVtpXSkgeworCQkJY2FzZSAweDk2OgorCQkJCS8qIFBhdHRlcm4gZm91 bmQgKi8KIAkJCQlQREVCVUcoRF9GUkFNLAogCQkJCQkiU09GIGZvdW5kLCBieXRlcyB0byBhbmFs eXplOiAldS4iCiAJCQkJCSIgRnJhbWUgc3RhcnRzIGF0IGJ5dGUgIyV1IiwKIAkJCQkJbGVuLCBp ICsgMSk7CiAJCQkJc2QtPnNvZl9yZWFkID0gMDsKIAkJCQlyZXR1cm4gbSArIGkgKyAxOworCQkJ CWJyZWFrOworCQkJY2FzZSAweGZmOgorCQkJCXNkLT5zb2ZfcmVhZCA9IDI7CisJCQkJYnJlYWs7 CisJCQlkZWZhdWx0OgorCQkJCXNkLT5zb2ZfcmVhZCA9IDA7CiAJCQl9Ci0JCX0gZWxzZSB7CisJ CQlicmVhazsKKwkJZGVmYXVsdDoKIAkJCXNkLT5zb2ZfcmVhZCA9IDA7CiAJCX0KIAl9CgotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KQ29tZSBidWlsZCB3aXRoIHVzISBUaGUgQmxhY2tCZXJyeSZyZWc7 IERldmVsb3BlciBDb25mZXJlbmNlIGluIFNGLCBDQQppcyB0aGUgb25seSBkZXZlbG9wZXIgZXZl bnQgeW91IG5lZWQgdG8gYXR0ZW5kIHRoaXMgeWVhci4gSnVtcHN0YXJ0IHlvdXIKZGV2ZWxvcGlu ZyBza2lsbHMsIHRha2UgQmxhY2tCZXJyeSBtb2JpbGUgYXBwbGljYXRpb25zIHRvIG1hcmtldCBh bmQgc3RheSAKYWhlYWQgb2YgdGhlIGN1cnZlLiBKb2luIHVzIGZyb20gTm92ZW1iZXIgOSYjNDU7 MTIsIDIwMDkuIFJlZ2lzdGVyIG5vdyYjMzM7Cmh0dHA6Ly9wLnNmLm5ldC9zZnUvZGV2Y29uZgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMdHAtbGlzdCBt YWlsaW5nIGxpc3QKTHRwLWxpc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0Cmh0dHBzOi8vbGlzdHMu c291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL2x0cC1saXN0Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758065AbZJDU4M (ORCPT ); Sun, 4 Oct 2009 16:56:12 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1758040AbZJDU4M (ORCPT ); Sun, 4 Oct 2009 16:56:12 -0400 Received: from mail00d.mail.t-online.hu ([84.2.42.5]:60483 "EHLO mail00d.mail.t-online.hu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757971AbZJDU4L (ORCPT ); Sun, 4 Oct 2009 16:56:11 -0400 Message-ID: <4AC90BBF.9040803@freemail.hu> Date: Sun, 04 Oct 2009 22:55:27 +0200 From: =?UTF-8?B?TsOpbWV0aCBNw6FydG9u?= User-Agent: Mozilla/5.0 (X11; U; Linux i686; hu-HU; rv:1.8.1.21) Gecko/20090402 SeaMonkey/1.1.16 MIME-Version: 1.0 To: Jean-Francois Moine , Thomas Kaiser , Kyle Guinn , Theodore Kilgore CC: V4L Mailing List , LKML , ltp-list@lists.sourceforge.net Subject: [PATCH] pac_common: redesign function for finding Start Of Frame Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-DCC-mail.t-online.hu-Metrics: mail00d.mail.t-online.hu 32710; Body=7 Fuz1=7 Fuz2=7 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Márton Németh The original implementation of pac_find_sof() does not always find the Start Of Frame (SOF) marker. Replace it with a state machine based design. The change was tested with Labtec Webcam 2200. Signed-off-by: Márton Németh --- --- linux-2.6.32-rc1.orig/drivers/media/video/gspca/pac_common.h 2009-09-10 00:13:59.000000000 +0200 +++ linux-2.6.32-rc1/drivers/media/video/gspca/pac_common.h 2009-10-04 21:49:19.000000000 +0200 @@ -33,6 +33,45 @@ static const unsigned char pac_sof_marker[5] = { 0xff, 0xff, 0x00, 0xff, 0x96 }; +/* + The following state machine finds the SOF marker sequence + 0xff, 0xff, 0x00, 0xff, 0x96 in a byte stream. + + +----------+ + | 0: START |<---------------\ + +----------+<-\ | + | \---/otherwise | + v 0xff | + +----------+ otherwise | + | 1 |--------------->* + | | ^ + +----------+ | + | | + v 0xff | + +----------+<-\0xff | + /->| |--/ | + | | 2 |--------------->* + | | | otherwise ^ + | +----------+ | + | | | + | v 0x00 | + | +----------+ | + | | 3 | | + | | |--------------->* + | +----------+ otherwise ^ + | | | + 0xff | v 0xff | + | +----------+ | + \--| 4 | | + | |----------------/ + +----------+ otherwise + | + v 0x96 + +----------+ + | FOUND | + +----------+ +*/ + static unsigned char *pac_find_sof(struct gspca_dev *gspca_dev, unsigned char *m, int len) { @@ -41,17 +80,54 @@ static unsigned char *pac_find_sof(struc /* Search for the SOF marker (fixed part) in the header */ for (i = 0; i < len; i++) { - if (m[i] == pac_sof_marker[sd->sof_read]) { - sd->sof_read++; - if (sd->sof_read == sizeof(pac_sof_marker)) { + switch (sd->sof_read) { + case 0: + if (m[i] == 0xff) + sd->sof_read = 1; + break; + case 1: + if (m[i] == 0xff) + sd->sof_read = 2; + else + sd->sof_read = 0; + break; + case 2: + switch (m[i]) { + case 0x00: + sd->sof_read = 3; + break; + case 0xff: + /* stay in this state */ + break; + default: + sd->sof_read = 0; + } + break; + case 3: + if (m[i] == 0xff) + sd->sof_read = 4; + else + sd->sof_read = 0; + break; + case 4: + switch (m[i]) { + case 0x96: + /* Pattern found */ PDEBUG(D_FRAM, "SOF found, bytes to analyze: %u." " Frame starts at byte #%u", len, i + 1); sd->sof_read = 0; return m + i + 1; + break; + case 0xff: + sd->sof_read = 2; + break; + default: + sd->sof_read = 0; } - } else { + break; + default: sd->sof_read = 0; } }