Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

newtoiphonesdk

macrumors 6502a
Original poster
Jul 30, 2010
567
2
My code is working decently, but I can tell there is a memory leak from somewhere, but can't find the source of it. Any suggestions?

.h
Code:
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AVFoundation/AVFoundation.h>
@interface MovieView : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate, AVCaptureFileOutputRecordingDelegate>{
    NSString *selectedCountry;
    MPMoviePlayerController *player;
    AVPlayer *avPlayer;
    AVPlayerLayer *avPlayerLayer;
    AVCaptureSession *session;
}
-(IBAction)endcall;
@property (nonatomic, retain) NSString *selectedCountry;
@property (nonatomic, retain) MPMoviePlayerController *player;
@property(nonatomic, retain) IBOutlet UIView *vImagePreview;
@property(nonatomic, retain) IBOutlet UIView *playit;
@property (nonatomic, retain) AVCaptureSession *session;

@end
.m
Code:
#import "MovieView.h"
#import <AudioToolbox/AudioToolbox.h>

@implementation MovieView
@synthesize selectedCountry, player, vImagePreview, playit, session;

-(void) viewWillAppear:(BOOL)animated {
    self.navigationController.navigationBarHidden = YES;
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
    
}

- (void)viewDidLoad
{ NSError* error4 = nil;
    AVAudioSession* audioSession = [AVAudioSession sharedInstance];
    if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error4]) {
        NSLog(@"AVAudioSession setCategory failed: %@", [error4 localizedDescription]);
    }
    
    // Set audio session property "allow mixing" to true so audio can be recorded while it is playing
    UInt32 allowMixing = true;
    OSStatus status = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);
    if (status != kAudioSessionNoError) {
        NSLog(@"AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers) failed: %ld", status);
    }
    
    // Activate the audio session
    error4 = nil;
    if (![audioSession setActive:YES error:&error4]) {
        NSLog(@"AVAudioSession setActive:YES failed: %@", [error4 localizedDescription]);
    }

    
    
    
    session = [[AVCaptureSession alloc] init];
    [session beginConfiguration];
	session.sessionPreset = AVCaptureSessionPresetMedium;
    
	CALayer *viewLayer = self.vImagePreview.layer;
	NSLog(@"viewLayer = %@", viewLayer);
    
	AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
	captureVideoPreviewLayer.frame = self.vImagePreview.bounds;
    [captureVideoPreviewLayer setCornerRadius:14];
    [captureVideoPreviewLayer setBorderWidth:3.0];
    [captureVideoPreviewLayer setBorderColor:[[UIColor whiteColor] CGColor]];
    [[vImagePreview layer] setCornerRadius:14];
    
    
    [[vImagePreview layer] setBorderWidth:3.0];
    
    
    [[vImagePreview layer] setBorderColor:[[UIColor whiteColor] CGColor]];

	[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer];
    
	AVCaptureDevice *device = [self frontFacingCameraIfAvailable];
	NSError *error = nil;
	AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
	if (!input) {
		// Handle the error appropriately.
		NSLog(@"ERROR: trying to open camera: %@", error);
	}

    AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
	NSError *error2 = nil;
	AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error2];
	
    
    
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [paths objectAtIndex:0];

    AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
    
    NSString *archives = [documentsDirectoryPath stringByAppendingPathComponent:@"archives"];
    NSString *outputpathofmovie = [[archives stringByAppendingPathComponent:@"Test"] stringByAppendingString:@".mp4"];
    NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie];
    [session addInput:input];
    [session addInput:audioInput];
    [session addOutput:movieFileOutput];
    [session commitConfiguration];
    [session startRunning];
    [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
   
    

    
   //tests
               
    
    // Set audio session category to "play and record"
       //endtests
    
    //this is the end of recording the video and audio
   NSString *proud = [[documentsDirectoryPath stringByAppendingPathComponent:@"proud"] stringByAppendingPathComponent:selectedCountry];
   
    NSURL  *movieURL = [[NSURL fileURLWithPath:proud] retain];
    self.player =
    
    [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
    player.useApplicationAudioSession=YES;

    [player prepareToPlay];
    player.controlStyle = MPMovieControlStyleNone;
    player.allowsAirPlay = NO;
    player.scalingMode = MPMovieScalingModeFill;   
    
    self.player.view.frame = self.view.frame;
    
    [self.view insertSubview:player.view belowSubview:vImagePreview];

    [self.player setFullscreen:YES animated:YES];
    
    // ...
    
    [[NSNotificationCenter defaultCenter] 
     addObserver:self
     selector:@selector(movieFinishedCallback:)
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:player];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:player];
    
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePlayerWillExitFullscreen:)
                                                 name:MPMoviePlayerWillExitFullscreenNotification
                                               object:player];
    
    
    [player play];

    
	

   
    
    [super viewDidLoad];
}

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error {
    //finished
    NSLog(@"Finished");
}
-(IBAction)endcall {

    [player stop];
    [session stopRunning];
}
-(AVCaptureDevice *)frontFacingCameraIfAvailable
{
    NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    AVCaptureDevice *captureDevice = nil;
    for (AVCaptureDevice *device in videoDevices)
    {
        if (device.position == AVCaptureDevicePositionFront)
        {
            captureDevice = device;
            break;
        }
    }
    
    //  couldn't find one on the front, so just get the default video device.
    if ( ! captureDevice)
    {
        captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    }
    
    return captureDevice;
}

- (void) movieFinishedCallback:(NSNotification*) aNotification {    
    NSLog(@"MovieDone");
    
    [player.view removeFromSuperview];   
    [[NSNotificationCenter defaultCenter]
     removeObserver:self
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:player];
    [session stopRunning];
    [self.navigationController popToRootViewControllerAnimated:NO];
    
}

- (void) exitedFullscreen:(NSNotification*) aNotification {   
    NSLog(@"MovieDone");
    [player.view removeFromSuperview];   
    [[NSNotificationCenter defaultCenter]
     removeObserver:self
     name:MPMoviePlayerDidExitFullscreenNotification
     object:player];
}
- (void)moviePlayerWillExitFullscreen:(NSNotification*) aNotification {
    [player stop];
    [self dismissMoviePlayerViewControllerAnimated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerWillExitFullscreenNotification object:player];
}
- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void) dealloc {
    [selectedCountry release];
    [playit release];
    [vImagePreview release];
    [player release];
    [session release];
    session = nil;
    [super dealloc];
}
@end
 
What have you tried?

Static analyzer?

What?


Simply scrolling through your code, I see inconsistent use of properties vs. instance variables. Examples:
Code:
    session = [[AVCaptureSession alloc] init];

...

    self.player =
    
    [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
    player.useApplicationAudioSession=YES;
Since your properties are all declared with retain attribute, the self.player assignment is wrong. If you run the static analyzer, does it point at this?

If you don't have a reason to use properties, don't. If you don't know why or when properties should be used, then you haven't thought through the encapsulation aspects of the design.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.