Transponer una matriz 2D

¿Cómo transpones eficientemente una matriz? ¿Hay bibliotecas para esto, o qué algoritmo usarías?

P.ej.:

short src[W*H] = {
  {1,2,3},
  {4,5,6}
};
short dest[W*H];


rotate_90_clockwise(dest,src,W,H); //<-- magic in here, no need for in-place

//dest is now:

{
  {4, 1},
  {5, 2},
  {6, 3}
};

(En mi caso específico, su matriz src es datos de imagen en bruto, y el destino es un framebuffer, y estoy incrustado en ARM en una cadena de herramientas que no admite ensamblaje)

Respuestas a la pregunta(6)

Su respuesta a la pregunta