[vlc-devel] [PATCH 1/9] VLCKit: migrate VLCMedia to ARC

Florent Pillet fpillet at gmail.com
Fri Jul 11 01:35:03 CEST 2014


---
 Headers/Public/VLCMedia.h |  14 +--
 Sources/VLCMedia.m        | 283 ++++++++++++++++++++--------------------------
 2 files changed, 131 insertions(+), 166 deletions(-)

diff --git a/Headers/Public/VLCMedia.h b/Headers/Public/VLCMedia.h
index 6fc924a..f5d6aa5 100644
--- a/Headers/Public/VLCMedia.h
+++ b/Headers/Public/VLCMedia.h
@@ -186,14 +186,14 @@ typedef NSInteger VLCMediaState;
 /**
  * Receiver's delegate.
  */
- at property (weak) id<VLCMediaDelegate> delegate;
+ at property (nonatomic, weak) id<VLCMediaDelegate> delegate;
 
 /**
  * A VLCTime object describing the length of the media resource, only if it is
  * available.  Use lengthWaitUntilDate: to wait for a specified length of time.
  * \see lengthWaitUntilDate
  */
- at property (readonly) VLCTime * length;
+ at property (nonatomic, readonly, strong) VLCTime * length;
 
 /**
  * Returns a VLCTime object describing the length of the media resource,
@@ -208,17 +208,17 @@ typedef NSInteger VLCMediaState;
 /**
  * Determines if the media has already been preparsed.
  */
- at property (readonly) BOOL isParsed;
+ at property (nonatomic, readonly) BOOL isParsed;
 
 /**
  * The URL for the receiver's media resource.
  */
- at property (readonly) NSURL * url;
+ at property (nonatomic, readonly, strong) NSURL * url;
 
 /**
  * The receiver's sub list.
  */
- at property (readonly) VLCMediaList * subitems;
+ at property (nonatomic, readonly, strong) VLCMediaList * subitems;
 
 /**
  * get meta property for key
@@ -245,12 +245,12 @@ typedef NSInteger VLCMediaState;
 /**
  * The receiver's meta data as a NSDictionary object.
  */
- at property (readonly) NSDictionary * metaDictionary;
+ at property (nonatomic, readonly, strong) NSDictionary * metaDictionary;
 
 /**
  * The receiver's state, such as Playing, Error, NothingSpecial, Buffering.
  */
- at property (readonly) VLCMediaState state;
+ at property (nonatomic, readonly) VLCMediaState state;
 
 /**
  * returns a bool whether is the media is expected to play fluently on this
diff --git a/Sources/VLCMedia.m b/Sources/VLCMedia.m
index 832432b..fbc20b7 100644
--- a/Sources/VLCMedia.m
+++ b/Sources/VLCMedia.m
@@ -56,29 +56,23 @@ NSString *const VLCMetaInformationTrackID        = @"trackID";
 NSString *const VLCMediaMetaChanged              = @"VLCMediaMetaChanged";
 
 /******************************************************************************
- * @property (readwrite)
+ * VLCMedia ()
  */
 @interface VLCMedia ()
 {
     void *                p_md;              //< Internal media descriptor instance
-    NSURL *               url;               //< URL (MRL) for this media resource
-    VLCMediaList *        subitems;          //< Sub list of items
-    VLCTime *             length;            //< Cached duration of the media
-    NSMutableDictionary * metaDictionary;    //< Meta data storage
     BOOL                  isArtFetched;      //< Value used to determine of the artwork has been parsed
     BOOL                  areOthersMetaFetched; //< Value used to determine of the other meta has been parsed
     BOOL                  isArtURLFetched;   //< Value used to determine of the other meta has been preparsed
-    VLCMediaState         state;             //< Current state of the media
     BOOL                  isParsed;
 }
- at property (readwrite) VLCMediaState state;
- at end
 
-/******************************************************************************
- * Interface (Private)
- */
-// TODO: Documentation
- at interface VLCMedia (Private)
+/* Make our properties internally readwrite */
+ at property (nonatomic, readwrite) VLCMediaState state;
+ at property (nonatomic, readwrite, strong) VLCTime *length;
+ at property (nonatomic, readwrite, strong) NSDictionary *metaDictionary;
+ at property (nonatomic, readwrite, strong) VLCMediaList * subitems;
+
 /* Statics */
 + (libvlc_meta_t)stringToMetaType:(NSString *)string;
 + (NSString *)metaTypeToString:(libvlc_meta_t)type;
