Preguntas sobre la biblioteca de decodificación libmad
El archivo de encabezado "mad.h" define la estructura de datos y las funciones API de libmad[15].
Estructura mad_synth
Almacena datos PCM después de decodificar y filtros de síntesis
Estructura mad_pcm
Definición Muestra de audio rate, define la frecuencia de muestreo de audio, el número de canales y los datos de muestra PCM, utilizados para inicializar el audio
Estructura mad_frame
Estructura utilizada para grabar datos PCM después de decodificar fotogramas MPEG. mad_header se utiliza para registrar información básica de fotogramas MPEG, como el número de capa MPEG, el modo de canal, la velocidad de bits de transmisión y la velocidad de bits de muestreo. Los modos de canal incluyen mono, dos canales, canales de mezcla estéreo combinados y estéreo normal.
MAD implementa la decodificación a través de un mecanismo de función de devolución de llamada. Cada función de devolución de llamada devuelve un tipo de enumeración mad_flow, a través del cual se puede controlar el proceso de decodificación. Cuando no se procesa, MAD normalmente genera formato little endian de 32 bits almacenado en mad_fixed_t. MAD solo es responsable del proceso de decodificación y funciona de la siguiente manera: recibe información de una fuente externa, la decodifica cuadro por cuadro y devuelve información durante el proceso de decodificación para obtener el resultado del proceso de decodificación. Los desarrolladores deben configurar manualmente las entradas y salidas.
Programación del método de decodificación: inicialice mad_decoder, que contiene punteros a funciones de entrada, salida, filtro, error y devolución de llamada de mensajes. La inicialización se logra mediante mad_decoder_init() [16].
struct mad_decoder decoder;
struct my_playbuf playbuf; //Establecer búfer de datos
mad_decoder_init(&decoder,&playbuf,input_ func,header_func,/*filter* / 0, output_func, /*error*/ 0, /* message */ 0);
En esta función de inicialización, la función de entrada de devolución de llamada apunta a input_func, la función que procesa la información del encabezado del marco apunta a header_func, y otras funciones de filtro, error y mensajes no están configuradas y están configuradas en 0.
Luego, MAD ingresa al ciclo de decodificación:
Cuando la función de decodificación completa la decodificación de los datos, llama a input_func
Cuando input_func le dice a la función de decodificación que todos los datos han sido decodificados. Después de eso, llama a input_func.
Decodifica el encabezado del marco y llama a la función header_func
Decodifica los datos principales en el marco
Llama a la función filter_func; >Envíe los datos decodificados, llame a la función output_func;
Repita los pasos anteriores.
MAD consultará el estado de mad_flow al final de cada fotograma decodificado para decidir si decodificar el siguiente fotograma.
La estructura de datos de enum mad_flow se define de la siguiente manera:
enum mad_flow{
MAD_FLOW_CONTINUE = 0x0000, /*Continuar decodificando el siguiente cuadro*/
MAD_FLOW_STOP = 0x0010, / *Detener decodificar este flujo de bits y salir normalmente*/
MAD_FLOW_BREAK = 0x0010, /*Detener decodificar este flujo de bits y devolver un error*/
MAD_FLOW_IGNORE = 0x0020 /*No decodifica este fotograma, salta al siguiente fotograma*/
};
En la mayoría de los casos, la función de devolución de llamada devolverá MAD_FLOW_CONTINUE. El formato de declaración de la función de devolución de llamada que se personalizará es:
enum mad_flow (*input_func)(void *, struct mad_stream *);
enum mad_flow (*input_func)(void * , struct mad_stream *);
Este es el formato de declaración de la función de devolución de llamada que se personalizará.
enum mad_flow (*header_func)(void *, struct mad_header const *);
enum mad_flow (*filter_func)(void *, struct mad_stream const *, struct mad_frame *);
enum mad_flow (*output_func)(void *, struct mad_header const *, struct mad_pcm *);
enum mad_flow (*output_func)(void *, struct mad_header const *, struct mad_pcm *);
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
El puntero void * pasa los datos almacenados en el búfer a estas funciones de devolución de llamada, Procesan los datos.
La función input_func normalmente realiza las siguientes operaciones:
if (more_data_available)
buffer = refill_buffer();
mad_ stream_buffer(stream,buffer,length_of_buffer);
p>
Devuelve MAD_FLOW_CONTINUE;
De lo contrario, devuelve MAD_FLOW_STOP;
La función header_func leerá información importante del marco del archivo de encabezado señalado por mad_header, como la lectura asignada a mad_timer_t Para la longitud del fotograma, puede cambiar la longitud del fotograma desde mad.h.
En la función output_func, utilice el puntero mad_pcm que apunta a los datos PCM y realice una operación similar a lo siguiente:
mad_fixed_t *left_ch = pcm- >samples[0], *right_ch = pcm->samples[1] //Envía muestras al canal izquierdo y derecho respectivamente
int nsamples = pcm->longitud;
muestra int firmada;
char unsigned * buffer = some_buffer;
char unsigned * ptr = buffer;
while (nsamples--)
p>{
muestra = (int con signo) do_downsample(*left_ch++)
*ptr++ = (carácter sin firmar) (muestra & gt; > 0);
*ptr++ = (carácter sin firmar) (muestra >> 8);
muestra = (int con signo) do_downsample(* right_ch++)
*ptr++ = (carácter sin firmar) (muestra > 0);
*ptr++ = (carácter sin firmar) (muestra >> 8);
Definición de función de devolución de llamada. Después de definir la función de devolución de llamada, puede comenzar a decodificar:
mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);
Una vez completada la decodificación, llame a mad_decoder_finish(&decoder);
Esta es la primera vez que se llama a Mad_decoder_finish(&decoder).