2012-01-05 16 views
6

Hice el decodificador jpeg, pero no implementé la lógica de reinicio de marcadores. Esa es la razón por la cual mi programa no funciona en algunas imágenes (por ejemplo, imágenes guardadas con Photoshop: Archivo-> Guardar como-> JPEG). Quiero implementar la lógica del marcador de reinicio, pero no hay una explicación en línea detallada de cómo funciona la lógica del marcador de reinicio. Por favor, ¿alguien puede decirme más sobre los marcadores de reinicio o sugerirme un recurso en línea donde pueda leer más sobre él? ¡Gracias!Marcadores de reinicio Jpeg

Respuesta

13

Los marcadores de reinicio son bastante simples. Fueron diseñados para permitir la resincronización después de un error. Como la mayoría de las imágenes JPEG se transmiten a través de canales sin errores, rara vez se necesitan. Un intervalo de reinicio se define con el marcador FFDD como un número de 2 bytes. Esto indica cuántas MCU hay entre los marcadores de reinicio. Cuando encuentre un marcador de reinicio (FFD0-FFD7), restablezca los valores de CC (Y, Cr, Cb) a 0 y el flujo de bits se inicia en un límite de bytes (después de FFDx). Es simplemente una cuestión de contar a través del intervalo de reinicio una y otra vez a medida que decodifica la imagen. Los valores del marcador de reinicio aumentarán de FFD0 a FFD7 y luego comenzarán de nuevo en FFD0. El valor del marcador en sí no es terriblemente importante, pero puede indicar si faltan grandes fragmentos de datos. Aquí hay un ejemplo de cómo lo hago en mi decodificador. Tomo los marcadores de reinicio en mi lector de bitstream.

iRestartCount = iRestartInterval; 
for (y=0; y<Height_in_MCUs; y++) 
    { 
    for (x=0; x<Width_in_MCUs; x++) 
     { 
     <decode an MCU> 
     if (iRestartInterval) // if there is a restart interval defined 
      { 
      if (--iRestartCount == 0) 
      { 
      iRestartCount = iRestartInterval; // reset restart inverval counter 
      iDCPred0 = iDCPred1 = iDCPred2 = 0; // reset DC predictors 
      if (*iBit & 7) // adjust bitstream to start on the next byte boundary 
       { 
       *iBit += (8 - (*iBit & 7)); 
       } 
      } // if restart interval expired 
      } // if restart interval defined 
     } // for x 
    } // for y 

Actualización: reiniciar marcadores sirven ahora un nuevo propósito - para permitir que los codificadores y decodificadores JPEG multi-roscado. Como cada "tira" de MCU tiene sus valores de CC reiniciados al comienzo de cada intervalo de reinicio y comienza en un límite de bytes, cada intervalo de reinicio puede codificarse o decodificarse independientemente con un subproceso diferente. Un codificador ahora puede dividir arbitrariamente la tarea en N hilos y luego "pegar" los datos junto con los marcadores de reinicio. Para decodificadores, no es tan fácil. Si están presentes los marcadores de reinicio, cada intervalo se puede asignar a un hilo diferente. Si no está presente, aún puede hacer algunos trucos previos a la descodificación para dividir el trabajo en varios hilos.

+0

¿Puede decirme más detalles sobre la implementación y la lógica? – MrD

+0

¿Qué ocurre si se trata de una imagen multicomponente con entrelazado? – adikshit

+0

@adikshit - Por lo que he visto, el intervalo de reinicio se refiere a MCU (unidades codificadas mínimas) sin importar la configuración. Para una imagen en color de 3 componentes (Y/Cb/Cr), el intervalo de reinicio se refiere a los grupos de 3 bloques DCT. Por ejemplo, un intervalo de 100 significaría 300 bloques DCT (100 MCU). – BitBank