@@ -100,6 +94,7 @@ NSString *const VLCMediaMetaChanged              = @"VLCMediaMetaChanged";
 - (void)metaChanged:(NSString *)metaType;
 - (void)subItemAdded;
 - (void)setStateAsNumber:(NSNumber *)newStateAsNumber;
+
 @end
 
 static VLCMediaState libvlc_state_to_media_state[] =
@@ -134,7 +129,6 @@ static void HandleMediaMetaChanged(const libvlc_event_t * event, void * self)
 static void HandleMediaDurationChanged(const libvlc_event_t * event, void * self)
 {
     @autoreleasepool {
-
         [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
                                                      withMethod:@selector(setLength:)
                                            withArgumentAsObject:[VLCTime timeWithNumber:
@@ -145,7 +139,6 @@ static void HandleMediaDurationChanged(const libvlc_event_t * event, void * self
 static void HandleMediaStateChanged(const libvlc_event_t * event, void * self)
 {
     @autoreleasepool {
-
         [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self)
                                                      withMethod:@selector(setStateAsNumber:)
                                            withArgumentAsObject:@(LibVLCStateToMediaState(event->u.media_state_changed.new_state))];
@@ -175,6 +168,7 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
  * Implementation
  */
 @implementation VLCMedia
+
 + (id)mediaWithURL:(NSURL *)anURL;
 {
     return [[VLCMedia alloc] initWithURL:anURL];
@@ -203,11 +197,7 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 
         p_md = libvlc_media_new_location(library.instance, [[anURL absoluteString] UTF8String]);
 
-        metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3];
-
-        // This value is set whenever the demuxer figures out what the length is.
-        // TODO: Easy way to tell the length of the movie without having to instiate the demuxer.  Maybe cached info?
-        length = nil;
+        _metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3];
 
         [self initInternalMediaDescriptor];
     }
@@ -217,14 +207,9 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 - (id)initAsNodeWithName:(NSString *)aName
 {
     if (self = [super init]) {
-        p_md = libvlc_media_new_as_node([VLCLibrary sharedInstance],
-                                                   [aName UTF8String]);
-
-        metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3];
+        p_md = libvlc_media_new_as_node([VLCLibrary sharedInstance], [aName UTF8String]);
 
-        // This value is set whenever the demuxer figures out what the length is.
-        // TODO: Easy way to tell the length of the movie without having to instiate the demuxer.  Maybe cached info?
-        length = nil;
+        _metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3];
 
         [self initInternalMediaDescriptor];
     }
@@ -239,11 +224,8 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
     libvlc_event_detach(p_em, libvlc_MediaStateChanged,    HandleMediaStateChanged,    (__bridge void *)(self));
     libvlc_event_detach(p_em, libvlc_MediaSubItemAdded,    HandleMediaSubItemAdded,    (__bridge void *)(self));
     libvlc_event_detach(p_em, libvlc_MediaParsedChanged,   HandleMediaParsedChanged,   (__bridge void *)(self));
-    [[VLCEventManager sharedManager] cancelCallToObject:self];
 
-    // Testing to see if the pointer exists is not required, if the pointer is null
-    // then the release message is not sent to it.
-    _delegate = nil;
+    [[VLCEventManager sharedManager] cancelCallToObject:self];
 
     libvlc_media_release( p_md );
 
@@ -251,8 +233,8 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 
 - (NSString *)description
 {
-    NSString * result = metaDictionary[VLCMetaInformationTitle];
-    return [NSString stringWithFormat:@"<%@ %p> %@", [self class], self, (result ? result : [url absoluteString])];
+    NSString * result = _metaDictionary[VLCMetaInformationTitle];
+    return [NSString stringWithFormat:@"<%@ %p> %@", [self class], self, (result ? result : [_url absoluteString])];
 }
 
 - (NSComparisonResult)compare:(VLCMedia *)media
@@ -266,38 +248,36 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 
 - (VLCTime *)length
 {
-    if (!length) {
+    if (!_length) {
         // Try figuring out what the length is
         long long duration = libvlc_media_get_duration( p_md );
-        if (duration > -1) {
-            length = [VLCTime timeWithNumber:@(duration)];
-            return length;
-        }
-        return [VLCTime nullTime];
+        if (duration < 0)
+            return [VLCTime nullTime];
+         _length = [VLCTime timeWithNumber:@(duration)];
     }
-    return length;
+    return _length;
 }
 
 - (VLCTime *)lengthWaitUntilDate:(NSDate *)aDate
 {
     static const long long thread_sleep = 10000;
 
-    if (!length) {
+    if (!_length) {
         // Force parsing of this item.
         [self parseIfNeeded];
 
         // wait until we are preparsed
-        while (!length && !libvlc_media_is_parsed(p_md) && [aDate timeIntervalSinceNow] > 0)
+        while (!_length && !libvlc_media_is_parsed(p_md) && [aDate timeIntervalSinceNow] > 0)
             usleep( thread_sleep );
 
         // So we're done waiting, but sometimes we trap the fact that the parsing
         // was done before the length gets assigned, so lets go ahead and assign
         // it ourselves.
-        if (!length)
+        if (!_length)
             return [self length];
     }
 
-    return length;
+    return _length;
 }
 
 - (BOOL)isParsed
@@ -320,12 +300,12 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
 - (void)addOptions:(NSDictionary*)options
 {
     if (p_md) {
-        for (NSString * key in [options allKeys]) {
-            if (options[key] != [NSNull null])
-                libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@=%@", key, options[key]] UTF8String]);
+        [options enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) {
+            if (![obj isKindOfClass:[NSNull class]])
+                libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@=%@", key, obj] UTF8String]);
             else
-                libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@", key] UTF8String]);
-        }
+                libvlc_media_add_option(p_md, [key UTF8String]);
+        }];
     }
 }
 
@@ -334,27 +314,26 @@ static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self)
     if (!p_md)
         return NULL;
 
-    NSMutableDictionary *d = [NSMutableDictionary dictionary];
     libvlc_media_stats_t p_stats;
     libvlc_media_get_stats(p_md, &p_stats);
 
-    d[@"demuxBitrate"] = @(p_stats.f_demux_bitrate);
-    d[@"inputBitrate"] = @(p_stats.f_input_bitrate);
-    d[@"sendBitrate"] = @(p_stats.f_send_bitrate);
-    d[@"decodedAudio"] = @(p_stats.i_decoded_audio);
-    d[@"decodedVideo"] = @(p_stats.i_decoded_video);
-    d[@"demuxCorrupted"] = @(p_stats.i_demux_corrupted);
-    d[@"demuxDiscontinuity"] = @(p_stats.i_demux_discontinuity);
-    d[@"demuxReadBytes"] = @(p_stats.i_demux_read_bytes);
-    d[@"displayedPictures"] = @(p_stats.i_displayed_pictures);
-    d[@"lostAbuffers"] = @(p_stats.i_lost_abuffers);
-    d[@"lostPictures"] = @(p_stats.i_lost_pictures);
-    d[@"playedAbuffers"] = @(p_stats.i_played_abuffers);
-    d[@"readBytes"] = @(p_stats.i_read_bytes);
-    d[@"sentBytes"] = @(p_stats.i_sent_bytes);
-    d[@"sentPackets"] = @(p_stats.i_sent_packets);
-
-    return d;
+    return @{
+        @"demuxBitrate" : @(p_stats.f_demux_bitrate),
+        @"inputBitrate" : @(p_stats.f_input_bitrate),
+        @"sendBitrate" : @(p_stats.f_send_bitrate),
+        @"decodedAudio" : @(p_stats.i_decoded_audio),
+        @"decodedVideo" : @(p_stats.i_decoded_video),
+        @"demuxCorrupted" : @(p_stats.i_demux_corrupted),
+        @"demuxDiscontinuity" : @(p_stats.i_demux_discontinuity),
+        @"demuxReadBytes" : @(p_stats.i_demux_read_bytes),
+        @"displayedPictures" : @(p_stats.i_displayed_pictures),
+        @"lostAbuffers" : @(p_stats.i_lost_abuffers),
+        @"lostPictures" : @(p_stats.i_lost_pictures),
+        @"playedAbuffers" : @(p_stats.i_played_abuffers),
+        @"readBytes" : @(p_stats.i_read_bytes),
+        @"sentBytes" : @(p_stats.i_sent_bytes),
+        @"sentPackets" : @(p_stats.i_sent_packets)
+    };
 }
 
 - (NSInteger)numberOfReadBytesOnInput
@@ -664,10 +643,6 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
     return YES;
 }
 
- at synthesize url;
- at synthesize subitems;
-
-
 - (NSString *)metadataForKey:(NSString *)key
 {
     if (!p_md)
@@ -698,64 +673,14 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
 - (BOOL)saveMetadata
 {
     if (p_md)
-        return libvlc_media_save_meta(p_md);
+        return libvlc_media_save_meta(p_md) != 0;
 
     return NO;
 }
 
- at synthesize metaDictionary;
- at synthesize state;
-
- at end
-
-/******************************************************************************
- * Implementation VLCMedia (LibVLCBridging)
- */
- at implementation VLCMedia (LibVLCBridging)
-
-+ (id)mediaWithLibVLCMediaDescriptor:(void *)md
-{
-    return [[VLCMedia alloc] initWithLibVLCMediaDescriptor:md];
-}
-
-- (id)initWithLibVLCMediaDescriptor:(void *)md
-{
-    if (self = [super init]) {
-        libvlc_media_retain(md);
-        p_md = md;
-
-        metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3];
-        [self initInternalMediaDescriptor];
-    }
-    return self;
-}
-
-- (void *)libVLCMediaDescriptor
-{
-    return p_md;
-}
-
-+ (id)mediaWithMedia:(VLCMedia *)media andLibVLCOptions:(NSDictionary *)options
-{
-    libvlc_media_t * p_md;
-    p_md = libvlc_media_duplicate([media libVLCMediaDescriptor]);
-
-    for (NSString * key in [options allKeys]) {
-        if (options[key] != [NSNull null])
-            libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@=%@", key, options[key]] UTF8String]);
-        else
-            libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@", key] UTF8String]);
-
-    }
-    return [VLCMedia mediaWithLibVLCMediaDescriptor:p_md];
-}
-
- at end
-
 /******************************************************************************
- * Implementation VLCMedia (Private)
+ * Implementation VLCMedia ()
  */
- at implementation VLCMedia (Private)
 
 + (libvlc_meta_t)stringToMetaType:(NSString *)string
 {
@@ -785,7 +710,7 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
 #undef VLCStringToMeta
     }
     NSNumber * number = stringToMetaDictionary[string];
-    return number ? [number intValue] : -1;
+    return (libvlc_meta_t) (number ? [number intValue] : -1);
 }
 
 + (NSString *)metaTypeToString:(libvlc_meta_t)type
