#include <RTPProfile.h>
Inheritance diagram for RTPProfile:
|
This method is called when the application issued the creation of an rtp payload sender module to transmit data. It creates a new sender module and connects it. The profile module informs the rtp module of having finished this task. Then it initializes the newly create sender module with a inititalizeSenderModule message. 00143 { 00144 00145 int ssrc = rinp->ssrc(); 00146 int payloadType = rinp->payloadType(); 00147 char moduleName[100]; 00148 sprintf(moduleName, "RTP%sPayload%iSender", _profileName, payloadType); 00149 00150 cModuleType *moduleType = findModuleType(moduleName); 00151 00152 if (moduleType == NULL) { 00153 opp_error("RTPProfile: payload sender module \"", moduleName, "\" not found !"); 00154 }; 00155 RTPPayloadSender *rtpPayloadSender = (RTPPayloadSender *)(moduleType->create(moduleName, this)); 00156 00157 connect(this, findGate("toPayloadSender"), NULL, rtpPayloadSender, rtpPayloadSender->findGate("fromProfile")); 00158 connect(rtpPayloadSender, rtpPayloadSender->findGate("toProfile"), NULL, this, findGate("fromPayloadSender")); 00159 00160 rtpPayloadSender->initialize(); 00161 rtpPayloadSender->scheduleStart(simTime()); 00162 00163 RTPInnerPacket *rinpOut1 = new RTPInnerPacket("senderModuleCreated()"); 00164 rinpOut1->senderModuleCreated(ssrc); 00165 send(rinpOut1, "toRTP"); 00166 00167 RTPInnerPacket *rinpOut2 = new RTPInnerPacket("initializeSenderModule()"); 00168 rinpOut2->initializeSenderModule(ssrc, rinp->fileName(), _mtu); 00169 send(rinpOut2, "toPayloadSender"); 00170 00171 delete rinp; 00172 };
|
|
Handles incoming data packets: If there isn't a receiver module for this sender it creates one. The data packet is forwarded to the receiver module after calling processIncomingPacket. 00192 { 00193 00194 processIncomingPacket(rinp); 00195 00196 RTPPacket *packet = (RTPPacket *)(rinp->encapsulatedMsg()); 00197 00198 u_int32 ssrc = packet->ssrc(); 00199 00200 RTPSSRCGate *ssrcGate = findSSRCGate(ssrc); 00201 00202 if (!ssrcGate) { 00203 ssrcGate = newSSRCGate(ssrc); 00204 char payloadReceiverName[100]; 00205 sprintf(payloadReceiverName, "RTP%sPayload%iReceiver", _profileName, packet->payloadType()); 00206 00207 cModuleType *moduleType = findModuleType(payloadReceiverName); 00208 if (moduleType == NULL) { 00209 opp_error("Receiver module %s not found !", payloadReceiverName); 00210 } 00211 else { 00212 RTPPayloadReceiver *receiverModule = (RTPPayloadReceiver *)(moduleType->create(payloadReceiverName, this)); 00213 if (_autoOutputFileNames) { 00214 char outputFileName[100]; 00215 sprintf(outputFileName, "id%i.sim", receiverModule->id()); 00216 receiverModule->par("outputFileName") = outputFileName; 00217 } 00218 connect(this, ssrcGate->gateId(), NULL, receiverModule, receiverModule->findGate("fromProfile")); 00219 connect(receiverModule, receiverModule->findGate("toProfile"), NULL, this, ssrcGate->gateId() - findGate("toPayloadReceiver") + findGate("fromPayloadReceiver")); 00220 receiverModule->callInitialize(0); 00221 receiverModule->scheduleStart(simTime()); 00222 } 00223 }; 00224 00225 send(rinp, ssrcGate->gateId()); 00226 };
|
|
Handles outgoing data packets: Calls processOutgoingPacket and forwards the packet to the rtp module. 00229 { 00230 processOutgoingPacket(rinp); 00231 send(rinp, "toRTP"); 00232 };
|
|
When a sender module is no longer needed it can be deleted by the profile module. 00175 { 00176 cModule *senderModule = gate("toPayloadSender")->toGate()->ownerModule(); 00177 senderModule->deleteModule(); 00178 00179 RTPInnerPacket *rinpOut = new RTPInnerPacket("senderModuleDeleted()"); 00180 rinpOut->senderModuleDeleted(rinpIn->ssrc()); 00181 delete rinpIn; 00182 00183 send(rinpOut, "toRTP"); 00184 };
|
|
Finds the gate of the receiver module for rtp data packets from this ssrc. 00255 { 00256 const char *name = RTPParticipantInfo::ssrcToName(ssrc); 00257 int objectIndex = _ssrcGates->find(name); 00258 if (objectIndex == -1) { 00259 return NULL; 00260 } 00261 else { 00262 cObject *co = (_ssrcGates->get(objectIndex)); 00263 return (RTPSSRCGate *)co; 00264 }; 00265 };
|
|
Creates and removes payload sender and receiver modules on demand. 00049 { 00050 00051 if (msg->arrivalGateId() == findGate("fromRTP")) { 00052 handleMessageFromRTP(msg); 00053 } 00054 00055 else if (msg->arrivalGateId() == findGate("fromPayloadSender")) { 00056 handleMessageFromPayloadSender(msg); 00057 } 00058 00059 else if (msg->arrivalGateId() >= findGate("fromPayloadReceiver") && msg->arrivalGateId() < findGate("fromPayloadReceiver") + _maxReceivers) { 00060 handleMessageFromPayloadReceiver(msg); 00061 } 00062 00063 else { 00064 // this shouldn't happen 00065 EV << "RTPProfile: message coming from unknown gate" << endl; 00066 } 00067 00068 };
|
|
Handles messages coming from a receiver module. 00128 { 00129 // currently payload receiver modules don't send messages 00130 delete msg; 00131 }
|
|
Handles messages coming from the sender module. 00105 { 00106 00107 RTPInnerPacket *rinpIn = (RTPInnerPacket *)msg; 00108 00109 if (rinpIn->type() == RTPInnerPacket::RTP_INP_DATA_OUT) { 00110 dataOut(rinpIn); 00111 } 00112 00113 else if (rinpIn->type() == RTPInnerPacket::RTP_INP_SENDER_MODULE_INITIALIZED) { 00114 senderModuleInitialized(rinpIn); 00115 } 00116 00117 else if (rinpIn->type() == RTPInnerPacket::RTP_INP_SENDER_MODULE_STATUS) { 00118 senderModuleStatus(rinpIn); 00119 } 00120 00121 else { 00122 EV << "Profile received RTPInnerPacket from sender module with wrong type!" << endl; 00123 } 00124 00125 }
|
|
Handles messages received from the rtp module. 00071 { 00072 00073 if (opp_strcmp(msg->className(), "RTPInnerPacket")) 00074 error("RTPProfile: message received from RTPModule is not an RTPInnerPacket !"); 00075 00076 RTPInnerPacket *rinpIn = (RTPInnerPacket *)msg; 00077 00078 if (rinpIn->type() == RTPInnerPacket::RTP_INP_INITIALIZE_PROFILE) { 00079 initializeProfile(rinpIn); 00080 } 00081 00082 else if (rinpIn->type() == RTPInnerPacket::RTP_INP_CREATE_SENDER_MODULE) { 00083 createSenderModule(rinpIn); 00084 } 00085 00086 else if (rinpIn->type() == RTPInnerPacket::RTP_INP_DELETE_SENDER_MODULE) { 00087 deleteSenderModule(rinpIn); 00088 } 00089 00090 else if (rinpIn->type() == RTPInnerPacket::RTP_INP_SENDER_MODULE_CONTROL) { 00091 senderModuleControl(rinpIn); 00092 } 00093 00094 else if (rinpIn->type() == RTPInnerPacket::RTP_INP_DATA_IN) { 00095 dataIn(rinpIn); 00096 } 00097 00098 else { 00099 EV << "RTPProfile: RTPInnerPacket from RTPModule has wrong type !"<< endl; 00100 } 00101 00102 }
|
|
Initializes variables. Must be overwritten by subclasses. Reimplemented in RTPAVProfile. 00036 { 00037 00038 _profileName = "Profile"; 00039 _rtcpPercentage = 5; 00040 _preferredPort = IPSuite_PORT_UNDEF; 00041 00042 // how many gates to payload receivers do we have 00043 _maxReceivers = gate("toPayloadReceiver")->size(); 00044 _ssrcGates = new cArray("SSRCGates"); 00045 _autoOutputFileNames = par("autoOutputFileNames").boolValue(); 00046 }
|
|
Initialization message received from rtp module. 00134 { 00135 _mtu = rinp->mtu(); 00136 delete rinp; 00137 RTPInnerPacket *rinpOut = new RTPInnerPacket("profileInitialized()"); 00138 rinpOut->profileInitialized(_rtcpPercentage, _preferredPort); 00139 send(rinpOut, "toRTP"); 00140 }
|
|
Creates a new association ssrc/gateId for this ssrc. 00268 { 00269 RTPSSRCGate *ssrcGate = new RTPSSRCGate(ssrc); 00270 bool assigned = false; 00271 int receiverGateId = findGate("toPayloadReceiver"); 00272 for (int i = receiverGateId; i < receiverGateId + _maxReceivers && !assigned; i++) { 00273 if (!gate(i)->isConnected()) { 00274 ssrcGate->setGateId(i); 00275 assigned = true; 00276 }; 00277 }; 00278 if (!assigned) { 00279 opp_error("Can't manage more senders !"); 00280 }; 00281 _ssrcGates->add(ssrcGate); 00282 return ssrcGate; 00283 };
|
|
Every time a rtp packet is received it it pre-processed by this method to remove profile specific extension which are not handled by the payload receiver module. In this implementation the packet isn't changed. Important: This method works with RTPInnerPacket. So the rtp packet must be decapsulated, changed and encapsulated again. 00245 {
00246 // do nothing with the packet
00247 };
|
|
Simular to the procedure for incoming packets, this adds profile specific extensions to outgoing rtp packets. 00250 {
00251 // do nothing with the packet
00252 };
|
|
The profile module forwards sender control messages to the sender module. 00187 {
00188 send(rinp, "toPayloadSender");
00189 };
|
|
The sender module returns a senderModuleInitialized message after being initialized. The profile module forwards this message to the rtp module which delivers it to its destination, the rtcp module. 00235 {
00236 send(rinp, "toRTP");
00237 };
|
|
After having received a sender module control message the sender module returns a sender status message to inform the application what it's doing at the moment. 00240 {
00241 send(rinp, "toRTP");
00242 };
|
|
If this is set true the RTPProfile automatically sets the output file name for payload receiver modules so the user is not bothered to set them manually during simulation runtime. |
|
The maximum number of incoming data streams this profile module can handle. It is set to the gate size of "toPayloadReceiver", "fromPayloadReceiver". |
|
The maximum size an RTPPacket can have. |
|
The rtp port this profile uses if no port is given. |
|
The name of this profile. Needed for dynamic creating of sender and receiver modules. |
|
The percentage of the available bandwidth to be used for rtcp. |
|
Stores information to which gate rtp data packets from a ssrc must be forwarded. |