Reverting timestamp RTP field

See discussion in #143
//FREEBIE
pull/1/head
Frederic Jacobs 11 years ago
parent 854046d976
commit 8b42036f16

@ -20,7 +20,6 @@
@interface AudioPacker : NSObject { @interface AudioPacker : NSObject {
@private NSMutableArray* framesToSend; @private NSMutableArray* framesToSend;
@private uint16_t nextSequenceNumber; @private uint16_t nextSequenceNumber;
@private uint32_t nextTimeStamp;
@private Queue* audioFrameToReceiveQueue; @private Queue* audioFrameToReceiveQueue;
} }

@ -9,7 +9,6 @@
AudioPacker* newAudioPackerInstance = [AudioPacker new]; AudioPacker* newAudioPackerInstance = [AudioPacker new];
newAudioPackerInstance->audioFrameToReceiveQueue = [Queue new]; newAudioPackerInstance->audioFrameToReceiveQueue = [Queue new];
newAudioPackerInstance->framesToSend = [NSMutableArray array]; newAudioPackerInstance->framesToSend = [NSMutableArray array];
newAudioPackerInstance->nextTimeStamp = [CryptoTools generateSecureRandomUInt32];
newAudioPackerInstance->nextSequenceNumber = [CryptoTools generateSecureRandomUInt16]; newAudioPackerInstance->nextSequenceNumber = [CryptoTools generateSecureRandomUInt16];
// interop fix: // interop fix:
@ -30,13 +29,10 @@
if (framesToSend.count < AUDIO_FRAMES_PER_PACKET) return nil; if (framesToSend.count < AUDIO_FRAMES_PER_PACKET) return nil;
uint16_t sequenceNumber = nextSequenceNumber++; uint16_t sequenceNumber = nextSequenceNumber++;
uint32_t timeStamp = nextTimeStamp; NSData* payload = [framesToSend concatDatas];
NSData* payload = framesToSend.concatDatas;
nextTimeStamp += payload.length;
[framesToSend removeAllObjects]; [framesToSend removeAllObjects];
return [EncodedAudioPacket encodedAudioPacketWithAudioData:payload return [EncodedAudioPacket encodedAudioPacketWithAudioData:payload
andTimeStamp:timeStamp
andSequenceNumber:sequenceNumber]; andSequenceNumber:sequenceNumber];
} }

@ -18,22 +18,20 @@
PacketHandlerBlock valueHandler = ^(RtpPacket* rtpPacket) { PacketHandlerBlock valueHandler = ^(RtpPacket* rtpPacket) {
require(rtpPacket != nil); require(rtpPacket != nil);
require([rtpPacket isKindOfClass:RtpPacket.class]); require([rtpPacket isKindOfClass:[RtpPacket class]]);
[handler handlePacket:[EncodedAudioPacket encodedAudioPacketWithAudioData:rtpPacket.payload [handler handlePacket:[EncodedAudioPacket encodedAudioPacketWithAudioData:[rtpPacket payload]
andTimeStamp:rtpPacket.timeStamp andSequenceNumber:[rtpPacket sequenceNumber]]];
andSequenceNumber:rtpPacket.sequenceNumber]];
}; };
[srtpSocket startWithHandler:[PacketHandler packetHandler:valueHandler [srtpSocket startWithHandler:[PacketHandler packetHandler:valueHandler
withErrorHandler:handler.errorHandler] withErrorHandler:[handler errorHandler]]
untilCancelled:untilCancelledToken]; untilCancelled:untilCancelledToken];
} }
-(void) send:(EncodedAudioPacket*)audioPacket { -(void) send:(EncodedAudioPacket*)audioPacket {
require(audioPacket != nil); require(audioPacket != nil);
RtpPacket* rtpPacket = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:audioPacket.sequenceNumber RtpPacket* rtpPacket = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:[audioPacket sequenceNumber]
andTimeStamp:audioPacket.timeStamp andPayload:[audioPacket audioData]];
andPayload:audioPacket.audioData];
[srtpSocket secureAndSendRtpPacket:rtpPacket]; [srtpSocket secureAndSendRtpPacket:rtpPacket];
} }