@@ -817,9 +742,9 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
     if (!p_url)
         return;
 
-    url = [NSURL URLWithString:@(p_url)];
-    if (!url) /* Attempt to interpret as a file path then */
-        url = [NSURL fileURLWithPath:@(p_url)];
+    _url = [NSURL URLWithString:@(p_url)];
+    if (!_url) /* Attempt to interpret as a file path then */
+        _url = [NSURL fileURLWithPath:@(p_url)];
     free(p_url);
 
     libvlc_media_set_user_data(p_md, (__bridge void*)self);
@@ -833,22 +758,20 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
 
     libvlc_media_list_t * p_mlist = libvlc_media_subitems( p_md );
 
-    if (!p_mlist)
-        subitems = nil;
-    else {
-        subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
+    if (p_mlist) {
+        self.subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
         libvlc_media_list_release( p_mlist );
     }
 
-    isParsed = libvlc_media_is_parsed(p_md);
-    state = LibVLCStateToMediaState(libvlc_media_get_state( p_md ));
+    isParsed = libvlc_media_is_parsed(p_md) != 0;
+    self.state = LibVLCStateToMediaState(libvlc_media_get_state( p_md ));
 }
 
 - (void)fetchMetaInformationFromLibVLCWithType:(NSString *)metaType
 {
     char * psz_value = libvlc_media_get_meta( p_md, [VLCMedia stringToMetaType:metaType] );
     NSString * newValue = psz_value ? @(psz_value) : nil;
-    NSString * oldValue = [metaDictionary valueForKey:metaType];
+    NSString * oldValue = [_metaDictionary valueForKey:metaType];
     free(psz_value);
 
     if (newValue != oldValue && !(oldValue && newValue && [oldValue compare:newValue] == NSOrderedSame)) {
@@ -859,38 +782,35 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
                                        withObject:newValue];
         }
 
