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

📄 isma_rtp_plugin.cpp

📁 完整的RTP RTSP代码库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  uint16_t header_len;  uint32_t retvalue;  pak = iptr->m_vft->get_head_and_check(iptr->m_ifptr, false, 0);  if (pak == NULL) {    return;  }#ifdef DEBUG_ISMA_AAC  isma_message(LOG_DEBUG, ismartp, 	       "processing pak seq %d ts %x len %d", 	       pak->rtp_pak_seq, pak->rtp_pak_ts, pak->rtp_data_len);#endif  // This pak has not had it's header processed  // length in bytes  if (pak->rtp_data_len == 0) {    iptr->m_vft->free_pak(pak);    isma_message(LOG_ERR, ismartp, "RTP audio packet with data length of 0");    return;  }  header_len = ntohs(*(unsigned short *)pak->rtp_data);  if (header_len < iptr->m_min_first_header_bits) {    // bye bye, frame...    iptr->m_vft->free_pak(pak);    isma_message(LOG_ERR, ismartp, "ISMA rtp - header len %d less than min %d", 		 header_len, iptr->m_min_first_header_bits);    return;  }  iptr->m_header_bitstream.init(&pak->rtp_data[sizeof(uint16_t)],			  header_len);  if (iptr->m_header_bitstream.getbits(iptr->m_fmtp->size_length, &frame_len) != 0)     return;  iptr->m_header_bitstream.getbits(iptr->m_fmtp->index_length, &retvalue);  get_au_header_bits(iptr);#ifdef DEBUG_ISMA_AAC  uint64_t msec = iptr->m_vft->rtp_ts_to_msec(iptr->m_ifptr, pak->rtp_pak_ts, 					      pak->pd.rtp_pd_timestamp,					      1);  isma_message(LOG_DEBUG, ismartp, 	       "1st - header len %u frame len %u ts %x "U64, 	       header_len, frame_len, pak->rtp_pak_ts, msec);#endif  if (frame_len == 0) {    iptr->m_vft->free_pak(pak);    return;  }  uint8_t *frame_ptr;  isma_frame_data_t *frame_data;  uint32_t ts;  ts = pak->rtp_pak_ts;  frame_data = get_frame_data(iptr);  frame_data->pak = pak;  // frame pointer is after header_len + header_len size.  Header_len  // is in bits - add 7, divide by 8 to get padding correctly.  frame_data->frame_ptr = &pak->rtp_data[((header_len + 7) / 8) 				    + sizeof(uint16_t)];  frame_data->frame_len = frame_len;  frame_data->rtp_timestamp = ts;  // Check if frame is fragmented  // frame_len plus the length of the 2 headers  uint32_t frag_check = frame_len + sizeof(uint16_t);  frag_check += iptr->m_fmtp->size_length / 8;  if ((iptr->m_fmtp->size_length % 8) != 0) frag_check++;  if (frag_check > pak->rtp_data_len) {#ifdef DEBUG_ISMA_AAC    isma_message(LOG_DEBUG, ismartp, "Frame is fragmented");#endif    frame_data->is_fragment = 1;    int err = process_fragment(iptr, pak, frame_data);    if (err == 1)      isma_message(LOG_ERR, ismartp, "Error in processing the fragment");    return;   }  else {#ifdef DEBUG_ISMA_AAC    isma_message(LOG_DEBUG, ismartp, "Frame is not fragmented");#endif    frame_data->is_fragment = 0;    frame_data->frag_data = NULL;  }  int error = insert_frame_data(iptr, frame_data);  frame_ptr = frame_data->frame_ptr + frame_data->frame_len;  while (iptr->m_header_bitstream.bits_remain() >= iptr->m_min_header_bits) {    uint32_t stride = 0;    iptr->m_header_bitstream.getbits(iptr->m_fmtp->size_length, &frame_len);    iptr->m_header_bitstream.getbits(iptr->m_fmtp->index_delta_length, &stride);    get_au_header_bits(iptr);    ts += (iptr->m_rtp_ts_add * (1 + stride));#ifdef DEBUG_ISMA_AAC    msec = iptr->m_vft->rtp_ts_to_msec(iptr->m_ifptr, 				       pak->rtp_pak_ts, 				       pak->pd.rtp_pd_timestamp,				       1);    isma_message(LOG_DEBUG, ismartp, 		 "Stride %d len %d ts %x "U64,		 stride, frame_len, ts, msec);#endif    frame_data = get_frame_data(iptr);    frame_data->pak = pak;    frame_data->is_fragment = 0;    frame_data->frag_data = NULL;    frame_data->frame_ptr = frame_ptr;    frame_data->frame_len = frame_len;    frame_ptr += frame_len;    frame_data->rtp_timestamp = ts;    error |= insert_frame_data(iptr, frame_data);  }  if (error == 0 && frame_data != NULL) {     frame_data->last_in_pak = 1;  }  else {    isma_frame_data_t *p, *last = NULL;    p = iptr->m_frame_data_head;    while (p != NULL) {      if (p->pak == pak) last = p;      p = p->frame_data_next;    }    if (last != NULL) {      last->last_in_pak = 1;      isma_message(LOG_WARNING, ismartp, "error at end - marked ts %x", last->rtp_timestamp);    } else {      // Didn't find pak in list.  Weird      isma_message(LOG_ERR, ismartp, 		   "Decoded packet with RTP timestamp %x and didn't"		   "see any good frames", pak->rtp_pak_ts);      iptr->m_vft->free_pak(pak);      return;    }  }  if (iptr->m_fmtp->auxiliary_data_size_length > 0) {    iptr->m_header_bitstream.byte_align();    uint32_t aux_len = 0;    iptr->m_header_bitstream.getbits(iptr->m_fmtp->auxiliary_data_size_length, &aux_len);    aux_len = (aux_len + 7) / 8;#ifdef DEBUG_ISMA_AAC    isma_message(LOG_DEBUG, ismartp, "Adding %d bytes for aux data size", aux_len);#endif    isma_frame_data_t *p;    p = iptr->m_frame_data_head;    while (p != NULL) {      if (p->pak == pak) {	p->frame_ptr += aux_len;      }      p = p->frame_data_next;    }  }}static bool start_next_frame (rtp_plugin_data_t *pifptr, 			      uint8_t **buffer, 			      uint32_t *buflen,			      frame_timestamp_t *ts,			      void **userdata){  isma_rtp_data_t *iptr = (isma_rtp_data_t *)pifptr;  uint64_t timetick;  if (iptr->m_frame_data_on != NULL) {    uint32_t next_ts;#ifdef DEBUG_ISMA_AAC    isma_message(LOG_DEBUG, ismartp, "Advancing to next pak data - old ts %x", 		 iptr->m_frame_data_on->rtp_timestamp);#endif    if (iptr->m_frame_data_on->last_in_pak != 0) {      // We're done with all the data in this packet - get rid      // of the rtp packet.      if (iptr->m_frame_data_on->is_fragment == 1) {	// if fragmented, need to get rid of all paks pointed to	isma_frag_data_t *q =  iptr->m_frame_data_on->frag_data;	while (q != NULL) {	  rtp_packet *pak = q->pak;	  q->pak = NULL;	  if (pak != NULL) {	    iptr->m_vft->free_pak(pak);	  }	  q = q->frag_data_next;#ifdef DEBUG_ISMA_AAC	  isma_message(LOG_DEBUG, ismartp, "removing pak - frag %d", pak->rtp_pak_seq);#endif	}      } else {	rtp_packet *pak = iptr->m_frame_data_on->pak;	iptr->m_frame_data_on->pak = NULL;	iptr->m_vft->free_pak(pak);#ifdef DEBUG_ISMA_AAC	isma_message(LOG_DEBUG, ismartp, "removing pak %d", pak->rtp_pak_seq);#endif      }    }    /*     * Remove the frame data head pointer, and put it on the free list     */    isma_frame_data_t *p = NULL;    SDL_LockMutex(iptr->m_rtp_packet_mutex);    p = iptr->m_frame_data_on;    iptr->m_frame_data_on = NULL;    next_ts = p->rtp_timestamp;    p->frame_data_next = iptr->m_frame_data_free;    iptr->m_frame_data_free = p;    // free all frag_data for this frame    if (p->is_fragment == 1) {      isma_frag_data_t * q = p->frag_data;      while (q != NULL) {	p->frag_data = q->frag_data_next;	free(q);	q = p->frag_data;      }     }    SDL_UnlockMutex(iptr->m_rtp_packet_mutex);    /*      * Now, look for the next timestamp - process a bunch of new     * rtp packets, if we have to...     */    next_ts += iptr->m_rtp_ts_add;    if (iptr->m_frame_data_head == NULL ||	iptr->m_frame_data_head->rtp_timestamp != next_ts) {      // process next pak in list.  Process until next timestamp is found,       // or 500 msec worth of data is found (in which case, go with first)      do {	process_packet_header(iptr);      } while (iptr->m_vft->get_next_pak(iptr->m_ifptr, NULL, 0) != NULL && 	       ((iptr->m_frame_data_head == NULL) || 		(iptr->m_frame_data_head->rtp_timestamp != next_ts)) &&  	       (iptr->m_frame_data_free != NULL));    }#ifdef DEBUG_ISMA_AAC    else {      // iptr->m_frame_data_head is correct      isma_message(LOG_DEBUG, ismartp, "frame_data_head is correct");    }#endif  } else {    // first time.  Process a bunch of packets, go with first one...    // asdf - will want to eventually add code to drop the first couple    // of packets if they're not consecutive.    do {      process_packet_header(iptr);    } while ((iptr->m_vft->get_next_pak(iptr->m_ifptr, NULL, 0) != NULL) &&	     (iptr->m_frame_data_free != NULL));  }  /*   * Init up the offsets   */  if (iptr->m_frame_data_head != NULL) {    SDL_LockMutex(iptr->m_rtp_packet_mutex);    iptr->m_frame_data_on = iptr->m_frame_data_head;    iptr->m_frame_data_head = iptr->m_frame_data_head->frame_data_next;    SDL_UnlockMutex(iptr->m_rtp_packet_mutex);    if (iptr->m_frame_data_on->is_fragment == 1) {	        iptr->m_frag_reass_size = 0;      isma_frag_data_t *ptr;      ptr = iptr->m_frame_data_on->frag_data;      while (ptr != NULL) {	if (iptr->m_frag_reass_size + ptr->frag_len > iptr->m_frag_reass_size_max) {	  iptr->m_frag_reass_size_max += MAX(4096, ptr->frag_len);	  iptr->m_frag_reass_buffer = 	    (uint8_t *)realloc(iptr->m_frag_reass_buffer, 			       iptr->m_frag_reass_size_max);	}	memmove(iptr->m_frag_reass_buffer + iptr->m_frag_reass_size, 		ptr->frag_ptr,		ptr->frag_len);	iptr->m_frag_reass_size += ptr->frag_len;	ptr = ptr->frag_data_next;      }      *buffer = iptr->m_frag_reass_buffer;      *buflen = iptr->m_frag_reass_size;    } else {       *buffer = iptr->m_frame_data_on->frame_ptr;      *buflen = iptr->m_frame_data_on->frame_len;    }  } else {    *buffer = NULL;  }#ifdef ISMA_RTP_DUMP_OUTPUT_TO_FILE  if (*buffer != NULL) {    fwrite(*buffer, *buflen,  1, iptr->m_outfile);  }#endif  timetick =     iptr->m_vft->rtp_ts_to_msec(iptr->m_ifptr, 				iptr->m_frame_data_on != NULL ? 				iptr->m_frame_data_on->rtp_timestamp : 				iptr->m_ts, 				iptr->m_frame_data_on ?				iptr->m_frame_data_on->pak->pd.rtp_pd_timestamp : 0,				0);  if (iptr->m_frame_data_on != NULL)    iptr->m_ts =  iptr->m_frame_data_on->rtp_timestamp;    // We're going to have to handle wrap better...#ifdef DEBUG_ISMA_AAC  isma_message(LOG_DEBUG, ismartp, "start next frame %p %d ts "X64" "U64, 	       *buffer, *buflen, iptr->m_ts, timetick);#endif  ts->audio_freq_timestamp = iptr->m_ts;  ts->msec_timestamp = timetick;  ts->timestamp_is_pts = true;  return (true);}static void used_bytes_for_frame (rtp_plugin_data_t *pifptr, uint32_t bytes){}static void reset (rtp_plugin_data_t *pifptr){}static void flush_rtp_packets (rtp_plugin_data_t *pifptr){  isma_rtp_data_t *iptr = (isma_rtp_data_t *)pifptr;  isma_frame_data_t *p;  SDL_LockMutex(iptr->m_rtp_packet_mutex);  if (iptr->m_frame_data_on != NULL) {    iptr->m_frame_data_on->frame_data_next = iptr->m_frame_data_head;    iptr->m_frame_data_head = iptr->m_frame_data_on;    iptr->m_frame_data_on = NULL;  }  if (iptr->m_frame_data_head != NULL) {    p = iptr->m_frame_data_head;    while (p->frame_data_next != NULL) {#ifdef DEBUG_ISMA_AAC      isma_message(LOG_DEBUG, ismartp, "reset removing pak %d", p->pak->rtp_pak_seq);#endif      if (p->last_in_pak != 0) {	if (p->is_fragment == 1) {	  // get rid of frag data 	  isma_frag_data_t * q = NULL;	  while ((q = p->frag_data) != NULL) {	    p->frag_data = q->frag_data_next;	    free(q);	  } 	}	iptr->m_vft->free_pak(p->pak);      }      p = p->frame_data_next;    }    p->frame_data_next = iptr->m_frame_data_free;    iptr->m_frame_data_free = iptr->m_frame_data_head;    iptr->m_frame_data_head = NULL;  }  SDL_UnlockMutex(iptr->m_rtp_packet_mutex);}static bool have_frame (rtp_plugin_data_t *pifptr){  isma_rtp_data_t *iptr = (isma_rtp_data_t *)pifptr;  if (iptr->m_frame_data_head != NULL) return true;  return (iptr->m_vft->get_next_pak(iptr->m_ifptr, NULL, 0) != NULL);}RTP_PLUGIN("mpeg4-generic", 	   check,	   isma_rtp_plugin_create,	   isma_rtp_destroy,	   start_next_frame, 	   used_bytes_for_frame,	   reset, 	   flush_rtp_packets,	   have_frame,	   NULL,	   0);

⌨️ 快捷键说明

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