⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 descriptors.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		new MP4Integer32Property("maxBitrate"));	AddProperty( /* 6 */		new MP4Integer32Property("avgBitrate"));	AddProperty( /* 7 */		new MP4DescriptorProperty("decSpecificInfo",			MP4DecSpecificDescrTag, 0, Optional, OnlyOne));	AddProperty( /* 8 */		new MP4DescriptorProperty("profileLevelIndicationIndexDescr",			MP4ExtProfileLevelDescrTag, 0, Optional, Many));}void MP4DecConfigDescriptor::Generate(){	((MP4BitfieldProperty*)m_pProperties[3])->SetValue(1);}MP4SLConfigDescriptor::MP4SLConfigDescriptor()	: MP4Descriptor(MP4SLConfigDescrTag){	AddProperty( /* 0 */		new MP4Integer8Property("predefined"));	AddProperty( /* 1 */		new MP4BitfieldProperty("useAccessUnitStartFlag", 1));	AddProperty( /* 2 */		new MP4BitfieldProperty("useAccessUnitEndFlag", 1));	AddProperty( /* 3 */		new MP4BitfieldProperty("useRandomAccessPointFlag", 1));	AddProperty( /* 4 */		new MP4BitfieldProperty("hasRandomAccessUnitsOnlyFlag", 1));	AddProperty( /* 5 */		new MP4BitfieldProperty("usePaddingFlag", 1));	AddProperty( /* 6 */		new MP4BitfieldProperty("useTimeStampsFlag", 1));	AddProperty( /* 7 */		new MP4BitfieldProperty("useIdleFlag", 1));	AddProperty( /* 8 */		new MP4BitfieldProperty("durationFlag", 1));	AddProperty( /* 9 */		new MP4Integer32Property("timeStampResolution"));	AddProperty( /* 10 */		new MP4Integer32Property("OCRResolution"));	AddProperty( /* 11 */		new MP4Integer8Property("timeStampLength"));	AddProperty( /* 12 */		new MP4Integer8Property("OCRLength"));	AddProperty( /* 13 */		new MP4Integer8Property("AULength"));	AddProperty( /* 14 */		new MP4Integer8Property("instantBitrateLength"));	AddProperty( /* 15 */		new MP4BitfieldProperty("degradationPriortyLength", 4));	AddProperty( /* 16 */		new MP4BitfieldProperty("AUSeqNumLength", 5));	AddProperty( /* 17 */		new MP4BitfieldProperty("packetSeqNumLength", 5));	AddProperty( /* 18 */		new MP4BitfieldProperty("reserved", 2));	// if durationFlag 	AddProperty( /* 19 */		new MP4Integer32Property("timeScale"));	AddProperty( /* 20 */		new MP4Integer16Property("accessUnitDuration"));	AddProperty( /* 21 */		new MP4Integer16Property("compositionUnitDuration"));		// if !useTimeStampsFlag	AddProperty( /* 22 */		new MP4BitfieldProperty("startDecodingTimeStamp", 64));	AddProperty( /* 23 */		new MP4BitfieldProperty("startCompositionTimeStamp", 64));}void MP4SLConfigDescriptor::Generate(){	// by default all tracks in an mp4 file 	// use predefined SLConfig descriptor == 2	((MP4Integer8Property*)m_pProperties[0])->SetValue(2);	// which implies UseTimestampsFlag = 1	((MP4BitfieldProperty*)m_pProperties[6])->SetValue(1);	// reserved = 3	((MP4BitfieldProperty*)m_pProperties[18])->SetValue(3);}void MP4SLConfigDescriptor::Read(MP4File* pFile){	ReadHeader(pFile);	// read the first property, 'predefined'	ReadProperties(pFile, 0, 1);	// if predefined == 0	if (((MP4Integer8Property*)m_pProperties[0])->GetValue() == 0) {		/* read the next 18 properties */		ReadProperties(pFile, 1, 18);	}	// now mutate 	Mutate();	// and read the remaining properties	ReadProperties(pFile, 19);}void MP4SLConfigDescriptor::Mutate(){	u_int32_t i;	u_int8_t predefined = 		((MP4Integer8Property*)m_pProperties[0])->GetValue();	if (predefined) {		// properties 1-18 are implicit		for (i = 1; i < m_pProperties.Size(); i++) {			m_pProperties[i]->SetImplicit(true);		}		if (predefined == 1) {			// UseTimestampsFlag = 0			((MP4BitfieldProperty*)m_pProperties[6])->SetValue(0);			// TimestampResolution = 1000			((MP4Integer32Property*)m_pProperties[9])->SetValue(1000);			// TimeStampLength = 32			((MP4Integer8Property*)m_pProperties[11])->SetValue(32);		} else if (predefined == 2) {			// UseTimestampsFlag = 1			((MP4BitfieldProperty*)m_pProperties[6])->SetValue(1);		}	} else {#if 1	  for (i = 1; i <= 18; i++) {	    m_pProperties[i]->SetImplicit(false);	  }	((MP4BitfieldProperty*)m_pProperties[18])->SetValue(3);#endif	}	bool durationFlag = 		((MP4BitfieldProperty*)m_pProperties[8])->GetValue();	for (i = 19; i <= 21; i++) {		m_pProperties[i]->SetImplicit(!durationFlag);	}	bool useTimeStampsFlag = 		((MP4BitfieldProperty*)m_pProperties[6])->GetValue();	for (i = 22; i <= 23; i++) {		m_pProperties[i]->SetImplicit(useTimeStampsFlag);		u_int8_t timeStampLength = MIN(64,			((MP4Integer8Property*)m_pProperties[11])->GetValue());		((MP4BitfieldProperty*)m_pProperties[i])->SetNumBits(timeStampLength);				// handle a nonsensical situation gracefully		if (timeStampLength == 0) {			m_pProperties[i]->SetImplicit(true);		}	}}MP4ContentIdDescriptor::MP4ContentIdDescriptor()	: MP4Descriptor(MP4ContentIdDescrTag){	AddProperty( /* 0 */		new MP4BitfieldProperty("compatibility", 2));	AddProperty( /* 1 */		new MP4BitfieldProperty("contentTypeFlag", 1));	AddProperty( /* 2 */		new MP4BitfieldProperty("contentIdFlag", 1));	AddProperty( /* 3 */		new MP4BitfieldProperty("protectedContent", 1));	AddProperty( /* 4 */		new MP4BitfieldProperty("reserved", 3));	AddProperty( /* 5 */		new MP4Integer8Property("contentType"));	AddProperty( /* 6 */		new MP4Integer8Property("contentIdType"));	AddProperty( /* 7 */		new MP4BytesProperty("contentId"));}void MP4ContentIdDescriptor::Read(MP4File* pFile){	ReadHeader(pFile);	/* read the first property, 'compatiblity' */	ReadProperties(pFile, 0, 1);	/* if compatiblity != 0 */	if (((MP4Integer8Property*)m_pProperties[0])->GetValue() != 0) {		/* we don't understand it */		VERBOSE_READ(pFile->GetVerbosity(),			printf("incompatible content id descriptor\n"));		return;	}	/* read the next four properties */	ReadProperties(pFile, 1, 4);	/* which allows us to reconfigure ourselves */	Mutate();	bool contentTypeFlag = ((MP4BitfieldProperty*)m_pProperties[1])->GetValue();	bool contentIdFlag = ((MP4BitfieldProperty*)m_pProperties[2])->GetValue();  if (contentIdFlag) {    u_int32_t cIdOffset = 2;    if (contentTypeFlag) {      cIdOffset++;    }  	((MP4BytesProperty*)m_pProperties[7])->SetValueSize(m_size - cIdOffset);  }	/* read the remaining properties */	ReadProperties(pFile, 5);}void MP4ContentIdDescriptor::Mutate(){	bool contentTypeFlag = ((MP4BitfieldProperty*)m_pProperties[1])->GetValue();	m_pProperties[5]->SetImplicit(!contentTypeFlag);	bool contentIdFlag = ((MP4BitfieldProperty*)m_pProperties[2])->GetValue();	m_pProperties[6]->SetImplicit(!contentIdFlag);	m_pProperties[7]->SetImplicit(!contentIdFlag);}MP4Descriptor* MP4DescriptorProperty::CreateDescriptor(u_int8_t tag) {	MP4Descriptor* pDescriptor = NULL;	switch (tag) {	case MP4ESDescrTag:		pDescriptor = new MP4ESDescriptor();		break;	case MP4DecConfigDescrTag:		pDescriptor = new MP4DecConfigDescriptor();		break;	case MP4DecSpecificDescrTag:	case MP4IPMPDescrTag:	case MP4RegistrationDescrTag:		pDescriptor = new MP4BytesDescriptor(tag);		break;	case MP4SLConfigDescrTag:		pDescriptor = new MP4SLConfigDescriptor();		break;	case MP4ContentIdDescrTag:		pDescriptor = new MP4ContentIdDescriptor();		break;	case MP4ESIDIncDescrTag:	case MP4ESIDRefDescrTag:	case MP4IPIPtrDescrTag:	case MP4SupplContentIdDescrTag:	case MP4IPMPPtrDescrTag:	case MP4ExtProfileLevelDescrTag:	        pDescriptor = new MP4BaseDescriptor(tag);		break;	case MP4QosDescrTag:		pDescriptor = new MP4QosDescriptorBase(MP4QosDescrTag);		break;	case MP4IODescrTag:	case MP4FileIODescrTag:		pDescriptor = new MP4IODescriptor();		pDescriptor->SetTag(tag);		break;	case MP4ODescrTag:	case MP4FileODescrTag:		pDescriptor = new MP4ODescriptor();		pDescriptor->SetTag(tag);		break;	}	if (pDescriptor == NULL) {		if (tag >= MP4OCIDescrTagsStart && tag <= MP4OCIDescrTagsEnd) {			pDescriptor = CreateOCIDescriptor(tag);		}		if (tag >= MP4ExtDescrTagsStart && tag <= MP4ExtDescrTagsEnd) {			pDescriptor = new MP4BytesDescriptor(tag);		}	}	return pDescriptor;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -