#include "nal.h" NAL_Unit::NAL_Unit( ) { } NAL_Unit::NAL_Unit( std::string & InputData ) { ReadData( InputData ); } bool NAL_Unit::ReadData( std::string & InputData ) { std::string FullAnnexB; FullAnnexB += (char)0x00; FullAnnexB += (char)0x00; FullAnnexB += (char)0x00; FullAnnexB += (char)0x01; std::string ShortAnnexB; ShortAnnexB += (char)0x00; ShortAnnexB += (char)0x00; ShortAnnexB += (char)0x01; // fprintf( stderr, "NAL_Unit::ReadData --- DataSize: %d\n", InputData.size() ); if( InputData.size() < 3 ) { return false; } bool AnnexB = false; if( InputData.substr(0,3) == ShortAnnexB ) { AnnexB = true; } if( InputData.substr(0,4) == FullAnnexB ) { InputData.erase(0,1); AnnexB = true; } if( AnnexB ) { MyData = ""; InputData.erase(0,3);//Intro Bytes bool FinalByteRead = false; int Location = std::min( InputData.find( ShortAnnexB ), InputData.find( FullAnnexB ) ); MyData = InputData.substr(0,Location); InputData.erase(0,Location); } else { if( InputData.size() < 4 ) { return false; } int UnitLen = (InputData[0] << 24) + (InputData[1] << 16) + (InputData[2] << 8) + InputData[3]; if( InputData.size() < 4+UnitLen ) { return false; } InputData.erase(0,4);//Remove Length MyData = InputData.substr(0,UnitLen); InputData.erase(0,UnitLen);//Remove this unit from the string } return true; } std::string NAL_Unit::AnnexB( bool LongIntro ) { std::string Result; if( MyData.size() ) { if( LongIntro ) { Result += (char)0x00; } Result += (char)0x00; Result += (char)0x00; Result += (char)0x01;//Annex B Lead-In Result += MyData; } return Result; } std::string NAL_Unit::SizePrepended( ) { std::string Result; if( MyData.size() ) { int DataSize = MyData.size(); Result += (char)( ( DataSize & 0xFF000000 ) >> 24 ); Result += (char)( ( DataSize & 0x00FF0000 ) >> 16 ); Result += (char)( ( DataSize & 0x0000FF00 ) >> 8 ); Result += (char)( DataSize & 0x000000FF );//Size Lead-In Result += MyData; } return Result; } int NAL_Unit::Type( ) { return ( MyData[0] & 0x1F ); }