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.&nbsp; <br>
What&#39;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&nbsp; <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--