/*---------------------------------------------------------------------- | AP4_FileByteStream::AP4_FileByteStream +---------------------------------------------------------------------*/ AP4_FileByteStream::AP4_FileByteStream(const char* name, AP4_FileByteStream::Mode mode) { AP4_ByteStream* stream = NULL; AP4_Result result = AP4_KodiFileByteStream::Create(this, name, mode, stream); if (AP4_FAILED(result)) throw AP4_Exception(result); m_Delegate = stream; }
/*---------------------------------------------------------------------- | AP4_RtpPacket::AP4_RtpPacket +---------------------------------------------------------------------*/ AP4_RtpPacket::AP4_RtpPacket(AP4_ByteStream& stream) : m_ReferenceCount(1), m_TimeStampOffset(0) { AP4_UI08 octet; // relative time AP4_UI32 relative_time; stream.ReadUI32(relative_time); m_RelativeTime = relative_time; // pbit and xbit stream.ReadUI08(octet); m_PBit = (octet & 0x20) != 0; m_XBit = (octet & 0x10) != 0; // mbit and payload type stream.ReadUI08(octet); m_MBit = (octet & 0x80) != 0; m_PayloadType = octet & 0x7F; // sequence seed stream.ReadUI16(m_SequenceSeed); // extra, bframe and repeat flags stream.ReadUI08(octet); stream.ReadUI08(octet); // repeat on purpose bool extra_flag = (octet & 0x04) != 0; // bframe and repeat flags m_BFrameFlag = (octet & 0x02) != 0; m_RepeatFlag = (octet & 0x01) != 0; // constructor count AP4_UI16 constructor_count; stream.ReadUI16(constructor_count); // parse the packet extra data if (extra_flag) { // read the length AP4_UI32 extra_length; stream.ReadUI32(extra_length); // check it if (extra_length < 4) throw AP4_Exception(AP4_ERROR_INVALID_RTP_PACKET_EXTRA_DATA); // now read the entries extra_length -= 4; while (extra_length > 0) { AP4_UI32 entry_length; AP4_UI32 entry_tag; stream.ReadUI32(entry_length); stream.ReadUI32(entry_tag); // check the entry if (entry_length < 8) { throw AP4_Exception(AP4_ERROR_INVALID_RTP_PACKET_EXTRA_DATA); } // parse the single entry that's currently defined in the spec if (entry_tag == AP4_ATOM_TYPE('r','t','p','o') && entry_length == 12) { AP4_UI32 time_stamp_offset; stream.ReadUI32(time_stamp_offset); m_TimeStampOffset = time_stamp_offset; } else { // ignore it AP4_Offset cur_pos; stream.Tell(cur_pos); stream.Seek(cur_pos + entry_length - 8); // 8 = length + tag } extra_length -= entry_length; } } // constructors for (AP4_UI16 i=0; i<constructor_count; i++) { AP4_RtpConstructor* constructor = NULL; AP4_RtpConstructorFactory::CreateConstructorFromStream(stream, constructor); m_Constructors.Add(constructor); } }