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

📄 mp4_file.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				     MP4GetHrefTrackBaseUrl(m_mp4file,							    tq[ix].track_id));#endif      int ret;      plugin = check_for_text_codec(tq[ix].stream_type,				    tq[ix].compressor,				    NULL,				    NULL,				    0, 				    &config);      ret = mptr->create_text_plugin(plugin,				     STREAM_TYPE_MP4_FILE,				     tq[ix].compressor,				     NULL, // sdp info				     NULL, 				     0);      if (ret < 0) {	mp4f_message(LOG_ERR, "Couldn't create text from plugin %s", 		     plugin->c_name);	psptr->set_message("Couldn't start text plugin %s", 			   plugin->c_name);	delete mptr;	delete tbyte;	return -1;      }      ret = mptr->create_media("text", tbyte);      if (ret != 0) {	return (-1);      }      MP4SetVerbosity(m_mp4file, verb & ~(MP4_DETAILS_ERROR));      char *mp4info = MP4Info(m_mp4file, tq[ix].track_id);      MP4SetVerbosity(m_mp4file, verb);      char *temp = mp4info;      while (*temp != '\0') {	if (isspace(*temp)) *temp = ' ';	if (!isprint(*temp)) *temp = '*';	temp++;      }      psptr->set_session_desc(start_desc, mp4info);      free(mp4info);      start_desc++;    } else {      CHECK_AND_FREE(tq[ix].config);    }  }  return 0;}int CMp4File::create_media (CPlayerSession *psptr,			    int have_audio_driver,			    control_callback_vft_t *cc_vft){  uint video_count, video_offset;  uint text_count, text_offset;  uint audio_count, audio_offset;  MP4TrackId trackId;  video_query_t *vq;  audio_query_t *aq;  text_query_t *tq;  uint ix;  codec_plugin_t *plugin;  int ret_value = 0;  uint8_t *foo;  u_int32_t bufsize;  char original_fmt[8];    uint32_t verb = MP4GetVerbosity(m_mp4file);  MP4SetVerbosity(m_mp4file, verb & ~(MP4_DETAILS_ERROR));  video_count = MP4GetNumberOfTracks(m_mp4file, MP4_VIDEO_TRACK_TYPE);  audio_count = MP4GetNumberOfTracks(m_mp4file, MP4_AUDIO_TRACK_TYPE);  text_count = MP4GetNumberOfTracks(m_mp4file, MP4_CNTL_TRACK_TYPE);  mp4f_message(LOG_DEBUG, "cntl tracks %u", text_count);  MP4SetVerbosity(m_mp4file, verb);  if (video_count == 0 && audio_count == 0 && text_count == 0) {    psptr->set_message("No audio, video or control tracks in file");    return -1;  }  if (video_count > 0) {    vq = (video_query_t *)malloc(sizeof(video_query_t) * video_count);    memset(vq, 0, sizeof(video_query_t) * video_count);  } else {    vq = NULL;  }  if (have_audio_driver && audio_count > 0) {    aq = (audio_query_t *)malloc(sizeof(audio_query_t) * audio_count);    memset(aq, 0, sizeof(audio_query_t) * audio_count);  } else {    aq = NULL;  }  if (text_count > 0) {    tq = (text_query_t *)malloc(sizeof(text_query_t) * text_count);    memset(tq, 0, sizeof(text_query_t) * text_count);  } else {    tq = NULL;  }  for (ix = 0, video_offset = 0; ix < video_count; ix++) {    trackId = MP4FindTrackId(m_mp4file, ix, MP4_VIDEO_TRACK_TYPE);    const char *media_data_name;    media_data_name = MP4GetTrackMediaDataName(m_mp4file, trackId);    mp4f_message(LOG_DEBUG, "MP4 - got video track 4cc %s", 	media_data_name);    vq[video_offset].track_id = trackId;    vq[video_offset].stream_type = STREAM_TYPE_MP4_FILE;    vq[video_offset].compressor = media_data_name;    vq[video_offset].original_fmt = media_data_name;    if (strcasecmp(media_data_name, "encv") == 0) {    	MP4GetTrackMediaDataOriginalFormat(m_mp4file, trackId, 		original_fmt, sizeof(original_fmt));    	mp4f_message(LOG_DEBUG, "MP4 - got video track original format 4cc %s", 		original_fmt);	// ok to do this since both vq and original_fmt are volatile in this scope    	vq[video_offset].compressor = original_fmt;	// in this case, the original_fmt is going to be encv, the	// compressor avc1 or mp4v    }    if (strcasecmp(vq[video_offset].compressor, "mp4v") == 0) {       uint8_t video_type = MP4GetTrackEsdsObjectTypeId(m_mp4file, trackId);      uint8_t profileID = MP4GetVideoProfileLevel(m_mp4file, trackId);      mp4f_message(LOG_DEBUG, "MP4 - got track %x profile ID %d", 		 trackId, profileID);      MP4SetVerbosity(m_mp4file, verb & ~(MP4_DETAILS_ERROR));      MP4GetTrackESConfiguration(m_mp4file, trackId, &foo, &bufsize);      MP4SetVerbosity(m_mp4file, verb);      vq[video_offset].type = video_type;      vq[video_offset].profile = profileID;      vq[video_offset].fptr = NULL;      vq[video_offset].config = foo;      vq[video_offset].config_len = bufsize;    }     // avc1 is unaltered h264, 264b is original format for ismacrypted avc1    else if ((strcasecmp(vq[video_offset].compressor, "avc1") == 0) ||     	(strcasecmp(vq[video_offset].compressor, "264b") == 0)) {       uint8_t profile, level;      uint8_t **seqheader, **pictheader;      uint32_t *pictheadersize, *seqheadersize;      uint32_t ix;      MP4GetTrackH264ProfileLevel(m_mp4file, trackId, &profile, &level);      MP4GetTrackH264SeqPictHeaders(m_mp4file, trackId, 				    &seqheader, &seqheadersize,				    &pictheader, &pictheadersize);      bufsize = 0;      for (ix = 0; seqheadersize[ix] != 0; ix++) {	bufsize += seqheadersize[ix] + 4;      }      for (ix = 0; pictheadersize[ix] != 0; ix++) {	bufsize += pictheadersize[ix] + 4;      }      foo = (uint8_t *)malloc(bufsize + 4);      memset(foo, 0, bufsize + 4);      uint32_t copied = 0;      // headers do not have the byte stream start code stored in the file      for (ix = 0; seqheadersize[ix] != 0; ix++) {	foo[copied] = 0;	foo[copied + 1] = 0;	foo[copied + 2] = 0;	foo[copied + 3] = 1;	copied += 4; // add header	memcpy(foo + copied, 	       seqheader[ix], 	       seqheadersize[ix]);	copied += seqheadersize[ix];	free(seqheader[ix]);      }      free(seqheader);      free(seqheadersize);      for (ix = 0; pictheadersize[ix] != 0; ix++) {	foo[copied] = 0;	foo[copied + 1] = 0;	foo[copied + 2] = 0;	foo[copied + 3] = 1;	copied += 4; // add header	memcpy(foo + copied, 	       pictheader[ix], 	       pictheadersize[ix]);	copied += pictheadersize[ix];	free(pictheader[ix]);      }      free(pictheader);      free(pictheadersize);	      vq[video_offset].type = level;      vq[video_offset].profile = profile;      vq[video_offset].fptr = NULL;      vq[video_offset].config = foo;      vq[video_offset].config_len = bufsize;    } else {      MP4GetTrackVideoMetadata(m_mp4file, trackId, &foo, &bufsize);      vq[video_offset].config = foo;      vq[video_offset].config_len = bufsize;    }    plugin = check_for_video_codec(vq[video_offset].stream_type,				   vq[video_offset].compressor,				   NULL,				   vq[video_offset].type,				   vq[video_offset].profile,				   vq[video_offset].config,				   vq[video_offset].config_len,				   &config);    if (plugin == NULL) {      psptr->set_message("Can't find plugin for video %s (%s) type %d, profile %d",			 vq[video_offset].compressor,			 vq[video_offset].original_fmt,			 vq[video_offset].type, 			 vq[video_offset].profile);      m_illegal_video_codec++;      ret_value = 1;      // possibly memleak for foo here    } else {      vq[video_offset].h = MP4GetTrackVideoHeight(m_mp4file, trackId);      vq[video_offset].w = MP4GetTrackVideoWidth(m_mp4file, trackId);      vq[video_offset].frame_rate = MP4GetTrackVideoFrameRate(m_mp4file, trackId);      vq[video_offset].enabled = 0;      vq[video_offset].reference = NULL;      video_offset++;    }  }  audio_offset = 0;  if (have_audio_driver) {    for (ix = 0; ix < audio_count; ix++) {      trackId = MP4FindTrackId(m_mp4file, ix, MP4_AUDIO_TRACK_TYPE);      const char *media_data_name;      media_data_name = MP4GetTrackMediaDataName(m_mp4file, trackId);      aq[audio_offset].track_id = trackId;      aq[audio_offset].stream_type = STREAM_TYPE_MP4_FILE;      aq[audio_offset].compressor = media_data_name;      if (strcasecmp(media_data_name, "mp4a") == 0 ||	  strcasecmp(media_data_name, "enca") == 0) {	uint8_t *userdata = NULL;	u_int32_t userdata_size;	aq[audio_offset].type = MP4GetTrackEsdsObjectTypeId(m_mp4file, trackId);	MP4SetVerbosity(m_mp4file, verb & ~(MP4_DETAILS_ERROR));	aq[audio_offset].profile = MP4GetAudioProfileLevel(m_mp4file);	MP4GetTrackESConfiguration(m_mp4file, 				   trackId, 				   &userdata, 				   &userdata_size);	MP4SetVerbosity(m_mp4file, verb);	aq[audio_offset].config = userdata;	aq[audio_offset].config_len = userdata_size;      }      plugin = check_for_audio_codec(aq[audio_offset].stream_type,				     aq[audio_offset].compressor,				     NULL,				     aq[audio_offset].type,				     aq[audio_offset].profile,				     aq[audio_offset].config,				     aq[audio_offset].config_len,				     &config);      if (plugin != NULL) {	aq[audio_offset].fptr = NULL;	aq[audio_offset].sampling_freq = 	  MP4GetTrackTimeScale(m_mp4file, trackId);	MP4SetVerbosity(m_mp4file, verb & ~(MP4_DETAILS_ERROR));	aq[audio_offset].chans = MP4GetTrackAudioChannels(m_mp4file, trackId);	MP4SetVerbosity(m_mp4file, verb);	aq[audio_offset].enabled = 0;	aq[audio_offset].reference = NULL;	audio_offset++;	m_have_audio = true;      } else {	m_illegal_audio_codec++;	ret_value = 1;      }    }  } else {    if (audio_count)      ret_value = 1;  }  text_offset = 0;  for (ix = 0; ix < text_count; ix++) {    trackId = MP4FindTrackId(m_mp4file, ix, MP4_CNTL_TRACK_TYPE);    const char *media_data_name;    media_data_name = MP4GetTrackMediaDataName(m_mp4file, trackId);    tq[text_offset].track_id = trackId;    tq[text_offset].stream_type = STREAM_TYPE_MP4_FILE;    tq[text_offset].compressor = media_data_name;    plugin = check_for_text_codec(tq[text_offset].stream_type,				  tq[text_offset].compressor,				  NULL,				  NULL,				  0, 				  &config);    if (plugin != NULL) {      tq[text_offset].fptr = NULL;      tq[text_offset].enabled = 0;      tq[text_offset].reference = NULL;      text_offset++;    } else {      m_illegal_text_codec++;      ret_value = 1;    }  }  if (video_offset == 0 && audio_offset == 0 && text_offset == 0) {    psptr->set_message("No playable codecs in mp4 file");    return -1;  }  if (cc_vft && cc_vft->media_list_query != NULL) {    (cc_vft->media_list_query)(psptr, video_offset, vq, audio_offset, aq, text_offset, tq);  } else {    if (video_offset > 0) {      vq[0].enabled = 1;    }    if (audio_offset > 0) {      aq[0].enabled = 1;    }    if (text_offset > 0) {      tq[0].enabled = 1;    }  }  int vidret, audret, textret;  uint start_desc = 1;  vidret = create_video(psptr, vq, video_offset, start_desc);  free(vq);  if (vidret < 0) {    free(aq);    free(tq);    return -1;  }   audret = create_audio(psptr, aq, audio_offset, start_desc);  free(aq);  textret = create_text(psptr, tq, text_offset, start_desc);  free(tq);  if (audret < 0 || textret < 0) ret_value = -1;  char *name;  verb = MP4GetVerbosity(m_mp4file);  MP4SetVerbosity(m_mp4file, verb & ~(MP4_DETAILS_ERROR));  if (MP4GetMetadataName(m_mp4file, &name) &&      name != NULL) {    psptr->set_session_desc(0, name);    free(name);  }  MP4SetVerbosity(m_mp4file, verb);    return (ret_value);}/* end file mp4_file.cpp */

⌨️ 快捷键说明

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