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

#import "ProtocolBuffers.h"

// @@protoc_insertion_point(imports)

@class ScrubbytalkMessage;
@class ScrubbytalkMessageBuilder;
@class VideoFrameV2;
@class VideoFrameV2Builder;
@class VideoFrameV3;
@class VideoFrameV3Builder;
#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 {
  ScrubbytalkMessageMsgTypeVideoFrame = 1,
} ScrubbytalkMessageMsgType;

BOOL ScrubbytalkMessageMsgTypeIsValidValue(ScrubbytalkMessageMsgType value);


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

@interface ScrubbytalkMessage : PBGeneratedMessage {
@private
  BOOL hasVideoFrameV2_:1;
  BOOL hasVideoFrameV3_:1;
  BOOL hasMsgType_:1;
  VideoFrameV2* videoFrameV2;
  VideoFrameV3* videoFrameV3;
  ScrubbytalkMessageMsgType msgType;
}
- (BOOL) hasMsgType;
- (BOOL) hasVideoFrameV2;
- (BOOL) hasVideoFrameV3;
@property (readonly) ScrubbytalkMessageMsgType msgType;
@property (readonly, strong) VideoFrameV2* videoFrameV2;
@property (readonly, strong) VideoFrameV3* videoFrameV3;

+ (ScrubbytalkMessage*) defaultInstance;
- (ScrubbytalkMessage*) defaultInstance;

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

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

@interface ScrubbytalkMessageBuilder : PBGeneratedMessageBuilder {
@private
  ScrubbytalkMessage* result;
}

- (ScrubbytalkMessage*) defaultInstance;

- (ScrubbytalkMessageBuilder*) clear;
- (ScrubbytalkMessageBuilder*) clone;

- (ScrubbytalkMessage*) build;
- (ScrubbytalkMessage*) buildPartial;

