diff options
Diffstat (limited to 'Src/f263/Header.cpp')
-rw-r--r-- | Src/f263/Header.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/Src/f263/Header.cpp b/Src/f263/Header.cpp new file mode 100644 index 00000000..727cf574 --- /dev/null +++ b/Src/f263/Header.cpp @@ -0,0 +1,92 @@ +#include "Decoder.h" + + +/* + * decode headers from one input stream + * until an End of Sequence or picture start code + * is found + */ +int Decoder::getheader() +{ + unsigned int sorenson_version; + + /* look for startcode */ + startcode(); + buffer.getbits(PSC_LENGTH); + sorenson_version = buffer.getbits(5); + if (sorenson_version <= 1) + { + escapemode=sorenson_version; + getpicturehdr(); + } + else + return 0; + + return 1; +} + +/* align to start of next startcode */ + +void Decoder::startcode() +{ + /* search for new picture start code */ + while (buffer.showbits(PSC_LENGTH)!=1l) + buffer.flushbits(1); +} + +/* decode picture header */ + +void Decoder::getpicturehdr() +{ + int pei, tmp; + + buffer.getbits(8); + + tmp = buffer.getbits(3); + switch(tmp) + { + case 0: + horizontal_size = buffer.getbits(8); + vertical_size = buffer.getbits(8); + break; + case 1: + horizontal_size = buffer.getbits(16); + vertical_size = buffer.getbits(16); + break; + case 2: + horizontal_size = 352; + vertical_size = 288; + break; + case 3: + horizontal_size = 176; + vertical_size = 144; + break; + case 4: + horizontal_size = 128; + vertical_size = 96; + break; + case 5: + horizontal_size = 320; + vertical_size = 240; + break; + case 6: + horizontal_size = 160; + vertical_size = 120; + break; + + } + pict_type = buffer.getbits(2); + deblock=buffer.getbits(1); // deblocking flag + quant = buffer.getbits(5); + + pei = buffer.getbits(1); +pspare: + if (pei) { + /* extra info for possible future backward compatible additions */ + buffer.getbits(8); /* not used */ + pei = buffer.getbits(1); + if (pei) goto pspare; /* keep on reading pspare until pei=0 */ + } + +} + |