A ver si podemos aportar un poquito de luz.
Un "codec" es básicamente un conjunto de instrucciones, un "manual" que le dice a un sistema operativo como puede un programa dentro del mismo manejar un stream de datos en un formato determinado.
Supongamos que tenemos un reproductor de Mp3 en nuestro ordenador (un programa), y metemos a reproducir "La Barbacoa" de Georgie Dan (si lo se... es un ejemplo muy malo)
El programa mira el fichero "La Barbacoa.mp3", lee su cabecera y confirma que es un archivo de ese tipo. A continuación tiene un montón de datos que es la "música". ¿Como convierte esos datos en música?
Pues con la ayuda de ese "codec" que hay en el sistema. Usándolo puede ir pasando esos datos del fichero y con la ayuda del mismo convertirlos en datos que puede enviar al procesador de audio, que los convertirá en las señales que salen por los altavoces
Y aquí viene lo gracioso, no existen "codecs únicos", sino que estos pueden estar especializados, no solo en un formato sino en otras particularidades.
Por ejemplo hay codecs de 32 y 64 bits. Si tu sistema soporta los de 64 el proceso será mas fluido, los hay que aprovechan un hardware concreto, como codecs para la reproducción de vídeo que aprovechen la potencia de tu gráfica (ya sea AMD, NVidia o la que toque)
El uso de esos "codecs" evita que una aplicación que reproduzca un tipo de formato, o varios tenga que tener en la misma las instrucciones de manejo de los mismos, aunque algunas aplicaciones lo hacen de todos modos (por ejemplo VLC tiene codecs propios)
Si tuvieramos que hacer una aplicación que reprodujera audio a partir de un formato (por ejemplo mp3), podríamos empollarnos el formato y "parir" una rutina que maneje esos datos contenidos en el fichero y los convierta en algo que podamos enviar a la tarjeta de sonido (ya sea integrada o no). Eso es posible, pero imagina que tu programa queremos que maneje cualquier tipo de formato (Mp3, Mp3.-Pro, Wav, FLAC, Ogg, AAC).
O nos empollamos todos los formatos disponibles y creamos rutinas para su manejo, o simplemente llamamos a los "codecs" que tenemos en nuestro sistema operativo, y que sean ellos los que se encargen de esa faena.
Lo mejor es que teniendo esos codecs, la aplicación puede llamarlos y manejarlos independientemente del lenguaje en el que esté escrita, lo que no deja de ser una ventaja.
El tema del vídeo es parecido, pero se lia un poco porque vídeo y audio pueden ser independientes, incluso puedes tener un fichero donde se mezclan en un solo stream de datos distintos ficheros de varios típos, como video, audio (uno o mas de uno), texto, etc.