JPEG File Interchange Format(jpeg.rfi):
Class: Graphics and Sounds, Status: Headers only, Last change: 28.05.2018 11:44:32
set byteorder rev
type
UI8 num+(1)
UI16 num+(2)
fail void():assert[0]
data
0x0000 UI16 StartRec
assert StartRec=0xFFD8;
descr ('JPEG File Interchange Format',NL)
descr ('Info Source: CRYX''s note about the JPEG decoding algorithm.',NL)
descr (' Copyright 1999 Cristi Cuturicu.',NL)
type
TSegTag enum byte (
//Start Of Frame markers, non-differential, Huffman coding
SOF0 = 0xc0, //Start Of Frame (Baseline DCT)
SOF1 = 0xc1, //Start Of Frame (Extended sequential DCT)
SOF2 = 0xc2, //Start Of Frame (Progressive DCT)
SOF3 = 0xc3, //Start Of Frame (Lossless (sequential))
//Start Of Frame markers, differential, Huffman coding
SOF5 = 0xc5, //Start Of Frame (Differential sequential DCT)
SOF6 = 0xc6, //Start Of Frame (Differential progressive DCT)
SOF7 = 0xc7, //Start Of Frame (Differential lossless (sequential))
//Start Of Frame markers, non-differential, arithmetic coding
JPG = 0xc8, //Start Of Frame (Reserved for JPEG extensions)
SOF9 = 0xc9, //Start Of Frame (Extended sequential DCT)
SOF10 = 0xca, //Start Of Frame (Progressive DCT)
SOF11 = 0xcb, //Start Of Frame (Lossless (sequential))
//Start Of Frame markers, differential, arithmetic coding
SOF13 = 0xcd, //Start Of Frame (Differential sequential DCT)
SOF14 = 0xce, //Start Of Frame (Differential progressive DCT)
SOF15 = 0xcf, //Start Of Frame (Differential lossless (sequential))
//Huffman table specification
DHT = 0xc4, //Define Huffman Table(s)
//Arithmetic coding conditioning specification
DAC = 0xcc, //Define arithmetic coding conditioning(s)
//Restart interval termination
RST0 = 0xd0, /**///Restart with modulo 8 count "m"
RST1 = 0xd1, /**/
RST2 = 0xd2, /**/
RST3 = 0xd3, /**/
RST4 = 0xd4, /**/
RST5 = 0xd5, /**/
RST6 = 0xd6, /**/
RST7 = 0xd7, /**/
//Other markers
SOI = 0xd8, //Start Of Image
EOI = 0xd9, //End Of Image
SOS = 0xda, //Start Of Scan
DQT = 0xdb, //Define Quantization Table
DNL = 0xdc, //Define number of lines
DRI = 0xdd, //Define Restart Interval
DHP = 0xde, //Define hierarchical progression
EXP = 0xdf, //Expand reference component(s)
APP0 = 0xe0, //JFIF APP0 segment marker
APP1 = 0xe1, //Reserved for application segments
APP2 = 0xe2, //
APP3 = 0xe3, //
APP4 = 0xe4, //
APP5 = 0xe5, //
APP6 = 0xe6, //
APP7 = 0xe7, //
APP8 = 0xe8, //
APP9 = 0xe9, //
APP10 = 0xea, //
APP11 = 0xeb, //
APP12 = 0xec, //
APP13 = 0xed, //
APP14 = 0xee, //
APP15 = 0xef, //
JPG0 = 0xf0, //Reserved for JPEG extensions
JPG1 = 0xf1, //
JPG2 = 0xf2, //
JPG3 = 0xf3, //
JPG4 = 0xf4, //
JPG5 = 0xf5, //
JPG6 = 0xf6, //
JPG7 = 0xf7, //
JPG8 = 0xf8, //
JPG9 = 0xf9, //
JPG10 = 0xfa, //
JPG11 = 0xfb, //
JPG12 = 0xfc, //
JPG13 = 0xfd, //
COM = 0xfe, //Comment, for details see below
//Reserved markers
TEM = 0x01 /**///For temporary private use in arithmetic coding
//0x02..0xBF //Reserved
)
type bit
TBit num+(1)
TBit2 num+(2)
TBit3 num+(3)
TBit4 num+(4)
TDQTPrec enum TBit4 (dqt8Bit=0,dqt16Bit=1)
TDQTFlags struc pas
Prec: TDQTPrec
N: TBit4 //Table number
ends
TDHTFlags struc pas
Rsrv: TBit3
IsAC: TBit //1-AC,0-DC table
N: TBit4 //Table number
ends
TSamplingFactors struc pas
Hor: TBit4
Vert: TBit4
ends
TScanTblNums struc pas
DCTbl: TBit4
ACTbl: TBit4
ends
TApproxBitPositions struc pas
Ah: TBit4 //Successive approximation bit position high
Al: TBit4 //Successive approximation bit position low or point transform
ends
type
TXYunits enum UI8 (
aspectRatio=0, //no units, x/y-density specify the aspect ratio instead
dotsPerInch=1, //x/y-density are dots/inch
dotsPerCm=2 //x/y-density are dots/cm
)
TRGB struc pas
R: Byte
G: Byte
B: Byte
ends
TAPP0JFIF struc pas
VerMaj: UI8 //major revision number, should be 1 (otherwise error)
VerMin: UI8 //- minor revision number, should be 0..2
XYunits: TXYunits //units for x/y densities
xDensity: UI16 //x-density, should be <> 0
yDensity: UI16 //y-density, should be <> 0
thumbW: Byte //thumbnail width (1 byte)
thumbH: Byte //thumbnail height (1 byte)
thumb: array[@.thumbH]of array[@@.thumbW]of TRGB
ends
TAPP0Rec struc pas
Mrk: PChar
D: case @.Mrk of
'JFIF': TAPP0JFIF
endc
ends
TComponId enum UI8 (Y=1, Cb=2, Cr=3, I=4, Q=5)
TComponInfo struc pas
Id: TComponId //component id
Sampling: TSamplingFactors //sampling factors (bit 0-3 vert., 4-7 hor.)
TblNum: Byte //quantization table number
ends
TSOFRec struc pas
BitsPerSample: UI8 //data precision (1 byte) in bits/sample,
//usually 8 (12 and 16 not supported by most software)
H: UI16 //image height (2 bytes, Hi-Lo), must be >0 if DNL not supported
W: UI16 //image width (2 bytes, Hi-Lo), must be >0 if DNL not supported
NCompon: Byte //number of components (1 byte), usually
//1 = grey scaled, 3 = color YCbCr or YIQ, 4 = color CMYK)
Compon: array[@.NCompon] of TComponInfo
ends
TDefineQuantTableRec struc pas
F: TDQTFlags //QT information (1 byte)
Tbl: array[64]of (num(1+@@.F.Prec):displ=(INT(@))) //QT elements
ends
TDefineHuffmanTableRec struc pas
F: TDHTFlags //HT information (1 byte)
LenCodes: array[16]of Byte //LenCodes[i]=number of Huffman codes of length i+1
CodeVal: array[16]of struc pas
V: array[@@@.LenCodes[@:#]]of Byte //the BYTE value associated to the j-th Huffman code of length k
ends
ends
TSOSComponInfo struc pas
Id: TComponId //component id
Tbls: TScanTblNums //Huffman table to use
ends
TSOSRec struc pas
nCompon: UI8 //number of components in scan (1 byte),
//must be >= 1 and <=4 (otherwise error), usually 1 or 3
Compon: array[@.nCompon] of TSOSComponInfo
Ss: UI8 //Start of spectral or predictor selection (select the predictor in lossless mode)
Se: UI8 //End of spectral selection (ignored and =0 in lossless mode)
A: TApproxBitPositions //Successive approximation bit positions
ends
TExif(Sz) struc pas
Sign: array[4]of Char
Z: Word
Data: subfile[@:Sz-6] spec 'tif.rfh'
ends:assert[@.Sign='Exif',@.Z=0]
TAPP1Rec(Sz) try
Exif: TExif(@:Sz)
Other: raw[@:Sz]
endt
TSegData(Sz,Tag) case TSegTag @:Tag of
APP0: TAPP0Rec
APP1: TAPP1Rec(@:Sz)
SOF0,SOF1,SOF2,SOF3,SOF5,SOF6,SOF7,SOF9,
SOF10,SOF11,SOF13,SOF14,SOF15,JPG: TSOFRec
DHT: array of TDefineHuffmanTableRec:[@:Size=@@:Sz] //(@:Sz)
DQT: array of TDefineQuantTableRec:[@:Size=@@:Sz] //(@:Sz)
COM: raw[@:Sz] //Comment
SOS: TSOSRec
DNL: UI8 //Specifies the number of lines in the frame (instead of SOF.H)
//else raw[@:Sz]
endc
TSegment struc pas
bFF: Byte
Tag: TSegTag
D: case @.Tag of
TEM,RST0,RST1,RST2,RST3,RST4,RST5,RST6,RST7,SOI,EOI: void
SOF0,SOF1,SOF2,SOF3,SOF5,SOF6,SOF7,SOF9,
SOF10,SOF11,SOF13,SOF14,SOF15,DHT,JPG,DAC,SOS,
DQT,DNL,DRI,DHP,EXP,APP0..APP15,JPG0..JPG13,COM: struc pas
Sz: UI16
D: TSegData(@.Sz-2,@@@.Tag)
Rest: raw[]
ends:[@:Size=@.Sz]:assert[@.Sz>=2]
else
fail
endc
ends: assert[@.bFF=0xFF,(@.Tag<>0xFF)and(@.Tag<>0),@.D.*:assert]
TFFVal struc pas
bFF: Byte
b00: Byte
ends: assert[@.bFF=0xFF,@.b00=0]
TNoFFData array of Byte?@=0xFF!void;:displ=(ShowArray(@,(@),' '))
TChkSegment try
Seg: TSegment
FF: TFFVal
X: TNoFFData
endt
TJPEGStream array of TChkSegment?@.Seg.Tag=TSegTag.EOI exc 0;
data
0x0002 TJPEGStream Stm
Other specifications.
FlexT home page,
Author`s home page.