- (ScrubbytalkMessageBuilder*) mergeFrom:(ScrubbytalkMessage*) other;
- (ScrubbytalkMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (ScrubbytalkMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (BOOL) hasMsgType;
- (ScrubbytalkMessageMsgType) msgType;
- (ScrubbytalkMessageBuilder*) setMsgType:(ScrubbytalkMessageMsgType) value;
- (ScrubbytalkMessageBuilder*) clearMsgType;

- (BOOL) hasVideoFrameV2;
- (VideoFrameV2*) videoFrameV2;
- (ScrubbytalkMessageBuilder*) setVideoFrameV2:(VideoFrameV2*) value;
- (ScrubbytalkMessageBuilder*) setVideoFrameV2Builder:(VideoFrameV2Builder*) builderForValue;
- (ScrubbytalkMessageBuilder*) mergeVideoFrameV2:(VideoFrameV2*) value;
- (ScrubbytalkMessageBuilder*) clearVideoFrameV2;

- (BOOL) hasVideoFrameV3;
- (VideoFrameV3*) videoFrameV3;
- (ScrubbytalkMessageBuilder*) setVideoFrameV3:(VideoFrameV3*) value;
- (ScrubbytalkMessageBuilder*) setVideoFrameV3Builder:(VideoFrameV3Builder*) builderForValue;
- (ScrubbytalkMessageBuilder*) mergeVideoFrameV3:(VideoFrameV3*) value;
- (ScrubbytalkMessageBuilder*) clearVideoFrameV3;
@end

@interface VideoFrameV2 : PBGeneratedMessage {
@private
  BOOL hasIsCacheable_:1;
  BOOL hasIsLastChunkFrame_:1;
  BOOL hasTimestamp_:1;
  BOOL hasChunkNum_:1;
  BOOL isCacheable_:1;
  BOOL isLastChunkFrame_:1;
  Float64 timestamp;
  SInt64 chunkNum;
  NSMutableArray * nalsArray;
}
- (BOOL) hasTimestamp;
- (BOOL) hasChunkNum;
- (BOOL) hasIsCacheable;
- (BOOL) hasIsLastChunkFrame;
@property (readonly, strong) PBArray * nals;
@property (readonly) Float64 timestamp;
@property (readonly) SInt64 chunkNum;
- (BOOL) isCacheable;
- (BOOL) isLastChunkFrame;
- (NSData*)nalsAtIndex:(NSUInteger)index;

+ (VideoFrameV2*) defaultInstance;
- (VideoFrameV2*) defaultInstance;

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

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

@interface VideoFrameV2Builder : PBGeneratedMessageBuilder {
@private
  VideoFrameV2* result;
}

- (VideoFrameV2*) defaultInstance;

- (VideoFrameV2Builder*) clear;
- (VideoFrameV2Builder*) clone;

- (VideoFrameV2*) build;
- (VideoFrameV2*) buildPartial;

- (VideoFrameV2Builder*) mergeFrom:(VideoFrameV2*) other;
- (VideoFrameV2Builder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (VideoFrameV2Builder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (NSMutableArray *)nals;
- (NSData*)nalsAtIndex:(NSUInteger)index;
- (VideoFrameV2Builder *)addNals:(NSData*)value;
- (VideoFrameV2Builder *)setNalsArray:(NSArray *)array;
- (VideoFrameV2Builder *)clearNals;

- (BOOL) hasTimestamp;
- (Float64) timestamp;
- (VideoFrameV2Builder*) setTimestamp:(Float64) value;
- (VideoFrameV2Builder*) clearTimestamp;

- (BOOL) hasChunkNum;
- (SInt64) chunkNum;
- (VideoFrameV2Builder*) setChunkNum:(SInt64) value;
- (VideoFrameV2Builder*) clearChunkNum;

- (BOOL) hasIsCacheable;
- (BOOL) isCacheable;
- (VideoFrameV2Builder*) setIsCacheable:(BOOL) value;
- (VideoFrameV2Builder*) clearIsCacheable;

- (BOOL) hasIsLastChunkFrame;
- (BOOL) isLastChunkFrame;
- (VideoFrameV2Builder*) setIsLastChunkFrame:(BOOL) value;
- (VideoFrameV2Builder*) clearIsLastChunkFrame;
@end

@interface VideoFrameV3 : PBGeneratedMessage {
@private
  BOOL hasTimestamp_:1;
  BOOL hasChunkStartTime_:1;
  BOOL hasCacheToken_:1;
  Float64 timestamp;
  Float64 chunkStartTime;
  NSString* cacheToken;
  NSMutableArray * nalsArray;
}
- (BOOL) hasTimestamp;
- (BOOL) hasCacheToken;
- (BOOL) hasChunkStartTime;
@property (readonly, strong) PBArray * nals;
@property (readonly) Float64 timestamp;
@property (readonly, strong) NSString* cacheToken;
@property (readonly) Float64 chunkStartTime;
- (NSData*)nalsAtIndex:(NSUInteger)index;

+ (VideoFrameV3*) defaultInstance;
- (VideoFrameV3*) defaultInstance;

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

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

@interface VideoFrameV3Builder : PBGeneratedMessageBuilder {
@private
  VideoFrameV3* result;
}

- (VideoFrameV3*) defaultInstance;

- (VideoFrameV3Builder*) clear;
- (VideoFrameV3Builder*) clone;

- (VideoFrameV3*) build;
- (VideoFrameV3*) buildPartial;

- (VideoFrameV3Builder*) mergeFrom:(VideoFrameV3*) other;
- (VideoFrameV3Builder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (VideoFrameV3Builder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;

- (NSMutableArray *)nals;
- (NSData*)nalsAtIndex:(NSUInteger)index;
- (VideoFrameV3Builder *)addNals:(NSData*)value;
- (VideoFrameV3Builder *)setNalsArray:(NSArray *)array;
- (VideoFrameV3Builder *)clearNals;

- (BOOL) hasTimestamp;
- (Float64) timestamp;
- (VideoFrameV3Builder*) setTimestamp:(Float64) value;
- (VideoFrameV3Builder*) clearTimestamp;

- (BOOL) hasCacheToken;
- (NSString*) cacheToken;
- (VideoFrameV3Builder*) setCacheToken:(NSString*) value;
- (VideoFrameV3Builder*) clearCacheToken;

- (BOOL) hasChunkStartTime;
- (Float64) chunkStartTime;
- (VideoFrameV3Builder*) setChunkStartTime:(Float64) value;
- (VideoFrameV3Builder*) clearChunkStartTime;
@end


// @@protoc_insertion_point(global_scope)
