About one application for decoder design
leon deng <[email protected]> Thu, 22 Jan 2009 03:06:08 -0500
| Newsgroups | gmane.comp.audio.mad.devel |
|---|---|
| Message-ID | <[email protected]> |
--0016e649cfacb7e4da04610dbe3f Content-Type: multipart/alternative; boundary=0016e649cfacb7e4cb04610dbe3d --0016e649cfacb7e4cb04610dbe3d Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi,all How are you? I found a source code for mp3 decorder using libmad library. It is called MADAudioFormatReader. if you do not know, it is not a big deal. In this code, It can handle the stereo (2 channles )mp3 file, However, it can not handle single channel mp3 file. What's the decorder difference between one channel and two channels mp3 file? I do not think there is a big difference. I think the key is to know the structure in data chunks for both case and use the right function in MAD. Am I right? Could you give me some clue? I attach the file to this email for reference. Best Leon --0016e649cfacb7e4cb04610dbe3d Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi,all<br>How are you?<br>I found a source code for mp3 decorder using libm= ad library. It is called MADAudioFormatReader. if you do not know, it is no= t a big deal.<br>In this code, It can handle the stereo (2 channles )mp3 fi= le, However, it can not handle single channel mp3 file. <br> What's the decorder difference between one channel and two channels mp3= file? I do not think there is a big difference. I think the key is <br>to = know the structure in data chunks for both case and use the right function = in MAD.<br> Am I right? Could you give me some clue?<br>I attach the file to this email= for reference.<br>Best<br><br>Leon <br> --0016e649cfacb7e4cb04610dbe3d-- --0016e649cfacb7e4da04610dbe3f Content-Type: text/x-c++src; charset=US-ASCII; name="MADAudioFormat.cpp" Content-Disposition: attachment; filename="MADAudioFormat.cpp" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fq8ym8100 I2luY2x1ZGUgInN0ZGFmeC5oIg0KI2luY2x1ZGUgIk1BREF1ZGlvRm9ybWF0LmgiDQoNCiNkZWZp bmUgRlBNXzY0QklUDQojZGVmaW5lIE9QVF9BQ0NVUkFDWQ0KI2luY2x1ZGUgIm1hZC5oIg0KDQoj ZGVmaW5lIG1hZEZpeGVkVG9JRUVFZmxvYXQobWFkKSBmbG9hdChqbGltaXQoZG91YmxlKC0xLmYp LCBkb3VibGUoMS5mKSwgKG1hZCAqIGRvdWJsZSgxLjAgLyAoMSA8PCBNQURfRl9GUkFDQklUUykp KSkpDQoNCmNvbnN0IGludCBYSU5HX0ZSQU1FUyA9IDB4MDAwMDAwMDFMOw0KY29uc3QgaW50IFhJ TkdfQllURVMgPSAweDAwMDAwMDAyTDsNCmNvbnN0IGludCBYSU5HX1RPQyA9IDB4MDAwMDAwMDRM Ow0KY29uc3QgaW50IFhJTkdfU0NBTEUgPSAweDAwMDAwMDA4TDsNCg0Kc3RydWN0IHhpbmcNCnsN Cglsb25nIGZsYWdzOw0KCXVuc2lnbmVkIGxvbmcgZnJhbWVzOw0KCXVuc2lnbmVkIGxvbmcgYnl0 ZXM7DQoJdW5zaWduZWQgY2hhciB0b2NbMTAwXTsNCglsb25nIHNjYWxlOw0KfTsNCg0KY2xhc3Mg TUFEQXVkaW9Gb3JtYXRSZWFkZXIgOiBwdWJsaWMgQXVkaW9Gb3JtYXRSZWFkZXINCnsNCnB1Ymxp YzoNCg0KCU1BREF1ZGlvRm9ybWF0UmVhZGVyKElucHV0U3RyZWFtKiBjb25zdCBzb3VyY2VTdHJl YW0pIDoNCgkJQXVkaW9Gb3JtYXRSZWFkZXIoc291cmNlU3RyZWFtLCBUKCJNUEVHIEF1ZGlvIERl Y29kZXIgKE1BRCkiKSkNCgl7DQoJCXVzZXNGbG9hdGluZ1BvaW50RGF0YSA9IHRydWU7DQoJCXNh bXBsZVJhdGUgPSAwOw0KDQoJCV9zdHJlYW1TdGFydFBvc2l0aW9uID0gMDsNCgkJX3NhbXBsZXNM ZWZ0SW5CdWZmZXIgPSAwOw0KDQoJCS8vIFNraXAgb3ZlciBJRDN2MiB0YWcgKGlmIHRoZXJlIGlz IG9uZSkNCgkJew0KCQkJdW5zaWduZWQgY2hhciB0YWdfWzEwXTsNCg0KCQkJbWVtc2V0KCZ0YWdf LCAwLCBzaXplb2YodGFnXykpOw0KCQkJaW50IGJ5dGVzUmVhZCA9IGlucHV0LT5yZWFkKCZ0YWdf LCBzaXplb2YodGFnXykpOw0KDQoJCQlpZihieXRlc1JlYWQgPT0gc2l6ZW9mKHRhZ18pICYmIHRh Z19bMF0gPT0gJ0knICYmIHRhZ19bMV0gPT0gJ0QnICYmIHRhZ19bMl0gPT0gJzMnKQ0KCQkJew0K CQkJCV9zdHJlYW1TdGFydFBvc2l0aW9uID0gc2l6ZW9mKHRhZ18pOw0KCQkJCV9zdHJlYW1TdGFy dFBvc2l0aW9uICs9IChpbnQodGFnX1s2XSkgPDwgMjEpDQoJCQkJCXwgKGludCh0YWdfWzddKSA8 PCAxNCkNCgkJCQkJfCAoaW50KHRhZ19bOF0pIDw8IDcpDQoJCQkJCXwgaW50KHRhZ19bOV0pOw0K CQkJfQ0KCQl9DQoNCgkJaW5wdXQtPnNldFBvc2l0aW9uKF9zdHJlYW1TdGFydFBvc2l0aW9uKTsN Cg0KCQltYWRfc3RyZWFtX2luaXQoJl9tYWRTdHJlYW0pOw0KCQltYWRfZnJhbWVfaW5pdCgmX21h ZEZyYW1lKTsNCgkJbWFkX3N5bnRoX2luaXQoJl9tYWRTeW50aCk7DQoNCgkJaWYoc2NhbkhlYWRl cigmX21hZEZyYW1lLmhlYWRlciwgJl94aW5nKSAhPSAtMSkNCgkJew0KCQkJaW5wdXQtPnNldFBv c2l0aW9uKF9zdHJlYW1TdGFydFBvc2l0aW9uKTsNCg0KCQkJX3N0cmVhbVNpemUgPSBpbnB1dC0+ Z2V0VG90YWxMZW5ndGgoKTsNCgkJCV9tYWRTeW50aC5wY20ubGVuZ3RoID0gMDsNCgkJCV9tYWRD dXJUaW1lID0gbWFkX3RpbWVyX3plcm87DQoJCQlpZihfeGluZy5mbGFncyAmIFhJTkdfRlJBTUVT KQ0KCQkJew0KCQkJCQlfbWFkVGltZUxlbmd0aCA9IF9tYWRGcmFtZS5oZWFkZXIuZHVyYXRpb247 DQoJCQkJCW1hZF90aW1lcl9tdWx0aXBseSgmX21hZFRpbWVMZW5ndGgsIF94aW5nLmZyYW1lcyk7 DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJCS8vIEVzdGltYXRlIHBsYXlpbmcgdGltZSBmcm9t IGZpbGUgc2l6ZQ0KCQkJCQltYWRfdGltZXJfc2V0KCZfbWFkVGltZUxlbmd0aCwgMCwgMSwgX21h ZEZyYW1lLmhlYWRlci5iaXRyYXRlIC8gOCk7DQoJCQkJCW1hZF90aW1lcl9tdWx0aXBseSgmX21h ZFRpbWVMZW5ndGgsIChsb25nKV9zdHJlYW1TaXplKTsNCgkJCX0NCg0KCQkJc2FtcGxlUmF0ZSA9 IF9tYWRGcmFtZS5oZWFkZXIuc2FtcGxlcmF0ZTsNCgkJCWxlbmd0aEluU2FtcGxlcyA9IGludDY0 KGRvdWJsZShtYWRfdGltZXJfY291bnQoX21hZFRpbWVMZW5ndGgsIE1BRF9VTklUU19NSUxMSVNF Q09ORFMpKSAvIDEwMDAuZiAqIGRvdWJsZShzYW1wbGVSYXRlKSArIC41Zik7DQoJCQliaXRzUGVy U2FtcGxlID0gMTY7DQoJCQludW1DaGFubmVscyA9IE1BRF9OQ0hBTk5FTFMoJl9tYWRGcmFtZS5o ZWFkZXIpOw0KDQoJCQlpbnB1dC0+c2V0UG9zaXRpb24oX3N0cmVhbVN0YXJ0UG9zaXRpb24pOw0K CQl9DQoJfQ0KDQoJfk1BREF1ZGlvRm9ybWF0UmVhZGVyKCkNCgl7DQoJCW1hZF9zeW50aF9maW5p c2goJl9tYWRTeW50aCk7DQoJCW1hZF9mcmFtZV9maW5pc2goJl9tYWRGcmFtZSk7DQoJCW1hZF9z dHJlYW1fZmluaXNoKCZfbWFkU3RyZWFtKTsNCgl9DQoNCglib29sIHJlYWQgKGludCoqIGRlc3RT YW1wbGVzLCBpbnQ2NCBzdGFydFNhbXBsZUluRmlsZSwgaW50IG51bVNhbXBsZXMpDQoJew0KCQlp ZihzdGFydFNhbXBsZUluRmlsZSA+PSBsZW5ndGhJblNhbXBsZXMpDQoJCQlyZXR1cm4gdHJ1ZTsN Cg0KCQlpZihzdGFydFNhbXBsZUluRmlsZSArIG51bVNhbXBsZXMgPiBsZW5ndGhJblNhbXBsZXMp DQoJCQludW1TYW1wbGVzID0gbGVuZ3RoSW5TYW1wbGVzIC0gc3RhcnRTYW1wbGVJbkZpbGU7DQoN CgkJaWYoc3RhcnRTYW1wbGVJbkZpbGUgIT0gX2xhc3RTYW1wbGUpDQoJCXsNCgkJCWlmKHNlZWso c3RhcnRTYW1wbGVJbkZpbGUpKQ0KCQkJCV9sYXN0U2FtcGxlID0gc3RhcnRTYW1wbGVJbkZpbGU7 DQoJCQllbHNlDQoJCQl7DQoJCQkJbGVuZ3RoSW5TYW1wbGVzID0gX2xhc3RTYW1wbGU7DQoJCQkJ cmV0dXJuIHRydWU7DQoJCQl9DQoJCX0NCg0KCQlmbG9hdCAqbGVmdCA9IChmbG9hdCopZGVzdFNh bXBsZXNbMF07DQoJICAgIGZsb2F0ICpyaWdodCA9IChmbG9hdCopZGVzdFNhbXBsZXNbMV07DQoJ CWludCBudW1Ub1JlYWRfID0gMDsNCg0KCQl3aGlsZShudW1TYW1wbGVzID4gMCkNCgkJew0KCQkJ aWYoX3NhbXBsZXNMZWZ0SW5CdWZmZXIgPD0gMCkNCgkJCXsNCgkJCQl3aGlsZShtYWRfZnJhbWVf ZGVjb2RlKCZfbWFkRnJhbWUsICZfbWFkU3RyZWFtKSA9PSAtMSkNCgkJCQl7DQoJCQkJCWlmKE1B RF9SRUNPVkVSQUJMRShfbWFkU3RyZWFtLmVycm9yKSkNCgkJCQkJCWNvbnRpbnVlOw0KDQoJCQkJ CWludCBzaGlmdCA9IDA7DQoNCgkJCQkJaWYoX21hZFN0cmVhbS5uZXh0X2ZyYW1lKQ0KCQkJCQl7 DQoJCQkJCQlzaGlmdCA9IF9tYWRTdHJlYW0uYnVmZW5kIC0gX21hZFN0cmVhbS5uZXh0X2ZyYW1l Ow0KCQkJCQkJbWVtbW92ZShfYnVmZmVyLCBfbWFkU3RyZWFtLm5leHRfZnJhbWUsIChzaXplX3Qp c2hpZnQpOw0KCQkJCQl9DQoNCgkJCQkJaW50NjQgYnl0ZXMgPSBpbnB1dC0+cmVhZChfYnVmZmVy ICsgc2hpZnQsIHNpemVvZihfYnVmZmVyKSAtIHNoaWZ0KTsNCgkJCQkJaWYoIWJ5dGVzKQ0KCQkJ CQl7DQoJCQkJCQlsZW5ndGhJblNhbXBsZXMgPSBfbGFzdFNhbXBsZTsNCgkJCQkJCV9tYWRTeW50 aC5wY20ubGVuZ3RoID0gMDsNCgkJCQkJCV9zYW1wbGVzTGVmdEluQnVmZmVyID0gMDsNCg0KCQkJ CQkJcmV0dXJuIHRydWU7DQoJCQkJCX0NCg0KCQkJCQltYWRfc3RyZWFtX2J1ZmZlcigmX21hZFN0 cmVhbSwgX2J1ZmZlciwgKGxvbmcpKHNoaWZ0ICsgYnl0ZXMpKTsNCgkJCQl9DQoNCgkJCQltYWRf c3ludGhfZnJhbWUoJl9tYWRTeW50aCwgJl9tYWRGcmFtZSk7DQoNCgkJCQlfc2FtcGxlc0xlZnRJ bkJ1ZmZlciA9IF9tYWRTeW50aC5wY20ubGVuZ3RoOw0KCQkJCV9sZWZ0Q2hhbm5lbCA9IF9tYWRT eW50aC5wY20uc2FtcGxlc1swXTsNCgkJCQkgZm9yIChpbnQgayA9IDA7ayA8IF9tYWRTeW50aC5w Y20ubGVuZ3RoO2srKykNCgkJCQkgICAgIF9tYWRTeW50aC5wY20uc2FtcGxlc1sxXVtrXSA9IDA7 DQoNCgkJCQkgX3JpZ2h0Q2hhbm5lbCA9IF9tYWRTeW50aC5wY20uc2FtcGxlc1sxXTsNCgkJCQkN Cg0KCQkJCW1hZF90aW1lcl9hZGQoJl9tYWRDdXJUaW1lLCBfbWFkRnJhbWUuaGVhZGVyLmR1cmF0 aW9uKTsNCgkJCX0NCg0KCQkJbnVtVG9SZWFkXyA9IChfc2FtcGxlc0xlZnRJbkJ1ZmZlciA8PSBu dW1TYW1wbGVzKSA/IF9zYW1wbGVzTGVmdEluQnVmZmVyIDogbnVtU2FtcGxlczsNCg0KCQkJbnVt U2FtcGxlcyAtPSBudW1Ub1JlYWRfOw0KCQkJX3NhbXBsZXNMZWZ0SW5CdWZmZXIgLT0gbnVtVG9S ZWFkXzsNCgkJCV9sYXN0U2FtcGxlICs9IG51bVRvUmVhZF87DQoJCQl3aGlsZSAobnVtVG9SZWFk Xy0tKQ0KCQkJew0KCQkJCWlmKGxlZnQpDQoJCQkJCS8vICgqbGVmdCsrKSA9IG1hZEZpeGVkVG9J RUVFZmxvYXQoX21hZFN5bnRoLnBjbS5jaGFubmVscyA9PSAxID8gKl9sZWZ0Q2hhbm5lbCA6ICpf bGVmdENoYW5uZWwrKyk7DQoJCQkJCSAgICgqbGVmdCsrKSA9IG1hZEZpeGVkVG9JRUVFZmxvYXQo X21hZFN5bnRoLnBjbS5jaGFubmVscyA9PSAxID8gKl9sZWZ0Q2hhbm5lbCsrIDogKl9sZWZ0Q2hh bm5lbCsrKTsNCg0KCQkJCWlmKHJpZ2h0KQ0KCQkJCQkgIC8vKCpyaWdodCsrKSA9IG1hZEZpeGVk VG9JRUVFZmxvYXQoX21hZFN5bnRoLnBjbS5jaGFubmVscyA9PSAxID8gKl9sZWZ0Q2hhbm5lbCsr IDogKl9yaWdodENoYW5uZWwrKyk7DQogICAgICAgICAgICAgICAgICAgICAgICgqcmlnaHQrKykg PSBtYWRGaXhlZFRvSUVFRWZsb2F0KF9tYWRTeW50aC5wY20uY2hhbm5lbHMgPT0gMSA/ICpfcmln aHRDaGFubmVsKys6ICpfcmlnaHRDaGFubmVsKysgKTsNCgkJCX0NCgkJfQ0KDQoJCXJldHVybiB0 cnVlOw0KCX0NCg0KcHJpdmF0ZToNCg0KCWJvb2wgc2VlayhpbnQ2NCBzYW1wbGUpDQoJew0KCQlp ZighaW5wdXQpDQoJCQlyZXR1cm4gZmFsc2U7DQoNCgkJaW50NjQgbWlsbGlzZWNvbmRzXyA9IG1h ZF90aW1lcl9jb3VudChfbWFkVGltZUxlbmd0aCwgTUFEX1VOSVRTX01JTExJU0VDT05EUyk7DQoJ CWludDY0IGN1cnJlbnRNaWxsaXNlY29uZF8gPSBpbnQ2NChkb3VibGUoc2FtcGxlKSAvIGRvdWJs ZShzYW1wbGVSYXRlKSAqIDEwMDApOw0KDQoJCWRvdWJsZSBmcmFjdGlvbl8gPSBkb3VibGUoY3Vy cmVudE1pbGxpc2Vjb25kXykgLyBkb3VibGUobWlsbGlzZWNvbmRzXyk7DQoNCgkJbWFkX3RpbWVy X3NldCgmX21hZEN1clRpbWUsIGN1cnJlbnRNaWxsaXNlY29uZF8sIGN1cnJlbnRNaWxsaXNlY29u ZF8sIE1BRF9VTklUU19NSUxMSVNFQ09ORFMpOw0KDQoJCWlmKF94aW5nLmZsYWdzICYgWElOR19U T0MpDQoJCXsNCgkJCWludCBwZXJjZW50XywgcDFfLCBwMl87DQoNCgkJCXBlcmNlbnRfID0gaW50 KGZyYWN0aW9uXyAqIDEwMCk7DQoJCQlwMV8gPSAocGVyY2VudF8gPCAxMDApID8gX3hpbmcudG9j W3BlcmNlbnRfICAgIF0gOiAweDEwMDsNCgkJCXAyXyA9IChwZXJjZW50XyA8ICA5OSkgPyBfeGlu Zy50b2NbcGVyY2VudF8gKyAxXSA6IDB4MTAwOw0KDQoJCQlmcmFjdGlvbl8gPSAocDFfICsgKHAy XyAtIHAxXykgKiAoZnJhY3Rpb25fICogMTAwIC0gcGVyY2VudF8pKSAvIDB4MTAwOw0KCQl9DQoN CgkJaW50NjQgcG9zXyA9IGludDY0KGRvdWJsZShfc3RyZWFtU2l6ZSkgKiBmcmFjdGlvbl8pOw0K CQlpbnB1dC0+c2V0UG9zaXRpb24ocG9zXyA/IHBvc18gOiBfc3RyZWFtU3RhcnRQb3NpdGlvbik7 DQoJCWludCBzaXplID0gaW5wdXQtPnJlYWQoX2J1ZmZlciwgc2l6ZW9mKF9idWZmZXIpKTsNCg0K CQlpZighc2l6ZSkNCgkJew0KCQkJX21hZFN5bnRoLnBjbS5sZW5ndGggPSAwOw0KCQkJX3NhbXBs ZXNMZWZ0SW5CdWZmZXIgPSAwOw0KDQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCg0KCQltYWRfc3Ry ZWFtX2J1ZmZlcigmX21hZFN0cmVhbSwgX2J1ZmZlciwgc2l6ZSk7DQoNCgkJbWFkX2ZyYW1lX211 dGUoJl9tYWRGcmFtZSk7DQoJCW1hZF9zeW50aF9tdXRlKCZfbWFkU3ludGgpOw0KDQoJCWludCBz a2lwXyA9IDI7DQoNCgkJZG8NCgkJew0KCQkJaWYoIW1hZF9mcmFtZV9kZWNvZGUoJl9tYWRGcmFt ZSwgJl9tYWRTdHJlYW0pKQ0KCQkJew0KCQkJCW1hZF90aW1lcl9hZGQoJl9tYWRDdXJUaW1lLCBf bWFkRnJhbWUuaGVhZGVyLmR1cmF0aW9uKTsNCg0KCQkJCWlmKCEoLS1za2lwXykpDQoJCQkJCW1h ZF9zeW50aF9mcmFtZSgmX21hZFN5bnRoLCAmX21hZEZyYW1lKTsNCgkJCX0NCgkJCWVsc2UNCgkJ CQlpZighTUFEX1JFQ09WRVJBQkxFKF9tYWRTdHJlYW0uZXJyb3IpKQ0KCQkJCQlicmVhazsNCgkJ fQ0KCQl3aGlsZShza2lwXyk7DQoNCgkJX21hZFN5bnRoLnBjbS5sZW5ndGggPSAwOw0KCQlfc2Ft cGxlc0xlZnRJbkJ1ZmZlciA9IDA7DQoNCgkJcmV0dXJuIHRydWU7DQoJfQ0KDQoJaW50IHBhcnNl WGluZyhzdHJ1Y3QgeGluZyAqeGluZywgc3RydWN0IG1hZF9iaXRwdHIgcHRyLCB1bnNpZ25lZCBp bnQgYml0bGVuKQ0KCXsNCgkJaWYgKGJpdGxlbiA8IDY0IHx8IG1hZF9iaXRfcmVhZCgmcHRyLCAz MikgIT0gKCgnWCcgPDwgMjQpIHwgKCdpJyA8PCAxNikgfCAoJ24nIDw8IDgpIHwgJ2cnKSkNCgkJ ew0KCQkJeGluZy0+ZmxhZ3MgPSAwOw0KCQkJcmV0dXJuIC0xOw0KCQl9DQoNCgkJeGluZy0+Zmxh Z3MgPSBtYWRfYml0X3JlYWQoJnB0ciwgMzIpOw0KCQliaXRsZW4gLT0gNjQ7DQoNCgkJaWYgKHhp bmctPmZsYWdzICYgWElOR19GUkFNRVMpDQoJCXsNCgkJCWlmIChiaXRsZW4gPCAzMikNCgkJCXsN CgkJCQl4aW5nLT5mbGFncyA9IDA7DQoJCQkJcmV0dXJuIC0xOw0KCQkJfQ0KDQoJCQl4aW5nLT5m cmFtZXMgPSBtYWRfYml0X3JlYWQoJnB0ciwgMzIpOw0KCQkJYml0bGVuIC09IDMyOw0KCQl9DQoN CgkJaWYgKHhpbmctPmZsYWdzICYgWElOR19CWVRFUykgew0KCQkJaWYgKGJpdGxlbiA8IDMyKQ0K CQkJew0KCQkJCXhpbmctPmZsYWdzID0gMDsNCgkJCQlyZXR1cm4gLTE7DQoJCQl9DQoNCgkJCXhp bmctPmJ5dGVzID0gbWFkX2JpdF9yZWFkKCZwdHIsIDMyKTsNCgkJCWJpdGxlbiAtPSAzMjsNCgkJ fQ0KDQoJCWlmICh4aW5nLT5mbGFncyAmIFhJTkdfVE9DKSB7DQoJCQlpbnQgaTsNCg0KCQkJaWYg KGJpdGxlbiA8IDgwMCkNCgkJCXsNCgkJCQl4aW5nLT5mbGFncyA9IDA7DQoJCQkJcmV0dXJuIC0x Ow0KCQkJfQ0KDQoJCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpDQoJCQkJeGluZy0+dG9jW2ld ID0gKHVuc2lnbmVkIGNoYXIpIG1hZF9iaXRfcmVhZCgmcHRyLCA4KTsNCg0KCQkJYml0bGVuIC09 IDgwMDsNCgkJfQ0KDQoJCWlmICh4aW5nLT5mbGFncyAmIFhJTkdfU0NBTEUpIHsNCgkJCWlmIChi aXRsZW4gPCAzMikNCgkJCXsNCgkJCQl4aW5nLT5mbGFncyA9IDA7DQoJCQkJcmV0dXJuIC0xOw0K CQkJfQ0KDQoJCQl4aW5nLT5zY2FsZSA9IG1hZF9iaXRfcmVhZCgmcHRyLCAzMik7DQoJCQliaXRs ZW4gLT0gMzI7DQoJCX0NCg0KCQlyZXR1cm4gMDsNCgl9DQoNCglpbnQgc2NhbkhlYWRlcihzdHJ1 Y3QgbWFkX2hlYWRlciAqaGVhZGVyLCBzdHJ1Y3QgeGluZyAqeGluZykNCgl7DQoJCXN0cnVjdCBt YWRfc3RyZWFtIHN0cmVhbTsNCgkJc3RydWN0IG1hZF9mcmFtZSBmcmFtZTsNCgkJdW5zaWduZWQg Y2hhciBidWZmZXJbODE5Ml07DQoJCXVuc2lnbmVkIGludCBidWZsZW4gPSAwOw0KCQlpbnQgY291 bnQgPSAwLCByZXN1bHQgPSAwOw0KDQoJCW1hZF9zdHJlYW1faW5pdCgmc3RyZWFtKTsNCgkJbWFk X2ZyYW1lX2luaXQoJmZyYW1lKTsNCg0KCQlpZiAoeGluZykNCgkJCXhpbmctPmZsYWdzID0gMDsN Cg0KCQl3aGlsZSgxKQ0KCQl7DQoJCQlpZihidWZsZW4gPCBzaXplb2YoYnVmZmVyKSkNCgkJCXsN CgkJCQlpbnQ2NCBieXRlcyA9IGlucHV0LT5yZWFkKGJ1ZmZlciArIGJ1Zmxlbiwgc2l6ZW9mKGJ1 ZmZlcikgLSBidWZsZW4pOw0KDQoJCQkJaWYoIWJ5dGVzKQ0KCQkJCXsNCgkJCQkJcmVzdWx0ID0g LTE7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWJ1ZmxlbiArPSBpbnQoYnl0ZXMpOw0KCQkJ fQ0KDQoJCQltYWRfc3RyZWFtX2J1ZmZlcigmc3RyZWFtLCBidWZmZXIsIGJ1Zmxlbik7DQoNCgkJ CXdoaWxlKDEpDQoJCQl7DQoJCQkJaWYobWFkX2ZyYW1lX2RlY29kZSgmZnJhbWUsICZzdHJlYW0p ID09IC0xKQ0KCQkJCXsNCgkJCQkJaWYoIU1BRF9SRUNPVkVSQUJMRShzdHJlYW0uZXJyb3IpKQ0K CQkJCQkJYnJlYWs7DQoNCgkJCQkJY29udGludWU7DQoJCQkJfQ0KDQoJCQkJaWYoY291bnQrKyB8 fCAoeGluZyAmJiBwYXJzZVhpbmcoeGluZywgc3RyZWFtLmFuY19wdHIsIHN0cmVhbS5hbmNfYml0 bGVuKSA9PSAwKSkNCgkJCQkJYnJlYWs7DQoJCQl9DQoNCgkJCWlmIChjb3VudCB8fCBzdHJlYW0u ZXJyb3IgIT0gTUFEX0VSUk9SX0JVRkxFTikNCgkJCQlicmVhazsNCg0KCQkJbWVtbW92ZShidWZm ZXIsIHN0cmVhbS5uZXh0X2ZyYW1lLCAoYnVmbGVuID0gJmJ1ZmZlcltidWZsZW5dIC0gc3RyZWFt Lm5leHRfZnJhbWUpKTsNCgkJfQ0KDQoJCWlmKGNvdW50KQ0KCQl7DQoJCQlpZihoZWFkZXIpDQoJ CQkJKmhlYWRlciA9IGZyYW1lLmhlYWRlcjsNCgkJfQ0KCQllbHNlDQoJCQlyZXN1bHQgPSAtMTsN Cg0KCQltYWRfZnJhbWVfZmluaXNoKCZmcmFtZSk7DQoJCW1hZF9zdHJlYW1fZmluaXNoKCZzdHJl YW0pOw0KDQoJCXJldHVybiByZXN1bHQ7DQoJfQ0KDQpwcml2YXRlOg0KDQoJc3RydWN0IHhpbmcg X3hpbmc7CQkJCS8qIFhpbmcgVkJSIHRhZyBkYXRhICovDQoNCglzdHJ1Y3QgbWFkX3N0cmVhbSBf bWFkU3RyZWFtOwkJLyogTUFEIHN0cmVhbSBzdHJ1Y3R1cmUgKi8NCglzdHJ1Y3QgbWFkX2ZyYW1l IF9tYWRGcmFtZTsJCQkvKiBNQUQgZnJhbWUgc3RydWN0dXJlICovDQoJc3RydWN0IG1hZF9zeW50 aCBfbWFkU3ludGg7CQkJLyogTUFEIHN5bnRoIHN0cnVjdHVyZSAqLw0KDQoJaW50IF9zYW1wbGVz TGVmdEluQnVmZmVyOw0KCWludDY0IF9zdHJlYW1TaXplOw0KCWludDY0IF9sYXN0U2FtcGxlOw0K CWludDY0IF9zdHJlYW1TdGFydFBvc2l0aW9uOw0KCW1hZF9maXhlZF90ICpfbGVmdENoYW5uZWw7 DQoJbWFkX2ZpeGVkX3QgKl9yaWdodENoYW5uZWw7DQoNCgltYWRfdGltZXJfdCBfbWFkQ3VyVGlt ZTsJCQkJLyogY3VycmVudCBwbGF5aW5nIHRpbWUgcG9zaXRpb24gKi8NCgltYWRfdGltZXJfdCBf bWFkVGltZUxlbmd0aDsJCS8qIHRvdGFsIHBsYXlpbmcgdGltZSBvZiBjdXJyZW50IHN0cmVhbSAq Lw0KDQoJdW5zaWduZWQgY2hhciBfYnVmZmVyWzQwMDAwXTsJLyogaW5wdXQgc3RyZWFtIGJ1ZmZl ciAqLw0KfTsNCg0Kc3RhdGljIGNvbnN0IHRjaGFyKiBjb25zdCBleHRlbnNpb25zW10gPSAgICB7 IFQoIi5tcDMiKSwgVCgiLm1wMiIpLCBUKCIubXBnIiksIDAgfTsNCk1BREF1ZGlvRm9ybWF0OjpN QURBdWRpb0Zvcm1hdCgpIDogQXVkaW9Gb3JtYXQoVCgiTVBFRyBBdWRpbyBEZWNvZGVyIChNQUQp IiksIChjb25zdCB0Y2hhcioqKSBleHRlbnNpb25zKQ0Kew0KfQ0KDQpNQURBdWRpb0Zvcm1hdDo6 fk1BREF1ZGlvRm9ybWF0KCkNCnsNCn0NCg0KYm9vbCBNQURBdWRpb0Zvcm1hdDo6Y2FuSGFuZGxl RmlsZShjb25zdCBGaWxlJiBmaWxlVG9UZXN0KQ0Kew0KCXJldHVybiBmaWxlVG9UZXN0Lmhhc0Zp bGVFeHRlbnNpb24oVCgibXAzIikpIHx8DQoJCQlmaWxlVG9UZXN0Lmhhc0ZpbGVFeHRlbnNpb24o VCgibXAyIikpIHx8DQoJCQlmaWxlVG9UZXN0Lmhhc0ZpbGVFeHRlbnNpb24oVCgibXBnIikpOw0K fQ0KDQpjb25zdCBBcnJheTxpbnQ+IE1BREF1ZGlvRm9ybWF0OjpnZXRQb3NzaWJsZVNhbXBsZVJh dGVzKCkNCnsNCiAgICBjb25zdCBpbnQgcmF0ZXNbXSA9IHsgNDQxMDAsIDQ4MDAwLCAwIH07DQog ICAgcmV0dXJuIEFycmF5IDxpbnQ+KHJhdGVzKTsNCn0NCg0KY29uc3QgQXJyYXk8aW50PiBNQURB dWRpb0Zvcm1hdDo6Z2V0UG9zc2libGVCaXREZXB0aHMoKQ0Kew0KICAgIGNvbnN0IGludCBkZXB0 aHNbXSA9IHsgMTYsIDI0LCAzMiwgMCB9Ow0KICAgIHJldHVybiBBcnJheTxpbnQ+IChkZXB0aHMp Ow0KfQ0KDQpib29sIE1BREF1ZGlvRm9ybWF0OjpjYW5Eb1N0ZXJlbygpDQp7DQoJcmV0dXJuIHRy dWU7DQp9DQoNCmJvb2wgTUFEQXVkaW9Gb3JtYXQ6OmNhbkRvTW9ubygpDQp7DQoJcmV0dXJuIHRy dWU7DQp9DQoNCmJvb2wgTUFEQXVkaW9Gb3JtYXQ6OmlzQ29tcHJlc3NlZCgpDQp7DQoJcmV0dXJu IHRydWU7DQp9DQoNCkF1ZGlvRm9ybWF0UmVhZGVyKiBNQURBdWRpb0Zvcm1hdDo6Y3JlYXRlUmVh ZGVyRm9yKElucHV0U3RyZWFtKiBzb3VyY2VTdHJlYW0sIGNvbnN0IGJvb2wgZGVsZXRlU3RyZWFt SWZPcGVuaW5nRmFpbHMpDQp7DQoJQXVkaW9Gb3JtYXRSZWFkZXIqIHIgPSBuZXcgTUFEQXVkaW9G b3JtYXRSZWFkZXIoc291cmNlU3RyZWFtKTsNCg0KICAgIGlmIChyLT5zYW1wbGVSYXRlID09IDAp DQogICAgICAgIGlmICghZGVsZXRlU3RyZWFtSWZPcGVuaW5nRmFpbHMpDQoJCQlkZWxldGUgcjsN Cg0KICAgIHJldHVybiByOw0KfQ0KDQpBdWRpb0Zvcm1hdFdyaXRlciogTUFEQXVkaW9Gb3JtYXQ6 OmNyZWF0ZVdyaXRlckZvcihPdXRwdXRTdHJlYW0qIHN0cmVhbVRvV3JpdGVUbywgZG91YmxlIHNh bXBsZVJhdGVUb1VzZSwgdW5zaWduZWQgaW50IG51bWJlck9mQ2hhbm5lbHMsIGludCBiaXRzUGVy U2FtcGxlLCBjb25zdCBTdHJpbmdQYWlyQXJyYXkmIG1ldGFkYXRhVmFsdWVzLCBpbnQgcXVhbGl0 eU9wdGlvbkluZGV4KQ0Kew0KCXJldHVybiAwOw0KfQ0K --0016e649cfacb7e4da04610dbe3f--