@ -12,11 +12,8 @@
@interface EncodedAudioPacket : NSObject @interface EncodedAudioPacket : NSObject
@property (readonly,nonatomic) NSData* audioData; @property (readonly,nonatomic) NSData* audioData;
@property (readonly,nonatomic) uint32_t timeStamp;
@property (readonly,nonatomic) uint16_t sequenceNumber; @property (readonly,nonatomic) uint16_t sequenceNumber;
+(EncodedAudioPacket*) encodedAudioPacketWithAudioData:(NSData*)audioData +(EncodedAudioPacket*) encodedAudioPacketWithAudioData:(NSData*)audioData andSequenceNumber:(uint16_t)sequenceNumber;
andTimeStamp:(uint32_t)timeStamp
andSequenceNumber:(uint16_t)sequenceNumber;
@end @end

@ -5,13 +5,10 @@
@synthesize audioData, sequenceNumber; @synthesize audioData, sequenceNumber;
+(EncodedAudioPacket*) encodedAudioPacketWithAudioData:(NSData*)audioData +(EncodedAudioPacket*) encodedAudioPacketWithAudioData:(NSData*)audioData andSequenceNumber:(uint16_t)sequenceNumber {
andTimeStamp:(uint32_t)timeStamp
andSequenceNumber:(uint16_t)sequenceNumber {
require(audioData != nil); require(audioData != nil);
EncodedAudioPacket* p = [EncodedAudioPacket new]; EncodedAudioPacket* p = [EncodedAudioPacket new];
p->audioData = audioData; p->audioData = audioData;
p->_timeStamp = timeStamp; // Not sure why timeStamp gets a leading underscore but the others don't; probably a reserved name?
p->sequenceNumber = sequenceNumber; p->sequenceNumber = sequenceNumber;
return p; return p;
} }

@ -26,9 +26,7 @@
@property (nonatomic,readonly) uint32_t synchronizationSourceIdentifier; @property (nonatomic,readonly) uint32_t synchronizationSourceIdentifier;
@property (nonatomic,readonly) NSData* payload; @property (nonatomic,readonly) NSData* payload;
+(RtpPacket*) rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)sequenceNumber +(RtpPacket*) rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)sequenceNumber andPayload:(NSData*)payload;
andTimeStamp:(uint32_t)timeStamp
andPayload:(NSData *)payload;
+(RtpPacket*) rtpPacketWithVersion:(uint8_t)version +(RtpPacket*) rtpPacketWithVersion:(uint8_t)version
andPadding:(uint8_t)padding andPadding:(uint8_t)padding

