// Generated by the protocol buffer compiler.  DO NOT EDIT!

#import "ProtocolBuffers.h"

#import "Commontalk.pb.h"
// @@protoc_insertion_point(imports)

@class AudioPayload;
@class AudioPayloadBuilder;
@class ClockSync;
@class ClockSyncBuilder;
@class ClockSyncEcho;
@class ClockSyncEchoBuilder;
@class Error;
@class ErrorBuilder;
@class Hello;
@class HelloBuilder;
@class LatencyMeasure;
@class LatencyMeasureBuilder;
@class Ok;
@class OkBuilder;
@class Ping;
@class PingBuilder;
@class PingCamera;
@class PingCameraBuilder;
@class PlaybackBegin;
@class PlaybackBeginBuilder;
@class PlaybackBeginStream;
@class PlaybackBeginStreamBuilder;
@class PlaybackEnd;
@class PlaybackEndBuilder;
@class PlaybackPacket;
@class PlaybackPacketBuilder;
@class Redirect;
@class RedirectBuilder;
@class StartPlayback;
@class StartPlaybackBuilder;
@class StopPlayback;
@class StopPlaybackBuilder;
#ifndef __has_feature
  #define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif // __has_feature

#ifndef NS_RETURNS_NOT_RETAINED
  #if __has_feature(attribute_ns_returns_not_retained)
    #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
  #else
    #define NS_RETURNS_NOT_RETAINED
  #endif
#endif

typedef enum {
  PacketTypePacketTypePing = 1,
  PacketTypePacketTypeHello = 100,
  PacketTypePacketTypePingCamera = 101,
  PacketTypePacketTypeAudioPayload = 102,
  PacketTypePacketTypeStartPlayback = 103,
  PacketTypePacketTypeStopPlayback = 104,
  PacketTypePacketTypeClockSyncEcho = 105,
  PacketTypePacketTypeLatencyMeasure = 106,
  PacketTypePacketTypeOk = 200,
  PacketTypePacketTypeError = 201,
  PacketTypePacketTypePlaybackBegin = 202,
  PacketTypePacketTypePlaybackEnd = 203,
  PacketTypePacketTypePlaybackPacket = 204,
  PacketTypePacketTypeLongPlaybackPacket = 205,
  PacketTypePacketTypeClockSync = 206,
  PacketTypePacketTypeRedirect = 207,
} PacketType;

BOOL PacketTypeIsValidValue(PacketType value);

typedef enum {
  ErrorCodeErrorCameraNotConnected = 1,
  ErrorCodeErrorIllegalPacket = 2,
  ErrorCodeErrorAuthorizationFailed = 3,
  ErrorCodeErrorNoTranscoderAvailable = 4,
} ErrorCode;

BOOL ErrorCodeIsValidValue(ErrorCode value);

typedef enum {
  CodecTypeSpeex = 0,
  CodecTypePcmS16Le = 1,
  CodecTypeH264 = 2,
  CodecTypeAac = 3,
  CodecTypeOpus = 4,
} CodecType;

BOOL CodecTypeIsValidValue(CodecType value);

typedef enum {
  HelloProtocolVersionVersion1 = 1,
  HelloProtocolVersionVersion2 = 2,
  HelloProtocolVersionVersion3 = 3,
} HelloProtocolVersion;

BOOL HelloProtocolVersionIsValidValue(HelloProtocolVersion value);

typedef enum {
  StartPlaybackProfileNotFoundActionRedirect = 0,
  StartPlaybackProfileNotFoundActionUseNextAvailable = 1,
} StartPlaybackProfileNotFoundAction;

BOOL StartPlaybackProfileNotFoundActionIsValidValue(StartPlaybackProfileNotFoundAction value);

typedef enum {
  PlaybackEndReasonErrorTimeNotAvailable = 1,
  PlaybackEndReasonErrorProfileNotAvailable = 2,
  PlaybackEndReasonErrorTranscodeNotAvailable = 3,
  PlaybackEndReasonPlayEndSessionComplete = 128,
} PlaybackEndReason;

BOOL PlaybackEndReasonIsValidValue(PlaybackEndReason value);


@interface NexustalkRoot : NSObject {
}
+ (PBExtensionRegistry*) extensionRegistry;
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry;
@end

@interface Ping : PBGeneratedMessage {
@private
}

