Started re-implementing my own LTC code, since the libLTC, although excellent and very complete, it's too tied to audio-samples for a quick conversion. This way I get complete control over when the sync-word is emitted.
I've also changed to using EXTI interface instead of the ICU, since I'm only concerned with time since and edge, and not whether it's a rising or falling edge, or period/width typical of the ICU module.
Slowly removing libLTC from the project. My own implementation seems to be stable, I just need to drastically clean up the code. I am borrowing some stuff from libLTC, though I may have to actually write my own due to LGPL vs GPL.
LTC decoding is working with my own full implementation.
I have re-written from scratch the LTCFrame & SMPTETimecode structs, which means i am no longer using any of libLTC's (excellent) code.
The LTC is pushed into the KBB directly, so I don't store the SMPTETimecode anymore, but rather the raw LTC, which means you have to extract full time info from that, but it's exactly what you want to do. It contains all userbits, drop frame info, etc, etc.
To this effect, I have modified KBB.py, kbb_viewer.py and kbb_check.py to look at this data. The KBB class does the LTC->SMPTE decoding, if you need the userbits and that, it's there to decode.

I've started working on the GPS reading - it's using the UART driver instead of the Serial, since it's DMA-based and I can read a block at a time. I kick off the first read on 1PPS, and then 4 more subsequent reads when the buffer is full. I know that I will get some data after that 1st 1PPS (about 70ms from experience), so that's my best bet. I'm also explicitly dropping all bytes not handled read through this by implementing the rxchar_cb and leaving it empty.

I should also move all config structs into their own modules, instead of polluting main.c

I made a stupid mistake assigning TIMEPULSE to PC01, since channel 1 in EXTI is also shared with BTN1 from PA01. I've moved it in the config file to PC03, and modified the eagle layout, but the physical board is still made, so I'll have to make new ones at some point.