@ -42,9 +42,7 @@ const uint8_t PACKET_VERSION = 2;
@synthesize version; @synthesize version;
@synthesize wasAdjustedDueToInteropIssues; @synthesize wasAdjustedDueToInteropIssues;
+(RtpPacket*) rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)sequenceNumber +(RtpPacket*) rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)sequenceNumber andPayload:(NSData *)payload {
andTimeStamp:(uint32_t)timeStamp
andPayload:(NSData *)payload {
require(payload != nil); require(payload != nil);
return [RtpPacket rtpPacketWithVersion:PACKET_VERSION return [RtpPacket rtpPacketWithVersion:PACKET_VERSION
andPadding:0 andPadding:0
@ -53,7 +51,7 @@ const uint8_t PACKET_VERSION = 2;
andMarkerBit:false andMarkerBit:false
andPayloadtype:0 andPayloadtype:0
andSequenceNumber:sequenceNumber andSequenceNumber:sequenceNumber
andTimeStamp:timeStamp andTimeStamp:0
andPayload:payload]; andPayload:payload];
} }
+(RtpPacket*) rtpPacketWithVersion:(uint8_t)version +(RtpPacket*) rtpPacketWithVersion:(uint8_t)version
@ -342,9 +340,7 @@ andSynchronizationSourceIdentifier:(uint32_t)synchronizedSourceIdentifier
return extensionHeaderData; return extensionHeaderData;
} }
-(NSData*) rawPacketDataUsingInteropOptions:(NSArray*)interopOptions { -(NSData*) rawPacketDataUsingInteropOptions:(NSArray*)interopOptions {
if (rawPacketData == nil) { if (rawPacketData == nil) rawPacketData = [self generateSerializedPacketDataUsingInteropOptions:interopOptions];
rawPacketData = [self generateSerializedPacketDataUsingInteropOptions:interopOptions];
}
return rawPacketData; return rawPacketData;
} }
-(bool) isEqualToRtpPacket:(RtpPacket*)other { -(bool) isEqualToRtpPacket:(RtpPacket*)other {

@ -10,14 +10,9 @@
-(void) testTrivial { -(void) testTrivial {
NSData* d2 = [NSMutableData dataWithLength:6]; NSData* d2 = [NSMutableData dataWithLength:6];
testThrows([EncodedAudioPacket encodedAudioPacketWithAudioData:nil testThrows([EncodedAudioPacket encodedAudioPacketWithAudioData:nil andSequenceNumber:0]);
andTimeStamp:0 EncodedAudioPacket* p2 = [EncodedAudioPacket encodedAudioPacketWithAudioData:d2 andSequenceNumber:0xFF00];
andSequenceNumber:0]); test([p2 audioData] == d2);
EncodedAudioPacket* p2 = [EncodedAudioPacket encodedAudioPacketWithAudioData:d2 test([p2 sequenceNumber] == 0xFF00);
andTimeStamp:0x23571113
andSequenceNumber:0xFF00];
test(p2.audioData == d2);
test(p2.timeStamp == 0x23571113);
test(p2.sequenceNumber == 0xFF00);
} }
@end @end

@ -15,8 +15,6 @@
#define testLoggedDiscard(q, sequenceNumber, oldReadHeadSequenceNumber, newReadHeadSequenceNumber) testLogged(q, ([NSString stringWithFormat:@"discard %d,%d,%d", sequenceNumber, oldReadHeadSequenceNumber, newReadHeadSequenceNumber])) #define testLoggedDiscard(q, sequenceNumber, oldReadHeadSequenceNumber, newReadHeadSequenceNumber) testLogged(q, ([NSString stringWithFormat:@"discard %d,%d,%d", sequenceNumber, oldReadHeadSequenceNumber, newReadHeadSequenceNumber]))
#define testLoggedResync(q, oldReadHeadSequenceNumber, newReadHeadSequenceNumber) testLogged(q, ([NSString stringWithFormat:@"resync %d to %d", oldReadHeadSequenceNumber,newReadHeadSequenceNumber])) #define testLoggedResync(q, oldReadHeadSequenceNumber, newReadHeadSequenceNumber) testLogged(q, ([NSString stringWithFormat:@"resync %d to %d", oldReadHeadSequenceNumber,newReadHeadSequenceNumber]))
#define TICK 320
@interface JitterQueueTest : XCTestCase @interface JitterQueueTest : XCTestCase
@end @end
@ -26,18 +24,14 @@
JitterQueue* r1 = [JitterQueue jitterQueue]; JitterQueue* r1 = [JitterQueue jitterQueue];
JitterQueue* r2 = [JitterQueue jitterQueue]; JitterQueue* r2 = [JitterQueue jitterQueue];
EncodedAudioPacket* q1 = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q1 = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:100];
andTimeStamp:100*TICK
andSequenceNumber:100];
test(r1.count == 0); test(r1.count == 0);
test([r1 tryEnqueue:q1]); test([r1 tryEnqueue:q1]);
test(r1.count == 1); test(r1.count == 1);
test([r1 tryDequeue] == q1); test([r1 tryDequeue] == q1);
test(r1.count == 0); test(r1.count == 0);
EncodedAudioPacket* q2 = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q2 = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:0xFF00];
andTimeStamp:0xFF00*TICK
andSequenceNumber:0xFF00];
test(r2.count == 0); test(r2.count == 0);
test([r2 tryEnqueue:q2]); test([r2 tryEnqueue:q2]);
test(r2.count == 1); test(r2.count == 1);
@ -48,9 +42,7 @@
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
for (uint16_t i = 0; i < 10; i++) { for (uint16_t i = 0; i < 10; i++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:i];
andTimeStamp:i*TICK
andSequenceNumber:i];
test([r tryEnqueue:q]); test([r tryEnqueue:q]);
test(r.count == i+1); test(r.count == i+1);
} }
@ -65,9 +57,7 @@
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
for (uint16_t i = 0; i < 10; i++) { for (uint16_t i = 0; i < 10; i++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:i*2+1];
andTimeStamp:(i*2+1)*TICK
andSequenceNumber:i*2+1];
test([r tryEnqueue:q]); test([r tryEnqueue:q]);
} }
@ -83,9 +73,7 @@
for (uint16_t i = 0; i < 20; i++) { for (uint16_t i = 0; i < 20; i++) {
for (uint16_t j = 0; j < 2; j++) { for (uint16_t j = 0; j < 2; j++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:i*2+j];
andTimeStamp:(i*2+j)*TICK
andSequenceNumber:i*2+j];
test([r tryEnqueue:q]); test([r tryEnqueue:q]);
} }
@ -96,15 +84,11 @@
-(void) testJitterQueueRejectsDuplicateSequenceNumbers { -(void) testJitterQueueRejectsDuplicateSequenceNumbers {
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:0];
andTimeStamp:0
andSequenceNumber:0];
test([r tryEnqueue:p]); test([r tryEnqueue:p]);
for (uint16_t i = 0; i < 10; i++) { for (uint16_t i = 0; i < 10; i++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:0];
andTimeStamp:0
andSequenceNumber:0];
test(![r tryEnqueue:q]); test(![r tryEnqueue:q]);
} }
@ -114,15 +98,11 @@
-(void) testJitterQueueRejectsOldSequenceNumbers { -(void) testJitterQueueRejectsOldSequenceNumbers {
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:50];
andTimeStamp:50*TICK
andSequenceNumber:50];
test([r tryEnqueue:p]); test([r tryEnqueue:p]);
for (uint16_t i = 1; i < 10; i++) { for (uint16_t i = 1; i < 10; i++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:50 - i];
andTimeStamp:(50-i)*TICK
andSequenceNumber:50 - i];
test(![r tryEnqueue:q]); test(![r tryEnqueue:q]);
} }
@ -132,15 +112,11 @@
-(void) testJitterQueueRejectsFarOffSequenceNumbers { -(void) testJitterQueueRejectsFarOffSequenceNumbers {
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:0];
andTimeStamp:0
andSequenceNumber:0];
test([r tryEnqueue:p]); test([r tryEnqueue:p]);
for (uint16_t i = 0; i < 10; i++) { for (uint16_t i = 0; i < 10; i++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:0x7000+i];
andTimeStamp:(0x7000+i)*TICK
andSequenceNumber:0x7000+i];
test(![r tryEnqueue:q]); test(![r tryEnqueue:q]);
} }
@ -150,15 +126,11 @@
-(void) testJitterQueueResyncsSequenceNumber { -(void) testJitterQueueResyncsSequenceNumber {
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* p = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:1];
andTimeStamp:1*TICK
andSequenceNumber:1];
test([r tryEnqueue:p]); test([r tryEnqueue:p]);
test([r tryDequeue] == p); test([r tryDequeue] == p);
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:0];
andTimeStamp:0
andSequenceNumber:0];
test(![r tryEnqueue:q]); test(![r tryEnqueue:q]);
// cause desync to be detected // cause desync to be detected
@ -170,25 +142,11 @@
test([r tryEnqueue:q]); test([r tryEnqueue:q]);
test([r tryDequeue] == q); test([r tryDequeue] == q);
} }
-(void) testLoopAround_sequenceNumber { -(void) testLoopAround {
JitterQueue* r = [JitterQueue jitterQueue];
for (uint32_t i = 0; i < 1 << 17; i++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1]
andTimeStamp:i*TICK
andSequenceNumber:(uint16_t)(i & 0xFFFF)];
test([r tryEnqueue:q]);
test([r tryDequeue] == q);
}
test([r tryDequeue] == nil);
}
-(void) testLoopAround_timeStamp {
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
for (uint32_t i = 0; i < 1 << 17; i++) { for (int i = 0; i < 1 << 17; i++) {
EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] EncodedAudioPacket* q = [EncodedAudioPacket encodedAudioPacketWithAudioData:[NSData dataWithLength:1] andSequenceNumber:(uint16_t)(i & 0xFFFF)];
andTimeStamp:i*TICK + 0xFFFF0000
andSequenceNumber:(uint16_t)(i & 0xFFFF)];
test([r tryEnqueue:q]); test([r tryEnqueue:q]);
test([r tryDequeue] == q); test([r tryDequeue] == q);
} }
@ -196,21 +154,15 @@
} }
-(void) testJitterQueueAvoidsRacingAhead { -(void) testJitterQueueAvoidsRacingAhead {
JitterQueue* r = [JitterQueue jitterQueue]; JitterQueue* r = [JitterQueue jitterQueue];
EncodedAudioPacket* p1 = [EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(1) EncodedAudioPacket* p1 = [EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(1) andSequenceNumber:0];
andTimeStamp:0 EncodedAudioPacket* p2 = [EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(1) andSequenceNumber:1];
andSequenceNumber:0];
EncodedAudioPacket* p2 = [EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(1)
andTimeStamp:1*TICK
andSequenceNumber:1];
test([r tryEnqueue:p1]); test([r tryEnqueue:p1]);
test([r tryDequeue] == p1); test([r tryDequeue] == p1);
test([r tryDequeue] == nil); test([r tryDequeue] == nil);
test([r tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(1) test([r tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(1) andSequenceNumber:10]]);
andTimeStamp:10*TICK
andSequenceNumber:10]]);
test([r tryDequeue] == nil); test([r tryDequeue] == nil);
test([r tryEnqueue:p2]); test([r tryEnqueue:p2]);
@ -221,38 +173,28 @@
-(void) testJitterQueueMeasurement { -(void) testJitterQueueMeasurement {
JitterQueue* q = [JitterQueue jitterQueue]; JitterQueue* q = [JitterQueue jitterQueue];
[q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) [q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) andSequenceNumber:1]];
andTimeStamp:1*TICK test([q currentBufferDepth] == 0);
andSequenceNumber:1]]; [q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) andSequenceNumber:2]];
test(q.currentBufferDepth == 0); test([q currentBufferDepth] == 1);
[q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) [q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) andSequenceNumber:4]];
andTimeStamp:2*TICK test([q currentBufferDepth] == 3);
andSequenceNumber:2]];
test(q.currentBufferDepth == 1);
[q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20)
andTimeStamp:4*TICK
andSequenceNumber:4]];
test(q.currentBufferDepth == 3);
[q tryDequeue]; [q tryDequeue];
test(q.currentBufferDepth == 2); test([q currentBufferDepth] == 2);
[q tryDequeue]; [q tryDequeue];
test(q.currentBufferDepth == 1); test([q currentBufferDepth] == 1);
[q tryDequeue]; [q tryDequeue];
test(q.currentBufferDepth == 0); test([q currentBufferDepth] == 0);
[q tryDequeue]; [q tryDequeue];
test(q.currentBufferDepth == -1); test([q currentBufferDepth] == -1);
[q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) [q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) andSequenceNumber:8]];
andTimeStamp:8*TICK test([q currentBufferDepth] == 3);
andSequenceNumber:8]];
test(q.currentBufferDepth == 3);
// resyncs to 0 // resyncs to 0
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
[q tryDequeue]; [q tryDequeue];
} }
[q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) [q tryEnqueue:[EncodedAudioPacket encodedAudioPacketWithAudioData:increasingData(20) andSequenceNumber:9000]];
andTimeStamp:9000*TICK test([q currentBufferDepth] == 0);
andSequenceNumber:9000]];
test(q.currentBufferDepth == 0);
} }
@end @end