+ (Ping*) defaultInstance;
- (Ping*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (PingBuilder*) builder;
+ (PingBuilder*) builder;
+ (PingBuilder*) builderWithPrototype:(Ping*) prototype;
- (PingBuilder*) toBuilder;

+ (Ping*) parseFromData:(NSData*) data;
+ (Ping*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Ping*) parseFromInputStream:(NSInputStream*) input;
+ (Ping*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Ping*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (Ping*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface PingBuilder : PBGeneratedMessageBuilder {
@private
  Ping* result;
}

- (Ping*) defaultInstance;

- (PingBuilder*) clear;
- (PingBuilder*) clone;

- (Ping*) build;
- (Ping*) buildPartial;

- (PingBuilder*) mergeFrom:(Ping*) other;
- (PingBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (PingBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface Hello : PBGeneratedMessage {
@private
  BOOL hasRequireConnectedCamera_:1;
  BOOL hasIsCamera_:1;
  BOOL hasUuid_:1;
  BOOL hasSessionToken_:1;
  BOOL hasDeviceId_:1;
  BOOL hasUserAgent_:1;
  BOOL hasProtocolVersion_:1;
  BOOL requireConnectedCamera_:1;
  BOOL isCamera_:1;
  NSString* uuid;
  NSString* sessionToken;
  NSString* deviceId;
  NSString* userAgent;
  HelloProtocolVersion protocolVersion;
}
- (BOOL) hasProtocolVersion;
- (BOOL) hasUuid;
- (BOOL) hasRequireConnectedCamera;
- (BOOL) hasSessionToken;
- (BOOL) hasIsCamera;
- (BOOL) hasDeviceId;
- (BOOL) hasUserAgent;
@property (readonly) HelloProtocolVersion protocolVersion;
@property (readonly, strong) NSString* uuid;
- (BOOL) requireConnectedCamera;
@property (readonly, strong) NSString* sessionToken;
- (BOOL) isCamera;
@property (readonly, strong) NSString* deviceId;
@property (readonly, strong) NSString* userAgent;

+ (Hello*) defaultInstance;
- (Hello*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (HelloBuilder*) builder;
+ (HelloBuilder*) builder;
+ (HelloBuilder*) builderWithPrototype:(Hello*) prototype;
- (HelloBuilder*) toBuilder;

+ (Hello*) parseFromData:(NSData*) data;
+ (Hello*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Hello*) parseFromInputStream:(NSInputStream*) input;
+ (Hello*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Hello*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (Hello*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface HelloBuilder : PBGeneratedMessageBuilder {
@private
  Hello* result;
}

- (Hello*) defaultInstance;

- (HelloBuilder*) clear;
- (HelloBuilder*) clone;

- (Hello*) build;
- (Hello*) buildPartial;

- (HelloBuilder*) mergeFrom:(Hello*) other;
- (HelloBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (HelloBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasProtocolVersion;
- (HelloProtocolVersion) protocolVersion;
- (HelloBuilder*) setProtocolVersion:(HelloProtocolVersion) value;
- (HelloBuilder*) clearProtocolVersion;

- (BOOL) hasUuid;
- (NSString*) uuid;
- (HelloBuilder*) setUuid:(NSString*) value;
- (HelloBuilder*) clearUuid;

- (BOOL) hasRequireConnectedCamera;
- (BOOL) requireConnectedCamera;
- (HelloBuilder*) setRequireConnectedCamera:(BOOL) value;
- (HelloBuilder*) clearRequireConnectedCamera;

- (BOOL) hasSessionToken;
- (NSString*) sessionToken;
- (HelloBuilder*) setSessionToken:(NSString*) value;
- (HelloBuilder*) clearSessionToken;

- (BOOL) hasIsCamera;
- (BOOL) isCamera;
- (HelloBuilder*) setIsCamera:(BOOL) value;
- (HelloBuilder*) clearIsCamera;

- (BOOL) hasDeviceId;
- (NSString*) deviceId;
- (HelloBuilder*) setDeviceId:(NSString*) value;
- (HelloBuilder*) clearDeviceId;

- (BOOL) hasUserAgent;
- (NSString*) userAgent;
- (HelloBuilder*) setUserAgent:(NSString*) value;
- (HelloBuilder*) clearUserAgent;
@end

@interface Ok : PBGeneratedMessage {
@private
  BOOL hasUdpPort_:1;
  UInt32 udpPort;
}
- (BOOL) hasUdpPort;
@property (readonly) UInt32 udpPort;

+ (Ok*) defaultInstance;
- (Ok*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OkBuilder*) builder;
+ (OkBuilder*) builder;
+ (OkBuilder*) builderWithPrototype:(Ok*) prototype;
- (OkBuilder*) toBuilder;

+ (Ok*) parseFromData:(NSData*) data;
+ (Ok*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Ok*) parseFromInputStream:(NSInputStream*) input;
+ (Ok*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Ok*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (Ok*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface OkBuilder : PBGeneratedMessageBuilder {
@private
  Ok* result;
}

- (Ok*) defaultInstance;

- (OkBuilder*) clear;
- (OkBuilder*) clone;

- (Ok*) build;
- (Ok*) buildPartial;

- (OkBuilder*) mergeFrom:(Ok*) other;
- (OkBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OkBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasUdpPort;
- (UInt32) udpPort;
- (OkBuilder*) setUdpPort:(UInt32) value;
- (OkBuilder*) clearUdpPort;
@end

@interface Error : PBGeneratedMessage {
@private
  BOOL hasMessage_:1;
  BOOL hasCode_:1;
  NSString* message;
  ErrorCode code;
}
- (BOOL) hasCode;
- (BOOL) hasMessage;
@property (readonly) ErrorCode code;
@property (readonly, strong) NSString* message;

+ (Error*) defaultInstance;
- (Error*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (ErrorBuilder*) builder;
+ (ErrorBuilder*) builder;
+ (ErrorBuilder*) builderWithPrototype:(Error*) prototype;
- (ErrorBuilder*) toBuilder;

+ (Error*) parseFromData:(NSData*) data;
+ (Error*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Error*) parseFromInputStream:(NSInputStream*) input;
+ (Error*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Error*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (Error*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface ErrorBuilder : PBGeneratedMessageBuilder {
@private
  Error* result;
}

- (Error*) defaultInstance;

- (ErrorBuilder*) clear;
- (ErrorBuilder*) clone;

- (Error*) build;
- (Error*) buildPartial;

- (ErrorBuilder*) mergeFrom:(Error*) other;
- (ErrorBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ErrorBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasCode;
- (ErrorCode) code;
- (ErrorBuilder*) setCode:(ErrorCode) value;
- (ErrorBuilder*) clearCode;

- (BOOL) hasMessage;
- (NSString*) message;
- (ErrorBuilder*) setMessage:(NSString*) value;
- (ErrorBuilder*) clearMessage;
@end

@interface PingCamera : PBGeneratedMessage {
@private
}

+ (PingCamera*) defaultInstance;
- (PingCamera*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (PingCameraBuilder*) builder;
+ (PingCameraBuilder*) builder;
+ (PingCameraBuilder*) builderWithPrototype:(PingCamera*) prototype;
- (PingCameraBuilder*) toBuilder;

+ (PingCamera*) parseFromData:(NSData*) data;
+ (PingCamera*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PingCamera*) parseFromInputStream:(NSInputStream*) input;
+ (PingCamera*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PingCamera*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (PingCamera*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface PingCameraBuilder : PBGeneratedMessageBuilder {
@private
  PingCamera* result;
}

- (PingCamera*) defaultInstance;

- (PingCameraBuilder*) clear;
- (PingCameraBuilder*) clone;

- (PingCamera*) build;
- (PingCamera*) buildPartial;

- (PingCameraBuilder*) mergeFrom:(PingCamera*) other;
- (PingCameraBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (PingCameraBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface AudioPayload : PBGeneratedMessage {
@private
  BOOL hasPayload_:1;
  BOOL hasSessionId_:1;
  BOOL hasSampleRate_:1;
  BOOL hasCodec_:1;
  NSData* payload;
  UInt32 sessionId;
  UInt32 sampleRate;
  CodecType codec;
}
- (BOOL) hasPayload;
- (BOOL) hasSessionId;
- (BOOL) hasCodec;
- (BOOL) hasSampleRate;
@property (readonly, strong) NSData* payload;
@property (readonly) UInt32 sessionId;
@property (readonly) CodecType codec;
@property (readonly) UInt32 sampleRate;

+ (AudioPayload*) defaultInstance;
- (AudioPayload*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (AudioPayloadBuilder*) builder;
+ (AudioPayloadBuilder*) builder;
+ (AudioPayloadBuilder*) builderWithPrototype:(AudioPayload*) prototype;
- (AudioPayloadBuilder*) toBuilder;

+ (AudioPayload*) parseFromData:(NSData*) data;
+ (AudioPayload*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (AudioPayload*) parseFromInputStream:(NSInputStream*) input;
+ (AudioPayload*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (AudioPayload*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (AudioPayload*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface AudioPayloadBuilder : PBGeneratedMessageBuilder {
@private
  AudioPayload* result;
}

- (AudioPayload*) defaultInstance;

- (AudioPayloadBuilder*) clear;
- (AudioPayloadBuilder*) clone;

- (AudioPayload*) build;
- (AudioPayload*) buildPartial;

- (AudioPayloadBuilder*) mergeFrom:(AudioPayload*) other;
- (AudioPayloadBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (AudioPayloadBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasPayload;
- (NSData*) payload;
- (AudioPayloadBuilder*) setPayload:(NSData*) value;
- (AudioPayloadBuilder*) clearPayload;

- (BOOL) hasSessionId;
- (UInt32) sessionId;
- (AudioPayloadBuilder*) setSessionId:(UInt32) value;
- (AudioPayloadBuilder*) clearSessionId;

- (BOOL) hasCodec;
- (CodecType) codec;
- (AudioPayloadBuilder*) setCodec:(CodecType) value;
- (AudioPayloadBuilder*) clearCodec;

- (BOOL) hasSampleRate;
- (UInt32) sampleRate;
- (AudioPayloadBuilder*) setSampleRate:(UInt32) value;
- (AudioPayloadBuilder*) clearSampleRate;
@end

@interface StartPlayback : PBGeneratedMessage {
@private
  BOOL hasStartTime_:1;
  BOOL hasExternalIp_:1;
  BOOL hasSessionId_:1;
  BOOL hasExternalPort_:1;
  BOOL hasProfile_:1;
  BOOL hasProfileNotFoundAction_:1;
  Float64 startTime;
  NSData* externalIp;
  UInt32 sessionId;
  UInt32 externalPort;
  CT_AVProfile profile;
  StartPlaybackProfileNotFoundAction profileNotFoundAction;
  PBAppendableArray * otherProfilesArray;
}
- (BOOL) hasSessionId;
- (BOOL) hasProfile;
- (BOOL) hasStartTime;
- (BOOL) hasExternalIp;
- (BOOL) hasExternalPort;
- (BOOL) hasProfileNotFoundAction;
@property (readonly) UInt32 sessionId;
@property (readonly) CT_AVProfile profile;
@property (readonly) Float64 startTime;
@property (readonly, strong) NSData* externalIp;
@property (readonly) UInt32 externalPort;
@property (readonly, strong) PBArray * otherProfiles;
@property (readonly) StartPlaybackProfileNotFoundAction profileNotFoundAction;
- (CT_AVProfile)otherProfilesAtIndex:(NSUInteger)index;

+ (StartPlayback*) defaultInstance;
- (StartPlayback*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (StartPlaybackBuilder*) builder;
+ (StartPlaybackBuilder*) builder;
+ (StartPlaybackBuilder*) builderWithPrototype:(StartPlayback*) prototype;
- (StartPlaybackBuilder*) toBuilder;

+ (StartPlayback*) parseFromData:(NSData*) data;
+ (StartPlayback*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (StartPlayback*) parseFromInputStream:(NSInputStream*) input;
+ (StartPlayback*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (StartPlayback*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (StartPlayback*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface StartPlaybackBuilder : PBGeneratedMessageBuilder {
@private
  StartPlayback* result;
}

- (StartPlayback*) defaultInstance;

- (StartPlaybackBuilder*) clear;
- (StartPlaybackBuilder*) clone;

- (StartPlayback*) build;
- (StartPlayback*) buildPartial;

- (StartPlaybackBuilder*) mergeFrom:(StartPlayback*) other;
- (StartPlaybackBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (StartPlaybackBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasSessionId;
- (UInt32) sessionId;
- (StartPlaybackBuilder*) setSessionId:(UInt32) value;
- (StartPlaybackBuilder*) clearSessionId;

- (BOOL) hasProfile;
- (CT_AVProfile) profile;
- (StartPlaybackBuilder*) setProfile:(CT_AVProfile) value;
- (StartPlaybackBuilder*) clearProfile;

- (BOOL) hasStartTime;
- (Float64) startTime;
- (StartPlaybackBuilder*) setStartTime:(Float64) value;
- (StartPlaybackBuilder*) clearStartTime;

- (BOOL) hasExternalIp;
- (NSData*) externalIp;
- (StartPlaybackBuilder*) setExternalIp:(NSData*) value;
- (StartPlaybackBuilder*) clearExternalIp;

- (BOOL) hasExternalPort;
- (UInt32) externalPort;
- (StartPlaybackBuilder*) setExternalPort:(UInt32) value;
- (StartPlaybackBuilder*) clearExternalPort;

- (PBAppendableArray *)otherProfiles;
- (CT_AVProfile)otherProfilesAtIndex:(NSUInteger)index;
- (StartPlaybackBuilder *)addOtherProfiles:(CT_AVProfile)value;
- (StartPlaybackBuilder *)setOtherProfilesArray:(NSArray *)array;
- (StartPlaybackBuilder *)setOtherProfilesValues:(const CT_AVProfile *)values count:(NSUInteger)count;
- (StartPlaybackBuilder *)clearOtherProfiles;

- (BOOL) hasProfileNotFoundAction;
- (StartPlaybackProfileNotFoundAction) profileNotFoundAction;
- (StartPlaybackBuilder*) setProfileNotFoundAction:(StartPlaybackProfileNotFoundAction) value;
- (StartPlaybackBuilder*) clearProfileNotFoundAction;
@end

@interface StopPlayback : PBGeneratedMessage {
@private
  BOOL hasSessionId_:1;
  UInt32 sessionId;
}
- (BOOL) hasSessionId;
@property (readonly) UInt32 sessionId;

+ (StopPlayback*) defaultInstance;
- (StopPlayback*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (StopPlaybackBuilder*) builder;
+ (StopPlaybackBuilder*) builder;
+ (StopPlaybackBuilder*) builderWithPrototype:(StopPlayback*) prototype;
- (StopPlaybackBuilder*) toBuilder;

+ (StopPlayback*) parseFromData:(NSData*) data;
+ (StopPlayback*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (StopPlayback*) parseFromInputStream:(NSInputStream*) input;
+ (StopPlayback*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (StopPlayback*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (StopPlayback*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface StopPlaybackBuilder : PBGeneratedMessageBuilder {
@private
  StopPlayback* result;
}

- (StopPlayback*) defaultInstance;

- (StopPlaybackBuilder*) clear;
- (StopPlaybackBuilder*) clone;

- (StopPlayback*) build;
- (StopPlayback*) buildPartial;

- (StopPlaybackBuilder*) mergeFrom:(StopPlayback*) other;
- (StopPlaybackBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (StopPlaybackBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasSessionId;
- (UInt32) sessionId;
- (StopPlaybackBuilder*) setSessionId:(UInt32) value;
- (StopPlaybackBuilder*) clearSessionId;
@end

@interface PlaybackBegin : PBGeneratedMessage {
@private
  BOOL hasSrtpMasterKey_:1;
  BOOL hasSrtpMasterSalt_:1;
  BOOL hasSessionId_:1;
  BOOL hasFecKVal_:1;
  BOOL hasFecNVal_:1;
  NSData* srtpMasterKey;
  NSData* srtpMasterSalt;
  UInt32 sessionId;
  UInt32 fecKVal;
  UInt32 fecNVal;
  NSMutableArray * channelsArray;
}
- (BOOL) hasSessionId;
- (BOOL) hasSrtpMasterKey;
- (BOOL) hasSrtpMasterSalt;
- (BOOL) hasFecKVal;
- (BOOL) hasFecNVal;
@property (readonly) UInt32 sessionId;
@property (readonly, strong) NSArray * channels;
@property (readonly, strong) NSData* srtpMasterKey;
@property (readonly, strong) NSData* srtpMasterSalt;
@property (readonly) UInt32 fecKVal;
@property (readonly) UInt32 fecNVal;
- (PlaybackBeginStream*)channelsAtIndex:(NSUInteger)index;

+ (PlaybackBegin*) defaultInstance;
- (PlaybackBegin*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (PlaybackBeginBuilder*) builder;
+ (PlaybackBeginBuilder*) builder;
+ (PlaybackBeginBuilder*) builderWithPrototype:(PlaybackBegin*) prototype;
- (PlaybackBeginBuilder*) toBuilder;

+ (PlaybackBegin*) parseFromData:(NSData*) data;
+ (PlaybackBegin*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackBegin*) parseFromInputStream:(NSInputStream*) input;
+ (PlaybackBegin*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackBegin*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (PlaybackBegin*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface PlaybackBeginStream : PBGeneratedMessage {
@private
  BOOL hasStartTime_:1;
  BOOL hasChannelId_:1;
  BOOL hasSampleRate_:1;
  BOOL hasUdpSsrc_:1;
  BOOL hasRtpStartTime_:1;
  BOOL hasCodecType_:1;
  BOOL hasProfile_:1;
  Float64 startTime;
  UInt32 channelId;
  UInt32 sampleRate;
  UInt32 udpSsrc;
  UInt32 rtpStartTime;
  CodecType codecType;
  CT_AVProfile profile;
  NSMutableArray * privateDataArray;
}
- (BOOL) hasChannelId;
- (BOOL) hasCodecType;
- (BOOL) hasSampleRate;
- (BOOL) hasStartTime;
- (BOOL) hasUdpSsrc;
- (BOOL) hasRtpStartTime;
- (BOOL) hasProfile;
@property (readonly) UInt32 channelId;
@property (readonly) CodecType codecType;
@property (readonly) UInt32 sampleRate;
@property (readonly, strong) PBArray * privateData;
@property (readonly) Float64 startTime;
@property (readonly) UInt32 udpSsrc;
@property (readonly) UInt32 rtpStartTime;
@property (readonly) CT_AVProfile profile;
- (NSData*)privateDataAtIndex:(NSUInteger)index;

+ (PlaybackBeginStream*) defaultInstance;
- (PlaybackBeginStream*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (PlaybackBeginStreamBuilder*) builder;
+ (PlaybackBeginStreamBuilder*) builder;
+ (PlaybackBeginStreamBuilder*) builderWithPrototype:(PlaybackBeginStream*) prototype;
- (PlaybackBeginStreamBuilder*) toBuilder;

+ (PlaybackBeginStream*) parseFromData:(NSData*) data;
+ (PlaybackBeginStream*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackBeginStream*) parseFromInputStream:(NSInputStream*) input;
+ (PlaybackBeginStream*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackBeginStream*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (PlaybackBeginStream*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface PlaybackBeginStreamBuilder : PBGeneratedMessageBuilder {
@private
  PlaybackBeginStream* result;
}

- (PlaybackBeginStream*) defaultInstance;

- (PlaybackBeginStreamBuilder*) clear;
- (PlaybackBeginStreamBuilder*) clone;

- (PlaybackBeginStream*) build;
- (PlaybackBeginStream*) buildPartial;

- (PlaybackBeginStreamBuilder*) mergeFrom:(PlaybackBeginStream*) other;
- (PlaybackBeginStreamBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (PlaybackBeginStreamBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasChannelId;
- (UInt32) channelId;
- (PlaybackBeginStreamBuilder*) setChannelId:(UInt32) value;
- (PlaybackBeginStreamBuilder*) clearChannelId;

- (BOOL) hasCodecType;
- (CodecType) codecType;
- (PlaybackBeginStreamBuilder*) setCodecType:(CodecType) value;
- (PlaybackBeginStreamBuilder*) clearCodecType;

- (BOOL) hasSampleRate;
- (UInt32) sampleRate;
- (PlaybackBeginStreamBuilder*) setSampleRate:(UInt32) value;
- (PlaybackBeginStreamBuilder*) clearSampleRate;

- (NSMutableArray *)privateData;
- (NSData*)privateDataAtIndex:(NSUInteger)index;
- (PlaybackBeginStreamBuilder *)addPrivateData:(NSData*)value;
- (PlaybackBeginStreamBuilder *)setPrivateDataArray:(NSArray *)array;
- (PlaybackBeginStreamBuilder *)clearPrivateData;

- (BOOL) hasStartTime;
- (Float64) startTime;
- (PlaybackBeginStreamBuilder*) setStartTime:(Float64) value;
- (PlaybackBeginStreamBuilder*) clearStartTime;

- (BOOL) hasUdpSsrc;
- (UInt32) udpSsrc;
- (PlaybackBeginStreamBuilder*) setUdpSsrc:(UInt32) value;
- (PlaybackBeginStreamBuilder*) clearUdpSsrc;

- (BOOL) hasRtpStartTime;
- (UInt32) rtpStartTime;
- (PlaybackBeginStreamBuilder*) setRtpStartTime:(UInt32) value;
- (PlaybackBeginStreamBuilder*) clearRtpStartTime;

- (BOOL) hasProfile;
- (CT_AVProfile) profile;
- (PlaybackBeginStreamBuilder*) setProfile:(CT_AVProfile) value;
- (PlaybackBeginStreamBuilder*) clearProfile;
@end

@interface PlaybackBeginBuilder : PBGeneratedMessageBuilder {
@private
  PlaybackBegin* result;
}

- (PlaybackBegin*) defaultInstance;

- (PlaybackBeginBuilder*) clear;
- (PlaybackBeginBuilder*) clone;

- (PlaybackBegin*) build;
- (PlaybackBegin*) buildPartial;

- (PlaybackBeginBuilder*) mergeFrom:(PlaybackBegin*) other;
- (PlaybackBeginBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (PlaybackBeginBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasSessionId;
- (UInt32) sessionId;
- (PlaybackBeginBuilder*) setSessionId:(UInt32) value;
- (PlaybackBeginBuilder*) clearSessionId;

- (NSMutableArray *)channels;
- (PlaybackBeginStream*)channelsAtIndex:(NSUInteger)index;
- (PlaybackBeginBuilder *)addChannels:(PlaybackBeginStream*)value;
- (PlaybackBeginBuilder *)setChannelsArray:(NSArray *)array;
- (PlaybackBeginBuilder *)clearChannels;

- (BOOL) hasSrtpMasterKey;
- (NSData*) srtpMasterKey;
- (PlaybackBeginBuilder*) setSrtpMasterKey:(NSData*) value;
- (PlaybackBeginBuilder*) clearSrtpMasterKey;

- (BOOL) hasSrtpMasterSalt;
- (NSData*) srtpMasterSalt;
- (PlaybackBeginBuilder*) setSrtpMasterSalt:(NSData*) value;
- (PlaybackBeginBuilder*) clearSrtpMasterSalt;

- (BOOL) hasFecKVal;
- (UInt32) fecKVal;
- (PlaybackBeginBuilder*) setFecKVal:(UInt32) value;
- (PlaybackBeginBuilder*) clearFecKVal;

- (BOOL) hasFecNVal;
- (UInt32) fecNVal;
- (PlaybackBeginBuilder*) setFecNVal:(UInt32) value;
- (PlaybackBeginBuilder*) clearFecNVal;
@end

@interface PlaybackEnd : PBGeneratedMessage {
@private
  BOOL hasSessionId_:1;
  BOOL hasReason_:1;
  UInt32 sessionId;
  PlaybackEndReason reason;
}
- (BOOL) hasSessionId;
- (BOOL) hasReason;
@property (readonly) UInt32 sessionId;
@property (readonly) PlaybackEndReason reason;

+ (PlaybackEnd*) defaultInstance;
- (PlaybackEnd*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (PlaybackEndBuilder*) builder;
+ (PlaybackEndBuilder*) builder;
+ (PlaybackEndBuilder*) builderWithPrototype:(PlaybackEnd*) prototype;
- (PlaybackEndBuilder*) toBuilder;

+ (PlaybackEnd*) parseFromData:(NSData*) data;
+ (PlaybackEnd*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackEnd*) parseFromInputStream:(NSInputStream*) input;
+ (PlaybackEnd*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackEnd*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (PlaybackEnd*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface PlaybackEndBuilder : PBGeneratedMessageBuilder {
@private
  PlaybackEnd* result;
}

- (PlaybackEnd*) defaultInstance;

- (PlaybackEndBuilder*) clear;
- (PlaybackEndBuilder*) clone;

- (PlaybackEnd*) build;
- (PlaybackEnd*) buildPartial;

- (PlaybackEndBuilder*) mergeFrom:(PlaybackEnd*) other;
- (PlaybackEndBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (PlaybackEndBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasSessionId;
- (UInt32) sessionId;
- (PlaybackEndBuilder*) setSessionId:(UInt32) value;
- (PlaybackEndBuilder*) clearSessionId;

- (BOOL) hasReason;
- (PlaybackEndReason) reason;
- (PlaybackEndBuilder*) setReason:(PlaybackEndReason) value;
- (PlaybackEndBuilder*) clearReason;
@end

@interface PlaybackPacket : PBGeneratedMessage {
@private
  BOOL hasPayload_:1;
  BOOL hasSessionId_:1;
  BOOL hasChannelId_:1;
  BOOL hasLatencyRtpSequence_:1;
  BOOL hasLatencyRtpSsrc_:1;
  BOOL hasTimestampDelta_:1;
  NSData* payload;
  UInt32 sessionId;
  UInt32 channelId;
  UInt32 latencyRtpSequence;
  UInt32 latencyRtpSsrc;
  SInt32 timestampDelta;
}
- (BOOL) hasSessionId;
- (BOOL) hasChannelId;
- (BOOL) hasTimestampDelta;
- (BOOL) hasPayload;
- (BOOL) hasLatencyRtpSequence;
- (BOOL) hasLatencyRtpSsrc;
@property (readonly) UInt32 sessionId;
@property (readonly) UInt32 channelId;
@property (readonly) SInt32 timestampDelta;
@property (readonly, strong) NSData* payload;
@property (readonly) UInt32 latencyRtpSequence;
@property (readonly) UInt32 latencyRtpSsrc;

+ (PlaybackPacket*) defaultInstance;
- (PlaybackPacket*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (PlaybackPacketBuilder*) builder;
+ (PlaybackPacketBuilder*) builder;
+ (PlaybackPacketBuilder*) builderWithPrototype:(PlaybackPacket*) prototype;
- (PlaybackPacketBuilder*) toBuilder;

+ (PlaybackPacket*) parseFromData:(NSData*) data;
+ (PlaybackPacket*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackPacket*) parseFromInputStream:(NSInputStream*) input;
+ (PlaybackPacket*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (PlaybackPacket*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (PlaybackPacket*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface PlaybackPacketBuilder : PBGeneratedMessageBuilder {
@private
  PlaybackPacket* result;
}

- (PlaybackPacket*) defaultInstance;

- (PlaybackPacketBuilder*) clear;
- (PlaybackPacketBuilder*) clone;

- (PlaybackPacket*) build;
- (PlaybackPacket*) buildPartial;

- (PlaybackPacketBuilder*) mergeFrom:(PlaybackPacket*) other;
- (PlaybackPacketBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (PlaybackPacketBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasSessionId;
- (UInt32) sessionId;
- (PlaybackPacketBuilder*) setSessionId:(UInt32) value;
- (PlaybackPacketBuilder*) clearSessionId;

- (BOOL) hasChannelId;
- (UInt32) channelId;
- (PlaybackPacketBuilder*) setChannelId:(UInt32) value;
- (PlaybackPacketBuilder*) clearChannelId;

- (BOOL) hasTimestampDelta;
- (SInt32) timestampDelta;
- (PlaybackPacketBuilder*) setTimestampDelta:(SInt32) value;
- (PlaybackPacketBuilder*) clearTimestampDelta;

- (BOOL) hasPayload;
- (NSData*) payload;
- (PlaybackPacketBuilder*) setPayload:(NSData*) value;
- (PlaybackPacketBuilder*) clearPayload;

- (BOOL) hasLatencyRtpSequence;
- (UInt32) latencyRtpSequence;
- (PlaybackPacketBuilder*) setLatencyRtpSequence:(UInt32) value;
- (PlaybackPacketBuilder*) clearLatencyRtpSequence;

- (BOOL) hasLatencyRtpSsrc;
- (UInt32) latencyRtpSsrc;
- (PlaybackPacketBuilder*) setLatencyRtpSsrc:(UInt32) value;
- (PlaybackPacketBuilder*) clearLatencyRtpSsrc;
@end

@interface ClockSync : PBGeneratedMessage {
@private
  BOOL hasServerSystemTimeSec_:1;
  BOOL hasServerSystemTimeMsec_:1;
  UInt32 serverSystemTimeSec;
  UInt32 serverSystemTimeMsec;
}
- (BOOL) hasServerSystemTimeSec;
- (BOOL) hasServerSystemTimeMsec;
@property (readonly) UInt32 serverSystemTimeSec;
@property (readonly) UInt32 serverSystemTimeMsec;

+ (ClockSync*) defaultInstance;
- (ClockSync*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (ClockSyncBuilder*) builder;
+ (ClockSyncBuilder*) builder;
+ (ClockSyncBuilder*) builderWithPrototype:(ClockSync*) prototype;
- (ClockSyncBuilder*) toBuilder;

+ (ClockSync*) parseFromData:(NSData*) data;
+ (ClockSync*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (ClockSync*) parseFromInputStream:(NSInputStream*) input;
+ (ClockSync*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (ClockSync*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (ClockSync*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface ClockSyncBuilder : PBGeneratedMessageBuilder {
@private
  ClockSync* result;
}

- (ClockSync*) defaultInstance;

- (ClockSyncBuilder*) clear;
- (ClockSyncBuilder*) clone;

- (ClockSync*) build;
- (ClockSync*) buildPartial;

- (ClockSyncBuilder*) mergeFrom:(ClockSync*) other;
- (ClockSyncBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ClockSyncBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasServerSystemTimeSec;
- (UInt32) serverSystemTimeSec;
- (ClockSyncBuilder*) setServerSystemTimeSec:(UInt32) value;
- (ClockSyncBuilder*) clearServerSystemTimeSec;

- (BOOL) hasServerSystemTimeMsec;
- (UInt32) serverSystemTimeMsec;
- (ClockSyncBuilder*) setServerSystemTimeMsec:(UInt32) value;
- (ClockSyncBuilder*) clearServerSystemTimeMsec;
@end

@interface ClockSyncEcho : PBGeneratedMessage {
@private
  BOOL hasServerSystemTimeEchoSec_:1;
  BOOL hasServerSystemTimeEchoMsec_:1;
  BOOL hasClientSystemTimeSec_:1;
  BOOL hasClientSystemTimeMsec_:1;
  UInt32 serverSystemTimeEchoSec;
  UInt32 serverSystemTimeEchoMsec;
  UInt32 clientSystemTimeSec;
  UInt32 clientSystemTimeMsec;
}
- (BOOL) hasServerSystemTimeEchoSec;
- (BOOL) hasServerSystemTimeEchoMsec;
- (BOOL) hasClientSystemTimeSec;
- (BOOL) hasClientSystemTimeMsec;
@property (readonly) UInt32 serverSystemTimeEchoSec;
@property (readonly) UInt32 serverSystemTimeEchoMsec;
@property (readonly) UInt32 clientSystemTimeSec;
@property (readonly) UInt32 clientSystemTimeMsec;

+ (ClockSyncEcho*) defaultInstance;
- (ClockSyncEcho*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (ClockSyncEchoBuilder*) builder;
+ (ClockSyncEchoBuilder*) builder;
+ (ClockSyncEchoBuilder*) builderWithPrototype:(ClockSyncEcho*) prototype;
- (ClockSyncEchoBuilder*) toBuilder;

+ (ClockSyncEcho*) parseFromData:(NSData*) data;
+ (ClockSyncEcho*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (ClockSyncEcho*) parseFromInputStream:(NSInputStream*) input;
+ (ClockSyncEcho*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (ClockSyncEcho*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (ClockSyncEcho*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface ClockSyncEchoBuilder : PBGeneratedMessageBuilder {
@private
  ClockSyncEcho* result;
}

- (ClockSyncEcho*) defaultInstance;

- (ClockSyncEchoBuilder*) clear;
- (ClockSyncEchoBuilder*) clone;

- (ClockSyncEcho*) build;
- (ClockSyncEcho*) buildPartial;

- (ClockSyncEchoBuilder*) mergeFrom:(ClockSyncEcho*) other;
- (ClockSyncEchoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ClockSyncEchoBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasServerSystemTimeEchoSec;
- (UInt32) serverSystemTimeEchoSec;
- (ClockSyncEchoBuilder*) setServerSystemTimeEchoSec:(UInt32) value;
- (ClockSyncEchoBuilder*) clearServerSystemTimeEchoSec;

- (BOOL) hasServerSystemTimeEchoMsec;
- (UInt32) serverSystemTimeEchoMsec;
- (ClockSyncEchoBuilder*) setServerSystemTimeEchoMsec:(UInt32) value;
- (ClockSyncEchoBuilder*) clearServerSystemTimeEchoMsec;

- (BOOL) hasClientSystemTimeSec;
- (UInt32) clientSystemTimeSec;
- (ClockSyncEchoBuilder*) setClientSystemTimeSec:(UInt32) value;
- (ClockSyncEchoBuilder*) clearClientSystemTimeSec;

- (BOOL) hasClientSystemTimeMsec;
- (UInt32) clientSystemTimeMsec;
- (ClockSyncEchoBuilder*) setClientSystemTimeMsec:(UInt32) value;
- (ClockSyncEchoBuilder*) clearClientSystemTimeMsec;
@end

@interface LatencyMeasure : PBGeneratedMessage {
@private
  BOOL hasEarliestTime_:1;
  BOOL hasLatestTime_:1;
  BOOL hasLatencyRtpSequence_:1;
  BOOL hasLatencyRtpSsrc_:1;
  UInt64 earliestTime;
  UInt64 latestTime;
  UInt32 latencyRtpSequence;
  UInt32 latencyRtpSsrc;
}
- (BOOL) hasEarliestTime;
- (BOOL) hasLatestTime;
- (BOOL) hasLatencyRtpSequence;
- (BOOL) hasLatencyRtpSsrc;
@property (readonly) UInt64 earliestTime;
@property (readonly) UInt64 latestTime;
@property (readonly) UInt32 latencyRtpSequence;
@property (readonly) UInt32 latencyRtpSsrc;

+ (LatencyMeasure*) defaultInstance;
- (LatencyMeasure*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (LatencyMeasureBuilder*) builder;
+ (LatencyMeasureBuilder*) builder;
+ (LatencyMeasureBuilder*) builderWithPrototype:(LatencyMeasure*) prototype;
- (LatencyMeasureBuilder*) toBuilder;

+ (LatencyMeasure*) parseFromData:(NSData*) data;
+ (LatencyMeasure*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (LatencyMeasure*) parseFromInputStream:(NSInputStream*) input;
+ (LatencyMeasure*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (LatencyMeasure*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (LatencyMeasure*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface LatencyMeasureBuilder : PBGeneratedMessageBuilder {
@private
  LatencyMeasure* result;
}

- (LatencyMeasure*) defaultInstance;

- (LatencyMeasureBuilder*) clear;
- (LatencyMeasureBuilder*) clone;

- (LatencyMeasure*) build;
- (LatencyMeasure*) buildPartial;

- (LatencyMeasureBuilder*) mergeFrom:(LatencyMeasure*) other;
- (LatencyMeasureBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (LatencyMeasureBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasEarliestTime;
- (UInt64) earliestTime;
- (LatencyMeasureBuilder*) setEarliestTime:(UInt64) value;
- (LatencyMeasureBuilder*) clearEarliestTime;

- (BOOL) hasLatestTime;
- (UInt64) latestTime;
- (LatencyMeasureBuilder*) setLatestTime:(UInt64) value;
- (LatencyMeasureBuilder*) clearLatestTime;

- (BOOL) hasLatencyRtpSequence;
- (UInt32) latencyRtpSequence;
- (LatencyMeasureBuilder*) setLatencyRtpSequence:(UInt32) value;
- (LatencyMeasureBuilder*) clearLatencyRtpSequence;

- (BOOL) hasLatencyRtpSsrc;
- (UInt32) latencyRtpSsrc;
- (LatencyMeasureBuilder*) setLatencyRtpSsrc:(UInt32) value;
- (LatencyMeasureBuilder*) clearLatencyRtpSsrc;
@end

@interface Redirect : PBGeneratedMessage {
@private
  BOOL hasNewHost_:1;
  NSString* newHost;
}
- (BOOL) hasNewHost;
@property (readonly, strong) NS_RETURNS_NOT_RETAINED NSString* newHost;

+ (Redirect*) defaultInstance;
- (Redirect*) defaultInstance;

- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (RedirectBuilder*) builder;
+ (RedirectBuilder*) builder;
+ (RedirectBuilder*) builderWithPrototype:(Redirect*) prototype;
- (RedirectBuilder*) toBuilder;

+ (Redirect*) parseFromData:(NSData*) data;
+ (Redirect*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Redirect*) parseFromInputStream:(NSInputStream*) input;
+ (Redirect*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (Redirect*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (Redirect*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end

@interface RedirectBuilder : PBGeneratedMessageBuilder {
@private
  Redirect* result;
}

- (Redirect*) defaultInstance;

- (RedirectBuilder*) clear;
- (RedirectBuilder*) clone;

- (Redirect*) build;
- (Redirect*) buildPartial;

- (RedirectBuilder*) mergeFrom:(Redirect*) other;
- (RedirectBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (RedirectBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasNewHost;
- (NSString*) newHost NS_RETURNS_NOT_RETAINED;
- (RedirectBuilder*) setNewHost:(NSString*) value;
- (RedirectBuilder*) clearNewHost;
@end


// @@protoc_insertion_point(global_scope)
