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 @@
-
-
+
+
-
+
+
-
-
-
-
+
+
+
+
+
+