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

📄 mp4_bytestream.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				m_track,				mp4_sampleId);  ts = MP4ConvertFromTrackTimestamp(m_parent->get_file(),				    m_track,				    sampleTime,				    MP4_MSECS_TIME_SCALE);  m_parent->unlock_file_mutex();#ifdef DEBUG_MP4_FRAME  mp4f_message(LOG_DEBUG, "%s searching timestamp "U64" gives "U64,	       m_name, start, mp4_ts);  mp4f_message(LOG_DEBUG, "%s values are sample time "U64" ts "U64,	       m_name, sampleTime, ts);#endif  set_timebase(mp4_sampleId);}double CMp4ByteStream::get_max_playtime (void) {  return (m_max_time);};bool CMp4EncAudioByteStream::start_next_frame (uint8_t **buffer, 					       uint32_t *buflen,					       frame_timestamp_t *pts,					       void **ud){  bool ret = CMp4AudioByteStream::start_next_frame(buffer, buflen, pts, ud);  u_int8_t *temp_buffer = NULL;  u_int32_t temp_this_frame_size = 0;#ifdef ISMACRYP_DEBUG  fwrite(*buffer, *buflen, 1, my_enc_file);#endif  ismacryp_rc_t ismacryprc;  ismacryprc = ismacrypDecryptSampleRemoveHeader(m_ismaCryptSId, 					*buflen,					*buffer,					&temp_this_frame_size,					&temp_buffer);  if ( ismacryprc != ismacryp_rc_ok ) {    mp4f_message(LOG_ERR, "%s  1. decrypt error code:  %u" ,	       m_name, ismacryprc);    CHECK_AND_FREE(temp_buffer);    // can't copy anything to buffer in this case.    return ret;   }#ifdef ISMACRYP_DEBUG  fwrite(temp_buffer, temp_this_frame_size, 1, my_unenc_file);#endif  *buflen = temp_this_frame_size;  memset(*buffer, 0, *buflen * sizeof(u_int8_t));  memcpy(*buffer, temp_buffer, temp_this_frame_size);#ifdef ISMACRYP_DEBUG  fwrite(*buffer, *buflen, 1, my_unenc_file2);#endif  CHECK_AND_FREE(temp_buffer);  return ret; }bool CMp4EncVideoByteStream::start_next_frame (uint8_t **buffer, 					       uint32_t *buflen,					       frame_timestamp_t *ts,					       void **ud){  bool ret = CMp4VideoByteStream::start_next_frame(buffer, buflen, ts, ud);  u_int8_t *temp_buffer = NULL;  u_int32_t temp_this_frame_size = 0;  ismacryp_rc_t ismacryprc;  ismacryprc = ismacrypDecryptSampleRemoveHeader(m_ismaCryptSId, 					*buflen,					*buffer,					&temp_this_frame_size,					&temp_buffer);  if (ismacryprc != ismacryp_rc_ok ) {    mp4f_message(LOG_ERR, "%s  2. decrypt error code:  %u" ,	       m_name, ismacryprc);    CHECK_AND_FREE(temp_buffer);    // can't copy anything to buffer in this case.    return ret;   }  *buflen = temp_this_frame_size;  memset(*buffer, 0, *buflen * sizeof(u_int8_t));  memcpy(*buffer, temp_buffer, temp_this_frame_size);  CHECK_AND_FREE(temp_buffer);  return ret; }bool CMp4H264VideoByteStream::start_next_frame (uint8_t **buffer, 						uint32_t *buflen, 						frame_timestamp_t *ts,						void **ud){  bool ret;  uint32_t len = 1, read_offset = 0;  uint32_t nal_len;  uint32_t write_offset = 0;  ret = CMp4VideoByteStream::start_next_frame(buffer, 					      buflen, 					      ts, 					      ud);  if (*buffer != NULL && *buflen != 0) {    if (m_buflen_size == 0) {      m_parent->lock_file_mutex();      MP4GetTrackH264LengthSize(m_parent->get_file(), m_track, &m_buflen_size);      m_parent->unlock_file_mutex();    }#ifdef DEBUG_H264_NALS    mp4f_message(LOG_DEBUG, "new frame - len %u", *buflen);#endif    do {      nal_len = read_nal_size(*buffer + read_offset);#ifdef DEBUG_H264_NALS      mp4f_message(LOG_DEBUG, "nal offset %u size %u", read_offset, 		   nal_len);#endif      len += nal_len + 3;      read_offset += nal_len + m_buflen_size;    } while (read_offset < *buflen);    if (len > m_translate_buffer_size) {      m_translate_buffer = (uint8_t *)realloc(m_translate_buffer, len);      m_translate_buffer_size = len;#ifdef DEBUG_H264_NALS      mp4f_message(LOG_DEBUG, "buflen alloced as %u", len);#endif    }    read_offset = 0;    do {      nal_len = read_nal_size(*buffer + read_offset);#ifdef DEBUG_H264_NALS      mp4f_message(LOG_DEBUG, "write offset %u, read offset %u len %u",		   write_offset, read_offset, nal_len);#endif      m_translate_buffer[write_offset] = 0;      m_translate_buffer[write_offset + 1] = 0;      if (write_offset == 0) {	// make sure that the first nal has a extra 0 (0 0 0 1 header)	m_translate_buffer[2] = 0;	write_offset = 1;      }      m_translate_buffer[write_offset + 2] = 1;      memcpy(m_translate_buffer + write_offset + 3, 	     *buffer + read_offset + m_buflen_size,	     nal_len);      write_offset += nal_len + 3;      read_offset += nal_len + m_buflen_size;    } while (read_offset < *buflen);    *buffer = m_translate_buffer;    *buflen = write_offset;  }  return ret;}bool CMp4EncH264VideoByteStream::start_next_frame (uint8_t **buffer, 						uint32_t *buflen, 						frame_timestamp_t *ts,						void **ud){  bool ret;  uint32_t len = 1, read_offset = 0;  uint32_t nal_len;  uint32_t write_offset = 0;  u_int8_t *temp_buffer = NULL;  u_int32_t temp_this_frame_size = 0;  ismacryp_rc_t ismacryprc;  ret = CMp4VideoByteStream::start_next_frame(buffer, 					      buflen, 					      ts, 					      ud);  //  // STEP 1 - isma decrypt. this returns ismacryp_rc_ok  // whether the correct key is loaded or not.  // nal is tested to determine if frame was decrypted OK   //  ismacryprc = ismacrypDecryptSampleRemoveHeader(m_ismaCryptSId, 					*buflen,					*buffer,					&temp_this_frame_size,					&temp_buffer);  if (ismacryprc != ismacryp_rc_ok ) {    mp4f_message(LOG_ERR, "%s  2. decrypt error code:  %u" ,	       m_name, ismacryprc);    CHECK_AND_FREE(temp_buffer);    // can't copy anything to buffer in this case.    return ret;   }  *buflen = temp_this_frame_size;  memset(*buffer, 0, *buflen * sizeof(u_int8_t));  memcpy(*buffer, temp_buffer, temp_this_frame_size);  CHECK_AND_FREE(temp_buffer);  //   // 	STEP 2 - H264   //   //    check the nal_len against frame size to validate  //    the decryption and reject attempt to decrypt  //    using wrong key   //  if (*buffer != NULL && *buflen != 0) {    if (m_buflen_size == 0) {      m_parent->lock_file_mutex();      MP4GetTrackH264LengthSize(m_parent->get_file(), m_track, &m_buflen_size);      m_parent->unlock_file_mutex();    }#ifdef DEBUG_H264_NALS    mp4f_message(LOG_DEBUG, "new frame - len %u", *buflen);#endif    do {      nal_len = read_nal_size(*buffer + read_offset);#ifdef DEBUG_H264_NALS      mp4f_message(LOG_DEBUG, "nal offset %u fsize %u size %u",         read_offset, *buflen, nal_len);#endif      // test if nal is sensible.  this fails when       // wrong key is used to decrypt.  this test      // avoids segfault below when bogus nal_len is used      // to realloc m_translate_buffer      if (nal_len != (*buflen - m_buflen_size))      {    	mp4f_message(LOG_ERR, "%s  3. buflen %u nal_len %u" ,	       m_name, *buflen, nal_len);        return (false);      }      len += nal_len + 3;      read_offset += nal_len + m_buflen_size;    } while (read_offset < *buflen);    if (len > m_translate_buffer_size) {      m_translate_buffer = (uint8_t *)realloc(m_translate_buffer, len);      m_translate_buffer_size = len;#ifdef DEBUG_H264_NALS      mp4f_message(LOG_DEBUG, "buflen alloced as %u", len);#endif    }    read_offset = 0;    do {      nal_len = read_nal_size(*buffer + read_offset);#ifdef DEBUG_H264_NALS      mp4f_message(LOG_DEBUG, "write offset %u, read offset %u len %u",		   write_offset, read_offset, nal_len);#endif      m_translate_buffer[write_offset] = 0;      m_translate_buffer[write_offset + 1] = 0;      if (write_offset == 0) {	// make sure that the first nal has a extra 0 (0 0 0 1 header)	m_translate_buffer[2] = 0;	write_offset = 1;      }      m_translate_buffer[write_offset + 2] = 1;      memcpy(m_translate_buffer + write_offset + 3, 	     *buffer + read_offset + m_buflen_size,	     nal_len);      write_offset += nal_len + 3;      read_offset += nal_len + m_buflen_size;    } while (read_offset < *buflen);    *buffer = m_translate_buffer;    *buflen = write_offset;  }  return ret;}bool CMp4TextByteStream::start_next_frame (uint8_t **buffer, 					   uint32_t *buflen,					   frame_timestamp_t *ptr,					   void **ud){  bool ret;  ret = CMp4ByteStream::start_next_frame(buffer, buflen, ptr, ud);  if (ret == false) return false;  if (buflen == 0) return ret;  *ud = (void *)strdup(m_base_url);  return true;}/* end file mp4_bytestream.cpp */

⌨️ 快捷键说明

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