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; }
// // 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; } }