diff --git a/Limelight-iOS/Limelight-iOS-Info.plist b/Limelight-iOS/Limelight-iOS-Info.plist index 7ddb6dd..c798ed1 100644 --- a/Limelight-iOS/Limelight-iOS-Info.plist +++ b/Limelight-iOS/Limelight-iOS-Info.plist @@ -36,15 +36,11 @@ UISupportedInterfaceOrientations - UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight diff --git a/Limelight-iOS/MainFrameViewController.m b/Limelight-iOS/MainFrameViewController.m index 985a392..f6fee16 100644 --- a/Limelight-iOS/MainFrameViewController.m +++ b/Limelight-iOS/MainFrameViewController.m @@ -23,6 +23,7 @@ - (void)StreamButton:(UIButton *)sender { NSLog(@"Stream Button Pressed!"); + [self performSegueWithIdentifier:@"createStreamFrame" sender:self]; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component diff --git a/Limelight-iOS/StreamFrameViewController.h b/Limelight-iOS/StreamFrameViewController.h index 5ca7fb1..982a790 100644 --- a/Limelight-iOS/StreamFrameViewController.h +++ b/Limelight-iOS/StreamFrameViewController.h @@ -10,6 +10,5 @@ #import "StreamView.h" @interface StreamFrameViewController : UIViewController -@property (strong, nonatomic) IBOutlet StreamView *renderView; @end diff --git a/Limelight-iOS/StreamFrameViewController.m b/Limelight-iOS/StreamFrameViewController.m index 86bd593..4ddcd80 100644 --- a/Limelight-iOS/StreamFrameViewController.m +++ b/Limelight-iOS/StreamFrameViewController.m @@ -18,15 +18,21 @@ - (void)viewDidLoad { [super viewDidLoad]; - [self.renderView setNeedsDisplay]; + StreamView* streamView = [[StreamView alloc] initWithFrame:self.view.frame]; + streamView.backgroundColor = [UIColor blackColor]; + [self.view addSubview:streamView]; + + [streamView setNeedsDisplay]; + // Do any additional setup after loading the view. - VideoDepacketizer* depacketizer = [[VideoDepacketizer alloc] init]; - NSString* path = [[NSBundle mainBundle] pathForResource:@"notpadded" ofType:@"h264"]; NSLog(@"Path: %@", path); - [depacketizer readFile:path]; + VideoDepacketizer* depacketizer = [[VideoDepacketizer alloc] initWithFile:path renderTarget:streamView]; + NSOperationQueue* opQueue = [[NSOperationQueue alloc] init]; + [opQueue addOperation:depacketizer]; + } diff --git a/Limelight-iOS/StreamView.m b/Limelight-iOS/StreamView.m index 631df91..c764a22 100644 --- a/Limelight-iOS/StreamView.m +++ b/Limelight-iOS/StreamView.m @@ -18,19 +18,16 @@ CGColorSpaceRef colorSpace; CGContextRef bitmapContext; CGImageRef image; - UIImage *uiImage; unsigned char* pixelData; } +static bool firstFrame = true; --(id)init -{ - NSLog(@"init"); - return [super init]; -} -- (void)awakeFromNib + +- (id)initWithFrame:(CGRect)frame { - NSLog(@"awakeFromNib"); + self = [super initWithFrame:frame]; + NSLog(@"initWithFrame"); // Initialization code width = 1280; height = 720; @@ -38,21 +35,18 @@ bytesPerRow = (bitsPerComponent / 8) * width * 4; pixelData = malloc(width * height * 4); colorSpace = CGColorSpaceCreateDeviceRGB(); - bitmapContext = CGBitmapContextCreate(NULL, 1280, 720, 8, 5120, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipLast); - image = CGBitmapContextCreateImage(bitmapContext); - uiImage = [UIImage imageWithCGImage:image]; - //VideoRenderer* renderer = [[VideoRenderer alloc]initWithTarget:self]; - //NSOperationQueue* opQueue = [[NSOperationQueue alloc]init]; - //[opQueue addOperation:renderer]; - [self setNeedsDisplay]; + //bitmapContext = CGBitmapContextCreate(pixelData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGBitmapByteOrderDefault); + //image = CGBitmapContextCreateImage(bitmapContext); + + return self; } + // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { - NSLog(@"drawRect"); if (!nv_avc_get_rgb_frame(pixelData, width*height*4)) @@ -60,10 +54,31 @@ return; } + if (firstFrame) { + + NSData *data = [[NSData alloc] initWithBytes:pixelData length:(width*height*4)]; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"MyFile"]; + [data writeToFile:appFile atomically:YES]; + NSLog(@"writing data to: %@",documentsDirectory); + + firstFrame = false; + } + + bitmapContext = CGBitmapContextCreate(pixelData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast); + image = CGBitmapContextCreateImage(bitmapContext); + + struct CGContext* context = UIGraphicsGetCurrentContext(); - CGContextDrawImage(context, CGRectMake(0, 0, 1280, 720), image); - + CGContextTranslateCTM(context, 0, rect.size.width); + CGContextScaleCTM(context, (float)width / self.frame.size.width, (float)height / -self.frame.size.height); + + CGContextDrawImage(context, rect, image); + + CGImageRelease(image); + [super drawRect:rect]; } diff --git a/Limelight-iOS/Video/VideoDepacketizer.h b/Limelight-iOS/Video/VideoDepacketizer.h index 451e3b3..954a24a 100644 --- a/Limelight-iOS/Video/VideoDepacketizer.h +++ b/Limelight-iOS/Video/VideoDepacketizer.h @@ -9,11 +9,13 @@ #import #import "VideoDecoder.h" -@interface VideoDepacketizer : NSObject +@interface VideoDepacketizer : NSOperation @property uint8_t* byteBuffer; @property unsigned int offset; @property VideoDecoder* decoder; +@property NSString* file; +@property UIView* target; -- (void) readFile:(NSString*) file; +- (id) initWithFile:(NSString*) file renderTarget:(UIView*)renderTarget; @end diff --git a/Limelight-iOS/Video/VideoDepacketizer.m b/Limelight-iOS/Video/VideoDepacketizer.m index eadd7e7..2b6dfc7 100644 --- a/Limelight-iOS/Video/VideoDepacketizer.m +++ b/Limelight-iOS/Video/VideoDepacketizer.m @@ -11,10 +11,18 @@ @implementation VideoDepacketizer static int BUFFER_LENGTH = 131072; -- (void) readFile:(NSString*) file +- (id)initWithFile:(NSString *)file renderTarget:(UIView*)renderTarget +{ + self = [super init]; + self.file = file; + self.target = renderTarget; + return self; +} + +- (void)main { NSLog(@"Allocating input stream\n"); - NSInputStream* inStream = [[NSInputStream alloc] initWithFileAtPath:file]; + NSInputStream* inStream = [[NSInputStream alloc] initWithFileAtPath:self.file]; NSLog(@"Allocating byteBuffer"); self.byteBuffer = malloc(BUFFER_LENGTH); NSLog(@"byte pointer: %p", self.byteBuffer); @@ -39,21 +47,20 @@ static int BUFFER_LENGTH = 131072; len = [(NSInputStream *)inStream read:self.byteBuffer maxLength:BUFFER_LENGTH]; if (len) { - NSLog(@"len: %u\n", len); BOOL firstStart = false; for (int i = 0; i < len - 4; i++) { self.offset++; if (self.byteBuffer[i] == 0 && self.byteBuffer[i+1] == 0 && self.byteBuffer[i+2] == 0 && self.byteBuffer[i+3] == 1) { - NSLog(@"i: %d", i); - if (firstStart) { // decode the first i-1 bytes - [self.decoder decode:self.byteBuffer length:i-1]; + [self.decoder decode:self.byteBuffer length:i]; + [self renderFrame]; [inStream setProperty:[[NSNumber alloc] initWithInt:self.offset-4] forKey:NSStreamFileCurrentOffsetKey]; - self.offset -= 4; + self.offset -= 1; + break; } else { @@ -67,6 +74,12 @@ static int BUFFER_LENGTH = 131072; NSLog(@"No Buffer!"); } } + +} + +- (void) renderFrame +{ + [self.target performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:NULL waitUntilDone:FALSE]; } @end diff --git a/Limelight-iOS/VideoDecoder.m b/Limelight-iOS/VideoDecoder.m index 594785c..8c82a1f 100644 --- a/Limelight-iOS/VideoDecoder.m +++ b/Limelight-iOS/VideoDecoder.m @@ -21,8 +21,6 @@ } }*/ int decStat = nv_avc_decode(buffer, length); - NSLog(@"Decode Status: %d", decStat); - } - (id) init @@ -125,23 +123,7 @@ int nv_avc_init(int width, int height, int perf_lvl, int thread_count) { decoder_ctx->height = height; decoder_ctx->pix_fmt = PIX_FMT_YUV420P; - // Little-endian makes the AV_PIX_FMT constants look wierd - if (perf_lvl & NATIVE_COLOR_RGB0) { - render_pix_fmt = AV_PIX_FMT_0BGR; - } - else if (perf_lvl & NATIVE_COLOR_0RGB) { - render_pix_fmt = AV_PIX_FMT_BGR0; - } - else if (perf_lvl & NATIVE_COLOR_RGBA) { - render_pix_fmt = AV_PIX_FMT_ABGR; - } - else if (perf_lvl & NATIVE_COLOR_ARGB) { - render_pix_fmt = AV_PIX_FMT_BGRA; - } - else { - // Default - render_pix_fmt = AV_PIX_FMT_ABGR; - } + render_pix_fmt = AV_PIX_FMT_RGBA; err = avcodec_open2(decoder_ctx, decoder, NULL); if (err < 0) { diff --git a/MainFrame.storyboard b/MainFrame.storyboard index 47976d4..5d7de02 100644 --- a/MainFrame.storyboard +++ b/MainFrame.storyboard @@ -12,18 +12,18 @@ - - + + - + - + @@ -31,7 +31,7 @@ + + + - + @@ -74,15 +74,18 @@ - - + + - + + - - - - + + + + + +