Xavier Serra

316 papers A* 3A 4B 4C 3Misc 26Journal 124Unranked 150
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Laura Ibáñez-Martínez, Chukwuemeka Nkama, Andrea Poltronieri, Xavier Serra, Martín Rocamora
2025 J jnl
CoRR
Esteban Gutiérrez, Frederic Font, Xavier Serra, Lonce Wyse
2025 J jnl
CoRR
Pedro Ramoneda, Pablo Alonso-Jiménez, Sergio Oramas, Xavier Serra, Dmitry Bogdanov
2025 J jnl
CoRR
Pedro Ramoneda, Masahiro Suzuki, Akira Maezawa, Xavier Serra
2025 J jnl
CoRR
Pedro Ramoneda, Emilia Parada-Cabaleiro, Dasaem Jeong, Xavier Serra
2025 conf
ICASSP Workshops
Adithi Shankar, Serafin Schweinitz, Genís Plaja-Roglans, Xavier Serra, Martín Rocamora
2025 B conf
IJCNN
Genís Plaja-Roglans, Yun-Ning Hung, Xavier Serra, Igor Pereira
2025 J jnl
CoRR
Genís Plaja-Roglans, Yun-Ning Hung, Xavier Serra, Igor Pereira
2025 conf
ISMIR
Alia Morsi, Suhit Chiruthapudi, Silvan Peter, Ivan Pilkov, Laura Bishop, Akira Maezawa, Xavier Serra, Carlos Eduardo Cancino-Chacón
2025 J jnl
Multim. Tools Appl.
Guillem Cortès-Sebastià, Marius Miron, Emilio Molina, Alex Ciurana, Xavier Serra
2025 conf
ISMIR
Recep Oguz Araz, Guillem Cortès-Sebastià, Emilio Molina, Joan Serrà, Xavier Serra, Yuki Mitsufuji, Dmitry Bogdanov
2025 J jnl
CoRR
Recep Oguz Araz, Guillem Cortès-Sebastià, Emilio Molina, Joan Serrà, Xavier Serra, Yuki Mitsufuji, Dmitry Bogdanov
2025 J jnl
CoRR
Esteban Gutiérrez, Rodrigo F. Cádiz, Carlos A. Sing-Long, Frederic Font, Xavier Serra
2025 conf
ISMIR
Andrea Poltronieri, Xavier Serra, Martín Rocamora
2025 J jnl
CoRR
Andrea Poltronieri, Xavier Serra, Martín Rocamora
2025 conf
WASPAA
Genís Plaja-Roglans, Yun-Ning Hung, Xavier Serra, Igor Pereira
2025 J jnl
CoRR
Genís Plaja-Roglans, Yun-Ning Hung, Xavier Serra, Igor Pereira
2025 conf
MMM (2)
Miguel Perez, Holger Kirchhoff, Peter Grosche, Xavier Serra
2025 conf
ISMIR
Genís Plaja-Roglans, Xavier Serra, Martín Rocamora
2025 conf
WASPAA
Enric Gusó, Joanna Luberadzka, Umut Sayin, Xavier Serra
2025 J jnl
CoRR
Enric Gusó, Joanna Luberadzka, Umut Sayin, Xavier Serra
2025 J jnl
CoRR
Roser Batlle-Roca, Laura Ibáñez-Martínez, Xavier Serra, Emilia Gómez, Martín Rocamora
2025 conf
ISMIR
Roser Batlle-Roca, Laura Ibáñez-Martínez, Xavier Serra, Emilia Gómez, Martín Rocamora
2025 conf
ISMIR
Guillem Cortès-Sebastià, Benjamin Martin, Emilio Molina, Xavier Serra, Romain Hennequin
2025 J jnl
CoRR
Guillem Cortès-Sebastià, Benjamin Martin, Emilio Molina, Xavier Serra, Romain Hennequin
2025 conf
ICASSP Workshops
Miguel Perez, Holger Kirchhoff, Peter Grosche, Xavier Serra
2025 conf
ICASSP Workshops
Thomas Nuttall, Xavier Serra, Lara Pearson
2025 J jnl
IEEE Signal Process. Lett.
Hyon Kim, Emmanouil Benetos, Xavier Serra
2024 conf
ISMIR
Hyon Kim, Xavier Serra
2024 conf
ISMIR
Jyoti Narang, Nazif Can Tamer, Viviana De La Vega, Xavier Serra
2024 J jnl
CoRR
Jyoti Narang, Nazif Can Tamer, Viviana De La Vega, Xavier Serra
2024 J jnl
CoRR
Pedro Ramoneda, Minhee Lee, Dasaem Jeong, Jose J. Valero-Mas, Xavier Serra
2024 J jnl
Expert Syst. Appl.
Pedro Ramoneda, Dasaem Jeong, Vsevolod Eremenko, Nazif Can Tamer, Marius Miron, Xavier Serra
2024 conf
ISMIR
Recep Oguz Araz, Xavier Serra, Dmitry Bogdanov
2024 J jnl
CoRR
Recep Oguz Araz, Xavier Serra, Dmitry Bogdanov
2024 J jnl
CoRR
Panagiota Anastasopoulou, Jessica Torrey, Xavier Serra, Frederic Font
2024 conf
ICASSP Workshops
Pablo Alonso-Jiménez, Leonardo Pepino, Roser Batlle-Roca, Pablo Zinemanas, Dmitry Bogdanov, Xavier Serra, Martín Rocamora
2024 J jnl
CoRR
Pablo Alonso-Jiménez, Leonardo Pepino, Roser Batlle-Roca, Pablo Zinemanas, Dmitry Bogdanov, Xavier Serra, Martín Rocamora
2024 conf
ISMIR
Adithi Shankar, Genís Plaja-Roglans, Thomas Nuttall, Martín Rocamora, Xavier Serra
2024 J jnl
J. Open Source Softw.
Magdalena Fuentes, Genís Plaja-Roglans, Guillem Cortès-Sebastià, Tanmay Khandelwal, Marius Miron, Xavier Serra, Juan Pablo Bello, Justin Salamon
2024 conf
DLfM
Thomas Nuttall, Xavier Serra, Lara Pearson
2024 J jnl
CoRR
Pedro Ramoneda, Emilia Parada-Cabaleiro, Benno Weck, Xavier Serra
2024 conf
ISMIR
Roser Batlle-Roca, Wei-Hsiang Liao, Xavier Serra, Yuki Mitsufuji, Emilia Gómez
2024 J jnl
CoRR
Roser Batlle-Roca, Wei-Hsiang Liao, Xavier Serra, Yuki Mitsufuji, Emilia Gómez
2024 conf
ISMIR
Pedro Ramoneda, Vsevolod Eremenko, Alexandre D'Hooge, Emilia Parada-Cabaleiro, Xavier Serra
2024 J jnl
CoRR
Pedro Ramoneda, Vsevolod Eremenko, Alexandre D'Hooge, Emilia Parada-Cabaleiro, Xavier Serra
2024 conf
MMM (5)
Benno Weck, Holger Kirchhoff, Peter Grosche, Xavier Serra
2023 conf
WASPAA
Enric Gusó, Joanna Luberadzka, Martí Baig, Umut Sayin Saraç, Xavier Serra
2023 J jnl
CoRR
Enric Gusó, Joanna Luberadzka, Martí Baig, Umut Sayin Saraç, Xavier Serra
2023 conf
ISMIR
Genís Plaja-Roglans, Marius Miron, Adithi Shankar, Xavier Serra
2023 J jnl
CoRR
Jyoti Narang, Viviana De La Vega, Xavier Lizarraga-Seijas, Oscar Mayor, Hector Parra, Jordi Janer, Xavier Serra
2023 J jnl
CoRR
Pedro Ramoneda, Dasaem Jeong, Vsevolod Eremenko, Nazif Can Tamer, Marius Miron, Xavier Serra
2023 Misc conf
ICASSP
Benno Weck, Xavier Serra
2023 J jnl
CoRR
Benno Weck, Xavier Serra
2023 conf
CMMR
Hyon Kim, Xavier Serra
2023 conf
ISMIR
Pablo Alonso-Jiménez, Xavier Serra, Dmitry Bogdanov
2023 J jnl
CoRR
Pablo Alonso-Jiménez, Xavier Serra, Dmitry Bogdanov
2023 Misc conf
ICASSP
Rajsuryan Singh, Pablo Zinemanas, Xavier Serra, Juan Pablo Bello, Magdalena Fuentes
2023 conf
ISMIR
Nazif Can Tamer, Yigitcan Özer, Meinard Müller, Xavier Serra
2023 J jnl
Pattern Recognit.
Jose J. Valero-Mas, Antonio Javier Gallego, Pablo Alonso-Jiménez, Xavier Serra
2023 Misc conf
ICASSP
Pablo Alonso-Jiménez, Xavier Favory, Hadrien Foroughmand, Grigoris Bourdalas, Xavier Serra, Thomas Lidy, Dmitry Bogdanov
2023 J jnl
CoRR
Pablo Alonso-Jiménez, Xavier Favory, Hadrien Foroughmand, Grigoris Bourdalas, Xavier Serra, Thomas Lidy, Dmitry Bogdanov
2023 conf
ISMIR
Pedro Ramoneda, Jose J. Valero-Mas, Dasaem Jeong, Xavier Serra
2023 J jnl
CoRR
Pedro Ramoneda, Jose J. Valero-Mas, Dasaem Jeong, Xavier Serra
2023 J jnl
Trans. Int. Soc. Music. Inf. Retr.
Genís Plaja-Roglans, Thomas Nuttall, Lara Pearson, Xavier Serra, Marius Miron
2023 conf
ISMIR
Alia Morsi, Kana Tatsumi, Akira Maezawa, Takuya Fujishima, Xavier Serra
2023 Misc conf
ICASSP
Nazif Can Tamer, Yigitcan Özer, Meinard Müller, Xavier Serra
2023 conf
ISMIR
Miguel Pérez Fernández, Holger Kirchhoff, Xavier Serra
2023 J jnl
CoRR
Benno Weck, Holger Kirchhoff, Peter Grosche, Xavier Serra
2022 conf
ISMIR
Genís Plaja-Roglans, Marius Miron, Xavier Serra
2022 conf
CSEDU (1)
Hyon Kim, Pedro Ramoneda, Marius Miron, Xavier Serra
2022 A* conf
ACM Multimedia
Pedro Ramoneda, Dasaem Jeong, Eita Nakamura, Xavier Serra, Marius Miron
2022 conf
ISMIR
Guillem Cortes, Alex Ciurana, Emilio Molina, Marius Miron, Owen Meyers, Joren Six, Xavier Serra
2022 conf
ISMIR
Alia Morsi, Xavier Serra
2022 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Eduardo Fonseca, Xavier Favory, Jordi Pons, Frederic Font, Xavier Serra
2022 J jnl
CoRR
Rajsuryan Singh, Pablo Zinemanas, Xavier Serra, Juan Pablo Bello, Magdalena Fuentes
2022 conf
ISMIR
Thomas Nuttall, Genís Plaja-Roglans, Lara Pearson, Xavier Serra
2022 conf
DCASE
Benno Weck, Miguel Pérez Fernández, Holger Kirchhoff, Xavier Serra
2022 J jnl
CoRR
Benno Weck, Miguel Pérez Fernández, Holger Kirchhoff, Xavier Serra
2022 J jnl
CoRR
Jose J. Valero-Mas, Antonio Javier Gallego, Pablo Alonso-Jiménez, Xavier Serra
2022 conf
ISMIR
Dmitry Bogdanov, Xavier Lizarraga-Seijas, Pablo Alonso-Jiménez, Xavier Serra
2022 conf
ISMIR
Pablo Alonso-Jiménez, Xavier Serra, Dmitry Bogdanov
2022 ed.
ISMIR
Preeti Rao, Hema A. Murthy, Ajay Srinivasamurthy, Rachel M. Bittner, Rafael Caro Repetto, Masataka Goto, Xavier Serra, Marius Miron
2022 Misc conf
ICASSP
Pedro Ramoneda, Nazif Can Tamer, Vsevolod Eremenko, Xavier Serra, Marius Miron
2022 J jnl
CoRR
Pedro Ramoneda, Nazif Can Tamer, Vsevolod Eremenko, Xavier Serra, Marius Miron
2022 Misc conf
ICASSP
Magdalena Fuentes, Bea Steers, Pablo Zinemanas, Martín Rocamora, Luca Bondi, Julia Wilkins, Qianyi Shi, Yao Hou, Samarjit Das, Xavier Serra, Juan Pablo Bello
2022 conf
ISMIR
Nazif Can Tamer, Pedro Ramoneda, Xavier Serra
2021 conf
CMMR
Jyoti Narang, Marius Miron, Xavier Lizarraga-Seijas, Xavier Serra
2021 J jnl
Trans. Int. Soc. Music. Inf. Retr.
Albin Andrew Correya, Jorge Marcos-Fernández, Luis Joglar-Ongay, Pablo Alonso-Jiménez, Xavier Serra, Dmitry Bogdanov
2021 B conf
CHIIR
Andres Ferraro, Xavier Serra, Christine Bauer
2021 conf
ISMIR
Minz Won, Justin Salamon, Nicholas J. Bryan, Gautham J. Mysore, Xavier Serra
2021 J jnl
CoRR
Minz Won, Justin Salamon, Nicholas J. Bryan, Gautham J. Mysore, Xavier Serra
2021 conf
DCASE
Benno Weck, Xavier Favory, Konstantinos Drossos, Xavier Serra
2021 J jnl
CoRR
Benno Weck, Xavier Favory, Konstantinos Drossos, Xavier Serra
2021 J jnl
CoRR
Eduardo Fonseca, Andres Ferraro, Xavier Serra
2021 Misc conf
ICASSP
Xavier Favory, Konstantinos Drossos, Tuomas Virtanen, Xavier Serra
2021 J jnl
CoRR
Pritish Chandna, António Ramires, Xavier Serra, Emilia Gómez
2021 Misc conf
ICASSP
Pritish Chandna, António Ramires, Xavier Serra, Emilia Gómez
2021 Misc conf
ICASSP
Andres Ferraro, Yuntae Kim, Soohyeon Lee, Biho Kim, Namjun Jo, Semi Lim, Suyon Lim, Jungtaek Jang, Sehwan Kim, Xavier Serra, Dmitry Bogdanov
2021 J jnl
CoRR
Andres Ferraro, Yuntae Kim, Soohyeon Lee, Biho Kim, Namjun Jo, Semi Lim, Suyon Lim, Jungtaek Jang, Sehwan Kim, Xavier Serra, Dmitry Bogdanov
2021 Misc conf
ICASSP
Minz Won, Sergio Oramas, Oriol Nieto, Fabien Gouyon, Xavier Serra
2021 J jnl
CoRR
Pedro Ramoneda, Marius Miron, Xavier Serra
2021 conf
WASPAA
Eduardo Fonseca, Aren Jansen, Daniel P. W. Ellis, Scott Wisdom, Marco Tagliasacchi, John R. Hershey, Manoj Plakal, Shawn Hershey, R. Channing Moore, Xavier Serra
2021 J jnl
CoRR
Eduardo Fonseca, Aren Jansen, Daniel P. W. Ellis, Scott Wisdom, Marco Tagliasacchi, John R. Hershey, Manoj Plakal, Shawn Hershey, R. Channing Moore, Xavier Serra
2021 J jnl
CoRR
Minz Won, Keunwoo Choi, Xavier Serra
2021 conf
ISMIR
Minz Won, Keunwoo Choi, Xavier Serra
2021 J jnl
CoRR
Magdalena Fuentes, Justin Salamon, Pablo Zinemanas, Martín Rocamora, Genís Paja, Irán R. Román, Rachel M. Bittner, Marius Miron, Xavier Serra, Juan Pablo Bello
2021 conf
CMMR
Thomas Nuttall, Genís Plaja-Roglans, Lara Pearson, Xavier Serra
2021 conf
DCASE
Pablo Zinemanas, Martín Rocamora, Eduardo Fonseca, Frederic Font, Xavier Serra
2021 Misc conf
ICASSP
Eduardo Fonseca, Diego Ortego, Kevin McGuinness, Noel E. O'Connor, Xavier Serra
2021 conf
INTERACT (2)
Andres Ferraro, Xavier Serra, Christine Bauer
2021 J jnl
CoRR
Andres Ferraro, Xavier Serra, Christine Bauer
2020 J jnl
CoRR
Eduardo Fonseca, Shawn Hershey, Manoj Plakal, Daniel P. W. Ellis, Aren Jansen, R. Channing Moore, Xavier Serra
2020 conf
TREC
Andres Ferraro, Lorenzo Porcaro, Xavier Serra
2020 J jnl
CoRR
Xavier Favory, Konstantinos Drossos, Tuomas Virtanen, Xavier Serra
2020 conf
DCASE
Pablo Zinemanas, Ignacio Hounie, Pablo Cancela, Frederic Font, Martín Rocamora, Xavier Serra
2020 Misc conf
ICASSP
Minz Won, Sanghyuk Chun, Oriol Nieto, Xavier Serra
2020 conf
ISMIR
Albin Andrew Correya, Dmitry Bogdanov, Luis Joglar-Ongay, Xavier Serra
2020 J jnl
CoRR
Minz Won, Andres Ferraro, Dmitry Bogdanov, Xavier Serra
2020 A conf
RecSys
Andres Ferraro, Dietmar Jannach, Xavier Serra
2020 J jnl
CoRR
Andres Ferraro, Dietmar Jannach, Xavier Serra
2020 J jnl
CoRR
Eduardo Fonseca, Xavier Favory, Jordi Pons, Frederic Font, Xavier Serra
2020 conf
EUSIPCO
Andres Ferraro, Dmitry Bogdanov, Xavier Serra, Jay Ho Jeon, Jason Yoon
2020 J jnl
CoRR
Xavier Favory, Konstantinos Drossos, Tuomas Virtanen, Xavier Serra
2020 conf
ComplexRec-ImpactRS@RecSys
Andres Ferraro, Sergio Oramas, Massimo Quadrana, Xavier Serra
2020 J jnl
CoRR
Minz Won, Sergio Oramas, Oriol Nieto, Fabien Gouyon, Xavier Serra
2020 Misc conf
ICASSP
António Ramires, Pritish Chandna, Xavier Favory, Emilia Gómez, Xavier Serra
2020 conf
CSEDU (1)
Vsevolod Eremenko, Alia Morsi, Jyoti Narang, Xavier Serra
2020 B conf
ICMR
Xavier Favory, Frederic Font, Xavier Serra
2020 J jnl
CoRR
Xavier Favory, Frederic Font, Xavier Serra
2020 J jnl
CoRR
António Ramires, Gilberto Bernardes, Matthew E. P. Davies, Xavier Serra
2020 J jnl
CoRR
Pablo Alonso-Jiménez, Dmitry Bogdanov, Jordi Pons, Xavier Serra
2020 Misc conf
ICASSP
Pablo Alonso-Jiménez, Dmitry Bogdanov, Jordi Pons, Xavier Serra
2020 conf
ISMIR
António Ramires, Frederic Font, Dmitry Bogdanov, Jordan B. L. Smith, Yi-Hsuan Yang, Joann Ching, Bo-Yu Chen, Yueh-Kao Wu, Wei-Han Hsu, Xavier Serra
2020 J jnl
CoRR
António Ramires, Frederic Font, Dmitry Bogdanov, Jordan B. L. Smith, Yi-Hsuan Yang, Joann Ching, Bo-Yu Chen, Yueh-Kao Wu, Wei-Han Hsu, Xavier Serra
2020 J jnl
CoRR
Eduardo Fonseca, Diego Ortego, Kevin McGuinness, Noel E. O'Connor, Xavier Serra
2019 conf
ISMIR
Felipe Falcão, Baris Bozkurt, Xavier Serra, Nazareno Andrade, Ozan Baysal
2019 conf
DCASE
Andrés Pérez-López, Eduardo Fonseca, Xavier Serra
2019 J jnl
CoRR
Andrés Pérez-López, Eduardo Fonseca, Xavier Serra
2019 J jnl
CoRR
Andres Ferraro, Dmitry Bogdanov, Xavier Serra, Jason Yoon
2019 conf
DCASE
Eduardo Fonseca, Manoj Plakal, Frederic Font, Daniel P. W. Ellis, Xavier Serra
2019 J jnl
CoRR
Eduardo Fonseca, Manoj Plakal, Frederic Font, Daniel P. W. Ellis, Xavier Serra
2019 conf
CMMR
Luciano Ciamarone, Baris Bozkurt, Xavier Serra
2019 J jnl
CoRR
Andres Ferraro, Dmitry Bogdanov, Jisang Yoon, KwangSeob Kim, Xavier Serra
2019 conf
ISMIR
Thomas Nuttall, Miguel García-Casado, Víctor Núñez-Tarifa, Rafael Caro Repetto, Xavier Serra
2019 conf
ISMIR
Furkan Yesiler, Chris Tralie, Albin Andrew Correya, Diego Furtado Silva, Philip Tovstogan, Emilia Gómez, Xavier Serra
2019 J jnl
CoRR
António Ramires, Xavier Serra
2019 A conf
INTERSPEECH
Francesc Lluís, Jordi Pons, Xavier Serra
2019 Misc conf
ICASSP
Eduardo Fonseca, Manoj Plakal, Daniel P. W. Ellis, Frederic Font, Xavier Favory, Xavier Serra
2019 J jnl
CoRR
Eduardo Fonseca, Manoj Plakal, Daniel P. W. Ellis, Frederic Font, Xavier Favory, Xavier Serra
2019 conf
WASPAA
Eduardo Fonseca, Frederic Font, Xavier Serra
2019 J jnl
CoRR
Eduardo Fonseca, Frederic Font, Xavier Serra
2019 J jnl
CoRR
Xavier Favory, Xavier Serra
2019 J jnl
CoRR
Andres Ferraro, Dmitry Bogdanov, Jay Ho Jeon, Jason Yoon, Xavier Serra
2019 J jnl
CoRR
António Ramires, Pritish Chandna, Xavier Favory, Emilia Gómez, Xavier Serra
2019 Misc conf
ICASSP
Jordi Pons, Xavier Serra
2019 J jnl
CoRR
Andrés Ferraro, Dmitry Bogdanov, Xavier Serra
2019 J jnl
CoRR
Minz Won, Sanghyuk Chun, Xavier Serra
2019 Misc conf
ICASSP
Jordi Pons, Joan Serrà, Xavier Serra
2019 J jnl
CoRR
Andres Ferraro, Dmitry Bogdanov, Kyumin Choi, Xavier Serra
2019 J jnl
CoRR
Minz Won, Sanghyuk Chun, Xavier Serra
2019 J jnl
CoRR
Jordi Pons, Xavier Serra
2018 J jnl
CoRR
Eduardo Fonseca, Rong Gong, Xavier Serra
2018 Misc conf
ICASSP
Dario Rethage, Jordi Pons, Xavier Serra
2018 conf
DLfm
Rafael Caro Repetto, Niccolò Pretto, Amin Chaachoo, Baris Bozkurt, Xavier Serra
2018 J jnl
CoRR
Emilia Gómez, Carlos Castillo, Vicky Charisi, Verónica Dahl, Gustavo Deco, Blagoj Delipetrev, Nicole Dewandre, Miguel Ángel González Ballester, Fabien Gouyon, José Hernández-Orallo, Perfecto Herrera, Anders Jonsson, Ansgar Koene, Martha A. Larson, Ramón López de Mántaras, Bertin Martens, Marius Miron, Rubén Moreno-Bote, Nuria Oliver, Antonio Puertas Gallardo, Heike Schweitzer, Núria Sebastián, Xavier Serra, Joan Serrà, Songül Tolan, Karina Vold
2018 conf
ISMIR
Vsevolod Eremenko, Emir Demirel, Baris Bozkurt, Xavier Serra
2018 conf
RecSys Challenge
Andres Ferraro, Dmitry Bogdanov, Jisang Yoon, KwangSeob Kim, Xavier Serra
2018 conf
ISMIR
Jordi Pons, Oriol Nieto, Matthew Prockup, Erik M. Schmidt, Andreas F. Ehmann, Xavier Serra
2018 J jnl
CoRR
Francesc Lluís, Jordi Pons, Xavier Serra
2018 J jnl
CoRR
Xavier Favory, Eduardo Fonseca, Frederic Font, Xavier Serra
2018 J jnl
CoRR
Eduardo Fonseca, Manoj Plakal, Frederic Font, Daniel P. W. Ellis, Xavier Favory, Jordi Pons, Xavier Serra
2018 conf
DCASE
Eduardo Fonseca, Manoj Plakal, Frederic Font, Daniel P. W. Ellis, Xavier Favory, Jordi Pons, Xavier Serra
2018 conf
WHISPERS
Andreas Kartakoullis, Andreas Kamilaris, Joel Gonzalez, Xavier Serra, Pere Gou, Maria Font
2018 J jnl
Future Gener. Comput. Syst.
Javier Panadero, Jésica de Armas, Xavier Serra, Joan Manuel Marquès
2018 J jnl
Trans. Int. Soc. Music. Inf. Retr.
Sergio Oramas, Francesco Barbieri, Oriol Nieto, Xavier Serra
2018 J jnl
CoRR
Sergio Oramas, Luis Espinosa Anke, Francisco Gómez, Xavier Serra
2018 J jnl
CoRR
Jordi Pons, Xavier Serra
2018 A conf
INTERSPEECH
Rong Gong, Xavier Serra
2018 J jnl
CoRR
Rong Gong, Xavier Serra
2018 J jnl
CoRR
Rong Gong, Xavier Serra
2018 J jnl
CoRR
Jordi Pons, Joan Serrà, Xavier Serra
2018 conf
WWW (Companion Volume)
Jaehun Kim, Minz Won, Xavier Serra, Cynthia C. S. Liem
2018 J jnl
CoRR
Jaehun Kim, Minz Won, Xavier Serra, Cynthia C. S. Liem
2017 conf
ISMIR
Rafael Caro Repetto, Xavier Serra
2017 conf
DLRS@RecSys
Sergio Oramas, Oriol Nieto, Mohamed Sordo, Xavier Serra
2017 J jnl
CoRR
Sergio Oramas, Oriol Nieto, Mohamed Sordo, Xavier Serra
2017 J jnl
CoRR
Dario Rethage, Jordi Pons, Xavier Serra
2017 conf
DCASE
Eduardo Fonseca, Rong Gong, Dmitry Bogdanov, Olga Slizovskaia, Emilia Gómez, Xavier Serra
2017 J jnl
Frontiers Digit. Humanit.
Ajay Srinivasamurthy, Andre Holzapfel, Kaustuv Kanti Ganguli, Xavier Serra
2017 conf
ISMIR
Rong Gong, Jordi Pons, Xavier Serra
2017 J jnl
CoRR
Rong Gong, Jordi Pons, Xavier Serra
2017 conf
DLfM
Rong Gong, Rafael Caro Repetto, Xavier Serra
2017 J jnl
CoRR
Rong Gong, Rafael Caro Repetto, Xavier Serra
2017 Misc conf
ICASSP
Jordi Pons, Xavier Serra
2017 conf
ESWC (Satellite Events)
Luis Espinosa Anke, Sergio Oramas, Horacio Saggion, Xavier Serra
2017 J jnl
CoRR
Jordi Pons, Oriol Nieto, Matthew Prockup, Erik M. Schmidt, Andreas F. Ehmann, Xavier Serra
2017 conf
ISMIR
Eduardo Fonseca, Jordi Pons, Xavier Favory, Frederic Font, Dmitry Bogdanov, Andres Ferraro, Sergio Oramas, Alastair Porter, Xavier Serra
2017 J jnl
CoRR
Rong Gong, Xavier Serra
2017 conf
ISMIR
Ajay Srinivasamurthy, Andre Holzapfel, Xavier Serra
2017 conf
ISMIR
Georgi Dzhambazov, Andre Holzapfel, Ajay Srinivasamurthy, Xavier Serra
2017 J jnl
CoRR
Georgi Dzhambazov, Andre Holzapfel, Ajay Srinivasamurthy, Xavier Serra
2017 conf
ISMIR
Sergio Oramas, Oriol Nieto, Francesco Barbieri, Xavier Serra
2017 J jnl
CoRR
Sergio Oramas, Oriol Nieto, Francesco Barbieri, Xavier Serra
2017 conf
ISMIR
Dmitry Bogdanov, Xavier Serra
2017 conf
DLfM
Rafael Caro Repetto, Shuo Zhang, Xavier Serra
2017 conf
ISMIR
Jordi Pons, Rong Gong, Xavier Serra
2017 J jnl
CoRR
Jordi Pons, Rong Gong, Xavier Serra
2017 J jnl
ACM Trans. Intell. Syst. Technol.
Sergio Oramas, Vito Claudio Ostuni, Tommaso Di Noia, Xavier Serra, Eugenio Di Sciascio
2017 J jnl
CoRR
Jordi Pons, Olga Slizovskaia, Rong Gong, Emilia Gómez, Xavier Serra
2017 conf
EUSIPCO
Jordi Pons, Olga Slizovskaia, Rong Gong, Emilia Gómez, Xavier Serra
2017 conf
ISMIR
Shuo Zhang, Rafael Caro Repetto, Xavier Serra
2016 Misc conf
ICASSP
Ajay Srinivasamurthy, Andre Holzapfel, Ali Taylan Cemgil, Xavier Serra
2016 conf
ISMIR
Dmitry Bogdanov, Alastair Porter, Perfecto Herrera, Xavier Serra
2016 conf
ISMIR
Kaustuv Kanti Ganguli, Sankalp Gulati, Xavier Serra, Preeti Rao
2016 Misc conf
ICASSP
Sankalp Gulati, Joan Serrà, Vignesh Ishwar, Xavier Serra
2016 B conf
LREC
Sergio Oramas, Luis Espinosa Anke, Mohamed Sordo, Horacio Saggion, Xavier Serra
2016 C conf
CBMI
Jordi Pons, Thomas Lidy, Xavier Serra
2016 conf
ISMIR
Sergio Oramas, Luis Espinosa Anke, Aonghus Lawlor, Xavier Serra, Horacio Saggion
2016 conf
ISMIR
Giuseppe Bandiera, Oriol Romani Picas, Hiroshi Tokuda, Wataru Hariya, Koji Oishi, Xavier Serra
2016 C conf
ISM
Sanjeel Parekh, Frederic Font, Xavier Serra
2016 J jnl
Data Knowl. Eng.
Sergio Oramas, Luis Espinosa Anke, Mohamed Sordo, Horacio Saggion, Xavier Serra
2016 conf
DLfm
Altug Karakurt, Sertan Sentürk, Xavier Serra
2016 conf
DLfm
Alastair Porter, Dmitry Bogdanov, Xavier Serra
2016 conf
ISMIR
Georgi Dzhambazov, Ajay Srinivasamurthy, Sertan Sentürk, Xavier Serra
2016 Misc conf
ICASSP
Sankalp Gulati, Joan Serrà, Vignesh Ishwar, Sertan Sentürk, Xavier Serra
2016 Misc conf
WSC
Xavier Serra, Jésica de Armas, Joan Manuel Marquès
2016 conf
ISMIR
Frederic Font, Xavier Serra
2016 conf
ISMIR
Sankalp Gulati, Joan Serrà, Kaustuv Kanti Ganguli, Sertan Sentürk, Xavier Serra
2015 conf
WWW (Companion Volume)
Vito Claudio Ostuni, Tommaso Di Noia, Eugenio Di Sciascio, Sergio Oramas, Xavier Serra
2015 conf
ISMIR
Sergio Oramas, Mohamed Sordo, Luis Espinosa Anke, Xavier Serra
2015 conf
ISMIR
Alastair Porter, Dmitry Bogdanov, Robert Kaye, Roman Tsukanov, Xavier Serra
2015 Misc conf
ICASSP
Sankalp Gulati, Joan Serrà, Xavier Serra
2015 J jnl
ACM Trans. Intell. Syst. Technol.
Frederic Font, Joan Serrà, Xavier Serra
2015
Xavier Serra
2015 conf
ISMIR
Rafael Caro Repetto, Rong Gong, Nadine Kroher, Xavier Serra
2015 conf
ISMIR
Swapnil Gupta, Ajay Srinivasamurthy, Manoj Kumar, Hema A. Murthy, Xavier Serra
2015 conf
ISMIR
Sankalp Gulati, Joan Serrà, Xavier Serra
2015 conf
ISMIR
Ajay Srinivasamurthy, Andre Holzapfel, Ali Taylan Cemgil, Xavier Serra
2015 conf
ISMIR
Shuo Zhang, Rafael Caro Repetto, Xavier Serra
2015 conf
ISMIR
Georgi Dzhambazov, Sertan Sentürk, Xavier Serra
2014 conf
DLfM@JCDL
Burak Uyar, Hasan Sercan Atli, Sertan Sentürk, Baris Bozkurt, Xavier Serra
2014 Misc conf
ICASSP
Mi Tian, Ajay Srinivasamurthy, Mark B. Sandler, Xavier Serra
2014 Misc conf
ICASSP
Ajay Srinivasamurthy, Xavier Serra
2014 conf
DLfM@JCDL
Alastair Porter, Xavier Serra
2014 conf
Semantic Audio
Frederic Font, Joan Serrà, Xavier Serra
2014 J jnl
Knowl. Based Syst.
Frederic Font, Joan Serrà, Xavier Serra
2014 conf
ICMC
Ajay Srinivasamurthy, Gopala Krishna Koduri, Sankalp Gulati, Vignesh Ishwar, Xavier Serra
2014 conf
DLfM@JCDL
Mohamed Sordo, Amin Chaachoo, Xavier Serra
2014 conf
Semantic Audio
Xavier Serra
2014 conf
ISMIR
Rafael Caro Repetto, Xavier Serra
2014 conf
ISWC (Posters & Demos)
Frederic Font, Sergio Oramas, György Fazekas, Xavier Serra
2014 conf
ICMC
Sankalp Gulati, Joan Serrà, Kaustuv Kanti Ganguli, Xavier Serra
2014 conf
SITIS
Sankalp Gulati, Joan Serrà, Vignesh Ishwar, Xavier Serra
2014 conf
ISMIR
Shuo Zhang, Rafael Caro Repetto, Xavier Serra
2014 conf
ISMIR
Ajay Srinivasamurthy, Rafael Caro Repetto, Sundar Harshavardhan, Xavier Serra
2014 conf
ISMIR
Julián Urbano, Dmitry Bogdanov, Perfecto Herrera, Emilia Gómez, Xavier Serra
2013 conf
ISMIR
Alastair Porter, Mohamed Sordo, Xavier Serra
2013 A* conf
ACM Multimedia
Dmitry Bogdanov, Nicolas Wack, Emilia Gómez, Sankalp Gulati, Perfecto Herrera, Oscar Mayor, Gerard Roma, Justin Salamon, José Ricardo Zapata, Xavier Serra
2013 conf
ISMIR
Dmitry Bogdanov, Nicolas Wack, Emilia Gómez, Sankalp Gulati, Perfecto Herrera, Oscar Mayor, Gerard Roma, Justin Salamon, José Ricardo Zapata, Xavier Serra
2013 J jnl
J. Intell. Inf. Syst.
Julián Urbano, Markus Schedl, Xavier Serra
2013 J jnl
Int. J. Semantic Web Inf. Syst.
Frederic Font, Joan Serrà, Xavier Serra
2013 A* conf
ACM Multimedia
Frederic Font, Gerard Roma, Xavier Serra
2013 conf
ISMIR
Sertan Sentürk, Sankalp Gulati, Xavier Serra
2013 conf
SSW
Xavier Serra
2012 conf
ISMIR
Justin Salamon, Sankalp Gulati, Xavier Serra
2012 J jnl
IEEE Trans. Evol. Comput.
Rafael Ramírez, Esteban Maestre, Xavier Serra
2012 J jnl
Pattern Recognit. Lett.
Joan Serrà, Massimiliano Zanin, Perfecto Herrera, Xavier Serra
2012 conf
ISMIR
Tan Hakan Özaslan, Xavier Serra, Josep Lluís Arcos
2012 conf
ISMIR
Gopala K. Koduri, Joan Serrà, Xavier Serra
2012 conf
CIP
Frederic Font, Gerard Roma, Perfecto Herrera, Xavier Serra
2012 conf
WWW (Companion Volume)
Xavier Serra
2012 conf
ISMIR
Mohamed Sordo, Joan Serrà, Gopala K. Koduri, Xavier Serra
2012 conf
ISMIR
Frederic Font, Joan Serrà, Xavier Serra
2012 J jnl
IEEE Trans. Speech Audio Process.
Joan Serrà, Holger Kantz, Xavier Serra, Ralph G. Andrzejak
2012 J jnl
Int. J. Soc. Netw. Min.
Gerard Roma, Perfecto Herrera, Massimiliano Zanin, Sergio L. Toral Marín, Frederic Font, Xavier Serra
2011 conf
ISMIR
Xavier Serra
2011 conf
ISMIR
Joan Serrà, Gopala K. Koduri, Marius Miron, Xavier Serra
2011 J jnl
CoRR
Joan Serrà, Massimiliano Zanin, Perfecto Herrera, Xavier Serra
2011 conf
ISMIR
Gopala K. Koduri, Marius Miron, Joan Serrà, Xavier Serra
2011 A conf
UMAP
Frederic Font, Xavier Serra
2011 conf
ISABEL
Waldo Nogueira, Martín Haro, Perfecto Herrera, Xavier Serra
2011 J jnl
IEEE Trans. Multim.
Dmitry Bogdanov, Joan Serrà, Nicolas Wack, Perfecto Herrera, Xavier Serra
2010 J jnl
Pattern Recognit. Lett.
Rafael Ramírez, Esteban Maestre, Xavier Serra
2010 J jnl
EURASIP J. Audio Speech Music. Process.
Gerard Roma, Jordi Janer, Stefan Kersten, Mattia Schirosa, Perfecto Herrera, Xavier Serra
2010 J jnl
Multim. Tools Appl.
Cyril Laurier, Owen Meyers, Joan Serrà, Martin Blech, Perfecto Herrera, Xavier Serra
2009 J jnl
Comput. Music. J.
Esteban Maestre, Rafael Ramírez, Stefan Kersten, Xavier Serra
2009 conf
CCIA
Xavier Serra
2009 J jnl
Connect. Sci.
Amaury Hazan, Ricard Marxer, Paul Brossier, Hendrik Purwins, Perfecto Herrera, Xavier Serra
2008 J jnl
Comput. Music. J.
Rafael Ramírez, Amaury Hazan, Esteban Maestre, Xavier Serra
2008 J jnl
IEEE Trans. Speech Audio Process.
Joan Serrà, Emilia Gómez, Perfecto Herrera, Xavier Serra
2008 conf
The Art of Artificial Evolution
Rafael Ramírez, Amaury Hazan, Jordi Marine, Xavier Serra
2008 J jnl
J. Web Semant.
Òscar Celma, Xavier Serra
2007 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Rafael Ramírez, Esteban Maestre, Antonio Pertusa, Emilia Gómez, Xavier Serra
2007 C conf
MMSP
Xavier Serra
2007 J jnl
IEEE Signal Process. Mag.
Jordi Bonada, Xavier Serra
2006 conf
SAMT (Posters and Demos)
Òscar Celma, Perfecto Herrera, Xavier Serra
2005 conf
ICMC
Xavier Serra
2004 conf
ICMC
Xavier Serra
2004 conf
ICMC
Matthew Wright, Roger B. Dannenberg, Stephen Travis Pope, Xavier Rodet, Xavier Serra, David Wessel
2001 conf
ICMC
Jordi Bonada, Òscar Celma, Alex Loscos, Jaume Ortolà, Xavier Serra, Yasuo Yoshioka, Hiraku Kayama, Yuji Hisaminato, Hideki Kenmochi
2000 conf
ICMC
Xavier Serra
2000 conf
ICMC
Maarten de Boer, Jordi Bonada, Pedro Cano, Alex Loscos, Xavier Serra
2000 conf
ISMIR
Perfecto Herrera-Boyer, Xavier Amatriain, Eloi Batlle, Xavier Serra
2000 conf
ICMC
Maarten de Boer, Jordi Bonada, Xavier Serra
2000 conf
ICMC
Pedro Cano, Alex Loscos, Jordi Bonada, Maarten de Boer, Xavier Serra
1999 conf
ICMC
Perfecto Herrera, Xavier Serra, Geoffroy Peeters
1999 conf
ICMC
Eduard Resina, Xavier Serra
1998 conf
ICMC
Matthew Wright, Amar Chaudhary, Adrian Freed, David Wessel, Xavier Rodet, Dominique Virolle, Rolf Wöhrmann, Xavier Serra
1997 conf
ICMC
Ramon Loureiro, Xavier Serra
1997 conf
ICMC
Xavier Serra, Jordi Bonada, Perfecto Herrera, Ramon Loureiro
1997 conf
ICMC
Josep Lluís Arcos, Ramón López de Mántaras, Xavier Serra
1994 conf
ICMC
Xavier Serra
1989 conf
ICMC
Xavier Serra, Julius O. Smith III
1987 conf
ICMC
Julius O. Smith III, Xavier Serra
1986 conf
ICMC
Xavier Serra
redb/extractors/decompiler/DecompileBinja.py
← Index redb/extractors/decompiler/DecompileBinja.py python
import hashlib
import inspect
import json
import logging
import os
import signal
import time
from datetime import datetime, timezone
from typing import Dict, Any, Optional
from pathlib import Path
import subprocess
import sys

