diff options
-rw-r--r-- | src/lrtp.cc | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/src/lrtp.cc b/src/lrtp.cc index 1f0b11d..f974331 100644 --- a/src/lrtp.cc +++ b/src/lrtp.cc @@ -39,6 +39,8 @@ #include "srtp.h" +//#define SKIP_SRTP + #ifdef __cplusplus extern "C" { #endif @@ -222,7 +224,9 @@ int lrtp_pack(struct lrtp_t *lrtp, char *packet, size_t maxsize) if(rtp.isValid()) { size_t size = rtp.packet(packet, maxsize); +#ifndef SKIP_SRTP size = lrtp->srtp->encrypt(packet, size); +#endif/*SKIP_SRTP*/ lrtp->seq++; return size; } @@ -246,6 +250,9 @@ int lrtp_dequeue_frame(struct lrtp_t *lrtp, memcpy(frame, f->data, f->size); + *csrc = f->csrc; + *ts = f->ts; + lrtp->framelist.pop_front(); free(f->data); @@ -257,32 +264,56 @@ int lrtp_dequeue_frame(struct lrtp_t *lrtp, EXPORT int lrtp_unpack(struct lrtp_t *lrtp, const char *packet, size_t size) { - if(!lrtp) return UNPACK_MISSING_HANDLE; + if(!lrtp) return -UNPACK_MISSING_HANDLE; // TODO: Check lrtp magic word - char pkg[16*1024]; + char pkg[size]; memcpy(pkg, packet, size); - size = lrtp->srtp->decrypt(pkg, size); + int ret = 0; + +#ifndef SKIP_SRTP + ret = lrtp->srtp->decrypt(pkg, size); + + if(ret < 0) { + printf("lrtp_unpack::decrypt error: %d\n", ret); + return -1; + } + + size = ret; +#endif/*SKIP_SRTP*/ RTP rtp; rtp.fromPacket(pkg, size); std::list<csrc_t> csrcs = rtp.getCSrcs(); - if(csrcs.size() == 0) return UNPACK_MISSING_CSRC; - if(csrcs.size() > 1) return UNPACK_TOO_MANY_CSRCS; + if(csrcs.size() == 0) return -UNPACK_MISSING_CSRC; + if(csrcs.size() > 1) return -UNPACK_TOO_MANY_CSRCS; csrc_t csrc = *csrcs.begin(); struct lrtp_profile_t *profile = NULL; if(lrtp->profiles.find(csrc) == lrtp->profiles.end()) { - return UNPACK_MISSING_PROFILE; + return -UNPACK_MISSING_PROFILE; } profile = lrtp->profiles[csrc]; std::list<outputframe_t*> framelist; - int ret = profile->unpack(profile, rtp, framelist); + ret = profile->unpack(profile, rtp, framelist); + + if(ret < 0) { + printf("lrtp_unpack::Profile unpack failed: %d\n", ret); + return -1; + } + + // Make sure all frames in the list have the correct csrc. + std::list<outputframe_t*>::iterator fi = framelist.begin(); + while(fi != framelist.end()) { + (*fi)->csrc = csrc; + fi++; + } + lrtp->framelist.splice(lrtp->framelist.end(), framelist); return ret; |