1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #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 */
- }
- }
|