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

📄 mp4.cpp

📁 mpeg4 video codec mpeg4 video codec
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				SetAmrVendor(trackId, vendor);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}}extern "C" void MP4SetAmrDecoderVersion(		MP4FileHandle hFile,		MP4TrackId trackId,		u_int8_t decoderVersion){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			((MP4File*)hFile)->				SetAmrDecoderVersion(trackId, decoderVersion);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}}extern "C" void MP4SetAmrModeSet(		MP4FileHandle hFile,		MP4TrackId trackId,		u_int16_t modeSet){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			((MP4File*)hFile)->				SetAmrModeSet(trackId, modeSet);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}}extern "C" MP4TrackId MP4AddVideoTrack(	MP4FileHandle hFile, 	u_int32_t timeScale, 	MP4Duration sampleDuration,	u_int16_t width, 	u_int16_t height, 	u_int8_t videoType){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->AddVideoTrack(				timeScale, sampleDuration, width, height, videoType);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddEncVideoTrack(MP4FileHandle hFile, 					  u_int32_t timeScale, 					  MP4Duration sampleDuration,					  u_int16_t width, 					  u_int16_t height,                                           mp4v2_ismacrypParams *icPp,					  u_int8_t videoType ){  if (MP4_IS_VALID_FILE_HANDLE(hFile)) {    try {      return ((MP4File*)hFile)->AddEncVideoTrack(timeScale, sampleDuration, 						 width, height, videoType,                                                 icPp->scheme_type, icPp->scheme_version,                                                  icPp->key_ind_len, icPp->iv_len,                                                  icPp->selective_enc, icPp->kms_uri);    }    catch (MP4Error* e) {      PRINT_ERROR(e);      delete e;    }  }  return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4AddH263VideoTrack(		MP4FileHandle hFile,		u_int32_t timeScale,		MP4Duration sampleDuration,		u_int16_t width,		u_int16_t height,		u_int8_t h263Level,		u_int8_t h263Profile,		u_int32_t avgBitrate,		u_int32_t maxBitrate){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->				AddH263VideoTrack(timeScale, sampleDuration, width, height, h263Level, h263Profile, avgBitrate, maxBitrate);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}		return MP4_INVALID_TRACK_ID;}extern "C" void MP4SetH263Vendor(		MP4FileHandle hFile,		MP4TrackId trackId,		u_int32_t vendor){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			((MP4File*)hFile)->				SetH263Vendor(trackId, vendor);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}}extern "C" void MP4SetH263DecoderVersion(		MP4FileHandle hFile,		MP4TrackId trackId,		u_int8_t decoderVersion){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {				try {			((MP4File*)hFile)->				SetH263DecoderVersion(trackId, decoderVersion);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}}extern "C" void MP4SetH263Bitrates(		MP4FileHandle hFile,		MP4TrackId trackId,		u_int32_t avgBitrate,		u_int32_t maxBitrate){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			((MP4File*)hFile)->				SetH263Bitrates(trackId, avgBitrate, maxBitrate);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}}extern "C" MP4TrackId MP4AddHintTrack(	MP4FileHandle hFile, MP4TrackId refTrackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->AddHintTrack(refTrackId);		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return MP4_INVALID_TRACK_ID;}extern "C" MP4TrackId MP4CloneTrack(	MP4FileHandle srcFile, 	MP4TrackId srcTrackId,	MP4FileHandle dstFile,	MP4TrackId dstHintTrackReferenceTrack){	MP4TrackId dstTrackId = MP4_INVALID_TRACK_ID;	if (dstFile == NULL) {		dstFile = srcFile;	}	const char* trackType = 		MP4GetTrackType(srcFile, srcTrackId);	if (!trackType) {		return dstTrackId;	}	if (MP4_IS_VIDEO_TRACK_TYPE(trackType)) {                MP4SetVideoProfileLevel(dstFile,                                         MP4GetVideoProfileLevel(srcFile));		dstTrackId = MP4AddVideoTrack(			dstFile,			MP4GetTrackTimeScale(srcFile, srcTrackId),			MP4GetTrackFixedSampleDuration(srcFile, srcTrackId),			MP4GetTrackVideoWidth(srcFile, srcTrackId),			MP4GetTrackVideoHeight(srcFile, srcTrackId),			MP4GetTrackEsdsObjectTypeId(srcFile, srcTrackId));	} else if (MP4_IS_AUDIO_TRACK_TYPE(trackType)) {                MP4SetAudioProfileLevel(dstFile,                                         MP4GetAudioProfileLevel(srcFile));		dstTrackId = MP4AddAudioTrack(			dstFile,			MP4GetTrackTimeScale(srcFile, srcTrackId),			MP4GetTrackFixedSampleDuration(srcFile, srcTrackId),			MP4GetTrackEsdsObjectTypeId(srcFile, srcTrackId));	} else if (MP4_IS_OD_TRACK_TYPE(trackType)) {		dstTrackId = MP4AddODTrack(dstFile);	} else if (MP4_IS_SCENE_TRACK_TYPE(trackType)) {		dstTrackId = MP4AddSceneTrack(dstFile);	} else if (MP4_IS_HINT_TRACK_TYPE(trackType)) {	  if (dstHintTrackReferenceTrack == MP4_INVALID_TRACK_ID) {	    dstTrackId = MP4_INVALID_TRACK_ID;	  } else {		dstTrackId = MP4AddHintTrack(			dstFile,			dstHintTrackReferenceTrack);	  }	} else if (MP4_IS_SYSTEMS_TRACK_TYPE(trackType)) {		dstTrackId = MP4AddSystemsTrack(dstFile, trackType);	} else {		dstTrackId = MP4AddTrack(dstFile, trackType);	}	if (dstTrackId == MP4_INVALID_TRACK_ID) {		return dstTrackId;	}	MP4SetTrackTimeScale(		dstFile, 		dstTrackId,		MP4GetTrackTimeScale(srcFile, srcTrackId));	if (MP4_IS_AUDIO_TRACK_TYPE(trackType) 	    || MP4_IS_VIDEO_TRACK_TYPE(trackType)) {	// copy track ES configuration	u_int8_t* pConfig = NULL;	u_int32_t configSize = 0;	MP4GetTrackESConfiguration(		srcFile, 		srcTrackId,		&pConfig,		&configSize);	MP4SetTrackESConfiguration(		dstFile, 		dstTrackId,		pConfig,		configSize);		free(pConfig);	}	if (MP4_IS_HINT_TRACK_TYPE(trackType)) {		// probably not exactly what is wanted		// but caller can adjust later to fit their desires		char* payloadName = NULL;		char *encodingParms = NULL;		u_int8_t payloadNumber;		u_int16_t maxPayloadSize;		MP4GetHintTrackRtpPayload(			srcFile,			srcTrackId,			&payloadName,			&payloadNumber,			&maxPayloadSize,			&encodingParms);		MP4SetHintTrackRtpPayload(			dstFile,			dstTrackId,			payloadName,			&payloadNumber,			maxPayloadSize,			encodingParms);#if 0		MP4SetHintTrackSdp(			dstFile,			dstTrackId,			MP4GetHintTrackSdp(srcFile, srcTrackId));#endif	}	return dstTrackId;}// Given a track, make an encrypted clone of it in the dest. fileextern "C" MP4TrackId MP4EncAndCloneTrack(MP4FileHandle srcFile,                                          MP4TrackId srcTrackId,                                          mp4v2_ismacrypParams *icPp,					  MP4FileHandle dstFile,					  MP4TrackId dstHintTrackReferenceTrack                                          ){  MP4TrackId dstTrackId = MP4_INVALID_TRACK_ID;  if (dstFile == NULL) {    dstFile = srcFile;  }  const char* trackType =     MP4GetTrackType(srcFile, srcTrackId);  if (!trackType) {    return dstTrackId;  }  if (MP4_IS_VIDEO_TRACK_TYPE(trackType)) {    MP4SetVideoProfileLevel(dstFile, MP4GetVideoProfileLevel(srcFile));    dstTrackId = MP4AddEncVideoTrack(dstFile,				     MP4GetTrackTimeScale(srcFile, srcTrackId),				     MP4GetTrackFixedSampleDuration(srcFile, 								    srcTrackId),				     MP4GetTrackVideoWidth(srcFile, srcTrackId),				     MP4GetTrackVideoHeight(srcFile, srcTrackId),                                     icPp,				     MP4GetTrackEsdsObjectTypeId(srcFile, 								 srcTrackId)                                     );  } else if (MP4_IS_AUDIO_TRACK_TYPE(trackType)) {    MP4SetAudioProfileLevel(dstFile, MP4GetAudioProfileLevel(srcFile));    dstTrackId = MP4AddEncAudioTrack(dstFile,				     MP4GetTrackTimeScale(srcFile, srcTrackId),				     MP4GetTrackFixedSampleDuration(srcFile, 								    srcTrackId),                                     icPp,				     MP4GetTrackEsdsObjectTypeId(srcFile, 								 srcTrackId)                                     );  } else if (MP4_IS_OD_TRACK_TYPE(trackType)) {    dstTrackId = MP4AddODTrack(dstFile);  } else if (MP4_IS_SCENE_TRACK_TYPE(trackType)) {    dstTrackId = MP4AddSceneTrack(dstFile);      } else if (MP4_IS_HINT_TRACK_TYPE(trackType)) {     if (dstHintTrackReferenceTrack == MP4_INVALID_TRACK_ID) {         dstTrackId = MP4_INVALID_TRACK_ID;    } else {	          dstTrackId = MP4AddHintTrack(dstFile,				 MP4GetHintTrackReferenceTrackId(srcFile, 								 srcTrackId));    }  } else if (MP4_IS_SYSTEMS_TRACK_TYPE(trackType)) {    dstTrackId = MP4AddSystemsTrack(dstFile, trackType);      } else {    dstTrackId = MP4AddTrack(dstFile, trackType);  }  if (dstTrackId == MP4_INVALID_TRACK_ID) {    return dstTrackId;  }  MP4SetTrackTimeScale(dstFile, 		       dstTrackId,		       MP4GetTrackTimeScale(srcFile, srcTrackId));  if (MP4_IS_AUDIO_TRACK_TYPE(trackType)    || MP4_IS_VIDEO_TRACK_TYPE(trackType)) {    // copy track ES configuration    u_int8_t* pConfig = NULL;    u_int32_t configSize = 0;    if (MP4GetTrackESConfiguration(srcFile, srcTrackId,				   &pConfig, &configSize)) {          if (pConfig != NULL) {	MP4SetTrackESConfiguration(dstFile, dstTrackId,				   pConfig, configSize);      }    }    if (pConfig != NULL)      free(pConfig);    }  // Bill's change to MP4CloneTrack  if (MP4_IS_HINT_TRACK_TYPE(trackType)) {    // probably not exactly what is wanted    // but caller can adjust later to fit their desires    char* payloadName = NULL;    char *encodingParms = NULL;    u_int8_t payloadNumber;    u_int16_t maxPayloadSize;    MP4GetHintTrackRtpPayload(                               srcFile,			       srcTrackId,			       &payloadName,			       &payloadNumber,			       &maxPayloadSize,			       &encodingParms);       MP4SetHintTrackRtpPayload(		                 dstFile,			         dstTrackId,			         payloadName,			         &payloadNumber,			         maxPayloadSize,			         encodingParms);	#if 0      MP4SetHintTrackSdp(                         dstFile,                         dstTrackId,                         MP4GetHintTrackSdp(srcFile, srcTrackId));#endif   }  return dstTrackId;}extern "C" MP4TrackId MP4CopyTrack(MP4FileHandle srcFile, 				   MP4TrackId srcTrackId,				   MP4FileHandle dstFile, 				   bool applyEdits,				   MP4TrackId dstHintTrackReferenceTrack){  bool copySamples = true;	// LATER allow false => reference samples  MP4TrackId dstTrackId =    MP4CloneTrack(srcFile, srcTrackId, dstFile, dstHintTrackReferenceTrack);  if (dstTrackId == MP4_INVALID_TRACK_ID) {    return dstTrackId;  }  bool viaEdits =    applyEdits && MP4GetTrackNumberOfEdits(srcFile, srcTrackId);  MP4SampleId sampleId = 0;  MP4SampleId numSamples =     MP4GetTrackNumberOfSamples(srcFile, srcTrackId);  MP4Timestamp when = 0;  MP4Duration editsDuration =     MP4GetTrackEditTotalDuration(srcFile, srcTrackId);  while (true) {    MP4Duration sampleDuration = MP4_INVALID_DURATION;    if (viaEdits) {      sampleId = MP4GetSampleIdFromEditTime(					    srcFile,					    srcTrackId,					    when,					    NULL,					    &sampleDuration);      // in theory, this shouldn't happen      if (sampleId == MP4_INVALID_SAMPLE_ID) {	MP4DeleteTrack(dstFile, dstTrackId);	return MP4_INVALID_TRACK_ID;      }      when += sampleDuration;            if (when >= editsDuration) {	break;      }    } else {      sampleId++;      if (sampleId > numSamples) {	break;      }    }    bool rc = false;        if (copySamples) {      rc = MP4CopySample(			 srcFile,			 srcTrackId,			 sampleId,			 dstFile,			 dstTrackId,			 sampleDuration);    } else {      rc = MP4ReferenceSample(			      srcFile,			      srcTrackId,			      sampleId,			      dstFile,			      dstTrackId,			      sampleDuration);    }    if (!rc) {      MP4DeleteTrack(dstFile, dstTrackId);      return MP4_INVALID_TRACK_ID;    }  }  return dstTrackId;}// Given a source track in a source file, make an encrypted copy of // the track in the destination file, including sample encryptionextern "C" MP4TrackId MP4EncAndCopyTrack(MP4FileHandle srcFile, 					 MP4TrackId srcTrackId,                                         mp4v2_ismacrypParams *icPp,                                         encryptFunc_t encfcnp,                                         u_int32_t encfcnparam1,					 MP4FileHandle dstFile,					 bool applyEdits,					 MP4TrackId dstHintTrackReferenceTrack                                         ){  bool copySamples = true;	// LATER allow false => reference samples  MP4TrackId dstTrackId =     MP4EncAndCloneTrack(srcFile, srcTrackId,                        icPp,                        dstFile, dstHintTrackReferenceTrack);    if (dstTrackId == MP4_INVALID_TRACK_ID) {    return dstTrackId;  }  bool viaEdits =    applyEdits && MP4GetTrackNumberOfEdits(srcFile, srcTrackId);  MP4SampleId sampleId = 0;  MP4SampleId numSamples =     MP4GetTrackNumberOfSamples(srcFile, srcTrackId);  MP4Timestamp when = 0;  MP4Duration editsDuration =     MP4GetTrackEditTotalDuration(srcFile, srcTrackId);  while (true) {    MP4Duration sampleDuration = MP4_INVALID_DURATION;    if (viaEdits) {      sampleId = MP4GetSampleIdFromEditTime(srcFile,					    srcTrackId,					    when,					    NULL,					    &sampleDuration);      // in theory, this shouldn't happen      if (sampleId == MP4_INVALID_SAMPLE_ID) {	MP4DeleteTrack(dstFile, dstTrackId);	return MP4_INVALID_TRACK_ID;      }      when += sampleDuration;      if (when >= editsDuration) {	break;      }    } else {      sampleId++;      if (sampleId > numSamples) {	break;      }    }    bool rc = false;    if (copySamples) {      // encrypt and copy      rc = MP4EncAndCopySample(srcFile,			 srcTrackId,			 sampleId,			 encfcnp,                         encfcnparam1,			 dstFile,			 dstTrackId,			 sampleDuration);    } else {      // not sure what these are - encrypt?      rc = MP4ReferenceSample(srcFile,			      srcTrackId,			      sampleId,			      dstFile,			      dstTrackId,			      sampleDuration);    }    if (!rc) {      MP4DeleteTrack(dstFile, dstTrackId);      return MP4_INVALID_TRACK_ID;    }  }  return dstTrackId;}extern "C" bool MP4DeleteTrack(	MP4FileHandle hFile, 	MP4TrackId trackId){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			((MP4File*)hFile)->DeleteTrack(trackId);			return true;		}		catch (MP4Error* e) {			PRINT_ERROR(e);			delete e;		}	}	return false;}extern "C" u_int32_t MP4GetNumberOfTracks(	MP4FileHandle hFile, 	const char* type,	u_int8_t subType){	if (MP4_IS_VALID_FILE_HANDLE(hFile)) {		try {			return ((MP4File*)hFile)->GetNumberOfTracks(type, subType);		}		catch (MP4Error* e) {			PRINT_ERROR(e);

⌨️ 快捷键说明

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