Split this into several layers.
At the lowest layer you have raw input events from the OS. SDL keyboard input, mouse input, joystick input, etc. You might have several platforms (SDL is a least-common-denominator lacking several input forms, for instance, which you might later care about).
You can abstract these with a very low-level custom event type, like "keyboard button down" or the like. When your platform layer (SDL game loop) receives input, it should create these low-level events and then forward them on to an input manager. It can do these with simple method calls, callback functions, a complicated event system, whatever you like best.
The input system now has the job of translating low-level input into high-level logical events. Game logic does not at all care that SPACE was pressed. It cares that JUMP was pressed. The input manager's job is to collect these low-level input events and generate high-level input events. It is responsible for knowing that the spacebar and the 'A' gamepad button both map to the logical command Jump. It deals with gamepad vs mouse look controls and so on. It emits high-level logical events that are as abstract as possible from the low-level controls (there are some limitations here, but you can abstract things away completely in the common case).
Your character controller then receives these events and processes these high-level input events to actually respond. The platform layer sent the event "Key down spacebar." The input system received that, looks at its mapping tables/logic, and then sends the event "Pressed jump." The game logic / character controller receives that event, checks that the player is actually allowed to jump, and then emits the "Player jumped" event (or just directly causes a jump to happen), which the rest of game logic uses to do whatever.
Anything dependent on game logic goes into the player controller. Anything OS dependent goes in the platform layer. All the rest goes into the input management layer.
Here's some amateurish ASCII art to describe this:
-----------------------------------------------------------------------
Platform Abstraction | Collect and forward OS input events
-----------------------------------------------------------------------
| |
| |
\ /
\_/
-----------------------------------------------------------------------
Input Manager | Translate OS input events into logical events
-----------------------------------------------------------------------
| |
| |
\ /
\_/
-----------------------------------------------------------------------
Character Controller | React to logical events and affect game play
-----------------------------------------------------------------------
| |
| |
\ /
\_/
-----------------------------------------------------------------------
Game Logic | React to player actions and provides feedback
-----------------------------------------------------------------------