All code interacting with Objective-C objects should now use Automated Reference Counting rather than manual memory management or Garbage Collection. Because ARC prohibits C-structs from containing references to Objective-C objects, all such fields are now typed 'gpointer'. Setting and gettings Objective-C fields on such a struct now uses explicit __bridge_* calls to tell ARC about object lifetimes. https://bugzilla.gnome.org/show_bug.cgi?id=777847
		
			
				
	
	
		
			140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| /*
 | |
|  * GStreamer
 | |
|  * Copyright (C) 2013 Fluendo S.L. <support@fluendo.com>
 | |
|  *    Authors: Andoni Morales Alastruey <amorales@fluendo.com>
 | |
|  *
 | |
|  * This library is free software; you can redistribute it and/or
 | |
|  * modify it under the terms of the GNU Library General Public
 | |
|  * License as published by the Free Software Foundation; either
 | |
|  * version 2 of the License, or (at your option) any later version.
 | |
|  *
 | |
|  * This library is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
|  * Library General Public License for more details.
 | |
|  *
 | |
|  * You should have received a copy of the GNU Library General Public
 | |
|  * License along with this library; if not, write to the
 | |
|  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | |
|  * Boston, MA 02111-1307, USA.
 | |
|  */
 | |
| 
 | |
| #ifndef __GST_AVF_ASSET_SRC_H__
 | |
| #define __GST_AVF_ASSET_SRC_H__
 | |
| 
 | |
| #ifdef HAVE_CONFIG_H
 | |
| #  include "config.h"
 | |
| #endif
 | |
| 
 | |
| #include <gst/gst.h>
 | |
| #include <gst/base/base.h>
 | |
| #include <gst/audio/audio.h>
 | |
| #import <AVFoundation/AVFoundation.h>
 | |
| #import <AVFoundation/AVAssetReader.h>
 | |
| #import <AVFoundation/AVAssetReaderOutput.h>
 | |
| 
 | |
| G_BEGIN_DECLS
 | |
| 
 | |
| #define GST_TYPE_AVF_ASSET_SRC \
 | |
|   (gst_avf_asset_src_get_type())
 | |
| #define GST_AVF_ASSET_SRC_READER(obj) \
 | |
|   ((__bridge GstAVFAssetReader *)(obj->reader))
 | |
| #define GST_AVF_ASSET_SRC(obj) \
 | |
|   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVF_ASSET_SRC,GstAVFAssetSrc))
 | |
| #define GST_AVF_ASSET_SRC_CLASS(klass) \
 | |
|   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVF_ASSET_SRC,GstAVFAssetSrcClass))
 | |
| #define GST_IS_AVF_ASSET_SRC(obj) \
 | |
|   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVF_ASSET_SRC))
 | |
| #define GST_IS_AVF_ASSET_SRC_CLASS(klass) \
 | |
|   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVF_ASSET_SRC))
 | |
| #define GST_AVF_ASSET_SRC_ERROR gst_avf_asset_src_error_quark ()
 | |
| 
 | |
| typedef struct _GstAVFAssetSrc      GstAVFAssetSrc;
 | |
| typedef struct _GstAVFAssetSrcClass GstAVFAssetSrcClass;
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|   GST_AVF_ASSET_READER_MEDIA_TYPE_AUDIO,
 | |
|   GST_AVF_ASSET_READER_MEDIA_TYPE_VIDEO,
 | |
| } GstAVFAssetReaderMediaType;
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|   GST_AVF_ASSET_ERROR_NOT_PLAYABLE,
 | |
|   GST_AVF_ASSET_ERROR_INIT,
 | |
|   GST_AVF_ASSET_ERROR_START,
 | |
|   GST_AVF_ASSET_ERROR_READ,
 | |
| } GstAVFAssetError;
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|   GST_AVF_ASSET_SRC_STATE_STOPPED,
 | |
|   GST_AVF_ASSET_SRC_STATE_STARTED,
 | |
|   GST_AVF_ASSET_SRC_STATE_READING,
 | |
| } GstAVFAssetSrcState;
 | |
| 
 | |
| @interface GstAVFAssetReader: NSObject
 | |
| {
 | |
|   AVAsset *asset;
 | |
|   AVAssetReader *reader;
 | |
|   AVAssetReaderTrackOutput *video_track;
 | |
|   AVAssetReaderTrackOutput *audio_track;
 | |
|   NSArray *audio_tracks;
 | |
|   NSArray *video_tracks;
 | |
|   int selected_audio_track;
 | |
|   int selected_video_track;
 | |
|   GstCaps *audio_caps;
 | |
|   GstCaps *video_caps;
 | |
|   gboolean reading;
 | |
|   GstClockTime duration;
 | |
|   GstClockTime position;
 | |
| }
 | |
| 
 | |
| @property GstClockTime duration;
 | |
| @property GstClockTime position;
 | |
| 
 | |
| - (id) initWithURI:(gchar*) uri : (GError **) error;
 | |
| - (void) start : (GError **) error;
 | |
| - (void) stop;
 | |
| - (void) seekTo: (guint64) start : (guint64) stop : (GError **) error;
 | |
| - (BOOL) hasMediaType: (GstAVFAssetReaderMediaType) type;
 | |
| - (GstCaps *) getCaps: (GstAVFAssetReaderMediaType) type;
 | |
| - (BOOL) selectTrack: (GstAVFAssetReaderMediaType) type : (gint) index;
 | |
| - (GstBuffer *) nextBuffer:  (GstAVFAssetReaderMediaType) type : (GError **) error;
 | |
| @end
 | |
| 
 | |
| struct _GstAVFAssetSrc
 | |
| {
 | |
|   GstElement element;
 | |
| 
 | |
|   GstPad *videopad;
 | |
|   GstPad *audiopad;
 | |
|   gint selected_video_track;
 | |
|   gint selected_audio_track;
 | |
| 
 | |
|   /* NOTE: ARC no longer allows Objective-C pointers in structs. */
 | |
|   /* Instead, use gpointer with explicit __bridge_* calls */
 | |
|   gpointer reader;
 | |
| 
 | |
|   GstAVFAssetSrcState state;
 | |
|   GMutex lock;
 | |
|   GstEvent *seek_event;
 | |
| 
 | |
|   GstFlowReturn last_audio_pad_ret;
 | |
|   GstFlowReturn last_video_pad_ret;
 | |
| 
 | |
|   /* Properties */
 | |
|   gchar * uri;
 | |
| };
 | |
| 
 | |
| struct _GstAVFAssetSrcClass
 | |
| {
 | |
|   GstElementClass parent_class;
 | |
| };
 | |
| 
 | |
| GType gst_avf_asset_src_get_type (void);
 | |
| 
 | |
| G_END_DECLS
 | |
| 
 | |
| #endif /* __GST_AVF_ASSET_SRC_H__ */
 |