/*********************** * GetNextPacket * Obtiene el siguiente paquete para enviar ************************/ int H263Encoder1996::GetNextPacket(BYTE *out,DWORD &len) { //Get info MediaFrame::RtpPacketizationInfo& info = frame->GetRtpPacketizationInfo(); //Check if (num>info.size()) //Exit return Error("No mor rtp packets!!"); //Get packet MediaFrame::RtpPacketization* rtp = info[num++]; //Make sure it is enought length if (rtp->GetTotalLength()>len) { //Nullify len = 0; //Send it return Error("H263 MB too big!!! [%d,%d]\n",rtp->GetTotalLength(),len); } //Copy prefic memcpy(out,rtp->GetPrefixData(),rtp->GetPrefixLen()); //Copy data memcpy(out+rtp->GetPrefixLen(),frame->GetData()+rtp->GetPos(),rtp->GetSize()); //Set len len = rtp->GetPrefixLen()+rtp->GetSize(); //It is last?? return (num<info.size()); }
int RTPMultiplexerSmoother::SmoothFrame(const MediaFrame* frame,DWORD duration) { //Check if (!frame || !frame->HasRtpPacketizationInfo()) //Error return Error("Frame do not has packetization info"); //Get info const MediaFrame::RtpPacketizationInfo& info = frame->GetRtpPacketizationInfo(); DWORD codec = 0; BYTE *frameData = NULL; DWORD frameSize = 0; //Depending on the type switch(frame->GetType()) { case MediaFrame::Audio: { //get audio frame AudioFrame * audio = (AudioFrame*)frame; //Get codec codec = audio->GetCodec(); //Get data frameData = audio->GetData(); //Get size frameSize = audio->GetLength(); } break; case MediaFrame::Video: { //get Video frame VideoFrame * video = (VideoFrame*)frame; //Get codec codec = video->GetCodec(); //Get data frameData = video->GetData(); //Get size frameSize = video->GetLength(); } break; default: return Error("No smoother for frame"); } DWORD frameLength = 0; //Calculate total length for (int i=0;i<info.size();i++) //Get total length frameLength += info[i]->GetTotalLength(); //Calculate bitrate for frame DWORD current = 0; //For each one for (int i=0;i<info.size();i++) { //Get packet MediaFrame::RtpPacketization* rtp = info[i]; //Create rtp packet RTPPacketSched *packet = new RTPPacketSched(frame->GetType(),codec); //Make sure it is enought length if (rtp->GetPrefixLen()+rtp->GetSize()>packet->GetMaxMediaLength()) //Error continue; //Get pointer to media data BYTE* out = packet->GetMediaData(); //Copy prefic memcpy(out,rtp->GetPrefixData(),rtp->GetPrefixLen()); //Copy data memcpy(out+rtp->GetPrefixLen(),frameData+rtp->GetPos(),rtp->GetSize()); //Set length DWORD len = rtp->GetPrefixLen()+rtp->GetSize(); //Set length packet->SetMediaLength(len); switch(packet->GetMedia()) { case MediaFrame::Video: //Set timestamp packet->SetTimestamp(frame->GetTimeStamp()*90); break; case MediaFrame::Audio: //Set timestamp packet->SetTimestamp(frame->GetTimeStamp()*8); break; default: //Set timestamp packet->SetTimestamp(frame->GetTimeStamp()); } //Check if (i+1==info.size()) //last packet->SetMark(true); else //No last packet->SetMark(false); //Calculate partial lenght current += len; //Calculate sending time offset from first frame packet->SetSendingTime(current*duration/frameLength); //Append it queue.Add(packet); } return 1; }