from redb.extractors.enum import Tag
from redb.extractors.extractor import Extractor
import magic
import pefile
from elftools.elf.elffile import ELFFile

# Import our BinjaDecompiler (conditional)
from redb.extractors.decompiler.bninja.decompiler import BinaryNinjaDecompiler

class DecompileBinja(Extractor):
    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        filetype=None,
        decompile_modules=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
        )
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Check if Binary Ninja is available
       # if not BINARYNINJA_AVAILABLE:
        #     self.log.error("Binary Ninja is not available in this container")
        #    raise ImportError(
        #        "Binary Ninja module not found - not available in feature extraction container"
        #    )
        self.analysis_results = None
        self.binja_decompiler = None
        self.filetype = filetype
        self.decompile_modules = decompile_modules or {"all"}
        self.goresym_data = None
        self.goresym_output_path = None

        # Convert TIMEOUT to integer with a default of 1200 seconds (20 minutes)
        try:
            self.BINJA_TIMEOUT = int(os.getenv("BINJA_TIMEOUT", "1200"))
        except ValueError:
            self.log.warning(
                "Invalid BINJA_TIMEOUT value, using default of 1200 seconds"
            )
            self.BINJA_TIMEOUT = 1200

        # Convert TIMEOUT to integer with a default of 1200 seconds (20 minutes)
        try:
            self.DECOMPILE_EXTRACTOR_TIMEOUT = int(
                os.getenv("DECOMPILE_EXTRACTOR_TIMEOUT", "2580")
            )
        except ValueError:
            self.log.warning(
                "Invalid DECOMPILE_EXTRACTOR_TIMEOUT value, using default of 2580 seconds"
            )
            self.DECOMPILE_EXTRACTOR_TIMEOUT = 2580

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cleanup_run()

    def calculate_md5(self, input_str):
        """Calculate MD5 hash of a string."""
        return hashlib.md5(input_str.encode("utf-8")).hexdigest()

    def is_dotnet(self):
        """Check if the binary is a .NET assembly.

        Returns:
            bool: True if the file is a .NET assembly, False otherwise
        """
        try:
            if self.filetype == "pebin":
                file_type = magic.from_buffer(self.binary)
                if ".Net" in file_type:
                    return True
                pe = pefile.PE(self.filepath)
                for entry in pe.OPTIONAL_HEADER.DATA_DIRECTORY:
                    # IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR is typically 14
                    if (
                        entry.name == "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR"
                        and entry.Size > 0
                    ):
                        return True
                return False
            return False
        except AttributeError as e:
            self.log.error(
                f"AttributeError error dotnet file {self.hash.sha256} Full error : {e}"
            )
            return False

    def is_golang(self):
        """Check if the binary is a Go-compiled binary (heuristic).

        Supports PE and ELF binaries.
        """
        try:
            if self.filetype == "pebin":
                pe = pefile.PE(self.filepath)
                signatures = [b"Go build ID:", b"runtime.main", b"main.main"]

                for section in pe.sections:
                    data = section.get_data()
                    if any(sig in data for sig in signatures):
                        return True

                return False

            elif self.filetype == "elf":
                with open(self.filepath, "rb") as f:
                    elf = ELFFile(f)

                    # 1. Section-based checks
                    section_names = [sec.name for sec in elf.iter_sections()]
                    if any(
                        s in section_names
                        for s in (".note.go.buildid", ".gopclntab")
                    ):
                        return True

                    # 2. String scan in loadable sections
                    signatures = [
                        b"Go build ID:",
                        b"runtime.main",
                        b"runtime.goexit",
                        b"runtime.morestack",
                        b"main.main",
                    ]

                    for sec in elf.iter_sections():
                        if sec["sh_flags"] & 0x2:  # SHF_ALLOC
                            data = sec.data()
                            if any(sig in data for sig in signatures):
                                return True

                return False

            return False

        except Exception as e:
            self.log.error(
                f"Golang detection error {self.hash.sha256}: {e}"
            )
            return False

    def cleanup_run(self):
        """Clean up after analysis."""
        try:
            # BinaryNinjaDecompiler uses context manager pattern (__enter__/__exit__)
            # Cleanup happens automatically when exiting the 'with' block
            self.binja_decompiler = None

            # Clean up goresym temp file if it exists (keep in debug mode)
            if self.goresym_output_path and os.path.exists(self.goresym_output_path):
                if self.log.isEnabledFor(logging.DEBUG):
                    self.log.debug(f"Debug mode: keeping goresym output at {self.goresym_output_path}")
                else:
                    os.remove(self.goresym_output_path)
                    self.goresym_output_path = None

            # Force garbage collection
            import gc

            gc.collect()

        except Exception as e:
            self.log.error(f"Error in cleanup: {e}")

    def run_goresym(self, binary_path, output_json_path):
        """
            Run goresym on a Go binary and export its JSON output to a file.
            binary_path: path to the Go binary to analyze
            output_json_path: path where the JSON output will be saved
            """
        binary_path = str(Path(binary_path).resolve())
        output_json_path = str(Path(output_json_path).resolve())
        goresym_path = os.getenv("GORESYM_PATH", "GoReSym")

        try:
            # Example: goresym -t json /path/to/binary
            self.log.info("DEBUG: starting GoReSym")
            result = subprocess.run(
                [goresym_path, binary_path],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True,
            )
        except FileNotFoundError:
            self.log.error("Error: 'goresym' not found in PATH. Make sure it is installed.")
            raise
        except subprocess.CalledProcessError as e:
            self.log.error("Error during goresym execution:")
            self.log.error(e.stderr)


        # Assuming goresym emits valid JSON to stdout.
        try:
            parsed = json.loads(result.stdout)
            # Store parsed JSON for later export to ClickHouse
            self.goresym_data = parsed
        except json.JSONDecodeError:
            # If it's not valid JSON, save the raw output instead.
            self.log.error("Warning: goresym output is not valid JSON; saving raw.")
            with open(output_json_path, "w", encoding="utf-8") as f:
                f.write(result.stdout)
            return

        # Save pretty-printed JSON for readability and debugging (used by BinaryNinja)
        with open(output_json_path, "w", encoding="utf-8") as f:
            json.dump(parsed, f, ensure_ascii=False, indent=2)
        self.goresym_output_path = output_json_path

        self.log.debug(f"goresym output saved to: {output_json_path}")

    def analyze_binary(self) -> Optional[Dict[str, Any]]:
        """Run Binary Ninja analysis and return results."""
        self.log.debug("Starting binary analysis")
        # if the binary is dotnet (only PE)
        if self.is_dotnet():
            self.log.debug("Skipping .NET binary - decompilation not supported")
            return None

        output_json_path = None
        ## if golang: run goresym
        try:
            if self.is_golang():
                output_json_path = "./goResym.json"
                self.run_goresym(self.filepath, output_json_path)
        except Exception as e:
            self.log.error(f"Error on GoReSym extraction: {e}")

        try:
            # Use BinaryNinjaDecompiler as a context manager to ensure proper setup/cleanup
            with BinaryNinjaDecompiler(
                filepath=self.filepath,
                timeout=self.BINJA_TIMEOUT,
                log=self.log,
                exporters=self.exporters,
                index_prefix=self.index_prefix,
                filetype=self.filetype,
                goresym=output_json_path,
                decompile_modules=self.decompile_modules,
            ) as decompiler:
                self.binja_decompiler = decompiler

                if decompiler.extract():
                    # Store results before context manager exits
                    results = decompiler.analysis_results
                    return results
                else:
                    self.log.error("BinaryNinjaDecompiler extraction failed")
                    return None

        except Exception as e:
            self.log.error(f"Error in Binary Ninja analysis: {e}")
            import traceback
            self.log.error(f"Traceback: {traceback.format_exc()}")
            return None

        finally:
            self.cleanup_run()

    def extract(self):
        """Extract and process all analysis results."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        # Create a flag to track if extraction completed
        extraction_completed = False
        extraction_result = False
        extraction_error = None

        # Define the extraction process as a separate function
        def do_extraction():
            nonlocal extraction_completed, extraction_result, extraction_error
            try:
                results = self.analyze_binary()
                if not results:
                    extraction_result = False
                else:
                    self.analysis_results = results
                    # Add file hashes from parent Extractor class to analysis results
                    self.analysis_results["sha256"] = self.sha256
                    self.analysis_results["sha1"] = self.sha1
                    self.analysis_results["md5"] = self.md5
                    extraction_result = True
            except Exception as e:
                extraction_error = e
                extraction_result = False
            finally:
                extraction_completed = True

        # Run extraction directly with signal-based timeout (no thread overhead).
        # SIGALRM is delivered by the OS, so there's no GIL contention or polling.
        old_handler = signal.getsignal(signal.SIGALRM)
        def _timeout_handler(signum, frame):
            raise TimeoutError("Extraction timed out")

        signal.signal(signal.SIGALRM, _timeout_handler)
        signal.alarm(self.DECOMPILE_EXTRACTOR_TIMEOUT)
        try:
            do_extraction()
        except TimeoutError:
            self.log.error(
                f"Extraction timed out after {self.DECOMPILE_EXTRACTOR_TIMEOUT} seconds"
            )
            self.cleanup_run()
            return None
        finally:
            signal.alarm(0)
            signal.signal(signal.SIGALRM, old_handler)

        if extraction_error:
            self.log.error(f"Error in extraction: {extraction_error}")
            return None

        # Return the actual analysis results, not just a boolean
        return self.analysis_results if extraction_result else None

    def prepare_export_data(self, exporter_type: str) -> Any:
        """Prepare data for database export."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not self.analysis_results:
            return None

        # # Delegate to the BinjaDecompiler for consistent export formatting
        # if self.binja_decompiler:
        #     return self.binja_decompiler.prepare_export_data(exporter_type)
        # else:
        #     self.log.error("BinjaDecompiler not available for export preparation")
        #     return None

        if exporter_type == "ClickHouseExporter":
            now = datetime.now(timezone.utc)

            def prepare_array_field(value, array_type):
                """Helper to prepare array fields with proper null handling"""
                if value is None:
                    return []
                return value

            # Add a helper function to handle empty strings
            def ensure_not_empty(value, default="UNKNOWN"):
                """Ensure a string value is not empty"""
                if value is None or value == "":
                    return default
                return value

            def prepare_register_usage_map(register_dict):
                """Convert register usage dict to Map format with tuples
                Input: {"rbx": {"reads": 3, "writes": 1}, ...}
                Output: {"rbx": (3, 1), ...}
                """
                if not register_dict:
                    return {}
                return {
                    reg: (info.get("reads", 0), info.get("writes", 0))
                    for reg, info in register_dict.items()
                }


            decompile_modules = getattr(self, "decompile_modules", {"all"})
            run_all = "all" in decompile_modules
            run_decompilation = run_all or "decompilation" in decompile_modules
            run_disassembly = run_all or "disassembly" in decompile_modules
            run_llil = run_all or "llil" in decompile_modules
            run_cfg = run_all or "cfg" in decompile_modules
            run_strings = run_all or "strings" in decompile_modules

            export = {"multi_table": True}

            # Decompilation tables
            if run_decompilation:
                export["decompiled_content"] = {
                    "table": "code_binja_decompiled_functions_content",
                    "data": [
                        [
                            f["decompiled_function_hash"],
                            f["decompiled_function"],
                            f["function_type"],
                            f.get("flattened_score"),
                            f.get("mba_score"),
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "decompiled_function_hash",
                        "decompiled_function",
                        "function_type",
                        "flattened_score",
                        "mba_score",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "Nullable(Float64)",
                        "Nullable(Float64)",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["decompiled_refs"] = {
                    "table": "code_binja_decompiled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f["decompiled_function_hash"],
                            f.get("disassembled_function_hash"),
                            f["decompiled_function_name"],
                            f["decompiled_function_prototype"],
                            f["decompiled_function_address"],
                            prepare_array_field(f.get("functions_caller"), "Array(String)"),
                            prepare_array_field(f.get("functions_call"), "Array(String)"),
                            now,
                        ]
                        for f in self.analysis_results["decompiled"]
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "decompiled_function_hash",
                        "disassembled_function_hash",
                        "decompiled_function_name",
                        "decompiled_function_prototype",
                        "decompiled_function_address",
                        "functions_caller",
                        "functions_call",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "LowCardinality(String)",
                        "UInt64",
                        "Array(String)",
                        "Array(String)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Disassembly tables
            if run_disassembly:
                export["disassembled_content"] = {
                    "table": "code_binja_disassembled_functions_content",
                    "data": [
                        [
                            f["disassembled_function_hash"],
                            f.get("disassembled_function", ""),
                            f.get("disassembled_function_no_addresses", ""),
                            f.get("function_type", "UNKNOWN"),
                            f.get("instructions_count", 0),
                            prepare_array_field(
                                f.get("instructions_types"), "LowCardinality(String)"
                            ),
                            f.get("control_flow_count", 0),
                            prepare_array_field(
                                f.get("memory_access_pattern"), "LowCardinality(String)"
                            ),
                            prepare_array_field(
                                f.get("register_usage"), "LowCardinality(String)"
                            ),
                            f.get("data_references_count", 0),
                            f.get("max_block_size"),
                            f.get("num_calls"),
                            f.get("stack_size"),
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "disassembled_function",
                        "disassembled_function_no_addresses",
                        "function_type",
                        "instructions_count",
                        "instructions_types",
                        "control_flow_count",
                        "memory_access_pattern",
                        "register_usage",
                        "data_references_count",
                        "max_block_size",
                        "num_calls",
                        "stack_size",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Nullable(UInt32)",
                        "Nullable(UInt32)",
                        "Nullable(Int32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["disassembled_refs"] = {
                    "table": "code_binja_disassembled_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f["disassembled_function_hash"],
                            f.get("decompiled_function_hash"),
                            f["disassembled_function_name"],
                            f["disassembled_function_address"],
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            now,
                        ]
                        for f in self.analysis_results["disassembled"]
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "disassembled_function_hash",
                        "decompiled_function_hash",
                        "disassembled_function_name",
                        "disassembled_function_address",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                # Function similarity metrics table (derived from disassembly data)
                # Lookup maps to join LLIL/MLIL features by disassembled_function_hash
                llil_by_hash = {
                    l.get("disassembled_function_hash"): l
                    for l in self.analysis_results.get("llil", [])
                    if l and l.get("disassembled_function_hash")
                }
                mlil_by_hash = {
                    m.get("disassembled_function_hash"): m
                    for m in self.analysis_results.get("mlil", [])
                    if m and m.get("disassembled_function_hash")
                }

                export["function_similarity_metrics"] = {
                    "table": "code_binja_function_similarity_metrics",
                    "data": [
                        [
                            f["disassembled_function_hash"],
                            f.get("cyclomatic_complexity"),
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            prepare_array_field(f.get("minhash"), "Array(UInt8)"),
                            (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_llil"),
                            (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get(
                                "tlsh_instruction_typed_llil"),
                            prepare_array_field(
                                (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_llil_skeleton"),
                                "Array(UInt8)",
                            ),
                            prepare_array_field(
                                (llil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_llil_typed"),
                                "Array(UInt8)",
                            ),
                            (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_mlil_skeleton"),
                            (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("tlsh_mlil_typed"),
                            prepare_array_field(
                                (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_mlil_skeleton"),
                                "Array(UInt8)",
                            ),
                            prepare_array_field(
                                (mlil_by_hash.get(f["disassembled_function_hash"]) or {}).get("minhash_mlil_typed"),
                                "Array(UInt8)",
                            ),
                            now,
                        ]
                        for f in self.analysis_results.get("disassembled", [])
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "cyclomatic_complexity",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "minhash",
                        "tlsh_llil_new",
                        "tlsh_instruction_typed_llil",
                        "minhash_llil_skeleton",
                        "minhash_llil_typed",
                        "tlsh_mlil_skeleton",
                        "tlsh_mlil_typed",
                        "minhash_mlil_skeleton",
                        "minhash_mlil_typed",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(UInt16)",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        # new
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(UInt8)",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(UInt8)",
                        "DateTime64(3, 'UTC')",
                    ],
                }


            # LLIL tables
            if run_llil:
                export["llil_content"] = {
                    "table": "code_binja_llil_functions_content",
                    "data": [
                        [
                            f["sha256_llil"],
                            f["function_type"],
                            prepare_array_field(
                                f.get("instructions_types_llil"), "LowCardinality(String)"
                            ),
                            f.get("control_flow_count_llil", 0),
                            prepare_array_field(
                                f.get("memory_access_pattern_llil"), "LowCardinality(String)"
                            ),
                            prepare_register_usage_map(f.get("register_usage", {})),
                            f.get("total_reg_reads", 0),
                            f.get("total_reg_written", 0),
                            f.get("data_references_count", 0),
                            f.get("max_block_size"),
                            f.get("num_calls"),
                            f.get("stack_size"),
                            prepare_array_field(f.get("body_llil_vector"), "Array(Tuple(UInt32, Array(UInt16)))"),
                            now,
                        ]
                        for f in self.analysis_results.get("llil", [])
                    ],
                    "column_names": [
                        "llil_function_hash",
                        "function_type",
                        "instructions_types_llil",
                        "control_flow_count_llil",
                        "memory_access_pattern_llil",
                        "register_usage_llil",
                        "total_reg_reads",
                        "total_reg_written",
                        "data_references_count",
                        "max_block_size",
                        "num_calls",
                        "stack_size",
                        "body_llil_vector",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'THUNK'=3, 'EXTERNAL'=4, 'UNKNOWN'=5)",
                        "Array(LowCardinality(String))",
                        "UInt32",
                        "Array(LowCardinality(String))",
                        "Map(LowCardinality(String), Tuple(UInt32, UInt32))",
                        "UInt32",
                        "UInt32",
                        "UInt32",
                        "Nullable(UInt32)",
                        "Nullable(UInt32)",
                        "Nullable(Int32)",
                        "Array(Tuple(UInt32, Array(UInt16)))",
                        "DateTime64(3, 'UTC')",
                    ],
                }
                export["llil_refs"] = {
                    "table": "code_binja_llil_functions_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            self.analysis_results["sha1"],
                            self.analysis_results["md5"],
                            f.get("sha256_llil"),
                            f.get("disassembled_function_hash"),
                            f.get("function_address"),
                            f.get("tlsh_disassembly"),
                            f.get("tlsh_llil"),
                            now,
                        ]
                        for f in self.analysis_results.get("llil", [])
                    ],
                    "column_names": [
                        "sha256",
                        "sha1",
                        "md5",
                        "llil_function_hash",
                        "disassembled_function_hash",
                        "function_address",
                        "tlsh_disassembly",
                        "tlsh_llil",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(40)",
                        "FixedString(32)",
                        "Nullable(FixedString(64))",
                        "FixedString(64)",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Nullable(FixedString(72))",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Errors table (always include if per-function loop ran)
            if run_decompilation or run_disassembly or run_llil or run_cfg:
                export["function_analysis_errors"] = {
                    "table": "new_function_analysis_errors_binja",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["function_name"],
                            f["function_address"],
                            f.get("error_location", "unknown"),
                            f.get("error_message", ""),
                            f.get("error_details", ""),
                            f.get("error_type", "unknown"),
                            self.calculate_md5(
                                f"{f.get('error_message', '')}{f['function_name']}{f['function_address']}{f.get('error_location', 'unknown')}"
                            ),
                            "new",
                            now,
                        ]
                        for f in self.analysis_results.get("errors", [])
                    ],
                    "column_names": [
                        "sha256",
                        "function_name",
                        "function_address",
                        "error_location",
                        "error_message",
                        "error_details",
                        "error_type",
                        "error_hash",
                        "status",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "UInt64",
                        "LowCardinality(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "FixedString(32)",
                        "Enum8('new'=1, 'investigating'=2, 'fixed'=3, 'wontfix'=4)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Strings table
            if run_strings:
                export["strings_raw"] = {
                    "table": "code_binja_strings_raw",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            s["string"],
                            s["string_raw"],
                            s["string_encoding"],
                            s["string_offset"],
                            s["string_length"],
                            s["string_raw_length"],
                            s["string_entropy"],
                        ]
                        for s in self.analysis_results.get("strings", [])
                    ],
                    "column_names": [
                        "sha256",
                        "string",
                        "string_raw",
                        "string_encoding",
                        "string_offset",
                        "string_length",
                        "string_raw_length",
                        "string_entropy",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "LowCardinality(String)",
                        "UInt64",
                        "UInt32",
                        "UInt32",
                        "Float32",
                    ],
                }

            # CFG function-level features table
            if run_cfg:
                export["cfg_functions"] = {
                    "table": "code_binja_cfg_functions",
                    "data": [
                        [
                            cfg.get("disassembled_function_hash"),
                            cfg["cfg_topology_hash"],
                            cfg["block_count"],
                            cfg["edge_count"],
                            cfg.get("llil_total_operations", 0),
                            cfg.get("call_count", 0),
                            cfg["cyclomatic_complexity"],
                            cfg.get("loop_count", 0),
                            cfg.get("max_depth", 0),
                            cfg.get("max_fan_out", 0),
                            cfg.get("md_index_topdown", 0),
                            cfg.get("md_index_bottomup", 0),
                            cfg.get("prime_product_llil", 0),
                            cfg.get("cfg_feature_tlsh"),
                            cfg.get("wl_minhash", []),
                            cfg.get("bb_features", []),
                            cfg.get("cfg_adjacency", []),
                            now,
                        ]
                        for cfg in self.analysis_results.get("cfg", [])
                        if cfg is not None
                    ],
                    "column_names": [
                        "disassembled_function_hash",
                        "cfg_topology_hash",
                        "block_count",
                        "edge_count",
                        "llil_total_operations",
                        "call_count",
                        "cyclomatic_complexity",
                        "loop_count",
                        "max_depth",
                        "max_fan_out",
                        "md_index_topdown",
                        "md_index_bottomup",
                        "prime_product_llil",
                        "cfg_feature_tlsh",
                        "wl_minhash",
                        "bb_features",
                        "cfg_adjacency",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(16)",
                        "UInt16",
                        "UInt16",
                        "UInt32",
                        "UInt16",
                        "UInt16",
                        "UInt8",
                        "UInt16",
                        "UInt8",
                        "UInt64",
                        "UInt64",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(Array(UInt16))",
                        "Array(UInt32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # GoReSym metadata table (only if goresym data exists)
            if self.goresym_data:
                export["golang_metadata"] = {
                    "table": "redb_golang_metadata",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            json.dumps(self.goresym_data),
                            now,
                        ]
                    ],
                    "column_names": [
                        "sha256",
                        "goresym",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "JSON",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            return export

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.DECOMPILED.value

    def get_clickhouse_table(self) -> str:
        """Not used directly as we're handling multiple tables."""
        pass


if __name__ == "__main__":
    # Setup basic logging
    import logging
    import time

    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger("DecompileBinja")

    # Parse command line arguments
    import argparse

    parser = argparse.ArgumentParser(description="Binary Ninja Decompiler Wrapper")
    parser.add_argument("filepath", help="Path to the binary file to analyze")
    parser.add_argument(
        "--output", "-o", help="Output JSON file path (default: stdout)"
    )
    parser.add_argument(
        "--timeout",
        "-t",
        type=int,
        default=1200,
        help="Analysis timeout in seconds (default: 1200)",
    )
    args = parser.parse_args()
    start = time.perf_counter()
    # Create and run the extractor
    with DecompileBinja(args.filepath, logger) as extractor:
        success = extractor.extract()
        end = time.perf_counter()
        if not success:
            logger.error("Analysis failed")
            exit(1)

        # Output results
        if args.output:
            with open(args.output, "w") as f:
                json.dump(extractor.analysis_results, f)
            logger.info(f"Results written to {args.output}")
        else:
            print((extractor.analysis_results))
            with open("diff", "w") as f:
                f.write(str(f"{end - start:.3f} seconds"))