@ -20,7 +20,7 @@
andMarkerBit:false andMarkerBit:false
andPayloadtype:0 andPayloadtype:0
andSequenceNumber:5 andSequenceNumber:5
andTimeStamp:0x23571113 andTimeStamp:0
andPayload:increasingData(5)]; andPayload:increasingData(5)];
// values were retained // values were retained
@ -32,27 +32,23 @@
test(r.isMarkerBitSet == false); test(r.isMarkerBitSet == false);
test([r payloadType] == 0); test([r payloadType] == 0);
test([r sequenceNumber] == 5); test([r sequenceNumber] == 5);
test([r timeStamp] == 0x23571113); test([r timeStamp] == 0);
test([[r payload] isEqualToData:increasingData(5)]); test([[r payload] isEqualToData:increasingData(5)]);
// equivalent to simplified constructor // equivalent to simplified constructor
test([r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:5 test([r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:5 andPayload:increasingData(5)]]);
andTimeStamp:0x23571113
andPayload:increasingData(5)]]);
// packed correctly // packed correctly
NSData* expectedData = [@[ NSData* expectedData = [@[
@0x80,@0,@0,@5, @0x80,@0,@0,@5,
@0x23,@0x57,@0x11,@0x13, @0,@0,@0,@0,
@0,@0,@0,@0, @0,@0,@0,@0,
@0,@1,@2,@3,@4] toUint8Data]; @0,@1,@2,@3,@4] toUint8Data];
test([[r rawPacketDataUsingInteropOptions:@[]] isEqualToData:expectedData]); test([[r rawPacketDataUsingInteropOptions:@[]] isEqualToData:expectedData]);
// reparsing packed data gives same packet // reparsing packed data gives same packet
test([r isEqualToRtpPacket:[RtpPacket rtpPacketParsedFromPacketData:expectedData]]); test([r isEqualToRtpPacket:[RtpPacket rtpPacketParsedFromPacketData:expectedData]]);
test(![r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 test(![r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 andPayload:[NSData data]]]);
andTimeStamp:0
andPayload:[NSData data]]]);
} }
-(void) testRawData { -(void) testRawData {
RtpPacket* r = [RtpPacket rtpPacketWithVersion:2 RtpPacket* r = [RtpPacket rtpPacketWithVersion:2
@ -88,9 +84,7 @@
test([[r rawPacketDataUsingInteropOptions:@[]] isEqualToData:expectedData]); test([[r rawPacketDataUsingInteropOptions:@[]] isEqualToData:expectedData]);
test([r isEqualToRtpPacket:[RtpPacket rtpPacketParsedFromPacketData:expectedData]]); test([r isEqualToRtpPacket:[RtpPacket rtpPacketParsedFromPacketData:expectedData]]);
test(![r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:90 test(![r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:90 andPayload:[NSData data]]]);
andTimeStamp:0
andPayload:[NSData data]]]);
} }
-(void) testExtendedData { -(void) testExtendedData {
RtpPacket* r = [RtpPacket rtpPacketWithVersion:2 RtpPacket* r = [RtpPacket rtpPacketWithVersion:2
@ -129,9 +123,7 @@
@0,@1,@2,@3,@4] toUint8Data]; @0,@1,@2,@3,@4] toUint8Data];
test([[r rawPacketDataUsingInteropOptions:@[]] isEqualToData:expectedData]); test([[r rawPacketDataUsingInteropOptions:@[]] isEqualToData:expectedData]);
test([r isEqualToRtpPacket:[RtpPacket rtpPacketParsedFromPacketData:expectedData]]); test([r isEqualToRtpPacket:[RtpPacket rtpPacketParsedFromPacketData:expectedData]]);
test(![r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 test(![r isEqualToRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 andPayload:[NSData data]]]);
andTimeStamp:0
andPayload:[NSData data]]]);
} }
@end @end