-        [metaDictionary setValue:newValue forKeyPath:metaType];
+        [_metaDictionary setValue:newValue forKeyPath:metaType];
     }
 }
 
 #if !TARGET_OS_IPHONE
 - (void)fetchMetaInformationForArtWorkWithURL:(NSString *)anURL
 {
-    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
-    NSImage * art = nil;
+    @autoreleasepool {
+        NSImage * art = nil;
+
+        if (anURL) {
+            // Go ahead and load up the art work
+            NSURL * artUrl = [NSURL URLWithString:[anURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+            // Don't attempt to fetch artwork from remote. Core will do that alone
+            if ([artUrl isFileURL])
+                art  = [[NSImage alloc] initWithContentsOfURL:artUrl];
+        }
 
-    if (anURL) {
-        // Go ahead and load up the art work
-        NSURL * artUrl = [NSURL URLWithString:[anURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
-        // Don't attempt to fetch artwork from remote. Core will do that alone
-        if ([artUrl isFileURL])
-            art  = [[[NSImage alloc] initWithContentsOfURL:artUrl] autorelease];
+        // If anything was found, lets save it to the meta data dictionary
+        [self performSelectorOnMainThread:@selector(setArtwork:) withObject:art waitUntilDone:NO];
     }
-
-    // If anything was found, lets save it to the meta data dictionary
-    [self performSelectorOnMainThread:@selector(setArtwork:) withObject:art waitUntilDone:NO];
-
-    [pool release];
 }
 
 - (void)setArtwork:(NSImage *)art
 {
-    if (!art) {
-        [metaDictionary removeObjectForKey:@"artwork"];
-        return;
-    }
-
-    [metaDictionary setObject:art forKey:@"artwork"];
+    if (!art)
+        [(NSMutableDictionary *)_metaDictionary removeObjectForKey:@"artwork"];
+    else
+        [(NSMutableDictionary *)_metaDictionary setObject:art forKey:@"artwork"];
 }
 #endif
 
@@ -910,16 +830,15 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
 
 - (void)subItemAdded
 {
-    if (subitems)
+    if (_subitems)
         return; /* Nothing to do */
 
     libvlc_media_list_t * p_mlist = libvlc_media_subitems( p_md );
 
     NSAssert( p_mlist, @"The mlist shouldn't be nil, we are receiving a subItemAdded");
 
-    [self willChangeValueForKey:@"subitems"];
-    subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
-    [self didChangeValueForKey:@"subitems"];
+    self.subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist];
+
     libvlc_media_list_release( p_mlist );
 }
 
@@ -990,6 +909,51 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
 @end
 
 /******************************************************************************
+ * Implementation VLCMedia (LibVLCBridging)
+ */
+ at implementation VLCMedia (LibVLCBridging)
+
++ (id)mediaWithLibVLCMediaDescriptor:(void *)md
+{
+    return [[VLCMedia alloc] initWithLibVLCMediaDescriptor:md];
+}
+
+- (id)initWithLibVLCMediaDescriptor:(void *)md
+{
+    if (self = [super init]) {
+        libvlc_media_retain(md);
+        p_md = md;
+
+        self.metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3];
+
+        [self initInternalMediaDescriptor];
+    }
+    return self;
+}
+
+- (void *)libVLCMediaDescriptor
+{
+    return p_md;
+}
+
++ (id)mediaWithMedia:(VLCMedia *)media andLibVLCOptions:(NSDictionary *)options
+{
+    libvlc_media_t * p_md;
+    p_md = libvlc_media_duplicate([media libVLCMediaDescriptor]);
+
+    for (NSString * key in [options allKeys]) {
+        if (options[key] != [NSNull null])
+            libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@=%@", key, options[key]] UTF8String]);
+        else
+            libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@", key] UTF8String]);
+
+    }
+    return [VLCMedia mediaWithLibVLCMediaDescriptor:p_md];
+}
+
+ at end
+
+/******************************************************************************
  * Implementation VLCMedia (VLCMediaPlayerBridging)
  */
 
@@ -997,10 +961,11 @@ NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString
 
 - (void)setLength:(VLCTime *)value
 {
+    VLCTime *length = _length;
     if (length && value && [length compare:value] == NSOrderedSame)
         return;
 
-    length = value ? value : nil;
+    _length = value;
 }
 
 @end
-- 
1.8.5.2 (Apple Git-48)




More information about the vlc-devel mailing list