Comment convertir un signal ADPCM G.726 en un signal PCM?

Je me tourne habituellement vers les bibliothèques audio intégrées de SoX ou de Window pour ces éléments, mais il semble qu’aucun d’eux ne possède de codecs G.726.

J’ai donc une séquence d’octets que je connais codés en G.726 bien que le débit binary et qu’il s’agisse de la loi mu ou de la loi A ne sont pas connus pour le moment (l’expérimentation déterminera ces parameters), et j’ai besoin de décodez-les en un signal PCM normal.

J’ai donc téléchargé l’implémentation de référence de l’UIT-T (Recommandation UIT-T G.191), mais je ne sais trop comment utiliser la fonction G726_decode . Selon la documentation, inp_buf et out_buf doivent avoir la même longueur. smpno et les deux tampons sont des tampons de 16 bits. Cela me semble manquer une étape; sinon, aucune compression n’est obtenue en utilisant G.726. Selon la page Wikipedia sur G.726, la taille de l’échantillon dépend du débit binary (de 2 à 5 bits). Suis-je censé faire la décompression en échantillons moi-même? Donc, si je suppose une compression maximale (échantillons de 2 bits), chaque octet produira 4 échantillons.

Exemple:

 char b = /* read the code from input */ short inp[4], output[4]; inp[0] = b & 0x0003; inp[1] = b & 0x000C >> 2; inp[2] = (b & 0x0030) >> 4; inp[3] = (b & 0x00C0) >> 6; G726_state state; memset(&state, 0, sizeof(G726_state)); G726_decode(inp, output, 4, "u", 2, 1, &state); /* ouput now contains 4 PCM samples */ 

Ou est-ce que je manque quelque chose complètement?

On dirait que ffmpeg n’est pas en mesure de le faire, car je pensais qu’il pourrait le faire … Cependant, pendant que je surfais sur Google, j’ai trouvé ce message sur la liste de diffusion ffmpeg qui offre une solution.

En gros, il existe un programme séparé appelé g72x ++ qui semble pouvoir décoder l’audio en PCM brut pour vous.