ADX (formato de archivo)
Desarrollador (s) | Middleware CRI |
---|---|
Estado de desarrollo | Activo / desconocido |
Plataforma | Multiplataforma |
Tipo | Códec / Formato de archivo |
Licencia | Propietario |
Sitio web | Middleware CRI |
ADX es un lossy Propietario formato de almacenamiento y compresión de audio desarrollado por Middleware CRI específicamente para su uso en video juegos; se deriva de ADPCM. Su característica más notable es una función bucle que ha demostrado ser útil para la música de fondo en varios juegos que han adoptado el formato, incluyendo muchos juegos para el Sega Dreamcast así como algunas PlayStation 2, Nintendo GameCube y Wii juegos. Fue uno de los primeros juegos para utilizar ADX Burning Rangers, en el Sega Saturn. En particular, la La serie de erizo Sonic de la generación de Dreamcast hasta por lo menos Shadow the Hedgehog han usado este formato para grabaciones de música y voz.
En la cima de la codificación de ADPCM principal, el ADX toolkit también incluye un formato hermano, desmontaje AHX, que usa una variante del MPEG-2 audio diseñado específicamente para grabaciones de voz y un archivo empaquetado, AFS, para liar varias pistas ADX y desmontaje AHX en un archivo único contenedor.
Contenido
- 1 Resumen general
- 2 Descripción técnica
- 2.1 Encabezado de archivo
- 2.2 Formato de muestra
- 2.3 Decodificación de ADX
- 2.3.1 Cifrado
- 2.4 Decodificación de desmontaje AHX
- 3 Referencias
Resumen general
ADX es un formato de audio comprimido pero a diferencia MP3 y formatos similares, no se aplica un modelo psicoacústico el sonido para reducir su complejidad. El modelo ADPCM en cambio almacena las muestras registrando la error en relación con una predicción de la función que significa más de la señal original sobrevive el proceso de codificación; como tal compresión ADPCM en cambio comercia exactitud de la representación de tamaño mediante el uso de tamaños de muestra relativamente pequeña, generalmente 4bits. Tolerancia del sistema auditivo humano para esto provoca el ruido hace que la pérdida de exactitud apenas perceptible.
Al igual que otros formatos de codificación, ADX soporta múltiples frecuencias de muestreo como 22050 Hz44100 Hz, 48000 Hz, etc. sin embargo, la profundidad de la muestra de salida está bloqueada en 16bits, generalmente debido a la falta de precisión ya mencionado. Soporta múltiples canales, pero parece haber una limitación implícita de audio estéreo (canal 2), aunque el formato del archivo puede representar hasta 255 canales. El único rasgo distintivo particular que distingue ADX alternativas como la IMA ADPCM (aparte de tener una función diferente predicción) es la funcionalidad integrada de bucle, esto permite un reproductor de audio para opcionalmente saltar hacia atrás después de llegar a un solo punto especificado en la pista para crear un bucle coherente; Hipotéticamente, esta funcionalidad podría utilizarse para saltar hacia delante así pero eso sería redundante ya que el audio simplemente puede sujetarse con un programa de edición en su lugar.
Para la reproducción existen algunos plugins para el WinAmp y un converso a la herramienta de onda (véase la sección de referencias). El programa de código abierto / biblioteca FFmpeg también cuenta con soporte ADX implementado, sin embargo, su decodificador cuesta codificado así sólo correctamente puede decodificar 44100 Hz ADXs.
Descripción técnica
|
En esta sección contiene instrucciones, consejos o contenido How-to. (Junio de 2012) |
La especificación ADX no está libremente disponible, sin embargo los elementos más importantes de la estructura han sido inversas diseñado y documentado en varios lugares en la web. La información puede ser incompleta pero debe ser suficiente para construir un trabajo Códec o Transcoder.
Como nota al margen, los archivos AFS que ADXs a veces se embalan en son una simple variante de un tarball que utiliza índices numéricos para identificar el contenido en lugar de nombres. Código fuente de un extractor puede encontrarse en el archivo ADX.[1]
Encabezado de archivo
El formato de disco ADX está definido en Big-endian. Las secciones identificadas de la cabecera se describen abajo:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 x 0 | 0 x 80 | 0 x 00 | Copyright Offset | Tipo de codificación | Tamaño de bloque | Bitdepth muestra | Canal Conde | Frecuencia de muestreo | Muestras totales | |||||||
0 x 10 | Frecuencia de paso alto | Versión | Banderas | Desconocido | Bucle habilitado (v3) | Loop comienza muestra índice (v3) | ||||||||||
0 x 20 | Lazo comenzar bytes Index (v3) | Bucle habilitado (v4) Bucle final muestra índice (v3) |
Loop comienza muestra índice (v4) Bucle final Byte índice (v3) |
Lazo comenzar bytes Index (v4) | ||||||||||||
0 x 30 | Bucle final muestra índice (v4) | Bucle final Byte índice (v4) | Cero o más bytes espacio vacío | |||||||||||||
??? | [CopyrightOffset - 2] Cadena ASCII (inconclusa): "CRI (c)" | |||||||||||||||
... | [CopyrightOffset + 4] Datos de audio empieza aquí |
Campos etiquetados "Desconocido" contienen ambos datos desconocidos o son aparentemente sólo reservados (es decir, llena de bytes nulos). Los campos marcados con 'v3' o 'v4', pero ambos no son considerados a "Desconocido" en la versión con que no están marcados. También cabe que este encabezado puede ser tan corto como 20 bytes (0), según lo determinado por el desplazamiento de derechos de autor, que implícitamente elimina soporte para un bucle desde esos campos no están presentes.
El campo "Tipo de codificación" debe contener uno de:
- 0 x 03 para ADX estándar
- 0 x 04 para ADX con escala exponencial
- 0 x 10 o 0 para desmontaje AHX
El campo "Versión" debe contener uno de:
- 0 x 02 una variante de ' versión 3' con un decodificador fijo diferente
- 0 x 03 para ADX ' versión 3'
- 0 x 04 para ADX ' versión 4'
- 0 x 05 para una variante de ADX 4 sin bucle soporte
Al descifrar audio desmontaje AHX, el campo versión no parecen tener ningún significado y puede ser ignorado con seguridad.
Formato de muestra
Datos de audio codificado ADX está divididos en una serie de 'bloques', cada que contiene datos de único canal. Los bloques se colocan luego en 'Marcos', que consisten en una cuadra de cada canal en orden ascendente. Por ejemplo, en una secuencia de estéreo (canal 2) esto consistiría en fotograma 1: bloque de canal izquierdo, canal derecho bloque; Capítulo 2: izquierda, derecha; etc. Bloques son generalmente siempre 18 bytes de tamaño que contienen muestras de 4 bits aunque otros tamaños son técnicamente posibles, que esto parece un ejemplo de tal bloque:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Escala | 32 bits 4 muestras |
La escala es una 16 bits unsigned entero)Big-endian como la cabecera), que es esencialmente la amplificación de las muestras en ese bloque. Cada muestra en el bloque debe ser decodificada en secuencia de bits orden, es decir, más significativo primero un poco. Por ejemplo, cuando el tamaño de muestra es 4bits:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
Primera muestra | Segunda muestra |
Las muestras no se desconocen en reversa por lo que hay necesidad de tocar el violín con ellos una vez que se extraen. Cada muestra se firma para que en este ejemplo, el valor puede variar entre -8 y + 7 (que se multiplicará por la escala durante la descodificación). Como acotación al margen, aunque cualquier profundidad de bits entre 1 y 255 es hecha posible por la cabecera. Es poco probable que las muestras un poquito nunca ocurriría como sólo pueden representar los valores {0, 1}, {-1, 0} o {-1, 1}, los cuales no son particularmente útiles para la codificación de la música — si iban a ocurrir y no está claro cuál de las tres posibilidades es la interpretación correcta.
Decodificación de ADX
Esta sección atraviesa decodificación ADX ' versión 3' o ' versión 4' cuando "Encoding Type" ("ADX estándar"0 x 03). También se puede construir un codificador poniendo simplemente el código que corre en sentido inverso. Todas las muestras de código en esta sección están escritas usando C99.
|
Este artículo necesita atención de un experto en la producción de sonido profesional. (Diciembre de 2008) |
Antes un ADX 'estándar' puede ser codificado o decodificado, debe calcularse el conjunto de coeficientes de predicción. Esto generalmente se hace mejor en la fase de inicialización:
#define constantio acos(-1.0) doble a, b, c; un = sqrt(2.0) - cos(2.0 * CONSTANTIO * ((doble)adx_header->highpass_frequency / adx_header->electrica)); b = sqrt(2.0) - 1.0; c = (a - sqrt((a + b) * (a - b))) / b; (a+b)*(a-b) = a *-b * b, sin embargo la fórmula más simple pierde precisión en coma flotante coeficiente doble [2]; coeficiente[0] = c * 2.0; coeficiente[1] = -(c * c);
Este código calcula los coeficientes de predicción para la predicción de la muestra actual de las 2 muestras anteriores. Estos coeficientes forman también un primer pedido Respuesta impulsiva finita filtro de paso alto tan bien.[aclaración necesitado]
Una vez que sabemos los coeficientes decodificación que podemos empezar a descifrar la secuencia:
estática int32_t* past_samples; Previamente decodificado muestras de cada canal, cero al inicio (tamaño = 2 * channel_count) estática uint_fast32_t sample_index = 0; sample_index es el índice del conjunto de la muestra que debe ser descifrado a continuación estática ADX_header* adx_header; buffer es donde se pondrán las muestras descodificadas samples_needed indica cuántos muestra 'sistemas' (una muestra de cada canal) necesitan ser decodificada para llenar el buffer looping_enabled es una bandera booleana para controlar el uso del lazo incorporado Devuelve el número de la muestra 'sistemas' en el buffer que no puede ser llenado (EOS) unsigned decode_adx_standard( int16_t* almacenador intermediario, unsigned samples_needed, bool looping_enabled ) { unsigned Const samples_per_block = (adx_header->block_size - 2) * 8 / adx_header->sample_bitdepth; int16_t escala[ adx_header->channel_count ]; if (looping_enabled & & !adx_header->loop_enabled) looping_enabled = falso; Bucle hasta que el número requerido de muestras es decodificado, o se alcanza el final del archivo al mismo tiempo (samples_needed > 0 & & sample_index < adx_header->total_samples) { Calcular el número de muestras que quedan para ser decodificados en el bloque actual unsigned sample_offset = sample_index % samples_per_block; unsigned samples_can_get = samples_per_block - sample_offset; Las muestras de que podemos conseguir durante esta carrera si no encajan en el búfer la abrazadera if (samples_can_get > samples_needed) samples_can_get = samples_needed; El número de muestras a ser adquirida si la corriente no es suficiente o el gatillo de bucle está cercano de la abrazadera if (looping_enabled & & sample_index + samples_can_get > adx_header->loop_end_index) samples_can_get = adx_header->loop_end_index - sample_index; más if (sample_index + samples_can_get > adx_header->total_samples) samples_can_get = adx_header->total_samples - sample_index; Calcular la dirección poco del comienzo de la estructura que sample_index reside en y registrar la ubicación unsigned largo started_at = (adx_header->copyright_offset + 4 + \ sample_index / samples_per_block * adx_header->block_size * adx_header->channel_count) * 8; Leer los valores de escala desde el comienzo de cada bloque en este marco para (unsigned Yo = 0 ; Yo < adx_header->channel_count ; ++i) { bitstream_seek( started_at + adx_header->block_size * Yo * 8 ); escala[i] = ntohs()( bitstream_read( 16 ) ); } Pre calcular el valor de la parada de sample_offset unsigned sample_endoffset = sample_offset + samples_can_get; Guardar la dirección de flujo de bits de la primera muestra inmediatamente después de la escala en el primer bloque del marco started_at += 16; al mismo tiempo ( sample_offset < sample_endoffset ) { para (unsigned Yo = 0 ; Yo < adx_header->channel_count ; ++i) { Predecir la siguiente muestra doble sample_prediction = coeficiente[0] * past_samples[i*2 + 0] + coeficiente[1] * past_samples[i*2 + 1]; Buscar el offset de la muestra, leer y firmar extenderlo a un entero de 32 bits Implementación de señal extensión queda como un ejercicio para el lector La extensión de signo también tendrá que incluir un ajuste endian si hay más de 8 bits bitstream_seek( started_at + adx_header->sample_bitdepth * sample_offset + \ adx_header->block_size * 8 * Yo ); int_fast32_t sample_error = bitstream_read( adx_header->sample_bitdepth ); sample_error = sign_extend( sample_error, adx_header->sample_bitdepth ); Escala el valor de corrección de error sample_error *= escala[i]; Calcular la muestra mediante la combinación de la predicción con la corrección de errores int_fast32_t muestra = sample_error + (int_fast32_t)sample_prediction; Actualizar las últimas muestras con la muestra más reciente past_samples[i*2 + 1] = past_samples[i*2 + 0]; past_samples[i*2 + 0] = muestra; Abrazadera de la muestra descodificada para el intervalo válido para un entero de 16 bits if (muestra > 32767) muestra = 32767; más if (muestra < -32768) muestra = -32768; Guardar la muestra en el búfer y luego avanzar en un solo lugar *almacenador intermediario++ = muestra; } ++sample_offset; Hemos decodificado una muestra de cada bloque, desplazamiento de bloque de avance por 1 ++sample_index; Esto también significa que somos una muestra adicional en el torrente --samples_needed; Y entonces hay menos un conjunto de muestras que deben ser decodificados } Compruebe si golpeamos el marcador final de bucle, si logramos que necesitamos para saltar al comienzo del bucle if (looping_enabled & & sample_index == adx_header->loop_end_index) sample_index = adx_header->loop_start_index; } retorno samples_needed; }
La mayor parte del código anterior debe ser lo suficientemente sencilla para cualquier persona versada en C. El 'adx_header
' puntero se refiere a los datos extraídos de la cabecera como se describe anteriormente, se asume que ya se han convertido en el host de Endian. Esta aplicación no tiene la intención de ser óptima y han ignorado las preocupaciones externas tales como el método específico para la extensión de la muestra y el método de la adquisición de un flujo de bits de una fuente de archivo o de la red. Una vez completa, habrá samples_needed establece (si es estéreo, habrá parejas por ejemplo) de las muestras en la salida almacenador intermediario. Las muestras decodificadas será en anfitrión-endian estándar intercalado PCM formato, es decir, dejado 16 bit, 16bits derecha, izquierda, derecha, etc.. Finalmente, si el bucle no habilitado, o no compatible, la función devolverá el número de espacios de muestra que no se utilizaron en el búfer. El llamador puede probar si este valor no es cero para detectar el final de la secuencia y gota o escribir silencio en los espacios no utilizados si es necesario.
Cifrado
ADX soporta un simple esquema de encriptación que XOR los valores de un lineal congruente generador de números pseudoaleatorio con los valores de escala de bloque. Este método es computacionalmente barato descifrar (en consonancia con decodificación en tiempo real de ADX) pero rinde el cifrado archivos inservible. El cifrado es activo cuando el valor de "Banderas" en el encabezado 0 x 08. Como XOR simétrico el mismo método se utiliza para descifrar en cuanto a cifrar. La clave de cifrado es un conjunto de tres valores de 16 bits: el multiplicador, incrementar y comienzan los valores para el generador lineal congruente (el módulo es 0x8000 para mantener los valores en el rango de 15 bits de escalas válidas bloque). Normalmente todos los archivos de un solo juego ADX utilizará la misma clave.
El método de cifrado es vulnerable a ataques conocidos-texto sin formato. Si una versión cifrada del mismo audio se conoce la secuencia de números al azar puede ser obtenida fácilmente y de él se pueden determinar los parámetros clave, representación cada ADX encriptado con esa misma llave decryptable. El método de cifrado intenta hacer esto más difícil encriptando Silentblocs (con toda muestra nybbles iguales a 0), no como su escala es conocida por ser 0.
Incluso si el ADX encriptado es la única muestra disponible, es posible determinar una clave por asumir que los valores de escala de descifrado el ADX deben caer dentro de una "gama baja". Este método no necesariamente encuentra la clave utilizada para cifrar el archivo, sin embargo. Aunque siempre puede determinar las claves que producen una salida aparentemente correcta, pueden existir sin ser detectado errores. Esto es debido a la distribución al azar cada vez más de los bits inferiores de los valores de escala, que se convierte en imposible separar de la aleatoriedad Añadida por el cifrado.
Decodificación de desmontaje AHX
Como se señaló anteriormente, desmontaje AHX es sólo una implementación de Audio MPEG2 y el método de decodificación es básicamente el mismo que el estándar, es posible para desmultiplexar la corriente desde el recipiente ADX y alimentación a través de un decodificador de Audio MPEG estándar como mpg123. Del encabezado ADX "muestreo" y "totales muestras" son generalmente correctas si ellos (por lo que debe ser fijado por las implementaciones de codificador/muxer) necesita un decodificador, pero la mayoría de los otros campos como el "tamaño del bloque" y "muestra bitdepth" generalmente será cero, como se señaló anteriormente, el bucle funcionalidad también está disponible.
Referencias
- ^ "Título desconocido". Archivado de el original en 2009-10-24.
- Página del producto ADX en Sitio web de Middleware de CRI
- vgmstream WinAMP codec con fuente (soporta ADX)
- Dreamcast utilidades incluyendo convertidores ADX con fuente (Programa archivado 2009-10-24)
- CRI ADX Descripción de multimedia.cx Wiki
- Descripción técnica ADX en vgmstream Wiki