blob: 84df6450858defa28d27c469637cdb36057a032a [file] [log] [blame]
/*
* 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__ */