FrameParserStatus_t   FrameParser_VideoMjpeg_c::ReadHeaders( void )
{
    FrameParserStatus_t         Status          = FrameParserNoError;
    unsigned int                Code;
    bool                        StartOfImageSeen;

#if 0
    unsigned int                i;
    report (severity_info, "First 40 bytes of %d :", BufferLength);
    for (unsigned int i=0; i<40; i++)
        report (severity_info, " %02x", BufferData[i]);
    report (severity_info, "\n");
#endif
#if 0
    report (severity_info, "Start codes (%d):", StartCodeList->NumberOfStartCodes);
    for (unsigned int i=0; i<StartCodeList->NumberOfStartCodes; i++)
        report (severity_info, " %02x(%d)", ExtractStartCodeCode(StartCodeList->StartCodes[i]), ExtractStartCodeOffset(StartCodeList->StartCodes[i]));
    report (severity_info, "\n");
#endif

    ParsedFrameParameters->DataOffset   = 0;
    StartOfImageSeen                    = false;
    for (unsigned int i=0; i<StartCodeList->NumberOfStartCodes; i++)
    {
        Code                            = StartCodeList->StartCodes[i];
        Bits.SetPointer (BufferData + ExtractStartCodeOffset(Code));
        Bits.FlushUnseen(16);
        Status                          = FrameParserNoError;
        switch (ExtractStartCodeCode(Code))
        {
            case MJPEG_SOI:
                ParsedFrameParameters->DataOffset       = ExtractStartCodeOffset(Code);
                StartOfImageSeen                        = true;
                break;
            case  MJPEG_SOF_0:               // Read the start of frame header
            case  MJPEG_SOF_1:
                if (!StartOfImageSeen)
                {
                    FRAME_ERROR("%s - No Start Of Image seen\n", __FUNCTION__);
                    return FrameParserError;
                }

                Status                  = ReadStartOfFrame();
                if (Status == FrameParserNoError)
                    return CommitFrameForDecode();
                break;
            case MJPEG_APP_15:
                Status                  = ReadStreamMetadata();
                break;
            default:
                break;
        }
    }

    return FrameParserNoError;
}
Esempio n. 2
0
//
// ReadHeader()
//
void JLSInputStream::ReadHeader()
{
	if (ReadByte() != 0xFF)
		throw JlsException(InvalidCompressedData);

	if (ReadByte() != JPEG_SOI)
		throw JlsException(InvalidCompressedData);
	
	for (;;)
	{
		if (ReadByte() != 0xFF)
			throw JlsException(InvalidCompressedData);

		BYTE marker = (BYTE)ReadByte();

		size_t cbyteStart = _cbyteOffset;
		LONG cbyteMarker = ReadWord();

		switch (marker)
		{
			case JPEG_SOS: ReadStartOfScan();  break;
			case JPEG_SOF: ReadStartOfFrame(); break;
			case JPEG_COM: ReadComment();	   break;
			case JPEG_LSE: ReadPresetParameters();	break;
			case JPEG_APP0: ReadJfif(); break;
			case JPEG_APP7: ReadColorSpace(); break;
			case JPEG_APP8: ReadColorXForm(); break;			
			// Other tags not supported (among which DNL DRI)
			default: 		throw JlsException(ImageTypeNotSupported);
		}

		if (marker == JPEG_SOS)
		{				
			_cbyteOffset = cbyteStart - 2;
			return;
		}
		_cbyteOffset = cbyteStart + cbyteMarker;
	}
}