@ -21,9 +21,7 @@
SrtpStream* ss = [SrtpStream srtpStreamWithCipherKey:key andMacKey:macKey andCipherIvSalt:salt]; SrtpStream* ss = [SrtpStream srtpStreamWithCipherKey:key andMacKey:macKey andCipherIvSalt:salt];
for (uint64_t sequenceNumber = 0; sequenceNumber < 0x70000; sequenceNumber += 0x7000) { for (uint64_t sequenceNumber = 0; sequenceNumber < 0x70000; sequenceNumber += 0x7000) {
RtpPacket* r = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)(sequenceNumber & 0xFFFF) RtpPacket* r = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)(sequenceNumber & 0xFFFF) andPayload:generatePseudoRandomData(12)];
andTimeStamp:(uint32_t)(sequenceNumber * 320)
andPayload:generatePseudoRandomData(12)];
RtpPacket* s = [ss encryptAndAuthenticateNormalRtpPacket:r]; RtpPacket* s = [ss encryptAndAuthenticateNormalRtpPacket:r];
RtpPacket* r2 = [ss verifyAuthenticationAndDecryptSecuredRtpPacket:s]; RtpPacket* r2 = [ss verifyAuthenticationAndDecryptSecuredRtpPacket:s];
test(![r isEqualToRtpPacket:s]); test(![r isEqualToRtpPacket:s]);
@ -38,20 +36,12 @@
SrtpStream* ss = [SrtpStream srtpStreamWithCipherKey:key andMacKey:macKey andCipherIvSalt:salt]; SrtpStream* ss = [SrtpStream srtpStreamWithCipherKey:key andMacKey:macKey andCipherIvSalt:salt];
// fuzzing // fuzzing
testThrows([ss verifyAuthenticationAndDecryptSecuredRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 testThrows([ss verifyAuthenticationAndDecryptSecuredRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 andPayload:generatePseudoRandomData(0)]]);
andTimeStamp:0 testThrows([ss verifyAuthenticationAndDecryptSecuredRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 andPayload:generatePseudoRandomData(12)]]);
andPayload:generatePseudoRandomData(0)]]); testThrows([ss verifyAuthenticationAndDecryptSecuredRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0 andPayload:generatePseudoRandomData(100)]]);
testThrows([ss verifyAuthenticationAndDecryptSecuredRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0
andTimeStamp:0
andPayload:generatePseudoRandomData(12)]]);
testThrows([ss verifyAuthenticationAndDecryptSecuredRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:0
andTimeStamp:0
andPayload:generatePseudoRandomData(100)]]);
// authenticated then bit flip // authenticated then bit flip
RtpPacket* r = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:5 RtpPacket* r = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:5 andPayload:generatePseudoRandomData(40)];
andTimeStamp:320*5
andPayload:generatePseudoRandomData(40)];
RtpPacket* s = [ss encryptAndAuthenticateNormalRtpPacket:r]; RtpPacket* s = [ss encryptAndAuthenticateNormalRtpPacket:r];
NSMutableData* m = [[s payload] mutableCopy]; NSMutableData* m = [[s payload] mutableCopy];
[m setUint8At:0 to:[m uint8At:0]^1]; [m setUint8At:0 to:[m uint8At:0]^1];
@ -67,15 +57,11 @@
SrtpStream* s2 = [SrtpStream srtpStreamWithCipherKey:key andMacKey:macKey andCipherIvSalt:salt]; SrtpStream* s2 = [SrtpStream srtpStreamWithCipherKey:key andMacKey:macKey andCipherIvSalt:salt];
for (NSUInteger i = 0; i < 0x20000; i+= 0x100) { for (NSUInteger i = 0; i < 0x20000; i+= 0x100) {
RtpPacket* m = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)(i & 0xFFFF) RtpPacket* m = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:(uint16_t)(i & 0xFFFF) andPayload:generatePseudoRandomData(40)];
andTimeStamp:(uint32_t)(i*320 + 5)
andPayload:generatePseudoRandomData(40)];
testThrows([s1 verifyAuthenticationAndDecryptSecuredRtpPacket:m]); testThrows([s1 verifyAuthenticationAndDecryptSecuredRtpPacket:m]);
} }
RtpPacket* r = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:5 RtpPacket* r = [RtpPacket rtpPacketWithDefaultsAndSequenceNumber:5 andPayload:generatePseudoRandomData(40)];
andTimeStamp:5*320 + 5
andPayload:generatePseudoRandomData(40)];
RtpPacket* s = [s2 encryptAndAuthenticateNormalRtpPacket:r]; RtpPacket* s = [s2 encryptAndAuthenticateNormalRtpPacket:r];
RtpPacket* r2 = [s1 verifyAuthenticationAndDecryptSecuredRtpPacket:s]; RtpPacket* r2 = [s1 verifyAuthenticationAndDecryptSecuredRtpPacket:s];
test([r isEqualToRtpPacket:r2]); test([r isEqualToRtpPacket:r2]);

@ -88,11 +88,10 @@ bool pm(HandshakePacket* p1, HandshakePacket* p2) {
[socket startWithHandler:[PacketHandler packetHandler:^(id packet) { test(false); } [socket startWithHandler:[PacketHandler packetHandler:^(id packet) { test(false); }
withErrorHandler:^(id error, id relatedInfo, bool causedTermination) { test(!causedTermination); }] withErrorHandler:^(id error, id relatedInfo, bool causedTermination) { test(!causedTermination); }]
untilCancelled:[cc1 untilCancelledToken]]; untilCancelled:[cc1 untilCancelledToken]];
[socket secureAndSendRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:1 [socket secureAndSendRtpPacket:[RtpPacket rtpPacketWithDefaultsAndSequenceNumber:1 andPayload:[NSData data]]];
andTimeStamp:320
andPayload:[NSData data]]];
} }
testChurnUntil(!f1.isIncomplete, 5.0); testChurnUntil(!f1.isIncomplete, 5.0);
test(f1.hasResult); test(f1.hasResult);

Loading…
Cancel
Save