summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2016-10-09 15:26:01 +0200
committerOlivier CrĂȘte <olivier.crete@collabora.com>2016-10-09 15:26:01 +0200
commit0ab2ce02ce2ea7c944ea606c01eb9a4dfd1ef5b0 (patch)
treea00b925443b77d5c09aaeef150aebdd660e95d40
parent9736d9a0b2de00fce73ff7d7667a64b12c446c00 (diff)
parent90b090f5b41eed424fcf0ea9a3915ee948d9c127 (diff)
Merge remote-tracking branch 'tutorials/master'
-rw-r--r--.gitignore22
-rw-r--r--tutorials/android-tutorial-1/AndroidManifest.xml17
-rw-r--r--tutorials/android-tutorial-1/jni/Android.mk31
-rw-r--r--tutorials/android-tutorial-1/jni/Application.mk1
-rw-r--r--tutorials/android-tutorial-1/jni/tutorial-1.c31
-rw-r--r--tutorials/android-tutorial-1/res/drawable-hdpi/gstreamer_logo_1.pngbin0 -> 1995 bytes
-rw-r--r--tutorials/android-tutorial-1/res/drawable-ldpi/gstreamer_logo_1.pngbin0 -> 1043 bytes
-rw-r--r--tutorials/android-tutorial-1/res/drawable-mdpi/gstreamer_logo_1.pngbin0 -> 1298 bytes
-rw-r--r--tutorials/android-tutorial-1/res/drawable-xhdpi/gstreamer_logo_1.pngbin0 -> 2527 bytes
-rw-r--r--tutorials/android-tutorial-1/res/drawable-xxhdpi/gstreamer_logo_1.pngbin0 -> 3918 bytes
-rw-r--r--tutorials/android-tutorial-1/res/drawable-xxxhdpi/gstreamer_logo_1.pngbin0 -> 5160 bytes
-rw-r--r--tutorials/android-tutorial-1/res/layout/main.xml14
-rw-r--r--tutorials/android-tutorial-1/res/values/strings.xml4
-rw-r--r--tutorials/android-tutorial-1/src/org/freedesktop/gstreamer/tutorials/tutorial_1/Tutorial1.java38
-rw-r--r--tutorials/android-tutorial-2/AndroidManifest.xml17
-rw-r--r--tutorials/android-tutorial-2/jni/Android.mk32
-rw-r--r--tutorials/android-tutorial-2/jni/Application.mk1
-rw-r--r--tutorials/android-tutorial-2/jni/tutorial-2.c275
-rw-r--r--tutorials/android-tutorial-2/res/drawable-hdpi/gstreamer_logo_2.pngbin0 -> 2127 bytes
-rw-r--r--tutorials/android-tutorial-2/res/drawable-ldpi/gstreamer_logo_2.pngbin0 -> 1070 bytes
-rw-r--r--tutorials/android-tutorial-2/res/drawable-mdpi/gstreamer_logo_2.pngbin0 -> 1357 bytes
-rw-r--r--tutorials/android-tutorial-2/res/drawable-xhdpi/gstreamer_logo_2.pngbin0 -> 2687 bytes
-rw-r--r--tutorials/android-tutorial-2/res/drawable-xxhdpi/gstreamer_logo_2.pngbin0 -> 4138 bytes
-rw-r--r--tutorials/android-tutorial-2/res/drawable-xxxhdpi/gstreamer_logo_2.pngbin0 -> 5344 bytes
-rw-r--r--tutorials/android-tutorial-2/res/layout/main.xml38
-rw-r--r--tutorials/android-tutorial-2/res/values/strings.xml6
-rw-r--r--tutorials/android-tutorial-2/src/org/freedesktop/gstreamer/tutorials/tutorial_2/Tutorial2.java119
-rw-r--r--tutorials/android-tutorial-3/AndroidManifest.xml18
-rw-r--r--tutorials/android-tutorial-3/jni/Android.mk33
-rw-r--r--tutorials/android-tutorial-3/jni/Application.mk1
-rw-r--r--tutorials/android-tutorial-3/jni/tutorial-3.c337
-rw-r--r--tutorials/android-tutorial-3/res/drawable-hdpi/gstreamer_logo_3.pngbin0 -> 2193 bytes
-rw-r--r--tutorials/android-tutorial-3/res/drawable-ldpi/gstreamer_logo_3.pngbin0 -> 1111 bytes
-rw-r--r--tutorials/android-tutorial-3/res/drawable-mdpi/gstreamer_logo_3.pngbin0 -> 1393 bytes
-rw-r--r--tutorials/android-tutorial-3/res/drawable-xhdpi/gstreamer_logo_3.pngbin0 -> 2821 bytes
-rw-r--r--tutorials/android-tutorial-3/res/drawable-xxhdpi/gstreamer_logo_3.pngbin0 -> 4295 bytes
-rw-r--r--tutorials/android-tutorial-3/res/drawable-xxxhdpi/gstreamer_logo_3.pngbin0 -> 5588 bytes
-rw-r--r--tutorials/android-tutorial-3/res/layout/main.xml45
-rw-r--r--tutorials/android-tutorial-3/res/values/strings.xml6
-rw-r--r--tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/GStreamerSurfaceView.java85
-rw-r--r--tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/Tutorial3.java143
-rw-r--r--tutorials/android-tutorial-4/AndroidManifest.xml19
-rw-r--r--tutorials/android-tutorial-4/jni/Android.mk34
-rw-r--r--tutorials/android-tutorial-4/jni/Application.mk1
-rw-r--r--tutorials/android-tutorial-4/jni/tutorial-4.c562
-rw-r--r--tutorials/android-tutorial-4/res/drawable-hdpi/gstreamer_logo_4.pngbin0 -> 2135 bytes
-rw-r--r--tutorials/android-tutorial-4/res/drawable-ldpi/gstreamer_logo_4.pngbin0 -> 1087 bytes
-rw-r--r--tutorials/android-tutorial-4/res/drawable-mdpi/gstreamer_logo_4.pngbin0 -> 1383 bytes
-rw-r--r--tutorials/android-tutorial-4/res/drawable-xhdpi/gstreamer_logo_4.pngbin0 -> 2756 bytes
-rw-r--r--tutorials/android-tutorial-4/res/drawable-xxhdpi/gstreamer_logo_4.pngbin0 -> 4240 bytes
-rw-r--r--tutorials/android-tutorial-4/res/drawable-xxxhdpi/gstreamer_logo_4.pngbin0 -> 5528 bytes
-rw-r--r--tutorials/android-tutorial-4/res/layout/main.xml69
-rw-r--r--tutorials/android-tutorial-4/res/values/strings.xml6
-rw-r--r--tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/GStreamerSurfaceView.java85
-rw-r--r--tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/Tutorial4.java250
-rwxr-xr-xtutorials/android-tutorial-5/AndroidManifest.xml94
-rwxr-xr-xtutorials/android-tutorial-5/jni/Android.mk34
-rw-r--r--tutorials/android-tutorial-5/jni/Application.mk2
-rwxr-xr-xtutorials/android-tutorial-5/jni/tutorial-5.c570
-rw-r--r--tutorials/android-tutorial-5/res/drawable-ldpi/file.pngbin0 -> 1102 bytes
-rw-r--r--tutorials/android-tutorial-5/res/drawable-ldpi/folder.pngbin0 -> 1552 bytes
-rw-r--r--tutorials/android-tutorial-5/res/drawable-ldpi/gstreamer_logo_5.pngbin0 -> 1099 bytes
-rw-r--r--tutorials/android-tutorial-5/res/drawable-mdpi/gstreamer_logo_5.pngbin0 -> 1395 bytes
-rw-r--r--tutorials/android-tutorial-5/res/drawable-xhdpi/gstreamer_logo_5.pngbin0 -> 2760 bytes
-rw-r--r--tutorials/android-tutorial-5/res/drawable-xxhdpi/gstreamer_logo_5.pngbin0 -> 4211 bytes
-rw-r--r--tutorials/android-tutorial-5/res/drawable-xxxhdpi/gstreamer_logo_5.pngbin0 -> 5512 bytes
-rw-r--r--tutorials/android-tutorial-5/res/layout/file_dialog_main.xml39
-rw-r--r--tutorials/android-tutorial-5/res/layout/file_dialog_row.xml24
-rwxr-xr-xtutorials/android-tutorial-5/res/layout/main.xml77
-rwxr-xr-xtutorials/android-tutorial-5/res/values/strings.xml12
-rw-r--r--tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/GStreamerSurfaceView.java85
-rw-r--r--tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/Tutorial5.java309
-rw-r--r--tutorials/android-tutorial-5/src/com/lamerman/FileDialog.java334
-rw-r--r--tutorials/basic-tutorial-1.c28
-rw-r--r--tutorials/basic-tutorial-12.c99
-rw-r--r--tutorials/basic-tutorial-13.c146
-rw-r--r--tutorials/basic-tutorial-15.c95
-rw-r--r--tutorials/basic-tutorial-2.c76
-rw-r--r--tutorials/basic-tutorial-3.c149
-rw-r--r--tutorials/basic-tutorial-4.c156
-rw-r--r--tutorials/basic-tutorial-5.c380
-rw-r--r--tutorials/basic-tutorial-6.c207
-rw-r--r--tutorials/basic-tutorial-7.c89
-rw-r--r--tutorials/basic-tutorial-8.c234
-rw-r--r--tutorials/basic-tutorial-9.c216
-rw-r--r--tutorials/icons/gstreamer-logo-1.svg68
-rw-r--r--tutorials/icons/gstreamer-logo-2.svg68
-rw-r--r--tutorials/icons/gstreamer-logo-3.svg68
-rw-r--r--tutorials/icons/gstreamer-logo-4.svg68
-rw-r--r--tutorials/icons/gstreamer-logo-5.svg68
-rw-r--r--tutorials/playback-tutorial-1.c221
-rw-r--r--tutorials/playback-tutorial-2.c223
-rw-r--r--tutorials/playback-tutorial-3.c154
-rw-r--r--tutorials/playback-tutorial-4.c172
-rw-r--r--tutorials/playback-tutorial-5.c146
-rw-r--r--tutorials/playback-tutorial-6.c89
-rw-r--r--tutorials/playback-tutorial-7.c55
-rw-r--r--tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj100
-rw-r--r--tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj99
-rw-r--r--tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj95
-rw-r--r--tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj.filters6
-rw-r--r--tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj97
-rw-r--r--tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj.filters6
-rw-r--r--tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj95
-rw-r--r--tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj.filters6
-rw-r--r--tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj95
-rw-r--r--tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj.filters6
-rw-r--r--tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj95
-rw-r--r--tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj.filters6
-rw-r--r--tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj95
-rw-r--r--tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj.filters6
-rw-r--r--tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj97
-rw-r--r--tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj.filters6
-rw-r--r--tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj95
-rw-r--r--tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj.filters6
-rw-r--r--tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj95
-rw-r--r--tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj.filters6
-rw-r--r--tutorials/vs2010/tutorials.sln206
-rw-r--r--tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.pbxproj1761
-rw-r--r--tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata7
-rw-r--r--tutorials/xcode iOS/Tutorial 1/AppDelegate.h7
-rw-r--r--tutorials/xcode iOS/Tutorial 1/AppDelegate.m38
-rw-r--r--tutorials/xcode iOS/Tutorial 1/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 1/Default.pngbin0 -> 6540 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 1/Default@2x.pngbin0 -> 16107 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 1/GStreamerBackend.h7
-rw-r--r--tutorials/xcode iOS/Tutorial 1/GStreamerBackend.m16
-rwxr-xr-xtutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad.pngbin0 -> 6622 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad@2x.pngbin0 -> 16934 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone.pngbin0 -> 5207 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone@2x.pngbin0 -> 12104 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 1/Tutorial 1-Info.plist62
-rw-r--r--tutorials/xcode iOS/Tutorial 1/Tutorial 1-Prefix.pch14
-rw-r--r--tutorials/xcode iOS/Tutorial 1/Ubuntu-R.ttfbin0 -> 353824 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 1/ViewController.h9
-rw-r--r--tutorials/xcode iOS/Tutorial 1/ViewController.m29
-rw-r--r--tutorials/xcode iOS/Tutorial 1/en.lproj/InfoPlist.strings2
-rw-r--r--tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPad.storyboard55
-rw-r--r--tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPhone.storyboard55
-rw-r--r--tutorials/xcode iOS/Tutorial 1/fonts.conf126
-rw-r--r--tutorials/xcode iOS/Tutorial 1/gst_ios_init.h39
-rw-r--r--tutorials/xcode iOS/Tutorial 1/gst_ios_init.m988
-rw-r--r--tutorials/xcode iOS/Tutorial 1/main.m12
-rw-r--r--tutorials/xcode iOS/Tutorial 2/AppDelegate.h7
-rw-r--r--tutorials/xcode iOS/Tutorial 2/AppDelegate.m38
-rw-r--r--tutorials/xcode iOS/Tutorial 2/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 2/Default.pngbin0 -> 6540 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 2/Default@2x.pngbin0 -> 16107 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 2/GStreamerBackend.h16
-rw-r--r--tutorials/xcode iOS/Tutorial 2/GStreamerBackend.m177
-rw-r--r--tutorials/xcode iOS/Tutorial 2/GStreamerBackendDelegate.h14
-rwxr-xr-xtutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad.pngbin0 -> 6998 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad@2x.pngbin0 -> 17933 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone.pngbin0 -> 5443 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone@2x.pngbin0 -> 12811 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 2/Tutorial 2-Info.plist62
-rw-r--r--tutorials/xcode iOS/Tutorial 2/Tutorial 2-Prefix.pch14
-rw-r--r--tutorials/xcode iOS/Tutorial 2/Tutorial2-Info.plist49
-rw-r--r--tutorials/xcode iOS/Tutorial 2/Ubuntu-R.ttfbin0 -> 353824 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 2/ViewController.h17
-rw-r--r--tutorials/xcode iOS/Tutorial 2/ViewController.m65
-rw-r--r--tutorials/xcode iOS/Tutorial 2/en.lproj/InfoPlist.strings2
-rw-r--r--tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPad.storyboard79
-rw-r--r--tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPhone.storyboard66
-rw-r--r--tutorials/xcode iOS/Tutorial 2/fonts.conf126
-rw-r--r--tutorials/xcode iOS/Tutorial 2/gst_ios_init.h39
-rw-r--r--tutorials/xcode iOS/Tutorial 2/gst_ios_init.m988
-rw-r--r--tutorials/xcode iOS/Tutorial 2/main.m12
-rw-r--r--tutorials/xcode iOS/Tutorial 3/AppDelegate.h7
-rw-r--r--tutorials/xcode iOS/Tutorial 3/AppDelegate.m38
-rw-r--r--tutorials/xcode iOS/Tutorial 3/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 3/Default.pngbin0 -> 6540 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 3/Default@2x.pngbin0 -> 16107 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 3/EaglUIVIew.h11
-rw-r--r--tutorials/xcode iOS/Tutorial 3/EaglUIVIew.m13
-rw-r--r--tutorials/xcode iOS/Tutorial 3/GStreamerBackend.h17
-rw-r--r--tutorials/xcode iOS/Tutorial 3/GStreamerBackend.m191
-rw-r--r--tutorials/xcode iOS/Tutorial 3/GStreamerBackendDelegate.h14
-rwxr-xr-xtutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad.pngbin0 -> 7051 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad@2x.pngbin0 -> 18108 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone.pngbin0 -> 5502 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone@2x.pngbin0 -> 12896 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 3/Tutorial 3-Info.plist62
-rw-r--r--tutorials/xcode iOS/Tutorial 3/Tutorial 3-Prefix.pch14
-rw-r--r--tutorials/xcode iOS/Tutorial 3/Ubuntu-R.ttfbin0 -> 353824 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 3/ViewController.h21
-rw-r--r--tutorials/xcode iOS/Tutorial 3/ViewController.m88
-rw-r--r--tutorials/xcode iOS/Tutorial 3/en.lproj/InfoPlist.strings2
-rw-r--r--tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPad.storyboard114
-rw-r--r--tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPhone.storyboard108
-rw-r--r--tutorials/xcode iOS/Tutorial 3/fonts.conf126
-rw-r--r--tutorials/xcode iOS/Tutorial 3/gst_ios_init.h39
-rw-r--r--tutorials/xcode iOS/Tutorial 3/gst_ios_init.m988
-rw-r--r--tutorials/xcode iOS/Tutorial 3/main.m12
-rw-r--r--tutorials/xcode iOS/Tutorial 4/AppDelegate.h7
-rw-r--r--tutorials/xcode iOS/Tutorial 4/AppDelegate.m38
-rw-r--r--tutorials/xcode iOS/Tutorial 4/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 4/Default.pngbin0 -> 6540 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 4/Default@2x.pngbin0 -> 16107 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 4/EaglUIVIew.h11
-rw-r--r--tutorials/xcode iOS/Tutorial 4/EaglUIVIew.m13
-rw-r--r--tutorials/xcode iOS/Tutorial 4/GStreamerBackend.h28
-rw-r--r--tutorials/xcode iOS/Tutorial 4/GStreamerBackend.m387
-rw-r--r--tutorials/xcode iOS/Tutorial 4/GStreamerBackendDelegate.h20
-rwxr-xr-xtutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad.pngbin0 -> 6891 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad@2x.pngbin0 -> 17472 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone.pngbin0 -> 5404 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone@2x.pngbin0 -> 12573 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 4/Tutorial 4-Info.plist64
-rw-r--r--tutorials/xcode iOS/Tutorial 4/Tutorial 4-Prefix.pch14
-rw-r--r--tutorials/xcode iOS/Tutorial 4/Ubuntu-R.ttfbin0 -> 353824 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 4/VideoViewController.h29
-rw-r--r--tutorials/xcode iOS/Tutorial 4/VideoViewController.m196
-rw-r--r--tutorials/xcode iOS/Tutorial 4/en.lproj/InfoPlist.strings2
-rw-r--r--tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPad.storyboard143
-rw-r--r--tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPhone.storyboard146
-rw-r--r--tutorials/xcode iOS/Tutorial 4/fonts.conf126
-rw-r--r--tutorials/xcode iOS/Tutorial 4/gst_ios_init.h39
-rw-r--r--tutorials/xcode iOS/Tutorial 4/gst_ios_init.m988
-rw-r--r--tutorials/xcode iOS/Tutorial 4/main.m12
-rw-r--r--tutorials/xcode iOS/Tutorial 5/AppDelegate.h7
-rw-r--r--tutorials/xcode iOS/Tutorial 5/AppDelegate.m38
-rw-r--r--tutorials/xcode iOS/Tutorial 5/Default-568h@2x.pngbin0 -> 18594 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 5/Default.pngbin0 -> 6540 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 5/Default@2x.pngbin0 -> 16107 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 5/EaglUIVIew.h11
-rw-r--r--tutorials/xcode iOS/Tutorial 5/EaglUIVIew.m13
-rw-r--r--tutorials/xcode iOS/Tutorial 5/GStreamerBackend.h28
-rw-r--r--tutorials/xcode iOS/Tutorial 5/GStreamerBackend.m387
-rw-r--r--tutorials/xcode iOS/Tutorial 5/GStreamerBackendDelegate.h20
-rwxr-xr-xtutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad.pngbin0 -> 7009 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad@2x.pngbin0 -> 18029 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone.pngbin0 -> 5445 bytes
-rwxr-xr-xtutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone@2x.pngbin0 -> 12745 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 5/LibraryViewController.h12
-rw-r--r--tutorials/xcode iOS/Tutorial 5/LibraryViewController.m165
-rw-r--r--tutorials/xcode iOS/Tutorial 5/Tutorial 5-Info.plist68
-rw-r--r--tutorials/xcode iOS/Tutorial 5/Tutorial 5-Prefix.pch14
-rw-r--r--tutorials/xcode iOS/Tutorial 5/Ubuntu-R.ttfbin0 -> 353824 bytes
-rw-r--r--tutorials/xcode iOS/Tutorial 5/VideoViewController.h29
-rw-r--r--tutorials/xcode iOS/Tutorial 5/VideoViewController.m197
-rw-r--r--tutorials/xcode iOS/Tutorial 5/en.lproj/InfoPlist.strings2
-rw-r--r--tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPad.storyboard216
-rw-r--r--tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPhone.storyboard224
-rw-r--r--tutorials/xcode iOS/Tutorial 5/fonts.conf126
-rw-r--r--tutorials/xcode iOS/Tutorial 5/gst_ios_init.h39
-rw-r--r--tutorials/xcode iOS/Tutorial 5/gst_ios_init.m988
-rw-r--r--tutorials/xcode iOS/Tutorial 5/main.m12
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/project.pbxproj1853
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata7
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/01-Tutorial 1.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/02-Tutorial 2.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/03-Turorial 3.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/04-Tutorial 4.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/05-Tutorial 5.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/06-Tutorial 6.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/07-Tutorial 7.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/08-Tutorial 8.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/09-Tutorial 9.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/12-Tutorial 12.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/13-Tutorial 13.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/15-Tutorial 15.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/21-Playback Tutorial 1.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/22-Playback Tutorial 2.xcscheme84
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/23-Playback Tutorial 3.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/24-Playback Tutorial 4.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/25-Playback Tutorial 5.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/26-Playback Tutorial 6.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/27-Playback Tutorial 7.xcscheme86
-rw-r--r--tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist64
288 files changed, 24591 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 1d95d59..cad237a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,24 @@
/built_doc
/hotdoc-private*
+Debug
+Release
+ipch
+*.user
+*.sdf
+*.suo
+*.opensdf
+vs/2010/libs
+bin
+gen
+libs
+obj
+.classpath
+.project
+.settings
+.libs
+.cproject
+gst-build
+project.properties
+gst_sdk
+.DS_Store
+xcuserdata
diff --git a/tutorials/android-tutorial-1/AndroidManifest.xml b/tutorials/android-tutorial-1/AndroidManifest.xml
new file mode 100644
index 0000000..2086bc5
--- /dev/null
+++ b/tutorials/android-tutorial-1/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.freedesktop.gstreamer.tutorials.tutorial_1"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
+ <application android:label="@string/app_name"
+ android:icon="@drawable/gstreamer_logo_1">
+ <activity android:name=".Tutorial1"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tutorials/android-tutorial-1/jni/Android.mk b/tutorials/android-tutorial-1/jni/Android.mk
new file mode 100644
index 0000000..ae15498
--- /dev/null
+++ b/tutorials/android-tutorial-1/jni/Android.mk
@@ -0,0 +1,31 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := tutorial-1
+LOCAL_SRC_FILES := tutorial-1.c
+LOCAL_SHARED_LIBRARIES := gstreamer_android
+LOCAL_LDLIBS := -llog
+include $(BUILD_SHARED_LIBRARY)
+
+ifndef GSTREAMER_ROOT_ANDROID
+$(error GSTREAMER_ROOT_ANDROID is not defined!)
+endif
+
+ifeq ($(TARGET_ARCH_ABI),armeabi)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
+else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
+else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
+else ifeq ($(TARGET_ARCH_ABI),x86)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
+else ifeq ($(TARGET_ARCH_ABI),x86_64)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
+else
+$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
+endif
+
+GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
+GSTREAMER_PLUGINS := coreelements
+include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
diff --git a/tutorials/android-tutorial-1/jni/Application.mk b/tutorials/android-tutorial-1/jni/Application.mk
new file mode 100644
index 0000000..b8848e8
--- /dev/null
+++ b/tutorials/android-tutorial-1/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI = armeabi armeabi-v7a arm64-v8a x86 x86_64
diff --git a/tutorials/android-tutorial-1/jni/tutorial-1.c b/tutorials/android-tutorial-1/jni/tutorial-1.c
new file mode 100644
index 0000000..1599489
--- /dev/null
+++ b/tutorials/android-tutorial-1/jni/tutorial-1.c
@@ -0,0 +1,31 @@
+#include <string.h>
+#include <jni.h>
+#include <android/log.h>
+#include <gst/gst.h>
+
+/*
+ * Java Bindings
+ */
+static jstring gst_native_get_gstreamer_info (JNIEnv* env, jobject thiz) {
+ char *version_utf8 = gst_version_string();
+ jstring *version_jstring = (*env)->NewStringUTF(env, version_utf8);
+ g_free (version_utf8);
+ return version_jstring;
+}
+
+static JNINativeMethod native_methods[] = {
+ { "nativeGetGStreamerInfo", "()Ljava/lang/String;", (void *) gst_native_get_gstreamer_info}
+};
+
+jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+ JNIEnv *env = NULL;
+
+ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-1", "Could not retrieve JNIEnv");
+ return 0;
+ }
+ jclass klass = (*env)->FindClass (env, "org/freedesktop/gstreamer/tutorials/tutorial_1/Tutorial1");
+ (*env)->RegisterNatives (env, klass, native_methods, G_N_ELEMENTS(native_methods));
+
+ return JNI_VERSION_1_4;
+}
diff --git a/tutorials/android-tutorial-1/res/drawable-hdpi/gstreamer_logo_1.png b/tutorials/android-tutorial-1/res/drawable-hdpi/gstreamer_logo_1.png
new file mode 100644
index 0000000..933899d
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/drawable-hdpi/gstreamer_logo_1.png
Binary files differ
diff --git a/tutorials/android-tutorial-1/res/drawable-ldpi/gstreamer_logo_1.png b/tutorials/android-tutorial-1/res/drawable-ldpi/gstreamer_logo_1.png
new file mode 100644
index 0000000..3e47dcb
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/drawable-ldpi/gstreamer_logo_1.png
Binary files differ
diff --git a/tutorials/android-tutorial-1/res/drawable-mdpi/gstreamer_logo_1.png b/tutorials/android-tutorial-1/res/drawable-mdpi/gstreamer_logo_1.png
new file mode 100644
index 0000000..fac2b7d
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/drawable-mdpi/gstreamer_logo_1.png
Binary files differ
diff --git a/tutorials/android-tutorial-1/res/drawable-xhdpi/gstreamer_logo_1.png b/tutorials/android-tutorial-1/res/drawable-xhdpi/gstreamer_logo_1.png
new file mode 100644
index 0000000..c9ab14a
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/drawable-xhdpi/gstreamer_logo_1.png
Binary files differ
diff --git a/tutorials/android-tutorial-1/res/drawable-xxhdpi/gstreamer_logo_1.png b/tutorials/android-tutorial-1/res/drawable-xxhdpi/gstreamer_logo_1.png
new file mode 100644
index 0000000..e721e56
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/drawable-xxhdpi/gstreamer_logo_1.png
Binary files differ
diff --git a/tutorials/android-tutorial-1/res/drawable-xxxhdpi/gstreamer_logo_1.png b/tutorials/android-tutorial-1/res/drawable-xxxhdpi/gstreamer_logo_1.png
new file mode 100644
index 0000000..55e8049
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/drawable-xxxhdpi/gstreamer_logo_1.png
Binary files differ
diff --git a/tutorials/android-tutorial-1/res/layout/main.xml b/tutorials/android-tutorial-1/res/layout/main.xml
new file mode 100644
index 0000000..5cf846b
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/layout/main.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/textview_info"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical|center_horizontal"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/tutorials/android-tutorial-1/res/values/strings.xml b/tutorials/android-tutorial-1/res/values/strings.xml
new file mode 100644
index 0000000..82e956d
--- /dev/null
+++ b/tutorials/android-tutorial-1/res/values/strings.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">GStreamer tutorial 1</string>
+</resources>
diff --git a/tutorials/android-tutorial-1/src/org/freedesktop/gstreamer/tutorials/tutorial_1/Tutorial1.java b/tutorials/android-tutorial-1/src/org/freedesktop/gstreamer/tutorials/tutorial_1/Tutorial1.java
new file mode 100644
index 0000000..74fd9f5
--- /dev/null
+++ b/tutorials/android-tutorial-1/src/org/freedesktop/gstreamer/tutorials/tutorial_1/Tutorial1.java
@@ -0,0 +1,38 @@
+package org.freedesktop.gstreamer.tutorials.tutorial_1;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.freedesktop.gstreamer.GStreamer;
+
+public class Tutorial1 extends Activity {
+ private native String nativeGetGStreamerInfo();
+
+ // Called when the activity is first created.
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ try {
+ GStreamer.init(this);
+ } catch (Exception e) {
+ Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
+ finish();
+ return;
+ }
+
+ setContentView(R.layout.main);
+
+ TextView tv = (TextView)findViewById(R.id.textview_info);
+ tv.setText("Welcome to " + nativeGetGStreamerInfo() + " !");
+ }
+
+ static {
+ System.loadLibrary("gstreamer_android");
+ System.loadLibrary("tutorial-1");
+ }
+
+}
diff --git a/tutorials/android-tutorial-2/AndroidManifest.xml b/tutorials/android-tutorial-2/AndroidManifest.xml
new file mode 100644
index 0000000..5f8dbcc
--- /dev/null
+++ b/tutorials/android-tutorial-2/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.freedesktop.gstreamer.tutorials.tutorial_2"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
+ <application android:label="@string/app_name"
+ android:icon="@drawable/gstreamer_logo_2">
+ <activity android:name=".Tutorial2"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tutorials/android-tutorial-2/jni/Android.mk b/tutorials/android-tutorial-2/jni/Android.mk
new file mode 100644
index 0000000..42ed3c6
--- /dev/null
+++ b/tutorials/android-tutorial-2/jni/Android.mk
@@ -0,0 +1,32 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := tutorial-2
+LOCAL_SRC_FILES := tutorial-2.c
+LOCAL_SHARED_LIBRARIES := gstreamer_android
+LOCAL_LDLIBS := -llog
+include $(BUILD_SHARED_LIBRARY)
+
+ifndef GSTREAMER_ROOT_ANDROID
+$(error GSTREAMER_ROOT_ANDROID is not defined!)
+endif
+
+ifeq ($(TARGET_ARCH_ABI),armeabi)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
+else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
+else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
+else ifeq ($(TARGET_ARCH_ABI),x86)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
+else ifeq ($(TARGET_ARCH_ABI),x86_64)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
+else
+$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
+endif
+
+GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
+include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
+GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_SYS)
+include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
diff --git a/tutorials/android-tutorial-2/jni/Application.mk b/tutorials/android-tutorial-2/jni/Application.mk
new file mode 100644
index 0000000..b8848e8
--- /dev/null
+++ b/tutorials/android-tutorial-2/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI = armeabi armeabi-v7a arm64-v8a x86 x86_64
diff --git a/tutorials/android-tutorial-2/jni/tutorial-2.c b/tutorials/android-tutorial-2/jni/tutorial-2.c
new file mode 100644
index 0000000..5fa780c
--- /dev/null
+++ b/tutorials/android-tutorial-2/jni/tutorial-2.c
@@ -0,0 +1,275 @@
+#include <string.h>
+#include <jni.h>
+#include <android/log.h>
+#include <gst/gst.h>
+#include <pthread.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+/*
+ * These macros provide a way to store the native pointer to CustomData, which might be 32 or 64 bits, into
+ * a jlong, which is always 64 bits, without warnings.
+ */
+#if GLIB_SIZEOF_VOID_P == 8
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)data)
+#else
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(jint)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)(jint)data)
+#endif
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ jobject app; /* Application instance, used to call its methods. A global reference is kept. */
+ GstElement *pipeline; /* The running pipeline */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+} CustomData;
+
+/* These global variables cache values which are not changing during execution */
+static pthread_t gst_app_thread;
+static pthread_key_t current_jni_env;
+static JavaVM *java_vm;
+static jfieldID custom_data_field_id;
+static jmethodID set_message_method_id;
+static jmethodID on_gstreamer_initialized_method_id;
+
+/*
+ * Private methods
+ */
+
+/* Register this thread with the VM */
+static JNIEnv *attach_current_thread (void) {
+ JNIEnv *env;
+ JavaVMAttachArgs args;
+
+ GST_DEBUG ("Attaching thread %p", g_thread_self ());
+ args.version = JNI_VERSION_1_4;
+ args.name = NULL;
+ args.group = NULL;
+
+ if ((*java_vm)->AttachCurrentThread (java_vm, &env, &args) < 0) {
+ GST_ERROR ("Failed to attach current thread");
+ return NULL;
+ }
+
+ return env;
+}
+
+/* Unregister this thread from the VM */
+static void detach_current_thread (void *env) {
+ GST_DEBUG ("Detaching thread %p", g_thread_self ());
+ (*java_vm)->DetachCurrentThread (java_vm);
+}
+
+/* Retrieve the JNI environment for this thread */
+static JNIEnv *get_jni_env (void) {
+ JNIEnv *env;
+
+ if ((env = pthread_getspecific (current_jni_env)) == NULL) {
+ env = attach_current_thread ();
+ pthread_setspecific (current_jni_env, env);
+ }
+
+ return env;
+}
+
+/* Change the content of the UI's TextView */
+static void set_ui_message (const gchar *message, CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ GST_DEBUG ("Setting message to: %s", message);
+ jstring jmessage = (*env)->NewStringUTF(env, message);
+ (*env)->CallVoidMethod (env, data->app, set_message_method_id, jmessage);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ (*env)->DeleteLocalRef (env, jmessage);
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ set_ui_message (message_string, data);
+ g_free (message_string);
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->pipeline)) {
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ set_ui_message(message, data);
+ g_free (message);
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+static void check_initialization_complete (CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ if (!data->initialized && data->main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application. main_loop:%p", data->main_loop);
+ (*env)->CallVoidMethod (env, data->app, on_gstreamer_initialized_method_id);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ data->initialized = TRUE;
+ }
+}
+
+/* Main method for the native code. This is executed on its own thread. */
+static void *app_function (void *userdata) {
+ JavaVMAttachArgs args;
+ GstBus *bus;
+ CustomData *data = (CustomData *)userdata;
+ GSource *bus_source;
+ GError *error = NULL;
+
+ GST_DEBUG ("Creating pipeline in CustomData at %p", data);
+
+ /* Create our own GLib Main Context and make it the default one */
+ data->context = g_main_context_new ();
+ g_main_context_push_thread_default(data->context);
+
+ /* Build pipeline */
+ data->pipeline = gst_parse_launch("audiotestsrc ! audioconvert ! audioresample ! autoaudiosink", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ set_ui_message(message, data);
+ g_free (message);
+ return NULL;
+ }
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (data->pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, data->context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, data);
+ gst_object_unref (bus);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop... (CustomData:%p)", data);
+ data->main_loop = g_main_loop_new (data->context, FALSE);
+ check_initialization_complete (data);
+ g_main_loop_run (data->main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (data->main_loop);
+ data->main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(data->context);
+ g_main_context_unref (data->context);
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+ gst_object_unref (data->pipeline);
+
+ return NULL;
+}
+
+/*
+ * Java Bindings
+ */
+
+/* Instruct the native code to create its internal data structure, pipeline and thread */
+static void gst_native_init (JNIEnv* env, jobject thiz) {
+ CustomData *data = g_new0 (CustomData, 1);
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, data);
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-2", 0, "Android tutorial 2");
+ gst_debug_set_threshold_for_name("tutorial-2", GST_LEVEL_DEBUG);
+ GST_DEBUG ("Created CustomData at %p", data);
+ data->app = (*env)->NewGlobalRef (env, thiz);
+ GST_DEBUG ("Created GlobalRef for app object at %p", data->app);
+ pthread_create (&gst_app_thread, NULL, &app_function, data);
+}
+
+/* Quit the main loop, remove the native thread and free resources */
+static void gst_native_finalize (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Quitting main loop...");
+ g_main_loop_quit (data->main_loop);
+ GST_DEBUG ("Waiting for thread to finish...");
+ pthread_join (gst_app_thread, NULL);
+ GST_DEBUG ("Deleting GlobalRef for app object at %p", data->app);
+ (*env)->DeleteGlobalRef (env, data->app);
+ GST_DEBUG ("Freeing CustomData at %p", data);
+ g_free (data);
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, NULL);
+ GST_DEBUG ("Done finalizing");
+}
+
+/* Set pipeline to PLAYING state */
+static void gst_native_play (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PLAYING");
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+}
+
+/* Set pipeline to PAUSED state */
+static void gst_native_pause (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PAUSED");
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+}
+
+/* Static class initializer: retrieve method and field IDs */
+static jboolean gst_native_class_init (JNIEnv* env, jclass klass) {
+ custom_data_field_id = (*env)->GetFieldID (env, klass, "native_custom_data", "J");
+ set_message_method_id = (*env)->GetMethodID (env, klass, "setMessage", "(Ljava/lang/String;)V");
+ on_gstreamer_initialized_method_id = (*env)->GetMethodID (env, klass, "onGStreamerInitialized", "()V");
+
+ if (!custom_data_field_id || !set_message_method_id || !on_gstreamer_initialized_method_id) {
+ /* We emit this message through the Android log instead of the GStreamer log because the later
+ * has not been initialized yet.
+ */
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-2", "The calling class does not implement all necessary interface methods");
+ return JNI_FALSE;
+ }
+ return JNI_TRUE;
+}
+
+/* List of implemented native methods */
+static JNINativeMethod native_methods[] = {
+ { "nativeInit", "()V", (void *) gst_native_init},
+ { "nativeFinalize", "()V", (void *) gst_native_finalize},
+ { "nativePlay", "()V", (void *) gst_native_play},
+ { "nativePause", "()V", (void *) gst_native_pause},
+ { "nativeClassInit", "()Z", (void *) gst_native_class_init}
+};
+
+/* Library initializer */
+jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+ JNIEnv *env = NULL;
+
+ java_vm = vm;
+
+ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-2", "Could not retrieve JNIEnv");
+ return 0;
+ }
+ jclass klass = (*env)->FindClass (env, "org/freedesktop/gstreamer/tutorials/tutorial_2/Tutorial2");
+ (*env)->RegisterNatives (env, klass, native_methods, G_N_ELEMENTS(native_methods));
+
+ pthread_key_create (&current_jni_env, detach_current_thread);
+
+ return JNI_VERSION_1_4;
+}
diff --git a/tutorials/android-tutorial-2/res/drawable-hdpi/gstreamer_logo_2.png b/tutorials/android-tutorial-2/res/drawable-hdpi/gstreamer_logo_2.png
new file mode 100644
index 0000000..a390d09
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/drawable-hdpi/gstreamer_logo_2.png
Binary files differ
diff --git a/tutorials/android-tutorial-2/res/drawable-ldpi/gstreamer_logo_2.png b/tutorials/android-tutorial-2/res/drawable-ldpi/gstreamer_logo_2.png
new file mode 100644
index 0000000..7386cb9
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/drawable-ldpi/gstreamer_logo_2.png
Binary files differ
diff --git a/tutorials/android-tutorial-2/res/drawable-mdpi/gstreamer_logo_2.png b/tutorials/android-tutorial-2/res/drawable-mdpi/gstreamer_logo_2.png
new file mode 100644
index 0000000..59e97ea
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/drawable-mdpi/gstreamer_logo_2.png
Binary files differ
diff --git a/tutorials/android-tutorial-2/res/drawable-xhdpi/gstreamer_logo_2.png b/tutorials/android-tutorial-2/res/drawable-xhdpi/gstreamer_logo_2.png
new file mode 100644
index 0000000..e383899
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/drawable-xhdpi/gstreamer_logo_2.png
Binary files differ
diff --git a/tutorials/android-tutorial-2/res/drawable-xxhdpi/gstreamer_logo_2.png b/tutorials/android-tutorial-2/res/drawable-xxhdpi/gstreamer_logo_2.png
new file mode 100644
index 0000000..d3ea6f0
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/drawable-xxhdpi/gstreamer_logo_2.png
Binary files differ
diff --git a/tutorials/android-tutorial-2/res/drawable-xxxhdpi/gstreamer_logo_2.png b/tutorials/android-tutorial-2/res/drawable-xxxhdpi/gstreamer_logo_2.png
new file mode 100644
index 0000000..9493e75
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/drawable-xxxhdpi/gstreamer_logo_2.png
Binary files differ
diff --git a/tutorials/android-tutorial-2/res/layout/main.xml b/tutorials/android-tutorial-2/res/layout/main.xml
new file mode 100644
index 0000000..2399033
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/layout/main.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/textview_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+ <ImageButton
+ android:id="@+id/button_play"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_play"
+ android:src="@android:drawable/ic_media_play"
+ android:text="@string/button_play" />
+
+ <ImageButton
+ android:id="@+id/button_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_stop"
+ android:src="@android:drawable/ic_media_pause"
+ android:text="@string/button_stop" />
+ </LinearLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/tutorials/android-tutorial-2/res/values/strings.xml b/tutorials/android-tutorial-2/res/values/strings.xml
new file mode 100644
index 0000000..25216d1
--- /dev/null
+++ b/tutorials/android-tutorial-2/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">GStreamer tutorial 2</string>
+ <string name="button_play">Play</string>
+ <string name="button_stop">Stop</string>
+</resources>
diff --git a/tutorials/android-tutorial-2/src/org/freedesktop/gstreamer/tutorials/tutorial_2/Tutorial2.java b/tutorials/android-tutorial-2/src/org/freedesktop/gstreamer/tutorials/tutorial_2/Tutorial2.java
new file mode 100644
index 0000000..c1f6068
--- /dev/null
+++ b/tutorials/android-tutorial-2/src/org/freedesktop/gstreamer/tutorials/tutorial_2/Tutorial2.java
@@ -0,0 +1,119 @@
+package org.freedesktop.gstreamer.tutorials.tutorial_2;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.freedesktop.gstreamer.GStreamer;
+
+public class Tutorial2 extends Activity {
+ private native void nativeInit(); // Initialize native code, build pipeline, etc
+ private native void nativeFinalize(); // Destroy pipeline and shutdown native code
+ private native void nativePlay(); // Set pipeline to PLAYING
+ private native void nativePause(); // Set pipeline to PAUSED
+ private static native boolean nativeClassInit(); // Initialize native class: cache Method IDs for callbacks
+ private long native_custom_data; // Native code will use this to keep private data
+
+ private boolean is_playing_desired; // Whether the user asked to go to PLAYING
+
+ // Called when the activity is first created.
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ // Initialize GStreamer and warn if it fails
+ try {
+ GStreamer.init(this);
+ } catch (Exception e) {
+ Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
+ finish();
+ return;
+ }
+
+ setContentView(R.layout.main);
+
+ ImageButton play = (ImageButton) this.findViewById(R.id.button_play);
+ play.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = true;
+ nativePlay();
+ }
+ });
+
+ ImageButton pause = (ImageButton) this.findViewById(R.id.button_stop);
+ pause.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = false;
+ nativePause();
+ }
+ });
+
+ if (savedInstanceState != null) {
+ is_playing_desired = savedInstanceState.getBoolean("playing");
+ Log.i ("GStreamer", "Activity created. Saved state is playing:" + is_playing_desired);
+ } else {
+ is_playing_desired = false;
+ Log.i ("GStreamer", "Activity created. There is no saved state, playing: false");
+ }
+
+ // Start with disabled buttons, until native code is initialized
+ this.findViewById(R.id.button_play).setEnabled(false);
+ this.findViewById(R.id.button_stop).setEnabled(false);
+
+ nativeInit();
+ }
+
+ protected void onSaveInstanceState (Bundle outState) {
+ Log.d ("GStreamer", "Saving state, playing:" + is_playing_desired);
+ outState.putBoolean("playing", is_playing_desired);
+ }
+
+ protected void onDestroy() {
+ nativeFinalize();
+ super.onDestroy();
+ }
+
+ // Called from native code. This sets the content of the TextView from the UI thread.
+ private void setMessage(final String message) {
+ final TextView tv = (TextView) this.findViewById(R.id.textview_message);
+ runOnUiThread (new Runnable() {
+ public void run() {
+ tv.setText(message);
+ }
+ });
+ }
+
+ // Called from native code. Native code calls this once it has created its pipeline and
+ // the main loop is running, so it is ready to accept commands.
+ private void onGStreamerInitialized () {
+ Log.i ("GStreamer", "Gst initialized. Restoring state, playing:" + is_playing_desired);
+ // Restore previous playing state
+ if (is_playing_desired) {
+ nativePlay();
+ } else {
+ nativePause();
+ }
+
+ // Re-enable buttons, now that GStreamer is initialized
+ final Activity activity = this;
+ runOnUiThread(new Runnable() {
+ public void run() {
+ activity.findViewById(R.id.button_play).setEnabled(true);
+ activity.findViewById(R.id.button_stop).setEnabled(true);
+ }
+ });
+ }
+
+ static {
+ System.loadLibrary("gstreamer_android");
+ System.loadLibrary("tutorial-2");
+ nativeClassInit();
+ }
+
+}
diff --git a/tutorials/android-tutorial-3/AndroidManifest.xml b/tutorials/android-tutorial-3/AndroidManifest.xml
new file mode 100644
index 0000000..6817677
--- /dev/null
+++ b/tutorials/android-tutorial-3/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.freedesktop.gstreamer.tutorials.tutorial_3"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
+ <uses-feature android:glEsVersion="0x00020000"/>
+ <application android:label="@string/app_name"
+ android:icon="@drawable/gstreamer_logo_3">
+ <activity android:name=".Tutorial3"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tutorials/android-tutorial-3/jni/Android.mk b/tutorials/android-tutorial-3/jni/Android.mk
new file mode 100644
index 0000000..537e621
--- /dev/null
+++ b/tutorials/android-tutorial-3/jni/Android.mk
@@ -0,0 +1,33 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := tutorial-3
+LOCAL_SRC_FILES := tutorial-3.c
+LOCAL_SHARED_LIBRARIES := gstreamer_android
+LOCAL_LDLIBS := -llog -landroid
+include $(BUILD_SHARED_LIBRARY)
+
+ifndef GSTREAMER_ROOT_ANDROID
+$(error GSTREAMER_ROOT_ANDROID is not defined!)
+endif
+
+ifeq ($(TARGET_ARCH_ABI),armeabi)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
+else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
+else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
+else ifeq ($(TARGET_ARCH_ABI),x86)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
+else ifeq ($(TARGET_ARCH_ABI),x86_64)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
+else
+$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
+endif
+
+GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
+include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
+GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_SYS) $(GSTREAMER_PLUGINS_EFFECTS)
+GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0
+include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
diff --git a/tutorials/android-tutorial-3/jni/Application.mk b/tutorials/android-tutorial-3/jni/Application.mk
new file mode 100644
index 0000000..b8848e8
--- /dev/null
+++ b/tutorials/android-tutorial-3/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI = armeabi armeabi-v7a arm64-v8a x86 x86_64
diff --git a/tutorials/android-tutorial-3/jni/tutorial-3.c b/tutorials/android-tutorial-3/jni/tutorial-3.c
new file mode 100644
index 0000000..c713a5c
--- /dev/null
+++ b/tutorials/android-tutorial-3/jni/tutorial-3.c
@@ -0,0 +1,337 @@
+#include <string.h>
+#include <stdint.h>
+#include <jni.h>
+#include <android/log.h>
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <pthread.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+/*
+ * These macros provide a way to store the native pointer to CustomData, which might be 32 or 64 bits, into
+ * a jlong, which is always 64 bits, without warnings.
+ */
+#if GLIB_SIZEOF_VOID_P == 8
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)data)
+#else
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(jint)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)(jint)data)
+#endif
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ jobject app; /* Application instance, used to call its methods. A global reference is kept. */
+ GstElement *pipeline; /* The running pipeline */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+ GstElement *video_sink; /* The video sink element which receives XOverlay commands */
+ ANativeWindow *native_window; /* The Android native window where video will be rendered */
+} CustomData;
+
+/* These global variables cache values which are not changing during execution */
+static pthread_t gst_app_thread;
+static pthread_key_t current_jni_env;
+static JavaVM *java_vm;
+static jfieldID custom_data_field_id;
+static jmethodID set_message_method_id;
+static jmethodID on_gstreamer_initialized_method_id;
+
+/*
+ * Private methods
+ */
+
+/* Register this thread with the VM */
+static JNIEnv *attach_current_thread (void) {
+ JNIEnv *env;
+ JavaVMAttachArgs args;
+
+ GST_DEBUG ("Attaching thread %p", g_thread_self ());
+ args.version = JNI_VERSION_1_4;
+ args.name = NULL;
+ args.group = NULL;
+
+ if ((*java_vm)->AttachCurrentThread (java_vm, &env, &args) < 0) {
+ GST_ERROR ("Failed to attach current thread");
+ return NULL;
+ }
+
+ return env;
+}
+
+/* Unregister this thread from the VM */
+static void detach_current_thread (void *env) {
+ GST_DEBUG ("Detaching thread %p", g_thread_self ());
+ (*java_vm)->DetachCurrentThread (java_vm);
+}
+
+/* Retrieve the JNI environment for this thread */
+static JNIEnv *get_jni_env (void) {
+ JNIEnv *env;
+
+ if ((env = pthread_getspecific (current_jni_env)) == NULL) {
+ env = attach_current_thread ();
+ pthread_setspecific (current_jni_env, env);
+ }
+
+ return env;
+}
+
+/* Change the content of the UI's TextView */
+static void set_ui_message (const gchar *message, CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ GST_DEBUG ("Setting message to: %s", message);
+ jstring jmessage = (*env)->NewStringUTF(env, message);
+ (*env)->CallVoidMethod (env, data->app, set_message_method_id, jmessage);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ (*env)->DeleteLocalRef (env, jmessage);
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ set_ui_message (message_string, data);
+ g_free (message_string);
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->pipeline)) {
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ set_ui_message(message, data);
+ g_free (message);
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+static void check_initialization_complete (CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ if (!data->initialized && data->native_window && data->main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application. native_window:%p main_loop:%p", data->native_window, data->main_loop);
+
+ /* The main loop is running and we received a native window, inform the sink about it */
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->video_sink), (guintptr)data->native_window);
+
+ (*env)->CallVoidMethod (env, data->app, on_gstreamer_initialized_method_id);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ data->initialized = TRUE;
+ }
+}
+
+/* Main method for the native code. This is executed on its own thread. */
+static void *app_function (void *userdata) {
+ JavaVMAttachArgs args;
+ GstBus *bus;
+ CustomData *data = (CustomData *)userdata;
+ GSource *bus_source;
+ GError *error = NULL;
+
+ GST_DEBUG ("Creating pipeline in CustomData at %p", data);
+
+ /* Create our own GLib Main Context and make it the default one */
+ data->context = g_main_context_new ();
+ g_main_context_push_thread_default(data->context);
+
+ /* Build pipeline */
+ data->pipeline = gst_parse_launch("videotestsrc ! warptv ! videoconvert ! autovideosink", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ set_ui_message(message, data);
+ g_free (message);
+ return NULL;
+ }
+
+ /* Set the pipeline to READY, so it can already accept a window handle, if we have one */
+ gst_element_set_state(data->pipeline, GST_STATE_READY);
+
+ data->video_sink = gst_bin_get_by_interface(GST_BIN(data->pipeline), GST_TYPE_VIDEO_OVERLAY);
+ if (!data->video_sink) {
+ GST_ERROR ("Could not retrieve video sink");
+ return NULL;
+ }
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (data->pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, data->context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, data);
+ gst_object_unref (bus);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop... (CustomData:%p)", data);
+ data->main_loop = g_main_loop_new (data->context, FALSE);
+ check_initialization_complete (data);
+ g_main_loop_run (data->main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (data->main_loop);
+ data->main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(data->context);
+ g_main_context_unref (data->context);
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+ gst_object_unref (data->video_sink);
+ gst_object_unref (data->pipeline);
+
+ return NULL;
+}
+
+/*
+ * Java Bindings
+ */
+
+/* Instruct the native code to create its internal data structure, pipeline and thread */
+static void gst_native_init (JNIEnv* env, jobject thiz) {
+ CustomData *data = g_new0 (CustomData, 1);
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, data);
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-3", 0, "Android tutorial 3");
+ gst_debug_set_threshold_for_name("tutorial-3", GST_LEVEL_DEBUG);
+ GST_DEBUG ("Created CustomData at %p", data);
+ data->app = (*env)->NewGlobalRef (env, thiz);
+ GST_DEBUG ("Created GlobalRef for app object at %p", data->app);
+ pthread_create (&gst_app_thread, NULL, &app_function, data);
+}
+
+/* Quit the main loop, remove the native thread and free resources */
+static void gst_native_finalize (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Quitting main loop...");
+ g_main_loop_quit (data->main_loop);
+ GST_DEBUG ("Waiting for thread to finish...");
+ pthread_join (gst_app_thread, NULL);
+ GST_DEBUG ("Deleting GlobalRef for app object at %p", data->app);
+ (*env)->DeleteGlobalRef (env, data->app);
+ GST_DEBUG ("Freeing CustomData at %p", data);
+ g_free (data);
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, NULL);
+ GST_DEBUG ("Done finalizing");
+}
+
+/* Set pipeline to PLAYING state */
+static void gst_native_play (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PLAYING");
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+}
+
+/* Set pipeline to PAUSED state */
+static void gst_native_pause (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PAUSED");
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+}
+
+/* Static class initializer: retrieve method and field IDs */
+static jboolean gst_native_class_init (JNIEnv* env, jclass klass) {
+ custom_data_field_id = (*env)->GetFieldID (env, klass, "native_custom_data", "J");
+ set_message_method_id = (*env)->GetMethodID (env, klass, "setMessage", "(Ljava/lang/String;)V");
+ on_gstreamer_initialized_method_id = (*env)->GetMethodID (env, klass, "onGStreamerInitialized", "()V");
+
+ if (!custom_data_field_id || !set_message_method_id || !on_gstreamer_initialized_method_id) {
+ /* We emit this message through the Android log instead of the GStreamer log because the later
+ * has not been initialized yet.
+ */
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-3", "The calling class does not implement all necessary interface methods");
+ return JNI_FALSE;
+ }
+ return JNI_TRUE;
+}
+
+static void gst_native_surface_init (JNIEnv *env, jobject thiz, jobject surface) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ ANativeWindow *new_native_window = ANativeWindow_fromSurface(env, surface);
+ GST_DEBUG ("Received surface %p (native window %p)", surface, new_native_window);
+
+ if (data->native_window) {
+ ANativeWindow_release (data->native_window);
+ if (data->native_window == new_native_window) {
+ GST_DEBUG ("New native window is the same as the previous one %p", data->native_window);
+ if (data->video_sink) {
+ gst_video_overlay_expose(GST_VIDEO_OVERLAY (data->video_sink));
+ gst_video_overlay_expose(GST_VIDEO_OVERLAY (data->video_sink));
+ }
+ return;
+ } else {
+ GST_DEBUG ("Released previous native window %p", data->native_window);
+ data->initialized = FALSE;
+ }
+ }
+ data->native_window = new_native_window;
+
+ check_initialization_complete (data);
+}
+
+static void gst_native_surface_finalize (JNIEnv *env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Releasing Native Window %p", data->native_window);
+
+ if (data->video_sink) {
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->video_sink), (guintptr)NULL);
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ }
+
+ ANativeWindow_release (data->native_window);
+ data->native_window = NULL;
+ data->initialized = FALSE;
+}
+
+/* List of implemented native methods */
+static JNINativeMethod native_methods[] = {
+ { "nativeInit", "()V", (void *) gst_native_init},
+ { "nativeFinalize", "()V", (void *) gst_native_finalize},
+ { "nativePlay", "()V", (void *) gst_native_play},
+ { "nativePause", "()V", (void *) gst_native_pause},
+ { "nativeSurfaceInit", "(Ljava/lang/Object;)V", (void *) gst_native_surface_init},
+ { "nativeSurfaceFinalize", "()V", (void *) gst_native_surface_finalize},
+ { "nativeClassInit", "()Z", (void *) gst_native_class_init}
+};
+
+/* Library initializer */
+jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+ JNIEnv *env = NULL;
+
+ java_vm = vm;
+
+ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-3", "Could not retrieve JNIEnv");
+ return 0;
+ }
+ jclass klass = (*env)->FindClass (env, "org/freedesktop/gstreamer/tutorials/tutorial_3/Tutorial3");
+ (*env)->RegisterNatives (env, klass, native_methods, G_N_ELEMENTS(native_methods));
+
+ pthread_key_create (&current_jni_env, detach_current_thread);
+
+ return JNI_VERSION_1_4;
+}
diff --git a/tutorials/android-tutorial-3/res/drawable-hdpi/gstreamer_logo_3.png b/tutorials/android-tutorial-3/res/drawable-hdpi/gstreamer_logo_3.png
new file mode 100644
index 0000000..47d9a80
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/drawable-hdpi/gstreamer_logo_3.png
Binary files differ
diff --git a/tutorials/android-tutorial-3/res/drawable-ldpi/gstreamer_logo_3.png b/tutorials/android-tutorial-3/res/drawable-ldpi/gstreamer_logo_3.png
new file mode 100644
index 0000000..fd2c41b
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/drawable-ldpi/gstreamer_logo_3.png
Binary files differ
diff --git a/tutorials/android-tutorial-3/res/drawable-mdpi/gstreamer_logo_3.png b/tutorials/android-tutorial-3/res/drawable-mdpi/gstreamer_logo_3.png
new file mode 100644
index 0000000..652d0f7
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/drawable-mdpi/gstreamer_logo_3.png
Binary files differ
diff --git a/tutorials/android-tutorial-3/res/drawable-xhdpi/gstreamer_logo_3.png b/tutorials/android-tutorial-3/res/drawable-xhdpi/gstreamer_logo_3.png
new file mode 100644
index 0000000..7dac7d9
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/drawable-xhdpi/gstreamer_logo_3.png
Binary files differ
diff --git a/tutorials/android-tutorial-3/res/drawable-xxhdpi/gstreamer_logo_3.png b/tutorials/android-tutorial-3/res/drawable-xxhdpi/gstreamer_logo_3.png
new file mode 100644
index 0000000..b51ecc5
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/drawable-xxhdpi/gstreamer_logo_3.png
Binary files differ
diff --git a/tutorials/android-tutorial-3/res/drawable-xxxhdpi/gstreamer_logo_3.png b/tutorials/android-tutorial-3/res/drawable-xxxhdpi/gstreamer_logo_3.png
new file mode 100644
index 0000000..6cc26c0
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/drawable-xxxhdpi/gstreamer_logo_3.png
Binary files differ
diff --git a/tutorials/android-tutorial-3/res/layout/main.xml b/tutorials/android-tutorial-3/res/layout/main.xml
new file mode 100644
index 0000000..9b1218d
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/layout/main.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/textview_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+ <ImageButton
+ android:id="@+id/button_play"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_play"
+ android:src="@android:drawable/ic_media_play"
+ android:text="@string/button_play" />
+
+ <ImageButton
+ android:id="@+id/button_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_stop"
+ android:src="@android:drawable/ic_media_pause"
+ android:text="@string/button_stop" />
+ </LinearLayout>
+
+ <org.freedesktop.gstreamer.tutorials.tutorial_3.GStreamerSurfaceView
+ android:id="@+id/surface_video"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|center_horizontal" />
+
+</LinearLayout>
diff --git a/tutorials/android-tutorial-3/res/values/strings.xml b/tutorials/android-tutorial-3/res/values/strings.xml
new file mode 100644
index 0000000..9f5f9cd
--- /dev/null
+++ b/tutorials/android-tutorial-3/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">GStreamer tutorial 3</string>
+ <string name="button_play">Play</string>
+ <string name="button_stop">Stop</string>
+</resources>
diff --git a/tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/GStreamerSurfaceView.java b/tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/GStreamerSurfaceView.java
new file mode 100644
index 0000000..9af8aba
--- /dev/null
+++ b/tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/GStreamerSurfaceView.java
@@ -0,0 +1,85 @@
+package org.freedesktop.gstreamer.tutorials.tutorial_3;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.view.View;
+
+// A simple SurfaceView whose width and height can be set from the outside
+public class GStreamerSurfaceView extends SurfaceView {
+ public int media_width = 320;
+ public int media_height = 240;
+
+ // Mandatory constructors, they do not do much
+ public GStreamerSurfaceView(Context context, AttributeSet attrs,
+ int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public GStreamerSurfaceView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public GStreamerSurfaceView (Context context) {
+ super(context);
+ }
+
+ // Called by the layout manager to find out our size and give us some rules.
+ // We will try to maximize our size, and preserve the media's aspect ratio if
+ // we are given the freedom to do so.
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int width = 0, height = 0;
+ int wmode = View.MeasureSpec.getMode(widthMeasureSpec);
+ int hmode = View.MeasureSpec.getMode(heightMeasureSpec);
+ int wsize = View.MeasureSpec.getSize(widthMeasureSpec);
+ int hsize = View.MeasureSpec.getSize(heightMeasureSpec);
+
+ Log.i ("GStreamer", "onMeasure called with " + media_width + "x" + media_height);
+ // Obey width rules
+ switch (wmode) {
+ case View.MeasureSpec.AT_MOST:
+ if (hmode == View.MeasureSpec.EXACTLY) {
+ width = Math.min(hsize * media_width / media_height, wsize);
+ break;
+ }
+ case View.MeasureSpec.EXACTLY:
+ width = wsize;
+ break;
+ case View.MeasureSpec.UNSPECIFIED:
+ width = media_width;
+ }
+
+ // Obey height rules
+ switch (hmode) {
+ case View.MeasureSpec.AT_MOST:
+ if (wmode == View.MeasureSpec.EXACTLY) {
+ height = Math.min(wsize * media_height / media_width, hsize);
+ break;
+ }
+ case View.MeasureSpec.EXACTLY:
+ height = hsize;
+ break;
+ case View.MeasureSpec.UNSPECIFIED:
+ height = media_height;
+ }
+
+ // Finally, calculate best size when both axis are free
+ if (hmode == View.MeasureSpec.AT_MOST && wmode == View.MeasureSpec.AT_MOST) {
+ int correct_height = width * media_height / media_width;
+ int correct_width = height * media_width / media_height;
+
+ if (correct_height < height)
+ height = correct_height;
+ else
+ width = correct_width;
+ }
+
+ // Obey minimum size
+ width = Math.max (getSuggestedMinimumWidth(), width);
+ height = Math.max (getSuggestedMinimumHeight(), height);
+ setMeasuredDimension(width, height);
+ }
+
+}
diff --git a/tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/Tutorial3.java b/tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/Tutorial3.java
new file mode 100644
index 0000000..1be3bf7
--- /dev/null
+++ b/tutorials/android-tutorial-3/src/org/freedesktop/gstreamer/tutorial_3/Tutorial3.java
@@ -0,0 +1,143 @@
+package org.freedesktop.gstreamer.tutorials.tutorial_3;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.freedesktop.gstreamer.GStreamer;
+
+public class Tutorial3 extends Activity implements SurfaceHolder.Callback {
+ private native void nativeInit(); // Initialize native code, build pipeline, etc
+ private native void nativeFinalize(); // Destroy pipeline and shutdown native code
+ private native void nativePlay(); // Set pipeline to PLAYING
+ private native void nativePause(); // Set pipeline to PAUSED
+ private static native boolean nativeClassInit(); // Initialize native class: cache Method IDs for callbacks
+ private native void nativeSurfaceInit(Object surface);
+ private native void nativeSurfaceFinalize();
+ private long native_custom_data; // Native code will use this to keep private data
+
+ private boolean is_playing_desired; // Whether the user asked to go to PLAYING
+
+ // Called when the activity is first created.
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ // Initialize GStreamer and warn if it fails
+ try {
+ GStreamer.init(this);
+ } catch (Exception e) {
+ Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
+ finish();
+ return;
+ }
+
+ setContentView(R.layout.main);
+
+ ImageButton play = (ImageButton) this.findViewById(R.id.button_play);
+ play.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = true;
+ nativePlay();
+ }
+ });
+
+ ImageButton pause = (ImageButton) this.findViewById(R.id.button_stop);
+ pause.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = false;
+ nativePause();
+ }
+ });
+
+ SurfaceView sv = (SurfaceView) this.findViewById(R.id.surface_video);
+ SurfaceHolder sh = sv.getHolder();
+ sh.addCallback(this);
+
+ if (savedInstanceState != null) {
+ is_playing_desired = savedInstanceState.getBoolean("playing");
+ Log.i ("GStreamer", "Activity created. Saved state is playing:" + is_playing_desired);
+ } else {
+ is_playing_desired = false;
+ Log.i ("GStreamer", "Activity created. There is no saved state, playing: false");
+ }
+
+ // Start with disabled buttons, until native code is initialized
+ this.findViewById(R.id.button_play).setEnabled(false);
+ this.findViewById(R.id.button_stop).setEnabled(false);
+
+ nativeInit();
+ }
+
+ protected void onSaveInstanceState (Bundle outState) {
+ Log.d ("GStreamer", "Saving state, playing:" + is_playing_desired);
+ outState.putBoolean("playing", is_playing_desired);
+ }
+
+ protected void onDestroy() {
+ nativeFinalize();
+ super.onDestroy();
+ }
+
+ // Called from native code. This sets the content of the TextView from the UI thread.
+ private void setMessage(final String message) {
+ final TextView tv = (TextView) this.findViewById(R.id.textview_message);
+ runOnUiThread (new Runnable() {
+ public void run() {
+ tv.setText(message);
+ }
+ });
+ }
+
+ // Called from native code. Native code calls this once it has created its pipeline and
+ // the main loop is running, so it is ready to accept commands.
+ private void onGStreamerInitialized () {
+ Log.i ("GStreamer", "Gst initialized. Restoring state, playing:" + is_playing_desired);
+ // Restore previous playing state
+ if (is_playing_desired) {
+ nativePlay();
+ } else {
+ nativePause();
+ }
+
+ // Re-enable buttons, now that GStreamer is initialized
+ final Activity activity = this;
+ runOnUiThread(new Runnable() {
+ public void run() {
+ activity.findViewById(R.id.button_play).setEnabled(true);
+ activity.findViewById(R.id.button_stop).setEnabled(true);
+ }
+ });
+ }
+
+ static {
+ System.loadLibrary("gstreamer_android");
+ System.loadLibrary("tutorial-3");
+ nativeClassInit();
+ }
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int width,
+ int height) {
+ Log.d("GStreamer", "Surface changed to format " + format + " width "
+ + width + " height " + height);
+ nativeSurfaceInit (holder.getSurface());
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.d("GStreamer", "Surface created: " + holder.getSurface());
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.d("GStreamer", "Surface destroyed");
+ nativeSurfaceFinalize ();
+ }
+
+}
diff --git a/tutorials/android-tutorial-4/AndroidManifest.xml b/tutorials/android-tutorial-4/AndroidManifest.xml
new file mode 100644
index 0000000..c03e7fc
--- /dev/null
+++ b/tutorials/android-tutorial-4/AndroidManifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.gst_sdk_tutorials.tutorial_4"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="14"/>
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-feature android:glEsVersion="0x00020000"/>
+ <application android:label="@string/app_name"
+ android:icon="@drawable/gstreamer_logo_4">
+ <activity android:name=".Tutorial4"
+ android:label="@string/app_name">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tutorials/android-tutorial-4/jni/Android.mk b/tutorials/android-tutorial-4/jni/Android.mk
new file mode 100644
index 0000000..9c19ac5
--- /dev/null
+++ b/tutorials/android-tutorial-4/jni/Android.mk
@@ -0,0 +1,34 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := tutorial-4
+LOCAL_SRC_FILES := tutorial-4.c
+LOCAL_SHARED_LIBRARIES := gstreamer_android
+LOCAL_LDLIBS := -llog -landroid
+include $(BUILD_SHARED_LIBRARY)
+
+ifndef GSTREAMER_ROOT_ANDROID
+$(error GSTREAMER_ROOT_ANDROID is not defined!)
+endif
+
+ifeq ($(TARGET_ARCH_ABI),armeabi)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
+else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
+else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
+else ifeq ($(TARGET_ARCH_ABI),x86)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
+else ifeq ($(TARGET_ARCH_ABI),x86_64)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
+else
+$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
+endif
+
+GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
+include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
+GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_PLAYBACK) $(GSTREAMER_PLUGINS_CODECS) $(GSTREAMER_PLUGINS_NET) $(GSTREAMER_PLUGINS_SYS)
+G_IO_MODULES := gnutls
+GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0
+include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
diff --git a/tutorials/android-tutorial-4/jni/Application.mk b/tutorials/android-tutorial-4/jni/Application.mk
new file mode 100644
index 0000000..b8848e8
--- /dev/null
+++ b/tutorials/android-tutorial-4/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI = armeabi armeabi-v7a arm64-v8a x86 x86_64
diff --git a/tutorials/android-tutorial-4/jni/tutorial-4.c b/tutorials/android-tutorial-4/jni/tutorial-4.c
new file mode 100644
index 0000000..192ae9a
--- /dev/null
+++ b/tutorials/android-tutorial-4/jni/tutorial-4.c
@@ -0,0 +1,562 @@
+#include <string.h>
+#include <stdint.h>
+#include <jni.h>
+#include <android/log.h>
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <pthread.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+/*
+ * These macros provide a way to store the native pointer to CustomData, which might be 32 or 64 bits, into
+ * a jlong, which is always 64 bits, without warnings.
+ */
+#if GLIB_SIZEOF_VOID_P == 8
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)data)
+#else
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(jint)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)(jint)data)
+#endif
+
+/* Do not allow seeks to be performed closer than this distance. It is visually useless, and will probably
+ * confuse some demuxers. */
+#define SEEK_MIN_DELAY (500 * GST_MSECOND)
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ jobject app; /* Application instance, used to call its methods. A global reference is kept. */
+ GstElement *pipeline; /* The running pipeline */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+ ANativeWindow *native_window; /* The Android native window where video will be rendered */
+ GstState state; /* Current pipeline state */
+ GstState target_state; /* Desired pipeline state, to be set once buffering is complete */
+ gint64 duration; /* Cached clip duration */
+ gint64 desired_position; /* Position to seek to, once the pipeline is running */
+ GstClockTime last_seek_time; /* For seeking overflow prevention (throttling) */
+ gboolean is_live; /* Live streams do not use buffering */
+} CustomData;
+
+/* playbin flags */
+typedef enum {
+ GST_PLAY_FLAG_TEXT = (1 << 2) /* We want subtitle output */
+} GstPlayFlags;
+
+/* These global variables cache values which are not changing during execution */
+static pthread_t gst_app_thread;
+static pthread_key_t current_jni_env;
+static JavaVM *java_vm;
+static jfieldID custom_data_field_id;
+static jmethodID set_message_method_id;
+static jmethodID set_current_position_method_id;
+static jmethodID on_gstreamer_initialized_method_id;
+static jmethodID on_media_size_changed_method_id;
+
+/*
+ * Private methods
+ */
+
+/* Register this thread with the VM */
+static JNIEnv *attach_current_thread (void) {
+ JNIEnv *env;
+ JavaVMAttachArgs args;
+
+ GST_DEBUG ("Attaching thread %p", g_thread_self ());
+ args.version = JNI_VERSION_1_4;
+ args.name = NULL;
+ args.group = NULL;
+
+ if ((*java_vm)->AttachCurrentThread (java_vm, &env, &args) < 0) {
+ GST_ERROR ("Failed to attach current thread");
+ return NULL;
+ }
+
+ return env;
+}
+
+/* Unregister this thread from the VM */
+static void detach_current_thread (void *env) {
+ GST_DEBUG ("Detaching thread %p", g_thread_self ());
+ (*java_vm)->DetachCurrentThread (java_vm);
+}
+
+/* Retrieve the JNI environment for this thread */
+static JNIEnv *get_jni_env (void) {
+ JNIEnv *env;
+
+ if ((env = pthread_getspecific (current_jni_env)) == NULL) {
+ env = attach_current_thread ();
+ pthread_setspecific (current_jni_env, env);
+ }
+
+ return env;
+}
+
+/* Change the content of the UI's TextView */
+static void set_ui_message (const gchar *message, CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ GST_DEBUG ("Setting message to: %s", message);
+ jstring jmessage = (*env)->NewStringUTF(env, message);
+ (*env)->CallVoidMethod (env, data->app, set_message_method_id, jmessage);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ (*env)->DeleteLocalRef (env, jmessage);
+}
+
+/* Tell the application what is the current position and clip duration */
+static void set_current_ui_position (gint position, gint duration, CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ (*env)->CallVoidMethod (env, data->app, set_current_position_method_id, position, duration);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+}
+
+/* If we have pipeline and it is running, query the current position and clip duration and inform
+ * the application */
+static gboolean refresh_ui (CustomData *data) {
+ gint64 current = -1;
+ gint64 position;
+
+ /* We do not want to update anything unless we have a working pipeline in the PAUSED or PLAYING state */
+ if (!data || !data->pipeline || data->state < GST_STATE_PAUSED)
+ return TRUE;
+
+ /* If we didn't know it yet, query the stream duration */
+ if (!GST_CLOCK_TIME_IS_VALID (data->duration)) {
+ if (!gst_element_query_duration (data->pipeline, GST_FORMAT_TIME, &data->duration)) {
+ GST_WARNING ("Could not query current duration");
+ }
+ }
+
+ if (gst_element_query_position (data->pipeline, GST_FORMAT_TIME, &position)) {
+ /* Java expects these values in milliseconds, and GStreamer provides nanoseconds */
+ set_current_ui_position (position / GST_MSECOND, data->duration / GST_MSECOND, data);
+ }
+ return TRUE;
+}
+
+/* Forward declaration for the delayed seek callback */
+static gboolean delayed_seek_cb (CustomData *data);
+
+/* Perform seek, if we are not too close to the previous seek. Otherwise, schedule the seek for
+ * some time in the future. */
+static void execute_seek (gint64 desired_position, CustomData *data) {
+ gint64 diff;
+
+ if (desired_position == GST_CLOCK_TIME_NONE)
+ return;
+
+ diff = gst_util_get_timestamp () - data->last_seek_time;
+
+ if (GST_CLOCK_TIME_IS_VALID (data->last_seek_time) && diff < SEEK_MIN_DELAY) {
+ /* The previous seek was too close, delay this one */
+ GSource *timeout_source;
+
+ if (data->desired_position == GST_CLOCK_TIME_NONE) {
+ /* There was no previous seek scheduled. Setup a timer for some time in the future */
+ timeout_source = g_timeout_source_new ((SEEK_MIN_DELAY - diff) / GST_MSECOND);
+ g_source_set_callback (timeout_source, (GSourceFunc)delayed_seek_cb, data, NULL);
+ g_source_attach (timeout_source, data->context);
+ g_source_unref (timeout_source);
+ }
+ /* Update the desired seek position. If multiple requests are received before it is time
+ * to perform a seek, only the last one is remembered. */
+ data->desired_position = desired_position;
+ GST_DEBUG ("Throttling seek to %" GST_TIME_FORMAT ", will be in %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (desired_position), GST_TIME_ARGS (SEEK_MIN_DELAY - diff));
+ } else {
+ /* Perform the seek now */
+ GST_DEBUG ("Seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (desired_position));
+ data->last_seek_time = gst_util_get_timestamp ();
+ gst_element_seek_simple (data->pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, desired_position);
+ data->desired_position = GST_CLOCK_TIME_NONE;
+ }
+}
+
+/* Delayed seek callback. This gets called by the timer setup in the above function. */
+static gboolean delayed_seek_cb (CustomData *data) {
+ GST_DEBUG ("Doing delayed seek to %" GST_TIME_FORMAT, GST_TIME_ARGS (data->desired_position));
+ execute_seek (data->desired_position, data);
+ return FALSE;
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ set_ui_message (message_string, data);
+ g_free (message_string);
+ data->target_state = GST_STATE_NULL;
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+}
+
+/* Called when the End Of the Stream is reached. Just move to the beginning of the media and pause. */
+static void eos_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ data->target_state = GST_STATE_PAUSED;
+ data->is_live = (gst_element_set_state (data->pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+ execute_seek (0, data);
+}
+
+/* Called when the duration of the media changes. Just mark it as unknown, so we re-query it in the next UI refresh. */
+static void duration_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ data->duration = GST_CLOCK_TIME_NONE;
+}
+
+/* Called when buffering messages are received. We inform the UI about the current buffering level and
+ * keep the pipeline paused until 100% buffering is reached. At that point, set the desired state. */
+static void buffering_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ gint percent;
+
+ if (data->is_live)
+ return;
+
+ gst_message_parse_buffering (msg, &percent);
+ if (percent < 100 && data->target_state >= GST_STATE_PAUSED) {
+ gchar * message_string = g_strdup_printf ("Buffering %d%%", percent);
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ set_ui_message (message_string, data);
+ g_free (message_string);
+ } else if (data->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ } else if (data->target_state >= GST_STATE_PAUSED) {
+ set_ui_message ("Buffering complete", data);
+ }
+}
+
+/* Called when the clock is lost */
+static void clock_lost_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ if (data->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ }
+}
+
+/* Retrieve the video sink's Caps and tell the application about the media size */
+static void check_media_size (CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ GstElement *video_sink;
+ GstPad *video_sink_pad;
+ GstCaps *caps;
+ GstVideoInfo info;
+
+ /* Retrieve the Caps at the entrance of the video sink */
+ g_object_get (data->pipeline, "video-sink", &video_sink, NULL);
+ video_sink_pad = gst_element_get_static_pad (video_sink, "sink");
+ caps = gst_pad_get_current_caps (video_sink_pad);
+
+ if (gst_video_info_from_caps (&info, caps)) {
+ info.width = info.width * info.par_n / info.par_d;
+ GST_DEBUG ("Media size is %dx%d, notifying application", info.width, info.height);
+
+ (*env)->CallVoidMethod (env, data->app, on_media_size_changed_method_id, (jint)info.width, (jint)info.height);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ }
+
+ gst_caps_unref(caps);
+ gst_object_unref (video_sink_pad);
+ gst_object_unref(video_sink);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->pipeline)) {
+ data->state = new_state;
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ set_ui_message(message, data);
+ g_free (message);
+
+ /* The Ready to Paused state change is particularly interesting: */
+ if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED) {
+ /* By now the sink already knows the media size */
+ check_media_size(data);
+
+ /* If there was a scheduled seek, perform it now that we have moved to the Paused state */
+ if (GST_CLOCK_TIME_IS_VALID (data->desired_position))
+ execute_seek (data->desired_position, data);
+ }
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+static void check_initialization_complete (CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ if (!data->initialized && data->native_window && data->main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application. native_window:%p main_loop:%p", data->native_window, data->main_loop);
+
+ /* The main loop is running and we received a native window, inform the sink about it */
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->pipeline), (guintptr)data->native_window);
+
+ (*env)->CallVoidMethod (env, data->app, on_gstreamer_initialized_method_id);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ data->initialized = TRUE;
+ }
+}
+
+/* Main method for the native code. This is executed on its own thread. */
+static void *app_function (void *userdata) {
+ JavaVMAttachArgs args;
+ GstBus *bus;
+ CustomData *data = (CustomData *)userdata;
+ GSource *timeout_source;
+ GSource *bus_source;
+ GError *error = NULL;
+ guint flags;
+
+ GST_DEBUG ("Creating pipeline in CustomData at %p", data);
+
+ /* Create our own GLib Main Context and make it the default one */
+ data->context = g_main_context_new ();
+ g_main_context_push_thread_default(data->context);
+
+ /* Build pipeline */
+ data->pipeline = gst_parse_launch("playbin", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ set_ui_message(message, data);
+ g_free (message);
+ return NULL;
+ }
+
+ /* Disable subtitles */
+ g_object_get (data->pipeline, "flags", &flags, NULL);
+ flags &= ~GST_PLAY_FLAG_TEXT;
+ g_object_set (data->pipeline, "flags", flags, NULL);
+
+ /* Set the pipeline to READY, so it can already accept a window handle, if we have one */
+ data->target_state = GST_STATE_READY;
+ gst_element_set_state(data->pipeline, GST_STATE_READY);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (data->pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, data->context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::eos", (GCallback)eos_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::duration", (GCallback)duration_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::buffering", (GCallback)buffering_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::clock-lost", (GCallback)clock_lost_cb, data);
+ gst_object_unref (bus);
+
+ /* Register a function that GLib will call 4 times per second */
+ timeout_source = g_timeout_source_new (250);
+ g_source_set_callback (timeout_source, (GSourceFunc)refresh_ui, data, NULL);
+ g_source_attach (timeout_source, data->context);
+ g_source_unref (timeout_source);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop... (CustomData:%p)", data);
+ data->main_loop = g_main_loop_new (data->context, FALSE);
+ check_initialization_complete (data);
+ g_main_loop_run (data->main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (data->main_loop);
+ data->main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(data->context);
+ g_main_context_unref (data->context);
+ data->target_state = GST_STATE_NULL;
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+ gst_object_unref (data->pipeline);
+
+ return NULL;
+}
+
+/*
+ * Java Bindings
+ */
+
+/* Instruct the native code to create its internal data structure, pipeline and thread */
+static void gst_native_init (JNIEnv* env, jobject thiz) {
+ CustomData *data = g_new0 (CustomData, 1);
+ data->desired_position = GST_CLOCK_TIME_NONE;
+ data->last_seek_time = GST_CLOCK_TIME_NONE;
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, data);
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-4", 0, "Android tutorial 4");
+ gst_debug_set_threshold_for_name("tutorial-4", GST_LEVEL_DEBUG);
+ GST_DEBUG ("Created CustomData at %p", data);
+ data->app = (*env)->NewGlobalRef (env, thiz);
+ GST_DEBUG ("Created GlobalRef for app object at %p", data->app);
+ pthread_create (&gst_app_thread, NULL, &app_function, data);
+}
+
+/* Quit the main loop, remove the native thread and free resources */
+static void gst_native_finalize (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Quitting main loop...");
+ g_main_loop_quit (data->main_loop);
+ GST_DEBUG ("Waiting for thread to finish...");
+ pthread_join (gst_app_thread, NULL);
+ GST_DEBUG ("Deleting GlobalRef for app object at %p", data->app);
+ (*env)->DeleteGlobalRef (env, data->app);
+ GST_DEBUG ("Freeing CustomData at %p", data);
+ g_free (data);
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, NULL);
+ GST_DEBUG ("Done finalizing");
+}
+
+/* Set playbin's URI */
+void gst_native_set_uri (JNIEnv* env, jobject thiz, jstring uri) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data || !data->pipeline) return;
+ const jbyte *char_uri = (*env)->GetStringUTFChars (env, uri, NULL);
+ GST_DEBUG ("Setting URI to %s", char_uri);
+ if (data->target_state >= GST_STATE_READY)
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ g_object_set(data->pipeline, "uri", char_uri, NULL);
+ (*env)->ReleaseStringUTFChars (env, uri, char_uri);
+ data->duration = GST_CLOCK_TIME_NONE;
+ data->is_live = (gst_element_set_state (data->pipeline, data->target_state) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+/* Set pipeline to PLAYING state */
+static void gst_native_play (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PLAYING");
+ data->target_state = GST_STATE_PLAYING;
+ data->is_live = (gst_element_set_state (data->pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+/* Set pipeline to PAUSED state */
+static void gst_native_pause (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PAUSED");
+ data->target_state = GST_STATE_PAUSED;
+ data->is_live = (gst_element_set_state (data->pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+/* Instruct the pipeline to seek to a different position */
+void gst_native_set_position (JNIEnv* env, jobject thiz, int milliseconds) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ gint64 desired_position = (gint64)(milliseconds * GST_MSECOND);
+ if (data->state >= GST_STATE_PAUSED) {
+ execute_seek(desired_position, data);
+ } else {
+ GST_DEBUG ("Scheduling seek to %" GST_TIME_FORMAT " for later", GST_TIME_ARGS (desired_position));
+ data->desired_position = desired_position;
+ }
+}
+
+/* Static class initializer: retrieve method and field IDs */
+static jboolean gst_native_class_init (JNIEnv* env, jclass klass) {
+ custom_data_field_id = (*env)->GetFieldID (env, klass, "native_custom_data", "J");
+ set_message_method_id = (*env)->GetMethodID (env, klass, "setMessage", "(Ljava/lang/String;)V");
+ set_current_position_method_id = (*env)->GetMethodID (env, klass, "setCurrentPosition", "(II)V");
+ on_gstreamer_initialized_method_id = (*env)->GetMethodID (env, klass, "onGStreamerInitialized", "()V");
+ on_media_size_changed_method_id = (*env)->GetMethodID (env, klass, "onMediaSizeChanged", "(II)V");
+
+ if (!custom_data_field_id || !set_message_method_id || !on_gstreamer_initialized_method_id ||
+ !on_media_size_changed_method_id || !set_current_position_method_id) {
+ /* We emit this message through the Android log instead of the GStreamer log because the later
+ * has not been initialized yet.
+ */
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-4", "The calling class does not implement all necessary interface methods");
+ return JNI_FALSE;
+ }
+ return JNI_TRUE;
+}
+
+static void gst_native_surface_init (JNIEnv *env, jobject thiz, jobject surface) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ ANativeWindow *new_native_window = ANativeWindow_fromSurface(env, surface);
+ GST_DEBUG ("Received surface %p (native window %p)", surface, new_native_window);
+
+ if (data->native_window) {
+ ANativeWindow_release (data->native_window);
+ if (data->native_window == new_native_window) {
+ GST_DEBUG ("New native window is the same as the previous one %p", data->native_window);
+ if (data->pipeline) {
+ gst_video_overlay_expose(GST_VIDEO_OVERLAY (data->pipeline));
+ gst_video_overlay_expose(GST_VIDEO_OVERLAY (data->pipeline));
+ }
+ return;
+ } else {
+ GST_DEBUG ("Released previous native window %p", data->native_window);
+ data->initialized = FALSE;
+ }
+ }
+ data->native_window = new_native_window;
+
+ check_initialization_complete (data);
+}
+
+static void gst_native_surface_finalize (JNIEnv *env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Releasing Native Window %p", data->native_window);
+
+ if (data->pipeline) {
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->pipeline), (guintptr)NULL);
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ }
+
+ ANativeWindow_release (data->native_window);
+ data->native_window = NULL;
+ data->initialized = FALSE;
+}
+
+/* List of implemented native methods */
+static JNINativeMethod native_methods[] = {
+ { "nativeInit", "()V", (void *) gst_native_init},
+ { "nativeFinalize", "()V", (void *) gst_native_finalize},
+ { "nativeSetUri", "(Ljava/lang/String;)V", (void *) gst_native_set_uri},
+ { "nativePlay", "()V", (void *) gst_native_play},
+ { "nativePause", "()V", (void *) gst_native_pause},
+ { "nativeSetPosition", "(I)V", (void*) gst_native_set_position},
+ { "nativeSurfaceInit", "(Ljava/lang/Object;)V", (void *) gst_native_surface_init},
+ { "nativeSurfaceFinalize", "()V", (void *) gst_native_surface_finalize},
+ { "nativeClassInit", "()Z", (void *) gst_native_class_init}
+};
+
+/* Library initializer */
+jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+ JNIEnv *env = NULL;
+
+ java_vm = vm;
+
+ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-4", "Could not retrieve JNIEnv");
+ return 0;
+ }
+ jclass klass = (*env)->FindClass (env, "com/gst_sdk_tutorials/tutorial_4/Tutorial4");
+ (*env)->RegisterNatives (env, klass, native_methods, G_N_ELEMENTS(native_methods));
+
+ pthread_key_create (&current_jni_env, detach_current_thread);
+
+ return JNI_VERSION_1_4;
+}
diff --git a/tutorials/android-tutorial-4/res/drawable-hdpi/gstreamer_logo_4.png b/tutorials/android-tutorial-4/res/drawable-hdpi/gstreamer_logo_4.png
new file mode 100644
index 0000000..40e9681
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/drawable-hdpi/gstreamer_logo_4.png
Binary files differ
diff --git a/tutorials/android-tutorial-4/res/drawable-ldpi/gstreamer_logo_4.png b/tutorials/android-tutorial-4/res/drawable-ldpi/gstreamer_logo_4.png
new file mode 100644
index 0000000..bf6d8ca
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/drawable-ldpi/gstreamer_logo_4.png
Binary files differ
diff --git a/tutorials/android-tutorial-4/res/drawable-mdpi/gstreamer_logo_4.png b/tutorials/android-tutorial-4/res/drawable-mdpi/gstreamer_logo_4.png
new file mode 100644
index 0000000..0ce2ac0
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/drawable-mdpi/gstreamer_logo_4.png
Binary files differ
diff --git a/tutorials/android-tutorial-4/res/drawable-xhdpi/gstreamer_logo_4.png b/tutorials/android-tutorial-4/res/drawable-xhdpi/gstreamer_logo_4.png
new file mode 100644
index 0000000..5c59576
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/drawable-xhdpi/gstreamer_logo_4.png
Binary files differ
diff --git a/tutorials/android-tutorial-4/res/drawable-xxhdpi/gstreamer_logo_4.png b/tutorials/android-tutorial-4/res/drawable-xxhdpi/gstreamer_logo_4.png
new file mode 100644
index 0000000..0674b0c
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/drawable-xxhdpi/gstreamer_logo_4.png
Binary files differ
diff --git a/tutorials/android-tutorial-4/res/drawable-xxxhdpi/gstreamer_logo_4.png b/tutorials/android-tutorial-4/res/drawable-xxxhdpi/gstreamer_logo_4.png
new file mode 100644
index 0000000..6d4e575
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/drawable-xxxhdpi/gstreamer_logo_4.png
Binary files differ
diff --git a/tutorials/android-tutorial-4/res/layout/main.xml b/tutorials/android-tutorial-4/res/layout/main.xml
new file mode 100644
index 0000000..e7329d2
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/layout/main.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/textview_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+ <ImageButton
+ android:id="@+id/button_play"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_play"
+ android:src="@android:drawable/ic_media_play"
+ android:text="@string/button_play" />
+
+ <ImageButton
+ android:id="@+id/button_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_stop"
+ android:src="@android:drawable/ic_media_pause"
+ android:text="@string/button_stop" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:id="@+id/textview_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="5dip"
+ android:layout_marginRight="5dip" />
+
+ <SeekBar
+ android:id="@+id/seek_bar"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:indeterminate="false" />
+ </LinearLayout>
+
+ <com.gst_sdk_tutorials.tutorial_4.GStreamerSurfaceView
+ android:id="@+id/surface_video"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|center_horizontal" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/tutorials/android-tutorial-4/res/values/strings.xml b/tutorials/android-tutorial-4/res/values/strings.xml
new file mode 100644
index 0000000..d26d1e6
--- /dev/null
+++ b/tutorials/android-tutorial-4/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">GStreamer tutorial 4</string>
+ <string name="button_play">Play</string>
+ <string name="button_stop">Stop</string>
+</resources>
diff --git a/tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/GStreamerSurfaceView.java b/tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/GStreamerSurfaceView.java
new file mode 100644
index 0000000..c2cd2b2
--- /dev/null
+++ b/tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/GStreamerSurfaceView.java
@@ -0,0 +1,85 @@
+package com.gst_sdk_tutorials.tutorial_4;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.view.View;
+
+// A simple SurfaceView whose width and height can be set from the outside
+public class GStreamerSurfaceView extends SurfaceView {
+ public int media_width = 320;
+ public int media_height = 240;
+
+ // Mandatory constructors, they do not do much
+ public GStreamerSurfaceView(Context context, AttributeSet attrs,
+ int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public GStreamerSurfaceView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public GStreamerSurfaceView (Context context) {
+ super(context);
+ }
+
+ // Called by the layout manager to find out our size and give us some rules.
+ // We will try to maximize our size, and preserve the media's aspect ratio if
+ // we are given the freedom to do so.
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int width = 0, height = 0;
+ int wmode = View.MeasureSpec.getMode(widthMeasureSpec);
+ int hmode = View.MeasureSpec.getMode(heightMeasureSpec);
+ int wsize = View.MeasureSpec.getSize(widthMeasureSpec);
+ int hsize = View.MeasureSpec.getSize(heightMeasureSpec);
+
+ Log.i ("GStreamer", "onMeasure called with " + media_width + "x" + media_height);
+ // Obey width rules
+ switch (wmode) {
+ case View.MeasureSpec.AT_MOST:
+ if (hmode == View.MeasureSpec.EXACTLY) {
+ width = Math.min(hsize * media_width / media_height, wsize);
+ break;
+ }
+ case View.MeasureSpec.EXACTLY:
+ width = wsize;
+ break;
+ case View.MeasureSpec.UNSPECIFIED:
+ width = media_width;
+ }
+
+ // Obey height rules
+ switch (hmode) {
+ case View.MeasureSpec.AT_MOST:
+ if (wmode == View.MeasureSpec.EXACTLY) {
+ height = Math.min(wsize * media_height / media_width, hsize);
+ break;
+ }
+ case View.MeasureSpec.EXACTLY:
+ height = hsize;
+ break;
+ case View.MeasureSpec.UNSPECIFIED:
+ height = media_height;
+ }
+
+ // Finally, calculate best size when both axis are free
+ if (hmode == View.MeasureSpec.AT_MOST && wmode == View.MeasureSpec.AT_MOST) {
+ int correct_height = width * media_height / media_width;
+ int correct_width = height * media_width / media_height;
+
+ if (correct_height < height)
+ height = correct_height;
+ else
+ width = correct_width;
+ }
+
+ // Obey minimum size
+ width = Math.max (getSuggestedMinimumWidth(), width);
+ height = Math.max (getSuggestedMinimumHeight(), height);
+ setMeasuredDimension(width, height);
+ }
+
+}
diff --git a/tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/Tutorial4.java b/tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/Tutorial4.java
new file mode 100644
index 0000000..f3d5977
--- /dev/null
+++ b/tutorials/android-tutorial-4/src/com/gst_sdk_tutorials/tutorial_4/Tutorial4.java
@@ -0,0 +1,250 @@
+package com.gst_sdk_tutorials.tutorial_4;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageButton;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.freedesktop.gstreamer.GStreamer;
+
+public class Tutorial4 extends Activity implements SurfaceHolder.Callback, OnSeekBarChangeListener {
+ private native void nativeInit(); // Initialize native code, build pipeline, etc
+ private native void nativeFinalize(); // Destroy pipeline and shutdown native code
+ private native void nativeSetUri(String uri); // Set the URI of the media to play
+ private native void nativePlay(); // Set pipeline to PLAYING
+ private native void nativeSetPosition(int milliseconds); // Seek to the indicated position, in milliseconds
+ private native void nativePause(); // Set pipeline to PAUSED
+ private static native boolean nativeClassInit(); // Initialize native class: cache Method IDs for callbacks
+ private native void nativeSurfaceInit(Object surface); // A new surface is available
+ private native void nativeSurfaceFinalize(); // Surface about to be destroyed
+ private long native_custom_data; // Native code will use this to keep private data
+
+ private boolean is_playing_desired; // Whether the user asked to go to PLAYING
+ private int position; // Current position, reported by native code
+ private int duration; // Current clip duration, reported by native code
+ private boolean is_local_media; // Whether this clip is stored locally or is being streamed
+ private int desired_position; // Position where the users wants to seek to
+ private String mediaUri; // URI of the clip being played
+
+ private final String defaultMediaUri = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.ogv";
+
+ // Called when the activity is first created.
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ // Initialize GStreamer and warn if it fails
+ try {
+ GStreamer.init(this);
+ } catch (Exception e) {
+ Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
+ finish();
+ return;
+ }
+
+ setContentView(R.layout.main);
+
+ ImageButton play = (ImageButton) this.findViewById(R.id.button_play);
+ play.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = true;
+ nativePlay();
+ }
+ });
+
+ ImageButton pause = (ImageButton) this.findViewById(R.id.button_stop);
+ pause.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = false;
+ nativePause();
+ }
+ });
+
+ SurfaceView sv = (SurfaceView) this.findViewById(R.id.surface_video);
+ SurfaceHolder sh = sv.getHolder();
+ sh.addCallback(this);
+
+ SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
+ sb.setOnSeekBarChangeListener(this);
+
+ // Retrieve our previous state, or initialize it to default values
+ if (savedInstanceState != null) {
+ is_playing_desired = savedInstanceState.getBoolean("playing");
+ position = savedInstanceState.getInt("position");
+ duration = savedInstanceState.getInt("duration");
+ mediaUri = savedInstanceState.getString("mediaUri");
+ Log.i ("GStreamer", "Activity created with saved state:");
+ } else {
+ is_playing_desired = false;
+ position = duration = 0;
+ mediaUri = defaultMediaUri;
+ Log.i ("GStreamer", "Activity created with no saved state:");
+ }
+ is_local_media = false;
+ Log.i ("GStreamer", " playing:" + is_playing_desired + " position:" + position +
+ " duration: " + duration + " uri: " + mediaUri);
+
+ // Start with disabled buttons, until native code is initialized
+ this.findViewById(R.id.button_play).setEnabled(false);
+ this.findViewById(R.id.button_stop).setEnabled(false);
+
+ nativeInit();
+ }
+
+ protected void onSaveInstanceState (Bundle outState) {
+ Log.d ("GStreamer", "Saving state, playing:" + is_playing_desired + " position:" + position +
+ " duration: " + duration + " uri: " + mediaUri);
+ outState.putBoolean("playing", is_playing_desired);
+ outState.putInt("position", position);
+ outState.putInt("duration", duration);
+ outState.putString("mediaUri", mediaUri);
+ }
+
+ protected void onDestroy() {
+ nativeFinalize();
+ super.onDestroy();
+ }
+
+ // Called from native code. This sets the content of the TextView from the UI thread.
+ private void setMessage(final String message) {
+ final TextView tv = (TextView) this.findViewById(R.id.textview_message);
+ runOnUiThread (new Runnable() {
+ public void run() {
+ tv.setText(message);
+ }
+ });
+ }
+
+ // Set the URI to play, and record whether it is a local or remote file
+ private void setMediaUri() {
+ nativeSetUri (mediaUri);
+ is_local_media = mediaUri.startsWith("file://");
+ }
+
+ // Called from native code. Native code calls this once it has created its pipeline and
+ // the main loop is running, so it is ready to accept commands.
+ private void onGStreamerInitialized () {
+ Log.i ("GStreamer", "GStreamer initialized:");
+ Log.i ("GStreamer", " playing:" + is_playing_desired + " position:" + position + " uri: " + mediaUri);
+
+ // Restore previous playing state
+ setMediaUri ();
+ nativeSetPosition (position);
+ if (is_playing_desired) {
+ nativePlay();
+ } else {
+ nativePause();
+ }
+
+ // Re-enable buttons, now that GStreamer is initialized
+ final Activity activity = this;
+ runOnUiThread(new Runnable() {
+ public void run() {
+ activity.findViewById(R.id.button_play).setEnabled(true);
+ activity.findViewById(R.id.button_stop).setEnabled(true);
+ }
+ });
+ }
+
+ // The text widget acts as an slave for the seek bar, so it reflects what the seek bar shows, whether
+ // it is an actual pipeline position or the position the user is currently dragging to.
+ private void updateTimeWidget () {
+ final TextView tv = (TextView) this.findViewById(R.id.textview_time);
+ final SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
+ final int pos = sb.getProgress();
+
+ SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
+ df.setTimeZone(TimeZone.getTimeZone("UTC"));
+ final String message = df.format(new Date (pos)) + " / " + df.format(new Date (duration));
+ tv.setText(message);
+ }
+
+ // Called from native code
+ private void setCurrentPosition(final int position, final int duration) {
+ final SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
+
+ // Ignore position messages from the pipeline if the seek bar is being dragged
+ if (sb.isPressed()) return;
+
+ runOnUiThread (new Runnable() {
+ public void run() {
+ sb.setMax(duration);
+ sb.setProgress(position);
+ updateTimeWidget();
+ }
+ });
+ this.position = position;
+ this.duration = duration;
+ }
+
+ static {
+ System.loadLibrary("gstreamer_android");
+ System.loadLibrary("tutorial-4");
+ nativeClassInit();
+ }
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int width,
+ int height) {
+ Log.d("GStreamer", "Surface changed to format " + format + " width "
+ + width + " height " + height);
+ nativeSurfaceInit (holder.getSurface());
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.d("GStreamer", "Surface created: " + holder.getSurface());
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.d("GStreamer", "Surface destroyed");
+ nativeSurfaceFinalize ();
+ }
+
+ // Called from native code when the size of the media changes or is first detected.
+ // Inform the video surface about the new size and recalculate the layout.
+ private void onMediaSizeChanged (int width, int height) {
+ Log.i ("GStreamer", "Media size changed to " + width + "x" + height);
+ final GStreamerSurfaceView gsv = (GStreamerSurfaceView) this.findViewById(R.id.surface_video);
+ gsv.media_width = width;
+ gsv.media_height = height;
+ runOnUiThread(new Runnable() {
+ public void run() {
+ gsv.requestLayout();
+ }
+ });
+ }
+
+ // The Seek Bar thumb has moved, either because the user dragged it or we have called setProgress()
+ public void onProgressChanged(SeekBar sb, int progress, boolean fromUser) {
+ if (fromUser == false) return;
+ desired_position = progress;
+ // If this is a local file, allow scrub seeking, this is, seek as soon as the slider is moved.
+ if (is_local_media) nativeSetPosition(desired_position);
+ updateTimeWidget();
+ }
+
+ // The user started dragging the Seek Bar thumb
+ public void onStartTrackingTouch(SeekBar sb) {
+ nativePause();
+ }
+
+ // The user released the Seek Bar thumb
+ public void onStopTrackingTouch(SeekBar sb) {
+ // If this is a remote file, scrub seeking is probably not going to work smoothly enough.
+ // Therefore, perform only the seek when the slider is released.
+ if (!is_local_media) nativeSetPosition(desired_position);
+ if (is_playing_desired) nativePlay();
+ }
+}
diff --git a/tutorials/android-tutorial-5/AndroidManifest.xml b/tutorials/android-tutorial-5/AndroidManifest.xml
new file mode 100755
index 0000000..6a33328
--- /dev/null
+++ b/tutorials/android-tutorial-5/AndroidManifest.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.gst_sdk_tutorials.tutorial_5"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="9"
+ android:targetSdkVersion="14" />
+
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
+
+ <uses-feature android:glEsVersion="0x00020000" />
+
+ <application
+ android:icon="@drawable/gstreamer_logo_5"
+ android:label="@string/app_name" >
+ <activity
+ android:name=".Tutorial5"
+ android:label="@string/app_name" >
+
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+
+ <!-- Local files whose MIME type is known to Android -->
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+
+ <data android:mimeType="audio/*" />
+ <data android:mimeType="video/*" />
+ <data android:mimeType="image/*" />
+ </intent-filter>
+
+ <!-- Local files with unknown MIME type.
+ The list of extensions and supported protocols can certainly be extended. -->
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+
+ <data android:scheme="file" />
+ <data android:mimeType="*/*" />
+ <data android:pathPattern=".*\\.avi" />
+ <data android:pathPattern=".*\\.AVI" />
+ <data android:pathPattern=".*\\.mkv" />
+ <data android:pathPattern=".*\\.MKV" />
+ <data android:pathPattern=".*\\.webm" />
+ <data android:pathPattern=".*\\.WEBM" />
+ <data android:pathPattern=".*\\.ogv" />
+ <data android:pathPattern=".*\\.OGV" />
+ <data android:pathPattern=".*\\.mp4" />
+ <data android:pathPattern=".*\\.MP4" />
+ <data android:pathPattern=".*\\.mov" />
+ <data android:pathPattern=".*\\.MOV" />
+ </intent-filter>
+
+ <!-- Remote files. These typically have unknown MIME type.
+ The list of extensions and supported protocols can certainly be extended. -->
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+
+ <data android:scheme="http" />
+ <data android:pathPattern=".*\\.avi" />
+ <data android:pathPattern=".*\\.AVI" />
+ <data android:pathPattern=".*\\.mkv" />
+ <data android:pathPattern=".*\\.MKV" />
+ <data android:pathPattern=".*\\.webm" />
+ <data android:pathPattern=".*\\.WEBM" />
+ <data android:pathPattern=".*\\.ogv" />
+ <data android:pathPattern=".*\\.OGV" />
+ <data android:pathPattern=".*\\.mp4" />
+ <data android:pathPattern=".*\\.MP4" />
+ <data android:pathPattern=".*\\.mov" />
+ <data android:pathPattern=".*\\.MOV" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="com.lamerman.FileDialog"
+ android:label="@string/filechooser_name" >
+ </activity>
+ </application>
+
+</manifest>
diff --git a/tutorials/android-tutorial-5/jni/Android.mk b/tutorials/android-tutorial-5/jni/Android.mk
new file mode 100755
index 0000000..80e7b4e
--- /dev/null
+++ b/tutorials/android-tutorial-5/jni/Android.mk
@@ -0,0 +1,34 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := tutorial-5
+LOCAL_SRC_FILES := tutorial-5.c
+LOCAL_SHARED_LIBRARIES := gstreamer_android
+LOCAL_LDLIBS := -llog -landroid
+include $(BUILD_SHARED_LIBRARY)
+
+ifndef GSTREAMER_ROOT_ANDROID
+$(error GSTREAMER_ROOT_ANDROID is not defined!)
+endif
+
+ifeq ($(TARGET_ARCH_ABI),armeabi)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
+else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
+else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
+else ifeq ($(TARGET_ARCH_ABI),x86)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
+else ifeq ($(TARGET_ARCH_ABI),x86_64)
+GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
+else
+$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
+endif
+
+GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
+include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
+GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) $(GSTREAMER_PLUGINS_PLAYBACK) $(GSTREAMER_PLUGINS_CODECS) $(GSTREAMER_PLUGINS_NET) $(GSTREAMER_PLUGINS_SYS)
+G_IO_MODULES := gnutls
+GSTREAMER_EXTRA_DEPS := gstreamer-video-1.0
+include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
diff --git a/tutorials/android-tutorial-5/jni/Application.mk b/tutorials/android-tutorial-5/jni/Application.mk
new file mode 100644
index 0000000..8e7b0ef
--- /dev/null
+++ b/tutorials/android-tutorial-5/jni/Application.mk
@@ -0,0 +1,2 @@
+APP_ABI = armeabi armeabi-v7a arm64-v8a x86 x86_64
+
diff --git a/tutorials/android-tutorial-5/jni/tutorial-5.c b/tutorials/android-tutorial-5/jni/tutorial-5.c
new file mode 100755
index 0000000..81e9524
--- /dev/null
+++ b/tutorials/android-tutorial-5/jni/tutorial-5.c
@@ -0,0 +1,570 @@
+#include <string.h>
+#include <stdint.h>
+#include <jni.h>
+#include <android/log.h>
+#include <android/native_window.h>
+#include <android/native_window_jni.h>
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <gst/video/videooverlay.h>
+#include <pthread.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+/*
+ * These macros provide a way to store the native pointer to CustomData, which might be 32 or 64 bits, into
+ * a jlong, which is always 64 bits, without warnings.
+ */
+#if GLIB_SIZEOF_VOID_P == 8
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)data)
+#else
+# define GET_CUSTOM_DATA(env, thiz, fieldID) (CustomData *)(jint)(*env)->GetLongField (env, thiz, fieldID)
+# define SET_CUSTOM_DATA(env, thiz, fieldID, data) (*env)->SetLongField (env, thiz, fieldID, (jlong)(jint)data)
+#endif
+
+/* Do not allow seeks to be performed closer than this distance. It is visually useless, and will probably
+ * confuse some demuxers. */
+#define SEEK_MIN_DELAY (500 * GST_MSECOND)
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ jobject app; /* Application instance, used to call its methods. A global reference is kept. */
+ GstElement *pipeline; /* The running pipeline */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+ ANativeWindow *native_window; /* The Android native window where video will be rendered */
+ GstState state; /* Current pipeline state */
+ GstState target_state; /* Desired pipeline state, to be set once buffering is complete */
+ gint64 duration; /* Cached clip duration */
+ gint64 desired_position; /* Position to seek to, once the pipeline is running */
+ GstClockTime last_seek_time; /* For seeking overflow prevention (throttling) */
+ gboolean is_live; /* Live streams do not use buffering */
+} CustomData;
+
+/* playbin2 flags */
+typedef enum {
+ GST_PLAY_FLAG_TEXT = (1 << 2) /* We want subtitle output */
+} GstPlayFlags;
+
+/* These global variables cache values which are not changing during execution */
+static pthread_t gst_app_thread;
+static pthread_key_t current_jni_env;
+static JavaVM *java_vm;
+static jfieldID custom_data_field_id;
+static jmethodID set_message_method_id;
+static jmethodID set_current_position_method_id;
+static jmethodID on_gstreamer_initialized_method_id;
+static jmethodID on_media_size_changed_method_id;
+
+/*
+ * Private methods
+ */
+
+/* Register this thread with the VM */
+static JNIEnv *attach_current_thread (void) {
+ JNIEnv *env;
+ JavaVMAttachArgs args;
+
+ GST_DEBUG ("Attaching thread %p", g_thread_self ());
+ args.version = JNI_VERSION_1_4;
+ args.name = NULL;
+ args.group = NULL;
+
+ if ((*java_vm)->AttachCurrentThread (java_vm, &env, &args) < 0) {
+ GST_ERROR ("Failed to attach current thread");
+ return NULL;
+ }
+
+ return env;
+}
+
+/* Unregister this thread from the VM */
+static void detach_current_thread (void *env) {
+ GST_DEBUG ("Detaching thread %p", g_thread_self ());
+ (*java_vm)->DetachCurrentThread (java_vm);
+}
+
+/* Retrieve the JNI environment for this thread */
+static JNIEnv *get_jni_env (void) {
+ JNIEnv *env;
+
+ if ((env = pthread_getspecific (current_jni_env)) == NULL) {
+ env = attach_current_thread ();
+ pthread_setspecific (current_jni_env, env);
+ }
+
+ return env;
+}
+
+/* Change the content of the UI's TextView */
+static void set_ui_message (const gchar *message, CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ GST_DEBUG ("Setting message to: %s", message);
+ jstring jmessage = (*env)->NewStringUTF(env, message);
+ (*env)->CallVoidMethod (env, data->app, set_message_method_id, jmessage);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ (*env)->DeleteLocalRef (env, jmessage);
+}
+
+/* Tell the application what is the current position and clip duration */
+static void set_current_ui_position (gint position, gint duration, CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ (*env)->CallVoidMethod (env, data->app, set_current_position_method_id, position, duration);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+}
+
+/* If we have pipeline and it is running, query the current position and clip duration and inform
+ * the application */
+static gboolean refresh_ui (CustomData *data) {
+ gint64 current = -1;
+ gint64 position;
+
+ /* We do not want to update anything unless we have a working pipeline in the PAUSED or PLAYING state */
+ if (!data || !data->pipeline || data->state < GST_STATE_PAUSED)
+ return TRUE;
+
+ /* If we didn't know it yet, query the stream duration */
+ if (!GST_CLOCK_TIME_IS_VALID (data->duration)) {
+ if (!gst_element_query_duration (data->pipeline, GST_FORMAT_TIME, &data->duration)) {
+ GST_WARNING ("Could not query current duration (normal for still pictures)");
+ data->duration = 0;
+ }
+ }
+
+ if (!gst_element_query_position (data->pipeline, GST_FORMAT_TIME, &position)) {
+ GST_WARNING ("Could not query current position (normal for still pictures)");
+ position = 0;
+ }
+
+ /* Java expects these values in milliseconds, and GStreamer provides nanoseconds */
+ set_current_ui_position (position / GST_MSECOND, data->duration / GST_MSECOND, data);
+ return TRUE;
+}
+
+/* Forward declaration for the delayed seek callback */
+static gboolean delayed_seek_cb (CustomData *data);
+
+/* Perform seek, if we are not too close to the previous seek. Otherwise, schedule the seek for
+ * some time in the future. */
+static void execute_seek (gint64 desired_position, CustomData *data) {
+ gint64 diff;
+
+ if (desired_position == GST_CLOCK_TIME_NONE)
+ return;
+
+ diff = gst_util_get_timestamp () - data->last_seek_time;
+
+ if (GST_CLOCK_TIME_IS_VALID (data->last_seek_time) && diff < SEEK_MIN_DELAY) {
+ /* The previous seek was too close, delay this one */
+ GSource *timeout_source;
+
+ if (data->desired_position == GST_CLOCK_TIME_NONE) {
+ /* There was no previous seek scheduled. Setup a timer for some time in the future */
+ timeout_source = g_timeout_source_new ((SEEK_MIN_DELAY - diff) / GST_MSECOND);
+ g_source_set_callback (timeout_source, (GSourceFunc)delayed_seek_cb, data, NULL);
+ g_source_attach (timeout_source, data->context);
+ g_source_unref (timeout_source);
+ }
+ /* Update the desired seek position. If multiple petitions are received before it is time
+ * to perform a seek, only the last one is remembered. */
+ data->desired_position = desired_position;
+ GST_DEBUG ("Throttling seek to %" GST_TIME_FORMAT ", will be in %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (desired_position), GST_TIME_ARGS (SEEK_MIN_DELAY - diff));
+ } else {
+ /* Perform the seek now */
+ GST_DEBUG ("Seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (desired_position));
+ data->last_seek_time = gst_util_get_timestamp ();
+ gst_element_seek_simple (data->pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, desired_position);
+ data->desired_position = GST_CLOCK_TIME_NONE;
+ }
+}
+
+/* Delayed seek callback. This gets called by the timer setup in the above function. */
+static gboolean delayed_seek_cb (CustomData *data) {
+ GST_DEBUG ("Doing delayed seek to %" GST_TIME_FORMAT, GST_TIME_ARGS (data->desired_position));
+ execute_seek (data->desired_position, data);
+ return FALSE;
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ set_ui_message (message_string, data);
+ g_free (message_string);
+ data->target_state = GST_STATE_NULL;
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+}
+
+/* Called when the End Of the Stream is reached. Just move to the beginning of the media and pause. */
+static void eos_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ data->target_state = GST_STATE_PAUSED;
+ data->is_live |= (gst_element_set_state (data->pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+ execute_seek (0, data);
+}
+
+/* Called when the duration of the media changes. Just mark it as unknown, so we re-query it in the next UI refresh. */
+static void duration_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ data->duration = GST_CLOCK_TIME_NONE;
+}
+
+/* Called when buffering messages are received. We inform the UI about the current buffering level and
+ * keep the pipeline paused until 100% buffering is reached. At that point, set the desired state. */
+static void buffering_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ gint percent;
+
+ if (data->is_live)
+ return;
+
+ gst_message_parse_buffering (msg, &percent);
+ if (percent < 100 && data->target_state >= GST_STATE_PAUSED) {
+ gchar * message_string = g_strdup_printf ("Buffering %d%%", percent);
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ set_ui_message (message_string, data);
+ g_free (message_string);
+ } else if (data->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ } else if (data->target_state >= GST_STATE_PAUSED) {
+ set_ui_message ("Buffering complete", data);
+ }
+}
+
+/* Called when the clock is lost */
+static void clock_lost_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ if (data->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ }
+}
+
+/* Retrieve the video sink's Caps and tell the application about the media size */
+static void check_media_size (CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ GstElement *video_sink;
+ GstPad *video_sink_pad;
+ GstCaps *caps;
+ GstVideoInfo info;
+
+ /* Retrieve the Caps at the entrance of the video sink */
+ g_object_get (data->pipeline, "video-sink", &video_sink, NULL);
+ video_sink_pad = gst_element_get_static_pad (video_sink, "sink");
+ caps = gst_pad_get_current_caps (video_sink_pad);
+
+ if (gst_video_info_from_caps(&info, caps)) {
+ info.width = info.width * info.par_n / info.par_d;
+ GST_DEBUG ("Media size is %dx%d, notifying application", info.width, info.height);
+
+ (*env)->CallVoidMethod (env, data->app, on_media_size_changed_method_id, (jint)info.width, (jint)info.height);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ }
+
+ gst_caps_unref(caps);
+ gst_object_unref (video_sink_pad);
+ gst_object_unref(video_sink);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->pipeline)) {
+ data->state = new_state;
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ set_ui_message(message, data);
+ g_free (message);
+
+ if (new_state == GST_STATE_NULL || new_state == GST_STATE_READY)
+ data->is_live = FALSE;
+
+ /* The Ready to Paused state change is particularly interesting: */
+ if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED) {
+ /* By now the sink already knows the media size */
+ check_media_size(data);
+
+ /* If there was a scheduled seek, perform it now that we have moved to the Paused state */
+ if (GST_CLOCK_TIME_IS_VALID (data->desired_position))
+ execute_seek (data->desired_position, data);
+ }
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+static void check_initialization_complete (CustomData *data) {
+ JNIEnv *env = get_jni_env ();
+ if (!data->initialized && data->native_window && data->main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application. native_window:%p main_loop:%p", data->native_window, data->main_loop);
+
+ /* The main loop is running and we received a native window, inform the sink about it */
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->pipeline), (guintptr)data->native_window);
+
+ (*env)->CallVoidMethod (env, data->app, on_gstreamer_initialized_method_id);
+ if ((*env)->ExceptionCheck (env)) {
+ GST_ERROR ("Failed to call Java method");
+ (*env)->ExceptionClear (env);
+ }
+ data->initialized = TRUE;
+ }
+}
+
+/* Main method for the native code. This is executed on its own thread. */
+static void *app_function (void *userdata) {
+ JavaVMAttachArgs args;
+ GstBus *bus;
+ CustomData *data = (CustomData *)userdata;
+ GSource *timeout_source;
+ GSource *bus_source;
+ GError *error = NULL;
+ guint flags;
+
+ GST_DEBUG ("Creating pipeline in CustomData at %p", data);
+
+ /* Create our own GLib Main Context and make it the default one */
+ data->context = g_main_context_new ();
+ g_main_context_push_thread_default(data->context);
+
+ /* Build pipeline */
+ data->pipeline = gst_parse_launch("playbin", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ set_ui_message(message, data);
+ g_free (message);
+ return NULL;
+ }
+
+ /* Disable subtitles */
+ g_object_get (data->pipeline, "flags", &flags, NULL);
+ flags &= ~GST_PLAY_FLAG_TEXT;
+ g_object_set (data->pipeline, "flags", flags, NULL);
+
+ /* Set the pipeline to READY, so it can already accept a window handle, if we have one */
+ data->target_state = GST_STATE_READY;
+ gst_element_set_state(data->pipeline, GST_STATE_READY);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (data->pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, data->context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::eos", (GCallback)eos_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::duration", (GCallback)duration_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::buffering", (GCallback)buffering_cb, data);
+ g_signal_connect (G_OBJECT (bus), "message::clock-lost", (GCallback)clock_lost_cb, data);
+ gst_object_unref (bus);
+
+ /* Register a function that GLib will call 4 times per second */
+ timeout_source = g_timeout_source_new (250);
+ g_source_set_callback (timeout_source, (GSourceFunc)refresh_ui, data, NULL);
+ g_source_attach (timeout_source, data->context);
+ g_source_unref (timeout_source);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop... (CustomData:%p)", data);
+ data->main_loop = g_main_loop_new (data->context, FALSE);
+ check_initialization_complete (data);
+ g_main_loop_run (data->main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (data->main_loop);
+ data->main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(data->context);
+ g_main_context_unref (data->context);
+ data->target_state = GST_STATE_NULL;
+ gst_element_set_state (data->pipeline, GST_STATE_NULL);
+ gst_object_unref (data->pipeline);
+
+ return NULL;
+}
+
+/*
+ * Java Bindings
+ */
+
+/* Instruct the native code to create its internal data structure, pipeline and thread */
+static void gst_native_init (JNIEnv* env, jobject thiz) {
+ CustomData *data = g_new0 (CustomData, 1);
+ data->desired_position = GST_CLOCK_TIME_NONE;
+ data->last_seek_time = GST_CLOCK_TIME_NONE;
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, data);
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-5", 0, "Android tutorial 5");
+ gst_debug_set_threshold_for_name("tutorial-5", GST_LEVEL_DEBUG);
+ GST_DEBUG ("Created CustomData at %p", data);
+ data->app = (*env)->NewGlobalRef (env, thiz);
+ GST_DEBUG ("Created GlobalRef for app object at %p", data->app);
+ pthread_create (&gst_app_thread, NULL, &app_function, data);
+}
+
+/* Quit the main loop, remove the native thread and free resources */
+static void gst_native_finalize (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Quitting main loop...");
+ g_main_loop_quit (data->main_loop);
+ GST_DEBUG ("Waiting for thread to finish...");
+ pthread_join (gst_app_thread, NULL);
+ GST_DEBUG ("Deleting GlobalRef for app object at %p", data->app);
+ (*env)->DeleteGlobalRef (env, data->app);
+ GST_DEBUG ("Freeing CustomData at %p", data);
+ g_free (data);
+ SET_CUSTOM_DATA (env, thiz, custom_data_field_id, NULL);
+ GST_DEBUG ("Done finalizing");
+}
+
+/* Set playbin2's URI */
+void gst_native_set_uri (JNIEnv* env, jobject thiz, jstring uri) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data || !data->pipeline) return;
+ const jbyte *char_uri = (*env)->GetStringUTFChars (env, uri, NULL);
+ GST_DEBUG ("Setting URI to %s", char_uri);
+ if (data->target_state >= GST_STATE_READY)
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ g_object_set(data->pipeline, "uri", char_uri, NULL);
+ (*env)->ReleaseStringUTFChars (env, uri, char_uri);
+ data->duration = GST_CLOCK_TIME_NONE;
+ data->is_live |= (gst_element_set_state (data->pipeline, data->target_state) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+/* Set pipeline to PLAYING state */
+static void gst_native_play (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PLAYING");
+ data->target_state = GST_STATE_PLAYING;
+ data->is_live |= (gst_element_set_state (data->pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+/* Set pipeline to PAUSED state */
+static void gst_native_pause (JNIEnv* env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Setting state to PAUSED");
+ data->target_state = GST_STATE_PAUSED;
+ data->is_live |= (gst_element_set_state (data->pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+/* Instruct the pipeline to seek to a different position */
+void gst_native_set_position (JNIEnv* env, jobject thiz, int milliseconds) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ gint64 desired_position = (gint64)(milliseconds * GST_MSECOND);
+ if (data->state >= GST_STATE_PAUSED) {
+ execute_seek(desired_position, data);
+ } else {
+ GST_DEBUG ("Scheduling seek to %" GST_TIME_FORMAT " for later", GST_TIME_ARGS (desired_position));
+ data->desired_position = desired_position;
+ }
+}
+
+/* Static class initializer: retrieve method and field IDs */
+static jboolean gst_native_class_init (JNIEnv* env, jclass klass) {
+ custom_data_field_id = (*env)->GetFieldID (env, klass, "native_custom_data", "J");
+ set_message_method_id = (*env)->GetMethodID (env, klass, "setMessage", "(Ljava/lang/String;)V");
+ set_current_position_method_id = (*env)->GetMethodID (env, klass, "setCurrentPosition", "(II)V");
+ on_gstreamer_initialized_method_id = (*env)->GetMethodID (env, klass, "onGStreamerInitialized", "()V");
+ on_media_size_changed_method_id = (*env)->GetMethodID (env, klass, "onMediaSizeChanged", "(II)V");
+
+ if (!custom_data_field_id || !set_message_method_id || !on_gstreamer_initialized_method_id ||
+ !on_media_size_changed_method_id || !set_current_position_method_id) {
+ /* We emit this message through the Android log instead of the GStreamer log because the later
+ * has not been initialized yet.
+ */
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-4", "The calling class does not implement all necessary interface methods");
+ return JNI_FALSE;
+ }
+ return JNI_TRUE;
+}
+
+static void gst_native_surface_init (JNIEnv *env, jobject thiz, jobject surface) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ ANativeWindow *new_native_window = ANativeWindow_fromSurface(env, surface);
+ GST_DEBUG ("Received surface %p (native window %p)", surface, new_native_window);
+
+ if (data->native_window) {
+ ANativeWindow_release (data->native_window);
+ if (data->native_window == new_native_window) {
+ GST_DEBUG ("New native window is the same as the previous one %p", data->native_window);
+ if (data->pipeline) {
+ gst_video_overlay_expose(GST_VIDEO_OVERLAY (data->pipeline));
+ gst_video_overlay_expose(GST_VIDEO_OVERLAY (data->pipeline));
+ }
+ return;
+ } else {
+ GST_DEBUG ("Released previous native window %p", data->native_window);
+ data->initialized = FALSE;
+ }
+ }
+ data->native_window = new_native_window;
+
+ check_initialization_complete (data);
+}
+
+static void gst_native_surface_finalize (JNIEnv *env, jobject thiz) {
+ CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
+ if (!data) return;
+ GST_DEBUG ("Releasing Native Window %p", data->native_window);
+
+ if (data->pipeline) {
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->pipeline), (guintptr)NULL);
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ }
+
+ ANativeWindow_release (data->native_window);
+ data->native_window = NULL;
+ data->initialized = FALSE;
+}
+
+/* List of implemented native methods */
+static JNINativeMethod native_methods[] = {
+ { "nativeInit", "()V", (void *) gst_native_init},
+ { "nativeFinalize", "()V", (void *) gst_native_finalize},
+ { "nativeSetUri", "(Ljava/lang/String;)V", (void *) gst_native_set_uri},
+ { "nativePlay", "()V", (void *) gst_native_play},
+ { "nativePause", "()V", (void *) gst_native_pause},
+ { "nativeSetPosition", "(I)V", (void*) gst_native_set_position},
+ { "nativeSurfaceInit", "(Ljava/lang/Object;)V", (void *) gst_native_surface_init},
+ { "nativeSurfaceFinalize", "()V", (void *) gst_native_surface_finalize},
+ { "nativeClassInit", "()Z", (void *) gst_native_class_init}
+};
+
+/* Library initializer */
+jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+ JNIEnv *env = NULL;
+
+ java_vm = vm;
+
+ if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
+ __android_log_print (ANDROID_LOG_ERROR, "tutorial-5", "Could not retrieve JNIEnv");
+ return 0;
+ }
+ jclass klass = (*env)->FindClass (env, "com/gst_sdk_tutorials/tutorial_5/Tutorial5");
+ (*env)->RegisterNatives (env, klass, native_methods, G_N_ELEMENTS(native_methods));
+
+ pthread_key_create (&current_jni_env, detach_current_thread);
+
+ return JNI_VERSION_1_4;
+}
diff --git a/tutorials/android-tutorial-5/res/drawable-ldpi/file.png b/tutorials/android-tutorial-5/res/drawable-ldpi/file.png
new file mode 100644
index 0000000..6a64f0e
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/drawable-ldpi/file.png
Binary files differ
diff --git a/tutorials/android-tutorial-5/res/drawable-ldpi/folder.png b/tutorials/android-tutorial-5/res/drawable-ldpi/folder.png
new file mode 100644
index 0000000..d54f034
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/drawable-ldpi/folder.png
Binary files differ
diff --git a/tutorials/android-tutorial-5/res/drawable-ldpi/gstreamer_logo_5.png b/tutorials/android-tutorial-5/res/drawable-ldpi/gstreamer_logo_5.png
new file mode 100644
index 0000000..d8cd8ea
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/drawable-ldpi/gstreamer_logo_5.png
Binary files differ
diff --git a/tutorials/android-tutorial-5/res/drawable-mdpi/gstreamer_logo_5.png b/tutorials/android-tutorial-5/res/drawable-mdpi/gstreamer_logo_5.png
new file mode 100644
index 0000000..2e2e776
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/drawable-mdpi/gstreamer_logo_5.png
Binary files differ
diff --git a/tutorials/android-tutorial-5/res/drawable-xhdpi/gstreamer_logo_5.png b/tutorials/android-tutorial-5/res/drawable-xhdpi/gstreamer_logo_5.png
new file mode 100644
index 0000000..b72499e
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/drawable-xhdpi/gstreamer_logo_5.png
Binary files differ
diff --git a/tutorials/android-tutorial-5/res/drawable-xxhdpi/gstreamer_logo_5.png b/tutorials/android-tutorial-5/res/drawable-xxhdpi/gstreamer_logo_5.png
new file mode 100644
index 0000000..e420415
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/drawable-xxhdpi/gstreamer_logo_5.png
Binary files differ
diff --git a/tutorials/android-tutorial-5/res/drawable-xxxhdpi/gstreamer_logo_5.png b/tutorials/android-tutorial-5/res/drawable-xxxhdpi/gstreamer_logo_5.png
new file mode 100644
index 0000000..093d4c2
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/drawable-xxxhdpi/gstreamer_logo_5.png
Binary files differ
diff --git a/tutorials/android-tutorial-5/res/layout/file_dialog_main.xml b/tutorials/android-tutorial-5/res/layout/file_dialog_main.xml
new file mode 100644
index 0000000..3e33d06
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/layout/file_dialog_main.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_above="@+id/fdLinearLayoutList"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/path"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" />
+
+ <ListView
+ android:id="@android:id/list"
+ android:layout_width="fill_parent"
+ android:layout_height="0dip"
+ android:layout_weight="1" />
+
+ <LinearLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal" >
+
+ <Button
+ android:id="@+id/fdButtonCancel"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight=".3"
+ android:text="@string/button_cancel" />
+
+ <Button
+ android:id="@+id/fdButtonSelect"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight=".7"
+ android:text="@string/button_select" />
+ </LinearLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/tutorials/android-tutorial-5/res/layout/file_dialog_row.xml b/tutorials/android-tutorial-5/res/layout/file_dialog_row.xml
new file mode 100644
index 0000000..33b8ea8
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/layout/file_dialog_row.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content" >
+
+ <ImageView
+ android:id="@+id/fdrowimage"
+ android:layout_width="wrap_content"
+ android:layout_height="36dp"
+ android:contentDescription="@string/icon" />
+
+ <TextView
+ android:id="@+id/fdrowtext"
+ android:layout_width="0dip"
+ android:layout_height="36dp"
+ android:layout_weight="1"
+ android:ellipsize="marquee"
+ android:gravity="center_vertical"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:scrollHorizontally="true"
+ android:singleLine="true"
+ android:textSize="23dp" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/tutorials/android-tutorial-5/res/layout/main.xml b/tutorials/android-tutorial-5/res/layout/main.xml
new file mode 100755
index 0000000..df795b2
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/layout/main.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="vertical" >
+
+ <TextView
+ android:id="@+id/textview_message"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+ <ImageButton
+ android:id="@+id/button_play"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_play"
+ android:src="@android:drawable/ic_media_play"
+ android:text="@string/button_play" />
+
+ <ImageButton
+ android:id="@+id/button_stop"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_stop"
+ android:src="@android:drawable/ic_media_pause"
+ android:text="@string/button_stop" />
+
+ <ImageButton
+ android:id="@+id/button_select"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@string/button_select"
+ android:src="@android:drawable/ic_media_next"
+ android:text="@string/button_select" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:id="@+id/textview_time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginLeft="5dip"
+ android:layout_marginRight="5dip" />
+
+ <SeekBar
+ android:id="@+id/seek_bar"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_weight="1"
+ android:indeterminate="false" />
+ </LinearLayout>
+
+ <com.gst_sdk_tutorials.tutorial_5.GStreamerSurfaceView
+ android:id="@+id/surface_video"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical|center_horizontal" />
+
+</LinearLayout>
diff --git a/tutorials/android-tutorial-5/res/values/strings.xml b/tutorials/android-tutorial-5/res/values/strings.xml
new file mode 100755
index 0000000..272fafa
--- /dev/null
+++ b/tutorials/android-tutorial-5/res/values/strings.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">GStreamer tutorial 5</string>
+ <string name="button_play">Play</string>
+ <string name="button_stop">Stop</string>
+ <string name="button_select">Select</string>
+ <string name="button_cancel">Cancel</string>
+ <string name="filechooser_name">Select a file</string>
+ <string name="location">Location</string>
+ <string name="cant_read_folder">folder cannot be read</string>
+ <string name="icon">Icon</string>
+</resources>
diff --git a/tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/GStreamerSurfaceView.java b/tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/GStreamerSurfaceView.java
new file mode 100644
index 0000000..72b17b9
--- /dev/null
+++ b/tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/GStreamerSurfaceView.java
@@ -0,0 +1,85 @@
+package com.gst_sdk_tutorials.tutorial_5;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.SurfaceView;
+import android.view.View;
+
+// A simple SurfaceView whose width and height can be set from the outside
+public class GStreamerSurfaceView extends SurfaceView {
+ public int media_width = 320;
+ public int media_height = 240;
+
+ // Mandatory constructors, they do not do much
+ public GStreamerSurfaceView(Context context, AttributeSet attrs,
+ int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public GStreamerSurfaceView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public GStreamerSurfaceView (Context context) {
+ super(context);
+ }
+
+ // Called by the layout manager to find out our size and give us some rules.
+ // We will try to maximize our size, and preserve the media's aspect ratio if
+ // we are given the freedom to do so.
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int width = 0, height = 0;
+ int wmode = View.MeasureSpec.getMode(widthMeasureSpec);
+ int hmode = View.MeasureSpec.getMode(heightMeasureSpec);
+ int wsize = View.MeasureSpec.getSize(widthMeasureSpec);
+ int hsize = View.MeasureSpec.getSize(heightMeasureSpec);
+
+ Log.i ("GStreamer", "onMeasure called with " + media_width + "x" + media_height);
+ // Obey width rules
+ switch (wmode) {
+ case View.MeasureSpec.AT_MOST:
+ if (hmode == View.MeasureSpec.EXACTLY) {
+ width = Math.min(hsize * media_width / media_height, wsize);
+ break;
+ }
+ case View.MeasureSpec.EXACTLY:
+ width = wsize;
+ break;
+ case View.MeasureSpec.UNSPECIFIED:
+ width = media_width;
+ }
+
+ // Obey height rules
+ switch (hmode) {
+ case View.MeasureSpec.AT_MOST:
+ if (wmode == View.MeasureSpec.EXACTLY) {
+ height = Math.min(wsize * media_height / media_width, hsize);
+ break;
+ }
+ case View.MeasureSpec.EXACTLY:
+ height = hsize;
+ break;
+ case View.MeasureSpec.UNSPECIFIED:
+ height = media_height;
+ }
+
+ // Finally, calculate best size when both axis are free
+ if (hmode == View.MeasureSpec.AT_MOST && wmode == View.MeasureSpec.AT_MOST) {
+ int correct_height = width * media_height / media_width;
+ int correct_width = height * media_width / media_height;
+
+ if (correct_height < height)
+ height = correct_height;
+ else
+ width = correct_width;
+ }
+
+ // Obey minimum size
+ width = Math.max (getSuggestedMinimumWidth(), width);
+ height = Math.max (getSuggestedMinimumHeight(), height);
+ setMeasuredDimension(width, height);
+ }
+
+}
diff --git a/tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/Tutorial5.java b/tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/Tutorial5.java
new file mode 100644
index 0000000..c86ebd8
--- /dev/null
+++ b/tutorials/android-tutorial-5/src/com/gst_sdk_tutorials/tutorial_5/Tutorial5.java
@@ -0,0 +1,309 @@
+package com.gst_sdk_tutorials.tutorial_5;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.PowerManager;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageButton;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.freedesktop.gstreamer.GStreamer;
+import com.lamerman.FileDialog;
+
+public class Tutorial5 extends Activity implements SurfaceHolder.Callback, OnSeekBarChangeListener {
+ private native void nativeInit(); // Initialize native code, build pipeline, etc
+ private native void nativeFinalize(); // Destroy pipeline and shutdown native code
+ private native void nativeSetUri(String uri); // Set the URI of the media to play
+ private native void nativePlay(); // Set pipeline to PLAYING
+ private native void nativeSetPosition(int milliseconds); // Seek to the indicated position, in milliseconds
+ private native void nativePause(); // Set pipeline to PAUSED
+ private static native boolean nativeClassInit(); // Initialize native class: cache Method IDs for callbacks
+ private native void nativeSurfaceInit(Object surface); // A new surface is available
+ private native void nativeSurfaceFinalize(); // Surface about to be destroyed
+ private long native_custom_data; // Native code will use this to keep private data
+
+ private boolean is_playing_desired; // Whether the user asked to go to PLAYING
+ private int position; // Current position, reported by native code
+ private int duration; // Current clip duration, reported by native code
+ private boolean is_local_media; // Whether this clip is stored locally or is being streamed
+ private int desired_position; // Position where the users wants to seek to
+ private String mediaUri; // URI of the clip being played
+
+ private final String defaultMediaUri = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.ogv";
+
+ static private final int PICK_FILE_CODE = 1;
+ private String last_folder;
+
+ private PowerManager.WakeLock wake_lock;
+
+ // Called when the activity is first created.
+ @Override
+ public void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+
+ // Initialize GStreamer and warn if it fails
+ try {
+ GStreamer.init(this);
+ } catch (Exception e) {
+ Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
+ finish();
+ return;
+ }
+
+ setContentView(R.layout.main);
+
+ PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ wake_lock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GStreamer tutorial 5");
+ wake_lock.setReferenceCounted(false);
+
+ ImageButton play = (ImageButton) this.findViewById(R.id.button_play);
+ play.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = true;
+ wake_lock.acquire();
+ nativePlay();
+ }
+ });
+
+ ImageButton pause = (ImageButton) this.findViewById(R.id.button_stop);
+ pause.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ is_playing_desired = false;
+ wake_lock.release();
+ nativePause();
+ }
+ });
+
+ ImageButton select = (ImageButton) this.findViewById(R.id.button_select);
+ select.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ Intent i = new Intent(getBaseContext(), FileDialog.class);
+ i.putExtra(FileDialog.START_PATH, last_folder);
+ startActivityForResult(i, PICK_FILE_CODE);
+ }
+ });
+
+ SurfaceView sv = (SurfaceView) this.findViewById(R.id.surface_video);
+ SurfaceHolder sh = sv.getHolder();
+ sh.addCallback(this);
+
+ SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
+ sb.setOnSeekBarChangeListener(this);
+
+ // Retrieve our previous state, or initialize it to default values
+ if (savedInstanceState != null) {
+ is_playing_desired = savedInstanceState.getBoolean("playing");
+ position = savedInstanceState.getInt("position");
+ duration = savedInstanceState.getInt("duration");
+ mediaUri = savedInstanceState.getString("mediaUri");
+ last_folder = savedInstanceState.getString("last_folder");
+ Log.i ("GStreamer", "Activity created with saved state:");
+ } else {
+ is_playing_desired = false;
+ position = duration = 0;
+ last_folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).getAbsolutePath();
+ Intent intent = getIntent();
+ android.net.Uri uri = intent.getData();
+ if (uri == null)
+ mediaUri = defaultMediaUri;
+ else {
+ Log.i ("GStreamer", "Received URI: " + uri);
+ if (uri.getScheme().equals("content")) {
+ android.database.Cursor cursor = getContentResolver().query(uri, null, null, null, null);
+ cursor.moveToFirst();
+ mediaUri = "file://" + cursor.getString(cursor.getColumnIndex(android.provider.MediaStore.Video.Media.DATA));
+ cursor.close();
+ } else
+ mediaUri = uri.toString();
+ }
+ Log.i ("GStreamer", "Activity created with no saved state:");
+ }
+ is_local_media = false;
+ Log.i ("GStreamer", " playing:" + is_playing_desired + " position:" + position +
+ " duration: " + duration + " uri: " + mediaUri);
+
+ // Start with disabled buttons, until native code is initialized
+ this.findViewById(R.id.button_play).setEnabled(false);
+ this.findViewById(R.id.button_stop).setEnabled(false);
+
+ nativeInit();
+ }
+
+ protected void onSaveInstanceState (Bundle outState) {
+ Log.d ("GStreamer", "Saving state, playing:" + is_playing_desired + " position:" + position +
+ " duration: " + duration + " uri: " + mediaUri);
+ outState.putBoolean("playing", is_playing_desired);
+ outState.putInt("position", position);
+ outState.putInt("duration", duration);
+ outState.putString("mediaUri", mediaUri);
+ outState.putString("last_folder", last_folder);
+ }
+
+ protected void onDestroy() {
+ nativeFinalize();
+ if (wake_lock.isHeld())
+ wake_lock.release();
+ super.onDestroy();
+ }
+
+ // Called from native code. This sets the content of the TextView from the UI thread.
+ private void setMessage(final String message) {
+ final TextView tv = (TextView) this.findViewById(R.id.textview_message);
+ runOnUiThread (new Runnable() {
+ public void run() {
+ tv.setText(message);
+ }
+ });
+ }
+
+ // Set the URI to play, and record whether it is a local or remote file
+ private void setMediaUri() {
+ nativeSetUri (mediaUri);
+ is_local_media = mediaUri.startsWith("file://");
+ }
+
+ // Called from native code. Native code calls this once it has created its pipeline and
+ // the main loop is running, so it is ready to accept commands.
+ private void onGStreamerInitialized () {
+ Log.i ("GStreamer", "GStreamer initialized:");
+ Log.i ("GStreamer", " playing:" + is_playing_desired + " position:" + position + " uri: " + mediaUri);
+
+ // Restore previous playing state
+ setMediaUri ();
+ nativeSetPosition (position);
+ if (is_playing_desired) {
+ nativePlay();
+ wake_lock.acquire();
+ } else {
+ nativePause();
+ wake_lock.release();
+ }
+
+ // Re-enable buttons, now that GStreamer is initialized
+ final Activity activity = this;
+ runOnUiThread(new Runnable() {
+ public void run() {
+ activity.findViewById(R.id.button_play).setEnabled(true);
+ activity.findViewById(R.id.button_stop).setEnabled(true);
+ }
+ });
+ }
+
+ // The text widget acts as an slave for the seek bar, so it reflects what the seek bar shows, whether
+ // it is an actual pipeline position or the position the user is currently dragging to.
+ private void updateTimeWidget () {
+ TextView tv = (TextView) this.findViewById(R.id.textview_time);
+ SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
+ int pos = sb.getProgress();
+
+ SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
+ df.setTimeZone(TimeZone.getTimeZone("UTC"));
+ String message = df.format(new Date (pos)) + " / " + df.format(new Date (duration));
+ tv.setText(message);
+ }
+
+ // Called from native code
+ private void setCurrentPosition(final int position, final int duration) {
+ final SeekBar sb = (SeekBar) this.findViewById(R.id.seek_bar);
+
+ // Ignore position messages from the pipeline if the seek bar is being dragged
+ if (sb.isPressed()) return;
+
+ runOnUiThread (new Runnable() {
+ public void run() {
+ sb.setMax(duration);
+ sb.setProgress(position);
+ updateTimeWidget();
+ sb.setEnabled(duration != 0);
+ }
+ });
+ this.position = position;
+ this.duration = duration;
+ }
+
+ static {
+ System.loadLibrary("gstreamer_android");
+ System.loadLibrary("tutorial-5");
+ nativeClassInit();
+ }
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int width,
+ int height) {
+ Log.d("GStreamer", "Surface changed to format " + format + " width "
+ + width + " height " + height);
+ nativeSurfaceInit (holder.getSurface());
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.d("GStreamer", "Surface created: " + holder.getSurface());
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.d("GStreamer", "Surface destroyed");
+ nativeSurfaceFinalize ();
+ }
+
+ // Called from native code when the size of the media changes or is first detected.
+ // Inform the video surface about the new size and recalculate the layout.
+ private void onMediaSizeChanged (int width, int height) {
+ Log.i ("GStreamer", "Media size changed to " + width + "x" + height);
+ final GStreamerSurfaceView gsv = (GStreamerSurfaceView) this.findViewById(R.id.surface_video);
+ gsv.media_width = width;
+ gsv.media_height = height;
+ runOnUiThread(new Runnable() {
+ public void run() {
+ gsv.requestLayout();
+ }
+ });
+ }
+
+ // The Seek Bar thumb has moved, either because the user dragged it or we have called setProgress()
+ public void onProgressChanged(SeekBar sb, int progress, boolean fromUser) {
+ if (fromUser == false) return;
+ desired_position = progress;
+ // If this is a local file, allow scrub seeking, this is, seek as soon as the slider is moved.
+ if (is_local_media) nativeSetPosition(desired_position);
+ updateTimeWidget();
+ }
+
+ // The user started dragging the Seek Bar thumb
+ public void onStartTrackingTouch(SeekBar sb) {
+ nativePause();
+ }
+
+ // The user released the Seek Bar thumb
+ public void onStopTrackingTouch(SeekBar sb) {
+ // If this is a remote file, scrub seeking is probably not going to work smoothly enough.
+ // Therefore, perform only the seek when the slider is released.
+ if (!is_local_media) nativeSetPosition(desired_position);
+ if (is_playing_desired) nativePlay();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data)
+ {
+ if (resultCode == RESULT_OK && requestCode == PICK_FILE_CODE) {
+ mediaUri = "file://" + data.getStringExtra(FileDialog.RESULT_PATH);
+ position = 0;
+ last_folder = new File (data.getStringExtra(FileDialog.RESULT_PATH)).getParent();
+ Log.i("GStreamer", "Setting last_folder to " + last_folder);
+ setMediaUri();
+ }
+ }
+}
diff --git a/tutorials/android-tutorial-5/src/com/lamerman/FileDialog.java b/tutorials/android-tutorial-5/src/com/lamerman/FileDialog.java
new file mode 100644
index 0000000..e2ef765
--- /dev/null
+++ b/tutorials/android-tutorial-5/src/com/lamerman/FileDialog.java
@@ -0,0 +1,334 @@
+// Based on http://code.google.com/p/android-file-dialog/
+//
+// Copyright (c) 2011, 2012, Alexander Ponomarev <alexander.ponomarev.1@gmail.com>
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification,
+// are permitted provided that the following conditions are met:
+//
+// Redistributions of source code must retain the above copyright notice, this list
+// of conditions and the following disclaimer. Redistributions in binary form must
+// reproduce the above copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided with the distribution.
+// Neither the name of the <ORGANIZATION> nor the names of its contributors may be used
+// to endorse or promote products derived from this software without specific prior
+// written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+// DAMAGE.
+
+package com.lamerman;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.TreeMap;
+
+import android.app.AlertDialog;
+import android.app.ListActivity;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+import android.widget.TextView;
+
+import com.gst_sdk_tutorials.tutorial_5.R;
+
+/**
+ * Activity para escolha de arquivos/diretorios.
+ *
+ * @author android
+ *
+ */
+public class FileDialog extends ListActivity {
+
+ /**
+ * Chave de um item da lista de paths.
+ */
+ private static final String ITEM_KEY = "key";
+
+ /**
+ * Imagem de um item da lista de paths (diretorio ou arquivo).
+ */
+ private static final String ITEM_IMAGE = "image";
+
+ /**
+ * Diretorio raiz.
+ */
+ private static final String ROOT = "/";
+
+ /**
+ * Parametro de entrada da Activity: path inicial. Padrao: ROOT.
+ */
+ public static final String START_PATH = "START_PATH";
+
+ /**
+ * Parametro de entrada da Activity: filtro de formatos de arquivos. Padrao:
+ * null.
+ */
+ public static final String FORMAT_FILTER = "FORMAT_FILTER";
+
+ /**
+ * Parametro de saida da Activity: path escolhido. Padrao: null.
+ */
+ public static final String RESULT_PATH = "RESULT_PATH";
+
+ private List<String> path = null;
+ private TextView myPath;
+ private ArrayList<HashMap<String, Object>> mList;
+
+ private Button selectButton;
+
+ private String parentPath;
+ private String currentPath = ROOT;
+
+ private String[] formatFilter = null;
+
+ private File selectedFile;
+ private HashMap<String, Integer> lastPositions = new HashMap<String, Integer>();
+
+ /**
+ * Called when the activity is first created. Configura todos os parametros
+ * de entrada e das VIEWS..
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setResult(RESULT_CANCELED, getIntent());
+
+ setContentView(R.layout.file_dialog_main);
+ myPath = (TextView) findViewById(R.id.path);
+
+ selectButton = (Button) findViewById(R.id.fdButtonSelect);
+ selectButton.setEnabled(false);
+ selectButton.setOnClickListener(new OnClickListener() {
+
+ public void onClick(View v) {
+ if (selectedFile != null) {
+ getIntent().putExtra(RESULT_PATH, selectedFile.getPath());
+ setResult(RESULT_OK, getIntent());
+ finish();
+ }
+ }
+ });
+
+ formatFilter = getIntent().getStringArrayExtra(FORMAT_FILTER);
+
+ final Button cancelButton = (Button) findViewById(R.id.fdButtonCancel);
+ cancelButton.setOnClickListener(new OnClickListener() {
+
+ public void onClick(View v) {
+ setResult(RESULT_CANCELED);
+ finish();
+ }
+
+ });
+
+ String startPath;
+ if (savedInstanceState != null) {
+ startPath = savedInstanceState.getString("currentPath");
+ } else {
+ startPath = getIntent().getStringExtra(START_PATH);
+ }
+ startPath = startPath != null ? startPath : ROOT;
+ getDir(startPath);
+
+ ListView lv = (ListView) findViewById(android.R.id.list);
+ lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+ }
+
+ private void getDir(String dirPath) {
+
+ boolean useAutoSelection = dirPath.length() < currentPath.length();
+
+ Integer position = lastPositions.get(parentPath);
+
+ getDirImpl(dirPath);
+
+ if (position != null && useAutoSelection) {
+ getListView().setSelection(position);
+ }
+
+ }
+
+ /**
+ * Monta a estrutura de arquivos e diretorios filhos do diretorio fornecido.
+ *
+ * @param dirPath
+ * Diretorio pai.
+ */
+ private void getDirImpl(final String dirPath) {
+
+ currentPath = dirPath;
+
+ final List<String> item = new ArrayList<String>();
+ path = new ArrayList<String>();
+ mList = new ArrayList<HashMap<String, Object>>();
+
+ File f = new File(currentPath);
+ File[] files = f.listFiles();
+ if (files == null) {
+ currentPath = ROOT;
+ f = new File(currentPath);
+ files = f.listFiles();
+ }
+ myPath.setText(getText(R.string.location) + ": " + currentPath);
+
+ if (!currentPath.equals(ROOT)) {
+
+ item.add(ROOT);
+ addItem(ROOT, R.drawable.folder);
+ path.add(ROOT);
+
+ item.add("../");
+ addItem("../", R.drawable.folder);
+ path.add(f.getParent());
+ parentPath = f.getParent();
+
+ }
+
+ TreeMap<String, String> dirsMap = new TreeMap<String, String>();
+ TreeMap<String, String> dirsPathMap = new TreeMap<String, String>();
+ TreeMap<String, String> filesMap = new TreeMap<String, String>();
+ TreeMap<String, String> filesPathMap = new TreeMap<String, String>();
+ for (File file : files) {
+ if (file.isDirectory()) {
+ String dirName = file.getName();
+ dirsMap.put(dirName, dirName);
+ dirsPathMap.put(dirName, file.getPath());
+ } else {
+ final String fileName = file.getName();
+ final String fileNameLwr = fileName.toLowerCase();
+ // se ha um filtro de formatos, utiliza-o
+ if (formatFilter != null) {
+ boolean contains = false;
+ for (int i = 0; i < formatFilter.length; i++) {
+ final String formatLwr = formatFilter[i].toLowerCase();
+ if (fileNameLwr.endsWith(formatLwr)) {
+ contains = true;
+ break;
+ }
+ }
+ if (contains) {
+ filesMap.put(fileName, fileName);
+ filesPathMap.put(fileName, file.getPath());
+ }
+ // senao, adiciona todos os arquivos
+ } else {
+ filesMap.put(fileName, fileName);
+ filesPathMap.put(fileName, file.getPath());
+ }
+ }
+ }
+ item.addAll(dirsMap.tailMap("").values());
+ item.addAll(filesMap.tailMap("").values());
+ path.addAll(dirsPathMap.tailMap("").values());
+ path.addAll(filesPathMap.tailMap("").values());
+
+ SimpleAdapter fileList = new SimpleAdapter(this, mList,
+ R.layout.file_dialog_row,
+ new String[] { ITEM_KEY, ITEM_IMAGE }, new int[] {
+ R.id.fdrowtext, R.id.fdrowimage });
+
+ for (String dir : dirsMap.tailMap("").values()) {
+ addItem(dir, R.drawable.folder);
+ }
+
+ for (String file : filesMap.tailMap("").values()) {
+ addItem(file, R.drawable.file);
+ }
+
+ fileList.notifyDataSetChanged();
+
+ setListAdapter(fileList);
+
+ }
+
+ private void addItem(String fileName, int imageId) {
+ HashMap<String, Object> item = new HashMap<String, Object>();
+ item.put(ITEM_KEY, fileName);
+ item.put(ITEM_IMAGE, imageId);
+ mList.add(item);
+ }
+
+ /**
+ * Quando clica no item da lista, deve-se: 1) Se for diretorio, abre seus
+ * arquivos filhos; 2) Se puder escolher diretorio, define-o como sendo o
+ * path escolhido. 3) Se for arquivo, define-o como path escolhido. 4) Ativa
+ * botao de selecao.
+ */
+ @Override
+ protected void onListItemClick(ListView l, View v, int position, long id) {
+
+ File file = new File(path.get(position));
+
+ if (file.isDirectory()) {
+ selectButton.setEnabled(false);
+ if (file.canRead()) {
+ lastPositions.put(currentPath, position);
+ getDir(path.get(position));
+ } else {
+ new AlertDialog.Builder(this)
+ .setIcon(android.R.drawable.stat_sys_warning)
+ .setTitle(
+ "[" + file.getName() + "] "
+ + getText(R.string.cant_read_folder))
+ .setPositiveButton("OK",
+ new DialogInterface.OnClickListener() {
+
+ public void onClick(DialogInterface dialog,
+ int which) {
+
+ }
+ }).show();
+ }
+ } else {
+ if (selectedFile != null
+ && selectedFile.getPath().equals(file.getPath())) {
+ getIntent().putExtra(RESULT_PATH, selectedFile.getPath());
+ setResult(RESULT_OK, getIntent());
+ finish();
+ }
+ selectedFile = file;
+ l.setItemChecked(position, true);
+ selectButton.setEnabled(true);
+ }
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if ((keyCode == KeyEvent.KEYCODE_BACK)) {
+ selectButton.setEnabled(false);
+
+ if (!currentPath.equals(ROOT)) {
+ getDir(parentPath);
+ } else {
+ return super.onKeyDown(keyCode, event);
+ }
+
+ return true;
+ } else {
+ return super.onKeyDown(keyCode, event);
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ outState.putString("currentPath", currentPath);
+ super.onSaveInstanceState(outState);
+ }
+
+}
diff --git a/tutorials/basic-tutorial-1.c b/tutorials/basic-tutorial-1.c
new file mode 100644
index 0000000..1656353
--- /dev/null
+++ b/tutorials/basic-tutorial-1.c
@@ -0,0 +1,28 @@
+#include <gst/gst.h>
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline;
+ GstBus *bus;
+ GstMessage *msg;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Build the pipeline */
+ pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Start playing */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* Wait until error or EOS */
+ bus = gst_element_get_bus (pipeline);
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
+
+ /* Free resources */
+ if (msg != NULL)
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-12.c b/tutorials/basic-tutorial-12.c
new file mode 100644
index 0000000..ab877e7
--- /dev/null
+++ b/tutorials/basic-tutorial-12.c
@@ -0,0 +1,99 @@
+#include <gst/gst.h>
+#include <string.h>
+
+typedef struct _CustomData {
+ gboolean is_live;
+ GstElement *pipeline;
+ GMainLoop *loop;
+} CustomData;
+
+static void cb_message (GstBus *bus, GstMessage *msg, CustomData *data) {
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (msg, &err, &debug);
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+ g_free (debug);
+
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ g_main_loop_quit (data->loop);
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ /* end-of-stream */
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ g_main_loop_quit (data->loop);
+ break;
+ case GST_MESSAGE_BUFFERING: {
+ gint percent = 0;
+
+ /* If the stream is live, we do not care about buffering. */
+ if (data->is_live) break;
+
+ gst_message_parse_buffering (msg, &percent);
+ g_print ("Buffering (%3d%%)\r", percent);
+ /* Wait until buffering is complete before start/resume playing */
+ if (percent < 100)
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ else
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ break;
+ }
+ case GST_MESSAGE_CLOCK_LOST:
+ /* Get a new clock */
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ break;
+ default:
+ /* Unhandled message */
+ break;
+ }
+}
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+ GMainLoop *main_loop;
+ CustomData data;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Initialize our data structure */
+ memset (&data, 0, sizeof (data));
+
+ /* Build the pipeline */
+ pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+ bus = gst_element_get_bus (pipeline);
+
+ /* Start playing */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (pipeline);
+ return -1;
+ } else if (ret == GST_STATE_CHANGE_NO_PREROLL) {
+ data.is_live = TRUE;
+ }
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ data.loop = main_loop;
+ data.pipeline = pipeline;
+
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message", G_CALLBACK (cb_message), &data);
+
+ g_main_loop_run (main_loop);
+
+ /* Free resources */
+ g_main_loop_unref (main_loop);
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-13.c b/tutorials/basic-tutorial-13.c
new file mode 100644
index 0000000..1447407
--- /dev/null
+++ b/tutorials/basic-tutorial-13.c
@@ -0,0 +1,146 @@
+#include <string.h>
+#include <stdio.h>
+#include <gst/gst.h>
+
+typedef struct _CustomData {
+ GstElement *pipeline;
+ GstElement *video_sink;
+ GMainLoop *loop;
+
+ gboolean playing; /* Playing or Paused */
+ gdouble rate; /* Current playback rate (can be negative) */
+} CustomData;
+
+/* Send seek event to change rate */
+static void send_seek_event (CustomData *data) {
+ gint64 position;
+ GstEvent *seek_event;
+
+ /* Obtain the current position, needed for the seek event */
+ if (!gst_element_query_position (data->pipeline, GST_FORMAT_TIME, &position)) {
+ g_printerr ("Unable to retrieve current position.\n");
+ return;
+ }
+
+ /* Create the seek event */
+ if (data->rate > 0) {
+ seek_event = gst_event_new_seek (data->rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+ GST_SEEK_TYPE_SET, position, GST_SEEK_TYPE_SET, -1);
+ } else {
+ seek_event = gst_event_new_seek (data->rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+ GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, position);
+ }
+
+ if (data->video_sink == NULL) {
+ /* If we have not done so, obtain the sink through which we will send the seek events */
+ g_object_get (data->pipeline, "video-sink", &data->video_sink, NULL);
+ }
+
+ /* Send the event */
+ gst_element_send_event (data->video_sink, seek_event);
+
+ g_print ("Current rate: %g\n", data->rate);
+}
+
+/* Process keyboard input */
+static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) {
+ gchar *str = NULL;
+
+ if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) {
+ return TRUE;
+ }
+
+ switch (g_ascii_tolower (str[0])) {
+ case 'p':
+ data->playing = !data->playing;
+ gst_element_set_state (data->pipeline, data->playing ? GST_STATE_PLAYING : GST_STATE_PAUSED);
+ g_print ("Setting state to %s\n", data->playing ? "PLAYING" : "PAUSE");
+ break;
+ case 's':
+ if (g_ascii_isupper (str[0])) {
+ data->rate *= 2.0;
+ } else {
+ data->rate /= 2.0;
+ }
+ send_seek_event (data);
+ break;
+ case 'd':
+ data->rate *= -1.0;
+ send_seek_event (data);
+ break;
+ case 'n':
+ if (data->video_sink == NULL) {
+ /* If we have not done so, obtain the sink through which we will send the step events */
+ g_object_get (data->pipeline, "video-sink", &data->video_sink, NULL);
+ }
+
+ gst_element_send_event (data->video_sink,
+ gst_event_new_step (GST_FORMAT_BUFFERS, 1, data->rate, TRUE, FALSE));
+ g_print ("Stepping one frame\n");
+ break;
+ case 'q':
+ g_main_loop_quit (data->loop);
+ break;
+ default:
+ break;
+ }
+
+ g_free (str);
+
+ return TRUE;
+}
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstStateChangeReturn ret;
+ GIOChannel *io_stdin;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Initialize our data structure */
+ memset (&data, 0, sizeof (data));
+
+ /* Print usage map */
+ g_print (
+ "USAGE: Choose one of the following options, then press enter:\n"
+ " 'P' to toggle between PAUSE and PLAY\n"
+ " 'S' to increase playback speed, 's' to decrease playback speed\n"
+ " 'D' to toggle playback direction\n"
+ " 'N' to move to next frame (in the current direction, better in PAUSE)\n"
+ " 'Q' to quit\n");
+
+ /* Build the pipeline */
+ data.pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Add a keyboard watch so we get notified of keystrokes */
+#ifdef G_OS_WIN32
+ io_stdin = g_io_channel_win32_new_fd (fileno (stdin));
+#else
+ io_stdin = g_io_channel_unix_new (fileno (stdin));
+#endif
+ g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+ data.playing = TRUE;
+ data.rate = 1.0;
+
+ /* Create a GLib Main Loop and set it to run */
+ data.loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (data.loop);
+
+ /* Free resources */
+ g_main_loop_unref (data.loop);
+ g_io_channel_unref (io_stdin);
+ gst_element_set_state (data.pipeline, GST_STATE_NULL);
+ if (data.video_sink != NULL)
+ gst_object_unref (data.video_sink);
+ gst_object_unref (data.pipeline);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-15.c b/tutorials/basic-tutorial-15.c
new file mode 100644
index 0000000..f9a18f0
--- /dev/null
+++ b/tutorials/basic-tutorial-15.c
@@ -0,0 +1,95 @@
+#include <clutter-gst/clutter-gst.h>
+
+/* Setup the video texture once its size is known */
+void size_change (ClutterActor *texture, gint width, gint height, gpointer user_data) {
+ ClutterActor *stage;
+ gfloat new_x, new_y, new_width, new_height;
+ gfloat stage_width, stage_height;
+ ClutterAnimation *animation = NULL;
+
+ stage = clutter_actor_get_stage (texture);
+ if (stage == NULL)
+ return;
+
+ clutter_actor_get_size (stage, &stage_width, &stage_height);
+
+ /* Center video on window and calculate new size preserving aspect ratio */
+ new_height = (height * stage_width) / width;
+ if (new_height <= stage_height) {
+ new_width = stage_width;
+
+ new_x = 0;
+ new_y = (stage_height - new_height) / 2;
+ } else {
+ new_width = (width * stage_height) / height;
+ new_height = stage_height;
+
+ new_x = (stage_width - new_width) / 2;
+ new_y = 0;
+ }
+ clutter_actor_set_position (texture, new_x, new_y);
+ clutter_actor_set_size (texture, new_width, new_height);
+ clutter_actor_set_rotation (texture, CLUTTER_Y_AXIS, 0.0, stage_width / 2, 0, 0);
+ /* Animate it */
+ animation = clutter_actor_animate (texture, CLUTTER_LINEAR, 10000, "rotation-angle-y", 360.0, NULL);
+ clutter_animation_set_loop (animation, TRUE);
+}
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline, *sink;
+ ClutterTimeline *timeline;
+ ClutterActor *stage, *texture;
+
+ /* clutter-gst takes care of initializing Clutter and GStreamer */
+ if (clutter_gst_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) {
+ g_error ("Failed to initialize clutter\n");
+ return -1;
+ }
+
+ stage = clutter_stage_get_default ();
+
+ /* Make a timeline */
+ timeline = clutter_timeline_new (1000);
+ g_object_set(timeline, "loop", TRUE, NULL);
+
+ /* Create new texture and disable slicing so the video is properly mapped onto it */
+ texture = CLUTTER_ACTOR (g_object_new (CLUTTER_TYPE_TEXTURE, "disable-slicing", TRUE, NULL));
+ g_signal_connect (texture, "size-change", G_CALLBACK (size_change), NULL);
+
+ /* Build the GStreamer pipeline */
+ pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Instantiate the Clutter sink */
+ sink = gst_element_factory_make ("autocluttersink", NULL);
+ if (sink == NULL) {
+ /* Revert to the older cluttersink, in case autocluttersink was not found */
+ sink = gst_element_factory_make ("cluttersink", NULL);
+ }
+ if (sink == NULL) {
+ g_printerr ("Unable to find a Clutter sink.\n");
+ return -1;
+ }
+
+ /* Link GStreamer with Clutter by passing the Clutter texture to the Clutter sink*/
+ g_object_set (sink, "texture", texture, NULL);
+
+ /* Add the Clutter sink to the pipeline */
+ g_object_set (pipeline, "video-sink", sink, NULL);
+
+ /* Start playing */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* start the timeline */
+ clutter_timeline_start (timeline);
+
+ /* Add texture to the stage, and show it */
+ clutter_group_add (CLUTTER_GROUP (stage), texture);
+ clutter_actor_show_all (stage);
+
+ clutter_main();
+
+ /* Free resources */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-2.c b/tutorials/basic-tutorial-2.c
new file mode 100644
index 0000000..984442b
--- /dev/null
+++ b/tutorials/basic-tutorial-2.c
@@ -0,0 +1,76 @@
+#include <gst/gst.h>
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline, *source, *sink;
+ GstBus *bus;
+ GstMessage *msg;
+ GstStateChangeReturn ret;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ source = gst_element_factory_make ("videotestsrc", "source");
+ sink = gst_element_factory_make ("autovideosink", "sink");
+
+ /* Create the empty pipeline */
+ pipeline = gst_pipeline_new ("test-pipeline");
+
+ if (!pipeline || !source || !sink) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Build the pipeline */
+ gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
+ if (gst_element_link (source, sink) != TRUE) {
+ g_printerr ("Elements could not be linked.\n");
+ gst_object_unref (pipeline);
+ return -1;
+ }
+
+ /* Modify the source's properties */
+ g_object_set (source, "pattern", 0, NULL);
+
+ /* Start playing */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (pipeline);
+ return -1;
+ }
+
+ /* Wait until error or EOS */
+ bus = gst_element_get_bus (pipeline);
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
+
+ /* Parse message */
+ if (msg != NULL) {
+ GError *err;
+ gchar *debug_info;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("End-Of-Stream reached.\n");
+ break;
+ default:
+ /* We should not reach here because we only asked for ERRORs and EOS */
+ g_printerr ("Unexpected message received.\n");
+ break;
+ }
+ gst_message_unref (msg);
+ }
+
+ /* Free resources */
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return 0;
+} \ No newline at end of file
diff --git a/tutorials/basic-tutorial-3.c b/tutorials/basic-tutorial-3.c
new file mode 100644
index 0000000..8ec0dca
--- /dev/null
+++ b/tutorials/basic-tutorial-3.c
@@ -0,0 +1,149 @@
+#include <gst/gst.h>
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ GstElement *pipeline;
+ GstElement *source;
+ GstElement *convert;
+ GstElement *sink;
+} CustomData;
+
+/* Handler for the pad-added signal */
+static void pad_added_handler (GstElement *src, GstPad *pad, CustomData *data);
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstBus *bus;
+ GstMessage *msg;
+ GstStateChangeReturn ret;
+ gboolean terminate = FALSE;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ data.source = gst_element_factory_make ("uridecodebin", "source");
+ data.convert = gst_element_factory_make ("audioconvert", "convert");
+ data.sink = gst_element_factory_make ("autoaudiosink", "sink");
+
+ /* Create the empty pipeline */
+ data.pipeline = gst_pipeline_new ("test-pipeline");
+
+ if (!data.pipeline || !data.source || !data.convert || !data.sink) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Build the pipeline. Note that we are NOT linking the source at this
+ * point. We will do it later. */
+ gst_bin_add_many (GST_BIN (data.pipeline), data.source, data.convert , data.sink, NULL);
+ if (!gst_element_link (data.convert, data.sink)) {
+ g_printerr ("Elements could not be linked.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+
+ /* Set the URI to play */
+ g_object_set (data.source, "uri", "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Connect to the pad-added signal */
+ g_signal_connect (data.source, "pad-added", G_CALLBACK (pad_added_handler), &data);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+
+ /* Listen to the bus */
+ bus = gst_element_get_bus (data.pipeline);
+ do {
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
+
+ /* Parse message */
+ if (msg != NULL) {
+ GError *err;
+ gchar *debug_info;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+ terminate = TRUE;
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("End-Of-Stream reached.\n");
+ terminate = TRUE;
+ break;
+ case GST_MESSAGE_STATE_CHANGED:
+ /* We are only interested in state-changed messages from the pipeline */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data.pipeline)) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ g_print ("Pipeline state changed from %s to %s:\n",
+ gst_element_state_get_name (old_state), gst_element_state_get_name (new_state));
+ }
+ break;
+ default:
+ /* We should not reach here */
+ g_printerr ("Unexpected message received.\n");
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ } while (!terminate);
+
+ /* Free resources */
+ gst_object_unref (bus);
+ gst_element_set_state (data.pipeline, GST_STATE_NULL);
+ gst_object_unref (data.pipeline);
+ return 0;
+}
+
+/* This function will be called by the pad-added signal */
+static void pad_added_handler (GstElement *src, GstPad *new_pad, CustomData *data) {
+ GstPad *sink_pad = gst_element_get_static_pad (data->convert, "sink");
+ GstPadLinkReturn ret;
+ GstCaps *new_pad_caps = NULL;
+ GstStructure *new_pad_struct = NULL;
+ const gchar *new_pad_type = NULL;
+
+ g_print ("Received new pad '%s' from '%s':\n", GST_PAD_NAME (new_pad), GST_ELEMENT_NAME (src));
+
+ /* If our converter is already linked, we have nothing to do here */
+ if (gst_pad_is_linked (sink_pad)) {
+ g_print (" We are already linked. Ignoring.\n");
+ goto exit;
+ }
+
+ /* Check the new pad's type */
+ new_pad_caps = gst_pad_query_caps (new_pad, NULL);
+ new_pad_struct = gst_caps_get_structure (new_pad_caps, 0);
+ new_pad_type = gst_structure_get_name (new_pad_struct);
+ if (!g_str_has_prefix (new_pad_type, "audio/x-raw")) {
+ g_print (" It has type '%s' which is not raw audio. Ignoring.\n", new_pad_type);
+ goto exit;
+ }
+
+ /* Attempt the link */
+ ret = gst_pad_link (new_pad, sink_pad);
+ if (GST_PAD_LINK_FAILED (ret)) {
+ g_print (" Type is '%s' but link failed.\n", new_pad_type);
+ } else {
+ g_print (" Link succeeded (type '%s').\n", new_pad_type);
+ }
+
+exit:
+ /* Unreference the new pad's caps, if we got them */
+ if (new_pad_caps != NULL)
+ gst_caps_unref (new_pad_caps);
+
+ /* Unreference the sink pad */
+ gst_object_unref (sink_pad);
+}
diff --git a/tutorials/basic-tutorial-4.c b/tutorials/basic-tutorial-4.c
new file mode 100644
index 0000000..37f162e
--- /dev/null
+++ b/tutorials/basic-tutorial-4.c
@@ -0,0 +1,156 @@
+#include <gst/gst.h>
+
+/* Structure to contain all our information, so we can pass it around */
+typedef struct _CustomData {
+ GstElement *playbin; /* Our one and only element */
+ gboolean playing; /* Are we in the PLAYING state? */
+ gboolean terminate; /* Should we terminate execution? */
+ gboolean seek_enabled; /* Is seeking enabled for this media? */
+ gboolean seek_done; /* Have we performed the seek already? */
+ gint64 duration; /* How long does this media last, in nanoseconds */
+} CustomData;
+
+/* Forward definition of the message processing function */
+static void handle_message (CustomData *data, GstMessage *msg);
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstBus *bus;
+ GstMessage *msg;
+ GstStateChangeReturn ret;
+
+ data.playing = FALSE;
+ data.terminate = FALSE;
+ data.seek_enabled = FALSE;
+ data.seek_done = FALSE;
+ data.duration = GST_CLOCK_TIME_NONE;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ data.playbin = gst_element_factory_make ("playbin", "playbin");
+
+ if (!data.playbin) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Set the URI to play */
+ g_object_set (data.playbin, "uri", "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.playbin, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.playbin);
+ return -1;
+ }
+
+ /* Listen to the bus */
+ bus = gst_element_get_bus (data.playbin);
+ do {
+ msg = gst_bus_timed_pop_filtered (bus, 100 * GST_MSECOND,
+ GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_DURATION);
+
+ /* Parse message */
+ if (msg != NULL) {
+ handle_message (&data, msg);
+ } else {
+ /* We got no message, this means the timeout expired */
+ if (data.playing) {
+ gint64 current = -1;
+
+ /* Query the current position of the stream */
+ if (!gst_element_query_position (data.playbin, GST_FORMAT_TIME, &current)) {
+ g_printerr ("Could not query current position.\n");
+ }
+
+ /* If we didn't know it yet, query the stream duration */
+ if (!GST_CLOCK_TIME_IS_VALID (data.duration)) {
+ if (!gst_element_query_duration (data.playbin, GST_FORMAT_TIME, &data.duration)) {
+ g_printerr ("Could not query current duration.\n");
+ }
+ }
+
+ /* Print current position and total duration */
+ g_print ("Position %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",
+ GST_TIME_ARGS (current), GST_TIME_ARGS (data.duration));
+
+ /* If seeking is enabled, we have not done it yet, and the time is right, seek */
+ if (data.seek_enabled && !data.seek_done && current > 10 * GST_SECOND) {
+ g_print ("\nReached 10s, performing seek...\n");
+ gst_element_seek_simple (data.playbin, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, 30 * GST_SECOND);
+ data.seek_done = TRUE;
+ }
+ }
+ }
+ } while (!data.terminate);
+
+ /* Free resources */
+ gst_object_unref (bus);
+ gst_element_set_state (data.playbin, GST_STATE_NULL);
+ gst_object_unref (data.playbin);
+ return 0;
+}
+
+static void handle_message (CustomData *data, GstMessage *msg) {
+ GError *err;
+ gchar *debug_info;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+ data->terminate = TRUE;
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("End-Of-Stream reached.\n");
+ data->terminate = TRUE;
+ break;
+ case GST_MESSAGE_DURATION:
+ /* The duration has changed, mark the current one as invalid */
+ data->duration = GST_CLOCK_TIME_NONE;
+ break;
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->playbin)) {
+ g_print ("Pipeline state changed from %s to %s:\n",
+ gst_element_state_get_name (old_state), gst_element_state_get_name (new_state));
+
+ /* Remember whether we are in the PLAYING state or not */
+ data->playing = (new_state == GST_STATE_PLAYING);
+
+ if (data->playing) {
+ /* We just moved to PLAYING. Check if seeking is possible */
+ GstQuery *query;
+ gint64 start, end;
+ query = gst_query_new_seeking (GST_FORMAT_TIME);
+ if (gst_element_query (data->playbin, query)) {
+ gst_query_parse_seeking (query, NULL, &data->seek_enabled, &start, &end);
+ if (data->seek_enabled) {
+ g_print ("Seeking is ENABLED from %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT "\n",
+ GST_TIME_ARGS (start), GST_TIME_ARGS (end));
+ } else {
+ g_print ("Seeking is DISABLED for this stream.\n");
+ }
+ }
+ else {
+ g_printerr ("Seeking query failed.");
+ }
+ gst_query_unref (query);
+ }
+ }
+ } break;
+ default:
+ /* We should not reach here */
+ g_printerr ("Unexpected message received.\n");
+ break;
+ }
+ gst_message_unref (msg);
+}
diff --git a/tutorials/basic-tutorial-5.c b/tutorials/basic-tutorial-5.c
new file mode 100644
index 0000000..c0af920
--- /dev/null
+++ b/tutorials/basic-tutorial-5.c
@@ -0,0 +1,380 @@
+#include <string.h>
+
+#include <gtk/gtk.h>
+#include <gst/gst.h>
+#include <gst/video/videooverlay.h>
+
+#include <gdk/gdk.h>
+#if defined (GDK_WINDOWING_X11)
+#include <gdk/gdkx.h>
+#elif defined (GDK_WINDOWING_WIN32)
+#include <gdk/gdkwin32.h>
+#elif defined (GDK_WINDOWING_QUARTZ)
+#include <gdk/gdkquartz.h>
+#endif
+
+/* Structure to contain all our information, so we can pass it around */
+typedef struct _CustomData {
+ GstElement *playbin; /* Our one and only pipeline */
+
+ GtkWidget *slider; /* Slider widget to keep track of current position */
+ GtkWidget *streams_list; /* Text widget to display info about the streams */
+ gulong slider_update_signal_id; /* Signal ID for the slider update signal */
+
+ GstState state; /* Current state of the pipeline */
+ gint64 duration; /* Duration of the clip, in nanoseconds */
+} CustomData;
+
+/* This function is called when the GUI toolkit creates the physical window that will hold the video.
+ * At this point we can retrieve its handler (which has a different meaning depending on the windowing system)
+ * and pass it to GStreamer through the XOverlay interface. */
+static void realize_cb (GtkWidget *widget, CustomData *data) {
+ GdkWindow *window = gtk_widget_get_window (widget);
+ guintptr window_handle;
+
+ if (!gdk_window_ensure_native (window))
+ g_error ("Couldn't create native window needed for GstXOverlay!");
+
+ /* Retrieve window handler from GDK */
+#if defined (GDK_WINDOWING_WIN32)
+ window_handle = (guintptr)GDK_WINDOW_HWND (window);
+#elif defined (GDK_WINDOWING_QUARTZ)
+ window_handle = gdk_quartz_window_get_nsview (window);
+#elif defined (GDK_WINDOWING_X11)
+ window_handle = GDK_WINDOW_XID (window);
+#endif
+ /* Pass it to playbin, which implements XOverlay and will forward it to the video sink */
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (data->playbin), window_handle);
+}
+
+/* This function is called when the PLAY button is clicked */
+static void play_cb (GtkButton *button, CustomData *data) {
+ gst_element_set_state (data->playbin, GST_STATE_PLAYING);
+}
+
+/* This function is called when the PAUSE button is clicked */
+static void pause_cb (GtkButton *button, CustomData *data) {
+ gst_element_set_state (data->playbin, GST_STATE_PAUSED);
+}
+
+/* This function is called when the STOP button is clicked */
+static void stop_cb (GtkButton *button, CustomData *data) {
+ gst_element_set_state (data->playbin, GST_STATE_READY);
+}
+
+/* This function is called when the main window is closed */
+static void delete_event_cb (GtkWidget *widget, GdkEvent *event, CustomData *data) {
+ stop_cb (NULL, data);
+ gtk_main_quit ();
+}
+
+/* This function is called everytime the video window needs to be redrawn (due to damage/exposure,
+ * rescaling, etc). GStreamer takes care of this in the PAUSED and PLAYING states, otherwise,
+ * we simply draw a black rectangle to avoid garbage showing up. */
+static gboolean draw_cb (GtkWidget *widget, cairo_t *cr, CustomData *data) {
+ if (data->state < GST_STATE_PAUSED) {
+ GtkAllocation allocation;
+
+ /* Cairo is a 2D graphics library which we use here to clean the video window.
+ * It is used by GStreamer for other reasons, so it will always be available to us. */
+ gtk_widget_get_allocation (widget, &allocation);
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+ cairo_fill (cr);
+ }
+
+ return FALSE;
+}
+
+/* This function is called when the slider changes its position. We perform a seek to the
+ * new position here. */
+static void slider_cb (GtkRange *range, CustomData *data) {
+ gdouble value = gtk_range_get_value (GTK_RANGE (data->slider));
+ gst_element_seek_simple (data->playbin, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
+ (gint64)(value * GST_SECOND));
+}
+
+/* This creates all the GTK+ widgets that compose our application, and registers the callbacks */
+static void create_ui (CustomData *data) {
+ GtkWidget *main_window; /* The uppermost window, containing all other windows */
+ GtkWidget *video_window; /* The drawing area where the video will be shown */
+ GtkWidget *main_box; /* VBox to hold main_hbox and the controls */
+ GtkWidget *main_hbox; /* HBox to hold the video_window and the stream info text widget */
+ GtkWidget *controls; /* HBox to hold the buttons and the slider */
+ GtkWidget *play_button, *pause_button, *stop_button; /* Buttons */
+
+ main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (G_OBJECT (main_window), "delete-event", G_CALLBACK (delete_event_cb), data);
+
+ video_window = gtk_drawing_area_new ();
+ gtk_widget_set_double_buffered (video_window, FALSE);
+ g_signal_connect (video_window, "realize", G_CALLBACK (realize_cb), data);
+ g_signal_connect (video_window, "draw", G_CALLBACK (draw_cb), data);
+
+ play_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PLAY);
+ g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb), data);
+
+ pause_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_PAUSE);
+ g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb), data);
+
+ stop_button = gtk_button_new_from_stock (GTK_STOCK_MEDIA_STOP);
+ g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb), data);
+
+ data->slider = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
+ gtk_scale_set_draw_value (GTK_SCALE (data->slider), 0);
+ data->slider_update_signal_id = g_signal_connect (G_OBJECT (data->slider), "value-changed", G_CALLBACK (slider_cb), data);
+
+ data->streams_list = gtk_text_view_new ();
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (data->streams_list), FALSE);
+
+ controls = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start (GTK_BOX (controls), play_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (controls), pause_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (controls), stop_button, FALSE, FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (controls), data->slider, TRUE, TRUE, 2);
+
+ main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_pack_start (GTK_BOX (main_hbox), video_window, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (main_hbox), data->streams_list, FALSE, FALSE, 2);
+
+ main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_pack_start (GTK_BOX (main_box), main_hbox, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (main_box), controls, FALSE, FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (main_window), main_box);
+ gtk_window_set_default_size (GTK_WINDOW (main_window), 640, 480);
+
+ gtk_widget_show_all (main_window);
+}
+
+/* This function is called periodically to refresh the GUI */
+static gboolean refresh_ui (CustomData *data) {
+ gint64 current = -1;
+
+ /* We do not want to update anything unless we are in the PAUSED or PLAYING states */
+ if (data->state < GST_STATE_PAUSED)
+ return TRUE;
+
+ /* If we didn't know it yet, query the stream duration */
+ if (!GST_CLOCK_TIME_IS_VALID (data->duration)) {
+ if (!gst_element_query_duration (data->playbin, GST_FORMAT_TIME, &data->duration)) {
+ g_printerr ("Could not query current duration.\n");
+ } else {
+ /* Set the range of the slider to the clip duration, in SECONDS */
+ gtk_range_set_range (GTK_RANGE (data->slider), 0, (gdouble)data->duration / GST_SECOND);
+ }
+ }
+
+ if (gst_element_query_position (data->playbin, GST_FORMAT_TIME, &current)) {
+ /* Block the "value-changed" signal, so the slider_cb function is not called
+ * (which would trigger a seek the user has not requested) */
+ g_signal_handler_block (data->slider, data->slider_update_signal_id);
+ /* Set the position of the slider to the current pipeline positoin, in SECONDS */
+ gtk_range_set_value (GTK_RANGE (data->slider), (gdouble)current / GST_SECOND);
+ /* Re-enable the signal */
+ g_signal_handler_unblock (data->slider, data->slider_update_signal_id);
+ }
+ return TRUE;
+}
+
+/* This function is called when new metadata is discovered in the stream */
+static void tags_cb (GstElement *playbin, gint stream, CustomData *data) {
+ /* We are possibly in a GStreamer working thread, so we notify the main
+ * thread of this event through a message in the bus */
+ gst_element_post_message (playbin,
+ gst_message_new_application (GST_OBJECT (playbin),
+ gst_structure_new_empty ("tags-changed")));
+}
+
+/* This function is called when an error message is posted on the bus */
+static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+
+ /* Print error details on the screen */
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+
+ /* Set the pipeline to READY (which stops playback) */
+ gst_element_set_state (data->playbin, GST_STATE_READY);
+}
+
+/* This function is called when an End-Of-Stream message is posted on the bus.
+ * We just set the pipeline to READY (which stops playback) */
+static void eos_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ g_print ("End-Of-Stream reached.\n");
+ gst_element_set_state (data->playbin, GST_STATE_READY);
+}
+
+/* This function is called when the pipeline changes states. We use it to
+ * keep track of the current state. */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->playbin)) {
+ data->state = new_state;
+ g_print ("State set to %s\n", gst_element_state_get_name (new_state));
+ if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED) {
+ /* For extra responsiveness, we refresh the GUI as soon as we reach the PAUSED state */
+ refresh_ui (data);
+ }
+ }
+}
+
+/* Extract metadata from all the streams and write it to the text widget in the GUI */
+static void analyze_streams (CustomData *data) {
+ gint i;
+ GstTagList *tags;
+ gchar *str, *total_str;
+ guint rate;
+ gint n_video, n_audio, n_text;
+ GtkTextBuffer *text;
+
+ /* Clean current contents of the widget */
+ text = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data->streams_list));
+ gtk_text_buffer_set_text (text, "", -1);
+
+ /* Read some properties */
+ g_object_get (data->playbin, "n-video", &n_video, NULL);
+ g_object_get (data->playbin, "n-audio", &n_audio, NULL);
+ g_object_get (data->playbin, "n-text", &n_text, NULL);
+
+ for (i = 0; i < n_video; i++) {
+ tags = NULL;
+ /* Retrieve the stream's video tags */
+ g_signal_emit_by_name (data->playbin, "get-video-tags", i, &tags);
+ if (tags) {
+ total_str = g_strdup_printf ("video stream %d:\n", i);
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ gst_tag_list_get_string (tags, GST_TAG_VIDEO_CODEC, &str);
+ total_str = g_strdup_printf (" codec: %s\n", str ? str : "unknown");
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ g_free (str);
+ gst_tag_list_free (tags);
+ }
+ }
+
+ for (i = 0; i < n_audio; i++) {
+ tags = NULL;
+ /* Retrieve the stream's audio tags */
+ g_signal_emit_by_name (data->playbin, "get-audio-tags", i, &tags);
+ if (tags) {
+ total_str = g_strdup_printf ("\naudio stream %d:\n", i);
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ if (gst_tag_list_get_string (tags, GST_TAG_AUDIO_CODEC, &str)) {
+ total_str = g_strdup_printf (" codec: %s\n", str);
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ g_free (str);
+ }
+ if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)) {
+ total_str = g_strdup_printf (" language: %s\n", str);
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ g_free (str);
+ }
+ if (gst_tag_list_get_uint (tags, GST_TAG_BITRATE, &rate)) {
+ total_str = g_strdup_printf (" bitrate: %d\n", rate);
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ }
+ gst_tag_list_free (tags);
+ }
+ }
+
+ for (i = 0; i < n_text; i++) {
+ tags = NULL;
+ /* Retrieve the stream's subtitle tags */
+ g_signal_emit_by_name (data->playbin, "get-text-tags", i, &tags);
+ if (tags) {
+ total_str = g_strdup_printf ("\nsubtitle stream %d:\n", i);
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)) {
+ total_str = g_strdup_printf (" language: %s\n", str);
+ gtk_text_buffer_insert_at_cursor (text, total_str, -1);
+ g_free (total_str);
+ g_free (str);
+ }
+ gst_tag_list_free (tags);
+ }
+ }
+}
+
+/* This function is called when an "application" message is posted on the bus.
+ * Here we retrieve the message posted by the tags_cb callback */
+static void application_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ if (g_strcmp0 (gst_structure_get_name (gst_message_get_structure (msg)), "tags-changed") == 0) {
+ /* If the message is the "tags-changed" (only one we are currently issuing), update
+ * the stream info GUI */
+ analyze_streams (data);
+ }
+}
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstStateChangeReturn ret;
+ GstBus *bus;
+
+ /* Initialize GTK */
+ gtk_init (&argc, &argv);
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Initialize our data structure */
+ memset (&data, 0, sizeof (data));
+ data.duration = GST_CLOCK_TIME_NONE;
+
+ /* Create the elements */
+ data.playbin = gst_element_factory_make ("playbin", "playbin");
+
+ if (!data.playbin) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Set the URI to play */
+ g_object_set (data.playbin, "uri", "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Connect to interesting signals in playbin */
+ g_signal_connect (G_OBJECT (data.playbin), "video-tags-changed", (GCallback) tags_cb, &data);
+ g_signal_connect (G_OBJECT (data.playbin), "audio-tags-changed", (GCallback) tags_cb, &data);
+ g_signal_connect (G_OBJECT (data.playbin), "text-tags-changed", (GCallback) tags_cb, &data);
+
+ /* Create the GUI */
+ create_ui (&data);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (data.playbin);
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, &data);
+ g_signal_connect (G_OBJECT (bus), "message::eos", (GCallback)eos_cb, &data);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, &data);
+ g_signal_connect (G_OBJECT (bus), "message::application", (GCallback)application_cb, &data);
+ gst_object_unref (bus);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.playbin, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.playbin);
+ return -1;
+ }
+
+ /* Register a function that GLib will call every second */
+ g_timeout_add_seconds (1, (GSourceFunc)refresh_ui, &data);
+
+ /* Start the GTK main loop. We will not regain control until gtk_main_quit is called. */
+ gtk_main ();
+
+ /* Free resources */
+ gst_element_set_state (data.playbin, GST_STATE_NULL);
+ gst_object_unref (data.playbin);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-6.c b/tutorials/basic-tutorial-6.c
new file mode 100644
index 0000000..4714938
--- /dev/null
+++ b/tutorials/basic-tutorial-6.c
@@ -0,0 +1,207 @@
+#include <gst/gst.h>
+
+/* Functions below print the Capabilities in a human-friendly format */
+static gboolean print_field (GQuark field, const GValue * value, gpointer pfx) {
+ gchar *str = gst_value_serialize (value);
+
+ g_print ("%s %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str);
+ g_free (str);
+ return TRUE;
+}
+
+static void print_caps (const GstCaps * caps, const gchar * pfx) {
+ guint i;
+
+ g_return_if_fail (caps != NULL);
+
+ if (gst_caps_is_any (caps)) {
+ g_print ("%sANY\n", pfx);
+ return;
+ }
+ if (gst_caps_is_empty (caps)) {
+ g_print ("%sEMPTY\n", pfx);
+ return;
+ }
+
+ for (i = 0; i < gst_caps_get_size (caps); i++) {
+ GstStructure *structure = gst_caps_get_structure (caps, i);
+
+ g_print ("%s%s\n", pfx, gst_structure_get_name (structure));
+ gst_structure_foreach (structure, print_field, (gpointer) pfx);
+ }
+}
+
+/* Prints information about a Pad Template, including its Capabilities */
+static void print_pad_templates_information (GstElementFactory * factory) {
+ const GList *pads;
+ GstStaticPadTemplate *padtemplate;
+
+ g_print ("Pad Templates for %s:\n", gst_element_factory_get_longname (factory));
+ if (!gst_element_factory_get_num_pad_templates (factory)) {
+ g_print (" none\n");
+ return;
+ }
+
+ pads = gst_element_factory_get_static_pad_templates (factory);
+ while (pads) {
+ padtemplate = pads->data;
+ pads = g_list_next (pads);
+
+ if (padtemplate->direction == GST_PAD_SRC)
+ g_print (" SRC template: '%s'\n", padtemplate->name_template);
+ else if (padtemplate->direction == GST_PAD_SINK)
+ g_print (" SINK template: '%s'\n", padtemplate->name_template);
+ else
+ g_print (" UNKNOWN!!! template: '%s'\n", padtemplate->name_template);
+
+ if (padtemplate->presence == GST_PAD_ALWAYS)
+ g_print (" Availability: Always\n");
+ else if (padtemplate->presence == GST_PAD_SOMETIMES)
+ g_print (" Availability: Sometimes\n");
+ else if (padtemplate->presence == GST_PAD_REQUEST) {
+ g_print (" Availability: On request\n");
+ } else
+ g_print (" Availability: UNKNOWN!!!\n");
+
+ if (padtemplate->static_caps.string) {
+ GstCaps *caps;
+
+ g_print (" Capabilities:\n");
+ caps = gst_static_caps_get (&padtemplate->static_caps);
+ print_caps (caps, " ");
+ gst_caps_unref (caps);
+ }
+
+ g_print ("\n");
+ }
+}
+
+/* Shows the CURRENT capabilities of the requested pad in the given element */
+static void print_pad_capabilities (GstElement *element, gchar *pad_name) {
+ GstPad *pad = NULL;
+ GstCaps *caps = NULL;
+
+ /* Retrieve pad */
+ pad = gst_element_get_static_pad (element, pad_name);
+ if (!pad) {
+ g_printerr ("Could not retrieve pad '%s'\n", pad_name);
+ return;
+ }
+
+ /* Retrieve negotiated caps (or acceptable caps if negotiation is not finished yet) */
+ caps = gst_pad_get_current_caps (pad);
+ if (!caps)
+ caps = gst_pad_query_caps (pad, NULL);
+
+ /* Print and free */
+ g_print ("Caps for the %s pad:\n", pad_name);
+ print_caps (caps, " ");
+ gst_caps_unref (caps);
+ gst_object_unref (pad);
+}
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline, *source, *sink;
+ GstElementFactory *source_factory, *sink_factory;
+ GstBus *bus;
+ GstMessage *msg;
+ GstStateChangeReturn ret;
+ gboolean terminate = FALSE;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the element factories */
+ source_factory = gst_element_factory_find ("audiotestsrc");
+ sink_factory = gst_element_factory_find ("autoaudiosink");
+ if (!source_factory || !sink_factory) {
+ g_printerr ("Not all element factories could be created.\n");
+ return -1;
+ }
+
+ /* Print information about the pad templates of these factories */
+ print_pad_templates_information (source_factory);
+ print_pad_templates_information (sink_factory);
+
+ /* Ask the factories to instantiate actual elements */
+ source = gst_element_factory_create (source_factory, "source");
+ sink = gst_element_factory_create (sink_factory, "sink");
+
+ /* Create the empty pipeline */
+ pipeline = gst_pipeline_new ("test-pipeline");
+
+ if (!pipeline || !source || !sink) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Build the pipeline */
+ gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
+ if (gst_element_link (source, sink) != TRUE) {
+ g_printerr ("Elements could not be linked.\n");
+ gst_object_unref (pipeline);
+ return -1;
+ }
+
+ /* Print initial negotiated caps (in NULL state) */
+ g_print ("In NULL state:\n");
+ print_pad_capabilities (sink, "sink");
+
+ /* Start playing */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state (check the bus for error messages).\n");
+ }
+
+ /* Wait until error, EOS or State Change */
+ bus = gst_element_get_bus (pipeline);
+ do {
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS |
+ GST_MESSAGE_STATE_CHANGED);
+
+ /* Parse message */
+ if (msg != NULL) {
+ GError *err;
+ gchar *debug_info;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+ terminate = TRUE;
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("End-Of-Stream reached.\n");
+ terminate = TRUE;
+ break;
+ case GST_MESSAGE_STATE_CHANGED:
+ /* We are only interested in state-changed messages from the pipeline */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (pipeline)) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ g_print ("\nPipeline state changed from %s to %s:\n",
+ gst_element_state_get_name (old_state), gst_element_state_get_name (new_state));
+ /* Print the current capabilities of the sink element */
+ print_pad_capabilities (sink, "sink");
+ }
+ break;
+ default:
+ /* We should not reach here because we only asked for ERRORs, EOS and STATE_CHANGED */
+ g_printerr ("Unexpected message received.\n");
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ } while (!terminate);
+
+ /* Free resources */
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_object_unref (source_factory);
+ gst_object_unref (sink_factory);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-7.c b/tutorials/basic-tutorial-7.c
new file mode 100644
index 0000000..73e34d9
--- /dev/null
+++ b/tutorials/basic-tutorial-7.c
@@ -0,0 +1,89 @@
+#include <gst/gst.h>
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline, *audio_source, *tee, *audio_queue, *audio_convert, *audio_resample, *audio_sink;
+ GstElement *video_queue, *visual, *video_convert, *video_sink;
+ GstBus *bus;
+ GstMessage *msg;
+ GstPadTemplate *tee_src_pad_template;
+ GstPad *tee_audio_pad, *tee_video_pad;
+ GstPad *queue_audio_pad, *queue_video_pad;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ audio_source = gst_element_factory_make ("audiotestsrc", "audio_source");
+ tee = gst_element_factory_make ("tee", "tee");
+ audio_queue = gst_element_factory_make ("queue", "audio_queue");
+ audio_convert = gst_element_factory_make ("audioconvert", "audio_convert");
+ audio_resample = gst_element_factory_make ("audioresample", "audio_resample");
+ audio_sink = gst_element_factory_make ("autoaudiosink", "audio_sink");
+ video_queue = gst_element_factory_make ("queue", "video_queue");
+ visual = gst_element_factory_make ("wavescope", "visual");
+ video_convert = gst_element_factory_make ("videoconvert", "video_convert");
+ video_sink = gst_element_factory_make ("autovideosink", "video_sink");
+
+ /* Create the empty pipeline */
+ pipeline = gst_pipeline_new ("test-pipeline");
+
+ if (!pipeline || !audio_source || !tee || !audio_queue || !audio_convert || !audio_resample || !audio_sink ||
+ !video_queue || !visual || !video_convert || !video_sink) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Configure elements */
+ g_object_set (audio_source, "freq", 215.0f, NULL);
+ g_object_set (visual, "shader", 0, "style", 1, NULL);
+
+ /* Link all elements that can be automatically linked because they have "Always" pads */
+ gst_bin_add_many (GST_BIN (pipeline), audio_source, tee, audio_queue, audio_convert, audio_resample, audio_sink,
+ video_queue, visual, video_convert, video_sink, NULL);
+ if (gst_element_link_many (audio_source, tee, NULL) != TRUE ||
+ gst_element_link_many (audio_queue, audio_convert, audio_resample, audio_sink, NULL) != TRUE ||
+ gst_element_link_many (video_queue, visual, video_convert, video_sink, NULL) != TRUE) {
+ g_printerr ("Elements could not be linked.\n");
+ gst_object_unref (pipeline);
+ return -1;
+ }
+
+ /* Manually link the Tee, which has "Request" pads */
+ tee_src_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (tee), "src_%u");
+ tee_audio_pad = gst_element_request_pad (tee, tee_src_pad_template, NULL, NULL);
+ g_print ("Obtained request pad %s for audio branch.\n", gst_pad_get_name (tee_audio_pad));
+ queue_audio_pad = gst_element_get_static_pad (audio_queue, "sink");
+ tee_video_pad = gst_element_request_pad (tee, tee_src_pad_template, NULL, NULL);
+ g_print ("Obtained request pad %s for video branch.\n", gst_pad_get_name (tee_video_pad));
+ queue_video_pad = gst_element_get_static_pad (video_queue, "sink");
+ if (gst_pad_link (tee_audio_pad, queue_audio_pad) != GST_PAD_LINK_OK ||
+ gst_pad_link (tee_video_pad, queue_video_pad) != GST_PAD_LINK_OK) {
+ g_printerr ("Tee could not be linked.\n");
+ gst_object_unref (pipeline);
+ return -1;
+ }
+ gst_object_unref (queue_audio_pad);
+ gst_object_unref (queue_video_pad);
+
+ /* Start playing the pipeline */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* Wait until error or EOS */
+ bus = gst_element_get_bus (pipeline);
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
+
+ /* Release the request pads from the Tee, and unref them */
+ gst_element_release_request_pad (tee, tee_audio_pad);
+ gst_element_release_request_pad (tee, tee_video_pad);
+ gst_object_unref (tee_audio_pad);
+ gst_object_unref (tee_video_pad);
+
+ /* Free resources */
+ if (msg != NULL)
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-8.c b/tutorials/basic-tutorial-8.c
new file mode 100644
index 0000000..2ddeaa7
--- /dev/null
+++ b/tutorials/basic-tutorial-8.c
@@ -0,0 +1,234 @@
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include <string.h>
+
+#define CHUNK_SIZE 1024 /* Amount of bytes we are sending in each buffer */
+#define SAMPLE_RATE 44100 /* Samples per second we are sending */
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ GstElement *pipeline, *app_source, *tee, *audio_queue, *audio_convert1, *audio_resample, *audio_sink;
+ GstElement *video_queue, *audio_convert2, *visual, *video_convert, *video_sink;
+ GstElement *app_queue, *app_sink;
+
+ guint64 num_samples; /* Number of samples generated so far (for timestamp generation) */
+ gfloat a, b, c, d; /* For waveform generation */
+
+ guint sourceid; /* To control the GSource */
+
+ GMainLoop *main_loop; /* GLib's Main Loop */
+} CustomData;
+
+/* This method is called by the idle GSource in the mainloop, to feed CHUNK_SIZE bytes into appsrc.
+ * The idle handler is added to the mainloop when appsrc requests us to start sending data (need-data signal)
+ * and is removed when appsrc has enough data (enough-data signal).
+ */
+static gboolean push_data (CustomData *data) {
+ GstBuffer *buffer;
+ GstFlowReturn ret;
+ int i;
+ GstMapInfo map;
+ gint16 *raw;
+ gint num_samples = CHUNK_SIZE / 2; /* Because each sample is 16 bits */
+ gfloat freq;
+
+ /* Create a new empty buffer */
+ buffer = gst_buffer_new_and_alloc (CHUNK_SIZE);
+
+ /* Set its timestamp and duration */
+ GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (data->num_samples, GST_SECOND, SAMPLE_RATE);
+ GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale (CHUNK_SIZE, GST_SECOND, SAMPLE_RATE);
+
+ /* Generate some psychodelic waveforms */
+ gst_buffer_map (buffer, &map, GST_MAP_WRITE);
+ raw = (gint16 *)map.data;
+ data->c += data->d;
+ data->d -= data->c / 1000;
+ freq = 1100 + 1000 * data->d;
+ for (i = 0; i < num_samples; i++) {
+ data->a += data->b;
+ data->b -= data->a / freq;
+ raw[i] = (gint16)(500 * data->a);
+ }
+ gst_buffer_unmap (buffer, &map);
+ data->num_samples += num_samples;
+
+ /* Push the buffer into the appsrc */
+ g_signal_emit_by_name (data->app_source, "push-buffer", buffer, &ret);
+
+ /* Free the buffer now that we are done with it */
+ gst_buffer_unref (buffer);
+
+ if (ret != GST_FLOW_OK) {
+ /* We got some error, stop sending data */
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* This signal callback triggers when appsrc needs data. Here, we add an idle handler
+ * to the mainloop to start pushing data into the appsrc */
+static void start_feed (GstElement *source, guint size, CustomData *data) {
+ if (data->sourceid == 0) {
+ g_print ("Start feeding\n");
+ data->sourceid = g_idle_add ((GSourceFunc) push_data, data);
+ }
+}
+
+/* This callback triggers when appsrc has enough data and we can stop sending.
+ * We remove the idle handler from the mainloop */
+static void stop_feed (GstElement *source, CustomData *data) {
+ if (data->sourceid != 0) {
+ g_print ("Stop feeding\n");
+ g_source_remove (data->sourceid);
+ data->sourceid = 0;
+ }
+}
+
+/* The appsink has received a buffer */
+static void new_sample (GstElement *sink, CustomData *data) {
+ GstSample *sample;
+
+ /* Retrieve the buffer */
+ g_signal_emit_by_name (sink, "pull-sample", &sample);
+ if (sample) {
+ /* The only thing we do in this example is print a * to indicate a received buffer */
+ g_print ("*");
+ gst_sample_unref (sample);
+ }
+}
+
+/* This function is called when an error message is posted on the bus */
+static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+
+ /* Print error details on the screen */
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+
+ g_main_loop_quit (data->main_loop);
+}
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstPadTemplate *tee_src_pad_template;
+ GstPad *tee_audio_pad, *tee_video_pad, *tee_app_pad;
+ GstPad *queue_audio_pad, *queue_video_pad, *queue_app_pad;
+ GstAudioInfo info;
+ GstCaps *audio_caps;
+ GstBus *bus;
+
+ /* Initialize cumstom data structure */
+ memset (&data, 0, sizeof (data));
+ data.b = 1; /* For waveform generation */
+ data.d = 1;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ data.app_source = gst_element_factory_make ("appsrc", "audio_source");
+ data.tee = gst_element_factory_make ("tee", "tee");
+ data.audio_queue = gst_element_factory_make ("queue", "audio_queue");
+ data.audio_convert1 = gst_element_factory_make ("audioconvert", "audio_convert1");
+ data.audio_resample = gst_element_factory_make ("audioresample", "audio_resample");
+ data.audio_sink = gst_element_factory_make ("autoaudiosink", "audio_sink");
+ data.video_queue = gst_element_factory_make ("queue", "video_queue");
+ data.audio_convert2 = gst_element_factory_make ("audioconvert", "audio_convert2");
+ data.visual = gst_element_factory_make ("wavescope", "visual");
+ data.video_convert = gst_element_factory_make ("videoconvert", "video_convert");
+ data.video_sink = gst_element_factory_make ("autovideosink", "video_sink");
+ data.app_queue = gst_element_factory_make ("queue", "app_queue");
+ data.app_sink = gst_element_factory_make ("appsink", "app_sink");
+
+ /* Create the empty pipeline */
+ data.pipeline = gst_pipeline_new ("test-pipeline");
+
+ if (!data.pipeline || !data.app_source || !data.tee || !data.audio_queue || !data.audio_convert1 ||
+ !data.audio_resample || !data.audio_sink || !data.video_queue || !data.audio_convert2 || !data.visual ||
+ !data.video_convert || !data.video_sink || !data.app_queue || !data.app_sink) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Configure wavescope */
+ g_object_set (data.visual, "shader", 0, "style", 0, NULL);
+
+ /* Configure appsrc */
+ gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S16, SAMPLE_RATE, 1, NULL);
+ audio_caps = gst_audio_info_to_caps (&info);
+ g_object_set (data.app_source, "caps", audio_caps, "format", GST_FORMAT_TIME, NULL);
+ g_signal_connect (data.app_source, "need-data", G_CALLBACK (start_feed), &data);
+ g_signal_connect (data.app_source, "enough-data", G_CALLBACK (stop_feed), &data);
+
+ /* Configure appsink */
+ g_object_set (data.app_sink, "emit-signals", TRUE, "caps", audio_caps, NULL);
+ g_signal_connect (data.app_sink, "new-sample", G_CALLBACK (new_sample), &data);
+ gst_caps_unref (audio_caps);
+
+ /* Link all elements that can be automatically linked because they have "Always" pads */
+ gst_bin_add_many (GST_BIN (data.pipeline), data.app_source, data.tee, data.audio_queue, data.audio_convert1, data.audio_resample,
+ data.audio_sink, data.video_queue, data.audio_convert2, data.visual, data.video_convert, data.video_sink, data.app_queue,
+ data.app_sink, NULL);
+ if (gst_element_link_many (data.app_source, data.tee, NULL) != TRUE ||
+ gst_element_link_many (data.audio_queue, data.audio_convert1, data.audio_resample, data.audio_sink, NULL) != TRUE ||
+ gst_element_link_many (data.video_queue, data.audio_convert2, data.visual, data.video_convert, data.video_sink, NULL) != TRUE ||
+ gst_element_link_many (data.app_queue, data.app_sink, NULL) != TRUE) {
+ g_printerr ("Elements could not be linked.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+
+ /* Manually link the Tee, which has "Request" pads */
+ tee_src_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (data.tee), "src_%u");
+ tee_audio_pad = gst_element_request_pad (data.tee, tee_src_pad_template, NULL, NULL);
+ g_print ("Obtained request pad %s for audio branch.\n", gst_pad_get_name (tee_audio_pad));
+ queue_audio_pad = gst_element_get_static_pad (data.audio_queue, "sink");
+ tee_video_pad = gst_element_request_pad (data.tee, tee_src_pad_template, NULL, NULL);
+ g_print ("Obtained request pad %s for video branch.\n", gst_pad_get_name (tee_video_pad));
+ queue_video_pad = gst_element_get_static_pad (data.video_queue, "sink");
+ tee_app_pad = gst_element_request_pad (data.tee, tee_src_pad_template, NULL, NULL);
+ g_print ("Obtained request pad %s for app branch.\n", gst_pad_get_name (tee_app_pad));
+ queue_app_pad = gst_element_get_static_pad (data.app_queue, "sink");
+ if (gst_pad_link (tee_audio_pad, queue_audio_pad) != GST_PAD_LINK_OK ||
+ gst_pad_link (tee_video_pad, queue_video_pad) != GST_PAD_LINK_OK ||
+ gst_pad_link (tee_app_pad, queue_app_pad) != GST_PAD_LINK_OK) {
+ g_printerr ("Tee could not be linked\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+ gst_object_unref (queue_audio_pad);
+ gst_object_unref (queue_video_pad);
+ gst_object_unref (queue_app_pad);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (data.pipeline);
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, &data);
+ gst_object_unref (bus);
+
+ /* Start playing the pipeline */
+ gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
+
+ /* Create a GLib Main Loop and set it to run */
+ data.main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (data.main_loop);
+
+ /* Release the request pads from the Tee, and unref them */
+ gst_element_release_request_pad (data.tee, tee_audio_pad);
+ gst_element_release_request_pad (data.tee, tee_video_pad);
+ gst_element_release_request_pad (data.tee, tee_app_pad);
+ gst_object_unref (tee_audio_pad);
+ gst_object_unref (tee_video_pad);
+ gst_object_unref (tee_app_pad);
+
+ /* Free resources */
+ gst_element_set_state (data.pipeline, GST_STATE_NULL);
+ gst_object_unref (data.pipeline);
+ return 0;
+}
diff --git a/tutorials/basic-tutorial-9.c b/tutorials/basic-tutorial-9.c
new file mode 100644
index 0000000..3e185e8
--- /dev/null
+++ b/tutorials/basic-tutorial-9.c
@@ -0,0 +1,216 @@
+#include <string.h>
+#include <gst/gst.h>
+#include <gst/pbutils/pbutils.h>
+
+/* Structure to contain all our information, so we can pass it around */
+typedef struct _CustomData {
+ GstDiscoverer *discoverer;
+ GMainLoop *loop;
+} CustomData;
+
+/* Print a tag in a human-readable format (name: value) */
+static void print_tag_foreach (const GstTagList *tags, const gchar *tag, gpointer user_data) {
+ GValue val = { 0, };
+ gchar *str;
+ gint depth = GPOINTER_TO_INT (user_data);
+
+ gst_tag_list_copy_value (&val, tags, tag);
+
+ if (G_VALUE_HOLDS_STRING (&val))
+ str = g_value_dup_string (&val);
+ else
+ str = gst_value_serialize (&val);
+
+ g_print ("%*s%s: %s\n", 2 * depth, " ", gst_tag_get_nick (tag), str);
+ g_free (str);
+
+ g_value_unset (&val);
+}
+
+/* Print information regarding a stream */
+static void print_stream_info (GstDiscovererStreamInfo *info, gint depth) {
+ gchar *desc = NULL;
+ GstCaps *caps;
+ const GstTagList *tags;
+
+ caps = gst_discoverer_stream_info_get_caps (info);
+
+ if (caps) {
+ if (gst_caps_is_fixed (caps))
+ desc = gst_pb_utils_get_codec_description (caps);
+ else
+ desc = gst_caps_to_string (caps);
+ gst_caps_unref (caps);
+ }
+
+ g_print ("%*s%s: %s\n", 2 * depth, " ", gst_discoverer_stream_info_get_stream_type_nick (info), (desc ? desc : ""));
+
+ if (desc) {
+ g_free (desc);
+ desc = NULL;
+ }
+
+ tags = gst_discoverer_stream_info_get_tags (info);
+ if (tags) {
+ g_print ("%*sTags:\n", 2 * (depth + 1), " ");
+ gst_tag_list_foreach (tags, print_tag_foreach, GINT_TO_POINTER (depth + 2));
+ }
+}
+
+/* Print information regarding a stream and its substreams, if any */
+static void print_topology (GstDiscovererStreamInfo *info, gint depth) {
+ GstDiscovererStreamInfo *next;
+
+ if (!info)
+ return;
+
+ print_stream_info (info, depth);
+
+ next = gst_discoverer_stream_info_get_next (info);
+ if (next) {
+ print_topology (next, depth + 1);
+ gst_discoverer_stream_info_unref (next);
+ } else if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) {
+ GList *tmp, *streams;
+
+ streams = gst_discoverer_container_info_get_streams (GST_DISCOVERER_CONTAINER_INFO (info));
+ for (tmp = streams; tmp; tmp = tmp->next) {
+ GstDiscovererStreamInfo *tmpinf = (GstDiscovererStreamInfo *) tmp->data;
+ print_topology (tmpinf, depth + 1);
+ }
+ gst_discoverer_stream_info_list_free (streams);
+ }
+}
+
+/* This function is called every time the discoverer has information regarding
+ * one of the URIs we provided.*/
+static void on_discovered_cb (GstDiscoverer *discoverer, GstDiscovererInfo *info, GError *err, CustomData *data) {
+ GstDiscovererResult result;
+ const gchar *uri;
+ const GstTagList *tags;
+ GstDiscovererStreamInfo *sinfo;
+
+ uri = gst_discoverer_info_get_uri (info);
+ result = gst_discoverer_info_get_result (info);
+ switch (result) {
+ case GST_DISCOVERER_URI_INVALID:
+ g_print ("Invalid URI '%s'\n", uri);
+ break;
+ case GST_DISCOVERER_ERROR:
+ g_print ("Discoverer error: %s\n", err->message);
+ break;
+ case GST_DISCOVERER_TIMEOUT:
+ g_print ("Timeout\n");
+ break;
+ case GST_DISCOVERER_BUSY:
+ g_print ("Busy\n");
+ break;
+ case GST_DISCOVERER_MISSING_PLUGINS:{
+ const GstStructure *s;
+ gchar *str;
+
+ s = gst_discoverer_info_get_misc (info);
+ str = gst_structure_to_string (s);
+
+ g_print ("Missing plugins: %s\n", str);
+ g_free (str);
+ break;
+ }
+ case GST_DISCOVERER_OK:
+ g_print ("Discovered '%s'\n", uri);
+ break;
+ }
+
+ if (result != GST_DISCOVERER_OK) {
+ g_printerr ("This URI cannot be played\n");
+ return;
+ }
+
+ /* If we got no error, show the retrieved information */
+
+ g_print ("\nDuration: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (gst_discoverer_info_get_duration (info)));
+
+ tags = gst_discoverer_info_get_tags (info);
+ if (tags) {
+ g_print ("Tags:\n");
+ gst_tag_list_foreach (tags, print_tag_foreach, GINT_TO_POINTER (1));
+ }
+
+ g_print ("Seekable: %s\n", (gst_discoverer_info_get_seekable (info) ? "yes" : "no"));
+
+ g_print ("\n");
+
+ sinfo = gst_discoverer_info_get_stream_info (info);
+ if (!sinfo)
+ return;
+
+ g_print ("Stream information:\n");
+
+ print_topology (sinfo, 1);
+
+ gst_discoverer_stream_info_unref (sinfo);
+
+ g_print ("\n");
+}
+
+/* This function is called when the discoverer has finished examining
+ * all the URIs we provided.*/
+static void on_finished_cb (GstDiscoverer *discoverer, CustomData *data) {
+ g_print ("Finished discovering\n");
+
+ g_main_loop_quit (data->loop);
+}
+
+int main (int argc, char **argv) {
+ CustomData data;
+ GError *err = NULL;
+ gchar *uri = "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm";
+
+ /* if a URI was provided, use it instead of the default one */
+ if (argc > 1) {
+ uri = argv[1];
+ }
+
+ /* Initialize cumstom data structure */
+ memset (&data, 0, sizeof (data));
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ g_print ("Discovering '%s'\n", uri);
+
+ /* Instantiate the Discoverer */
+ data.discoverer = gst_discoverer_new (5 * GST_SECOND, &err);
+ if (!data.discoverer) {
+ g_print ("Error creating discoverer instance: %s\n", err->message);
+ g_clear_error (&err);
+ return -1;
+ }
+
+ /* Connect to the interesting signals */
+ g_signal_connect (data.discoverer, "discovered", G_CALLBACK (on_discovered_cb), &data);
+ g_signal_connect (data.discoverer, "finished", G_CALLBACK (on_finished_cb), &data);
+
+ /* Start the discoverer process (nothing to do yet) */
+ gst_discoverer_start (data.discoverer);
+
+ /* Add a request to process asynchronously the URI passed through the command line */
+ if (!gst_discoverer_discover_uri_async (data.discoverer, uri)) {
+ g_print ("Failed to start discovering URI '%s'\n", uri);
+ g_object_unref (data.discoverer);
+ return -1;
+ }
+
+ /* Create a GLib Main Loop and set it to run, so we can wait for the signals */
+ data.loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (data.loop);
+
+ /* Stop the discoverer process */
+ gst_discoverer_stop (data.discoverer);
+
+ /* Free resources */
+ g_object_unref (data.discoverer);
+ g_main_loop_unref (data.loop);
+
+ return 0;
+} \ No newline at end of file
diff --git a/tutorials/icons/gstreamer-logo-1.svg b/tutorials/icons/gstreamer-logo-1.svg
new file mode 100644
index 0000000..4c48823
--- /dev/null
+++ b/tutorials/icons/gstreamer-logo-1.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ width="100"
+ height="100"
+ viewBox="0 0 100 99.999999"
+ overflow="visible"
+ enable-background="new 0 0 280.22 69.387"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="gstreamer-logo-1.svg"
+ style="overflow:visible"><metadata
+ id="metadata3365"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs3363" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ id="namedview3361"
+ showgrid="false"
+ inkscape:zoom="4"
+ inkscape:cx="47.543353"
+ inkscape:cy="50.202349"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><path
+ d="m 49.141,11.311999 c -5.409,0 -13.323,-4.407 -21.036,-4.407 -7.713,0 -12.32,4.407 -13.122,5.008 -0.801,0.601 -1.303,2.904 1.102,2.203 2.405,-0.701 4.407,-0.701 8.214,-0.701 3.807,0 12.922,5.209 22.138,5.209 9.216,0 16.928,-7.111 18.631,-9.616 1.703,-2.505 0.1,-3.306 -1.202,-2.704 -1.303,0.601 -9.716,5.008 -14.725,5.008 z"
+ id="path3355"
+ inkscape:connector-curvature="0"
+ style="fill:#ff3131" /><path
+ d="m 72.639,25.033999 c -5.683,0 -13.997,-4.406 -22.1,-4.406 -8.103,0 -12.944,4.406 -13.786,5.008 -0.842,0.602 -1.369,2.904 1.157,2.203 2.526,-0.701 4.63,-0.701 8.629,-0.701 3.999,0 13.576,5.209 23.257,5.209 9.681,0 17.785,-7.111 19.574,-9.615 1.789,-2.505 0.105,-3.307 -1.263,-2.705 -1.368,0.602 -10.206,5.007 -15.468,5.007 z"
+ id="path3357"
+ inkscape:connector-curvature="0"
+ style="fill:#319831" /><path
+ d="m 39.936,40.175999 c -5.893,0 -14.515,-4.761 -22.918,-4.761 -8.403,0 -13.424,4.761 -14.297,5.41 -0.873,0.649 -1.419,3.137 1.2,2.379 2.62,-0.757 4.802,-0.757 8.949,-0.757 4.147,0 14.079,5.626 24.12,5.626 10.04,0 18.443,-7.681 20.299,-10.386 1.856,-2.705 0.109,-3.57 -1.31,-2.921 -1.419,0.649 -10.586,5.41 -16.043,5.41 z"
+ id="path3359"
+ inkscape:connector-curvature="0"
+ style="fill:#3232cc" /><text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:70px;line-height:125%;font-family:Optima;-inkscape-font-specification:'Optima Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="48.124519"
+ y="90.172836"
+ id="text3375"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3377"
+ x="48.124519"
+ y="90.172836">1</tspan></text>
+</svg> \ No newline at end of file
diff --git a/tutorials/icons/gstreamer-logo-2.svg b/tutorials/icons/gstreamer-logo-2.svg
new file mode 100644
index 0000000..be67d39
--- /dev/null
+++ b/tutorials/icons/gstreamer-logo-2.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ width="100"
+ height="100"
+ viewBox="0 0 100 99.999999"
+ overflow="visible"
+ enable-background="new 0 0 280.22 69.387"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="gstreamer-logo-2.svg"
+ style="overflow:visible"><metadata
+ id="metadata3365"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs3363" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ id="namedview3361"
+ showgrid="false"
+ inkscape:zoom="4"
+ inkscape:cx="47.543353"
+ inkscape:cy="50.202349"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><path
+ d="m 49.141,11.311999 c -5.409,0 -13.323,-4.407 -21.036,-4.407 -7.713,0 -12.32,4.407 -13.122,5.008 -0.801,0.601 -1.303,2.904 1.102,2.203 2.405,-0.701 4.407,-0.701 8.214,-0.701 3.807,0 12.922,5.209 22.138,5.209 9.216,0 16.928,-7.111 18.631,-9.616 1.703,-2.505 0.1,-3.306 -1.202,-2.704 -1.303,0.601 -9.716,5.008 -14.725,5.008 z"
+ id="path3355"
+ inkscape:connector-curvature="0"
+ style="fill:#ff3131" /><path
+ d="m 72.639,25.033999 c -5.683,0 -13.997,-4.406 -22.1,-4.406 -8.103,0 -12.944,4.406 -13.786,5.008 -0.842,0.602 -1.369,2.904 1.157,2.203 2.526,-0.701 4.63,-0.701 8.629,-0.701 3.999,0 13.576,5.209 23.257,5.209 9.681,0 17.785,-7.111 19.574,-9.615 1.789,-2.505 0.105,-3.307 -1.263,-2.705 -1.368,0.602 -10.206,5.007 -15.468,5.007 z"
+ id="path3357"
+ inkscape:connector-curvature="0"
+ style="fill:#319831" /><path
+ d="m 39.936,40.175999 c -5.893,0 -14.515,-4.761 -22.918,-4.761 -8.403,0 -13.424,4.761 -14.297,5.41 -0.873,0.649 -1.419,3.137 1.2,2.379 2.62,-0.757 4.802,-0.757 8.949,-0.757 4.147,0 14.079,5.626 24.12,5.626 10.04,0 18.443,-7.681 20.299,-10.386 1.856,-2.705 0.109,-3.57 -1.31,-2.921 -1.419,0.649 -10.586,5.41 -16.043,5.41 z"
+ id="path3359"
+ inkscape:connector-curvature="0"
+ style="fill:#3232cc" /><text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:70px;line-height:125%;font-family:Optima;-inkscape-font-specification:'Optima Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="48.124519"
+ y="90.172836"
+ id="text3375"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3377"
+ x="48.124519"
+ y="90.172836">2</tspan></text>
+</svg> \ No newline at end of file
diff --git a/tutorials/icons/gstreamer-logo-3.svg b/tutorials/icons/gstreamer-logo-3.svg
new file mode 100644
index 0000000..edbd265
--- /dev/null
+++ b/tutorials/icons/gstreamer-logo-3.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ width="100"
+ height="100"
+ viewBox="0 0 100 99.999999"
+ overflow="visible"
+ enable-background="new 0 0 280.22 69.387"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="gstreamer-logo-3.svg"
+ style="overflow:visible"><metadata
+ id="metadata3365"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs3363" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ id="namedview3361"
+ showgrid="false"
+ inkscape:zoom="4"
+ inkscape:cx="47.543353"
+ inkscape:cy="50.202349"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><path
+ d="m 49.141,11.311999 c -5.409,0 -13.323,-4.407 -21.036,-4.407 -7.713,0 -12.32,4.407 -13.122,5.008 -0.801,0.601 -1.303,2.904 1.102,2.203 2.405,-0.701 4.407,-0.701 8.214,-0.701 3.807,0 12.922,5.209 22.138,5.209 9.216,0 16.928,-7.111 18.631,-9.616 1.703,-2.505 0.1,-3.306 -1.202,-2.704 -1.303,0.601 -9.716,5.008 -14.725,5.008 z"
+ id="path3355"
+ inkscape:connector-curvature="0"
+ style="fill:#ff3131" /><path
+ d="m 72.639,25.033999 c -5.683,0 -13.997,-4.406 -22.1,-4.406 -8.103,0 -12.944,4.406 -13.786,5.008 -0.842,0.602 -1.369,2.904 1.157,2.203 2.526,-0.701 4.63,-0.701 8.629,-0.701 3.999,0 13.576,5.209 23.257,5.209 9.681,0 17.785,-7.111 19.574,-9.615 1.789,-2.505 0.105,-3.307 -1.263,-2.705 -1.368,0.602 -10.206,5.007 -15.468,5.007 z"
+ id="path3357"
+ inkscape:connector-curvature="0"
+ style="fill:#319831" /><path
+ d="m 39.936,40.175999 c -5.893,0 -14.515,-4.761 -22.918,-4.761 -8.403,0 -13.424,4.761 -14.297,5.41 -0.873,0.649 -1.419,3.137 1.2,2.379 2.62,-0.757 4.802,-0.757 8.949,-0.757 4.147,0 14.079,5.626 24.12,5.626 10.04,0 18.443,-7.681 20.299,-10.386 1.856,-2.705 0.109,-3.57 -1.31,-2.921 -1.419,0.649 -10.586,5.41 -16.043,5.41 z"
+ id="path3359"
+ inkscape:connector-curvature="0"
+ style="fill:#3232cc" /><text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:70px;line-height:125%;font-family:Optima;-inkscape-font-specification:'Optima Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="48.124519"
+ y="90.172836"
+ id="text3375"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3377"
+ x="48.124519"
+ y="90.172836">3</tspan></text>
+</svg> \ No newline at end of file
diff --git a/tutorials/icons/gstreamer-logo-4.svg b/tutorials/icons/gstreamer-logo-4.svg
new file mode 100644
index 0000000..dffc1f7
--- /dev/null
+++ b/tutorials/icons/gstreamer-logo-4.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ width="100"
+ height="100"
+ viewBox="0 0 100 99.999999"
+ overflow="visible"
+ enable-background="new 0 0 280.22 69.387"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="gstreamer-logo-4.svg"
+ style="overflow:visible"><metadata
+ id="metadata3365"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs3363" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ id="namedview3361"
+ showgrid="false"
+ inkscape:zoom="4"
+ inkscape:cx="47.543353"
+ inkscape:cy="50.202349"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><path
+ d="m 49.141,11.311999 c -5.409,0 -13.323,-4.407 -21.036,-4.407 -7.713,0 -12.32,4.407 -13.122,5.008 -0.801,0.601 -1.303,2.904 1.102,2.203 2.405,-0.701 4.407,-0.701 8.214,-0.701 3.807,0 12.922,5.209 22.138,5.209 9.216,0 16.928,-7.111 18.631,-9.616 1.703,-2.505 0.1,-3.306 -1.202,-2.704 -1.303,0.601 -9.716,5.008 -14.725,5.008 z"
+ id="path3355"
+ inkscape:connector-curvature="0"
+ style="fill:#ff3131" /><path
+ d="m 72.639,25.033999 c -5.683,0 -13.997,-4.406 -22.1,-4.406 -8.103,0 -12.944,4.406 -13.786,5.008 -0.842,0.602 -1.369,2.904 1.157,2.203 2.526,-0.701 4.63,-0.701 8.629,-0.701 3.999,0 13.576,5.209 23.257,5.209 9.681,0 17.785,-7.111 19.574,-9.615 1.789,-2.505 0.105,-3.307 -1.263,-2.705 -1.368,0.602 -10.206,5.007 -15.468,5.007 z"
+ id="path3357"
+ inkscape:connector-curvature="0"
+ style="fill:#319831" /><path
+ d="m 39.936,40.175999 c -5.893,0 -14.515,-4.761 -22.918,-4.761 -8.403,0 -13.424,4.761 -14.297,5.41 -0.873,0.649 -1.419,3.137 1.2,2.379 2.62,-0.757 4.802,-0.757 8.949,-0.757 4.147,0 14.079,5.626 24.12,5.626 10.04,0 18.443,-7.681 20.299,-10.386 1.856,-2.705 0.109,-3.57 -1.31,-2.921 -1.419,0.649 -10.586,5.41 -16.043,5.41 z"
+ id="path3359"
+ inkscape:connector-curvature="0"
+ style="fill:#3232cc" /><text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:70px;line-height:125%;font-family:Optima;-inkscape-font-specification:'Optima Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="48.124519"
+ y="90.172836"
+ id="text3375"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3377"
+ x="48.124519"
+ y="90.172836">4</tspan></text>
+</svg> \ No newline at end of file
diff --git a/tutorials/icons/gstreamer-logo-5.svg b/tutorials/icons/gstreamer-logo-5.svg
new file mode 100644
index 0000000..83f3d01
--- /dev/null
+++ b/tutorials/icons/gstreamer-logo-5.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ width="100"
+ height="100"
+ viewBox="0 0 100 99.999999"
+ overflow="visible"
+ enable-background="new 0 0 280.22 69.387"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="gstreamer-logo-5.svg"
+ style="overflow:visible"><metadata
+ id="metadata3365"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs3363" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1366"
+ inkscape:window-height="704"
+ id="namedview3361"
+ showgrid="false"
+ inkscape:zoom="4"
+ inkscape:cx="47.543353"
+ inkscape:cy="50.202349"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><path
+ d="m 49.141,11.311999 c -5.409,0 -13.323,-4.407 -21.036,-4.407 -7.713,0 -12.32,4.407 -13.122,5.008 -0.801,0.601 -1.303,2.904 1.102,2.203 2.405,-0.701 4.407,-0.701 8.214,-0.701 3.807,0 12.922,5.209 22.138,5.209 9.216,0 16.928,-7.111 18.631,-9.616 1.703,-2.505 0.1,-3.306 -1.202,-2.704 -1.303,0.601 -9.716,5.008 -14.725,5.008 z"
+ id="path3355"
+ inkscape:connector-curvature="0"
+ style="fill:#ff3131" /><path
+ d="m 72.639,25.033999 c -5.683,0 -13.997,-4.406 -22.1,-4.406 -8.103,0 -12.944,4.406 -13.786,5.008 -0.842,0.602 -1.369,2.904 1.157,2.203 2.526,-0.701 4.63,-0.701 8.629,-0.701 3.999,0 13.576,5.209 23.257,5.209 9.681,0 17.785,-7.111 19.574,-9.615 1.789,-2.505 0.105,-3.307 -1.263,-2.705 -1.368,0.602 -10.206,5.007 -15.468,5.007 z"
+ id="path3357"
+ inkscape:connector-curvature="0"
+ style="fill:#319831" /><path
+ d="m 39.936,40.175999 c -5.893,0 -14.515,-4.761 -22.918,-4.761 -8.403,0 -13.424,4.761 -14.297,5.41 -0.873,0.649 -1.419,3.137 1.2,2.379 2.62,-0.757 4.802,-0.757 8.949,-0.757 4.147,0 14.079,5.626 24.12,5.626 10.04,0 18.443,-7.681 20.299,-10.386 1.856,-2.705 0.109,-3.57 -1.31,-2.921 -1.419,0.649 -10.586,5.41 -16.043,5.41 z"
+ id="path3359"
+ inkscape:connector-curvature="0"
+ style="fill:#3232cc" /><text
+ xml:space="preserve"
+ style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:70px;line-height:125%;font-family:Optima;-inkscape-font-specification:'Optima Bold Italic';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="48.124519"
+ y="90.172836"
+ id="text3375"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3377"
+ x="48.124519"
+ y="90.172836">5</tspan></text>
+</svg> \ No newline at end of file
diff --git a/tutorials/playback-tutorial-1.c b/tutorials/playback-tutorial-1.c
new file mode 100644
index 0000000..b142fa7
--- /dev/null
+++ b/tutorials/playback-tutorial-1.c
@@ -0,0 +1,221 @@
+#include <stdio.h>
+#include <gst/gst.h>
+
+/* Structure to contain all our information, so we can pass it around */
+typedef struct _CustomData {
+ GstElement *playbin; /* Our one and only element */
+
+ gint n_video; /* Number of embedded video streams */
+ gint n_audio; /* Number of embedded audio streams */
+ gint n_text; /* Number of embedded subtitle streams */
+
+ gint current_video; /* Currently playing video stream */
+ gint current_audio; /* Currently playing audio stream */
+ gint current_text; /* Currently playing subtitle stream */
+
+ GMainLoop *main_loop; /* GLib's Main Loop */
+} CustomData;
+
+/* playbin flags */
+typedef enum {
+ GST_PLAY_FLAG_VIDEO = (1 << 0), /* We want video output */
+ GST_PLAY_FLAG_AUDIO = (1 << 1), /* We want audio output */
+ GST_PLAY_FLAG_TEXT = (1 << 2) /* We want subtitle output */
+} GstPlayFlags;
+
+/* Forward definition for the message and keyboard processing functions */
+static gboolean handle_message (GstBus *bus, GstMessage *msg, CustomData *data);
+static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data);
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+ gint flags;
+ GIOChannel *io_stdin;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ data.playbin = gst_element_factory_make ("playbin", "playbin");
+
+ if (!data.playbin) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Set the URI to play */
+ g_object_set (data.playbin, "uri", "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_cropped_multilingual.webm", NULL);
+
+ /* Set flags to show Audio and Video but ignore Subtitles */
+ g_object_get (data.playbin, "flags", &flags, NULL);
+ flags |= GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO;
+ flags &= ~GST_PLAY_FLAG_TEXT;
+ g_object_set (data.playbin, "flags", flags, NULL);
+
+ /* Set connection speed. This will affect some internal decisions of playbin */
+ g_object_set (data.playbin, "connection-speed", 56, NULL);
+
+ /* Add a bus watch, so we get notified when a message arrives */
+ bus = gst_element_get_bus (data.playbin);
+ gst_bus_add_watch (bus, (GstBusFunc)handle_message, &data);
+
+ /* Add a keyboard watch so we get notified of keystrokes */
+#ifdef G_OS_WIN32
+ io_stdin = g_io_channel_win32_new_fd (fileno (stdin));
+#else
+ io_stdin = g_io_channel_unix_new (fileno (stdin));
+#endif
+ g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.playbin, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.playbin);
+ return -1;
+ }
+
+ /* Create a GLib Main Loop and set it to run */
+ data.main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (data.main_loop);
+
+ /* Free resources */
+ g_main_loop_unref (data.main_loop);
+ g_io_channel_unref (io_stdin);
+ gst_object_unref (bus);
+ gst_element_set_state (data.playbin, GST_STATE_NULL);
+ gst_object_unref (data.playbin);
+ return 0;
+}
+
+/* Extract some metadata from the streams and print it on the screen */
+static void analyze_streams (CustomData *data) {
+ gint i;
+ GstTagList *tags;
+ gchar *str;
+ guint rate;
+
+ /* Read some properties */
+ g_object_get (data->playbin, "n-video", &data->n_video, NULL);
+ g_object_get (data->playbin, "n-audio", &data->n_audio, NULL);
+ g_object_get (data->playbin, "n-text", &data->n_text, NULL);
+
+ g_print ("%d video stream(s), %d audio stream(s), %d text stream(s)\n",
+ data->n_video, data->n_audio, data->n_text);
+
+ g_print ("\n");
+ for (i = 0; i < data->n_video; i++) {
+ tags = NULL;
+ /* Retrieve the stream's video tags */
+ g_signal_emit_by_name (data->playbin, "get-video-tags", i, &tags);
+ if (tags) {
+ g_print ("video stream %d:\n", i);
+ gst_tag_list_get_string (tags, GST_TAG_VIDEO_CODEC, &str);
+ g_print (" codec: %s\n", str ? str : "unknown");
+ g_free (str);
+ gst_tag_list_unref (tags);
+ }
+ }
+
+ g_print ("\n");
+ for (i = 0; i < data->n_audio; i++) {
+ tags = NULL;
+ /* Retrieve the stream's audio tags */
+ g_signal_emit_by_name (data->playbin, "get-audio-tags", i, &tags);
+ if (tags) {
+ g_print ("audio stream %d:\n", i);
+ if (gst_tag_list_get_string (tags, GST_TAG_AUDIO_CODEC, &str)) {
+ g_print (" codec: %s\n", str);
+ g_free (str);
+ }
+ if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)) {
+ g_print (" language: %s\n", str);
+ g_free (str);
+ }
+ if (gst_tag_list_get_uint (tags, GST_TAG_BITRATE, &rate)) {
+ g_print (" bitrate: %d\n", rate);
+ }
+ gst_tag_list_unref (tags);
+ }
+ }
+
+ g_print ("\n");
+ for (i = 0; i < data->n_text; i++) {
+ tags = NULL;
+ /* Retrieve the stream's subtitle tags */
+ g_signal_emit_by_name (data->playbin, "get-text-tags", i, &tags);
+ if (tags) {
+ g_print ("subtitle stream %d:\n", i);
+ if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)) {
+ g_print (" language: %s\n", str);
+ g_free (str);
+ }
+ gst_tag_list_unref (tags);
+ }
+ }
+
+ g_object_get (data->playbin, "current-video", &data->current_video, NULL);
+ g_object_get (data->playbin, "current-audio", &data->current_audio, NULL);
+ g_object_get (data->playbin, "current-text", &data->current_text, NULL);
+
+ g_print ("\n");
+ g_print ("Currently playing video stream %d, audio stream %d and text stream %d\n",
+ data->current_video, data->current_audio, data->current_text);
+ g_print ("Type any number and hit ENTER to select a different audio stream\n");
+}
+
+/* Process messages from GStreamer */
+static gboolean handle_message (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+ g_main_loop_quit (data->main_loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("End-Of-Stream reached.\n");
+ g_main_loop_quit (data->main_loop);
+ break;
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->playbin)) {
+ if (new_state == GST_STATE_PLAYING) {
+ /* Once we are in the playing state, analyze the streams */
+ analyze_streams (data);
+ }
+ }
+ } break;
+ default:
+ break;
+ }
+
+ /* We want to keep receiving messages */
+ return TRUE;
+}
+
+/* Process keyboard input */
+static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) {
+ gchar *str = NULL;
+
+ if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) == G_IO_STATUS_NORMAL) {
+ int index = g_ascii_strtoull (str, NULL, 0);
+ if (index < 0 || index >= data->n_audio) {
+ g_printerr ("Index out of bounds\n");
+ } else {
+ /* If the input was a valid audio stream index, set the current audio stream */
+ g_print ("Setting current audio stream to %d\n", index);
+ g_object_set (data->playbin, "current-audio", index, NULL);
+ }
+ }
+ g_free (str);
+ return TRUE;
+}
diff --git a/tutorials/playback-tutorial-2.c b/tutorials/playback-tutorial-2.c
new file mode 100644
index 0000000..52d3f6f
--- /dev/null
+++ b/tutorials/playback-tutorial-2.c
@@ -0,0 +1,223 @@
+#include <stdio.h>
+#include <gst/gst.h>
+
+/* Structure to contain all our information, so we can pass it around */
+typedef struct _CustomData {
+ GstElement *playbin; /* Our one and only element */
+
+ gint n_video; /* Number of embedded video streams */
+ gint n_audio; /* Number of embedded audio streams */
+ gint n_text; /* Number of embedded subtitle streams */
+
+ gint current_video; /* Currently playing video stream */
+ gint current_audio; /* Currently playing audio stream */
+ gint current_text; /* Currently playing subtitle stream */
+
+ GMainLoop *main_loop; /* GLib's Main Loop */
+} CustomData;
+
+/* playbin flags */
+typedef enum {
+ GST_PLAY_FLAG_VIDEO = (1 << 0), /* We want video output */
+ GST_PLAY_FLAG_AUDIO = (1 << 1), /* We want audio output */
+ GST_PLAY_FLAG_TEXT = (1 << 2) /* We want subtitle output */
+} GstPlayFlags;
+
+/* Forward definition for the message and keyboard processing functions */
+static gboolean handle_message (GstBus *bus, GstMessage *msg, CustomData *data);
+static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data);
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+ gint flags;
+ GIOChannel *io_stdin;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ data.playbin = gst_element_factory_make ("playbin", "playbin");
+
+ if (!data.playbin) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Set the URI to play */
+ g_object_set (data.playbin, "uri", "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.ogv", NULL);
+
+ /* Set the subtitle URI to play and some font description */
+ g_object_set (data.playbin, "suburi", "https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer_gr.srt", NULL);
+ g_object_set (data.playbin, "subtitle-font-desc", "Sans, 18", NULL);
+
+ /* Set flags to show Audio, Video and Subtitles */
+ g_object_get (data.playbin, "flags", &flags, NULL);
+ flags |= GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_TEXT;
+ g_object_set (data.playbin, "flags", flags, NULL);
+
+ /* Add a bus watch, so we get notified when a message arrives */
+ bus = gst_element_get_bus (data.playbin);
+ gst_bus_add_watch (bus, (GstBusFunc)handle_message, &data);
+
+ /* Add a keyboard watch so we get notified of keystrokes */
+#ifdef G_OS_WIN32
+ io_stdin = g_io_channel_win32_new_fd (fileno (stdin));
+#else
+ io_stdin = g_io_channel_unix_new (fileno (stdin));
+#endif
+ g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.playbin, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.playbin);
+ return -1;
+ }
+
+ /* Create a GLib Main Loop and set it to run */
+ data.main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (data.main_loop);
+
+ /* Free resources */
+ g_main_loop_unref (data.main_loop);
+ g_io_channel_unref (io_stdin);
+ gst_object_unref (bus);
+ gst_element_set_state (data.playbin, GST_STATE_NULL);
+ gst_object_unref (data.playbin);
+ return 0;
+}
+
+/* Extract some metadata from the streams and print it on the screen */
+static void analyze_streams (CustomData *data) {
+ gint i;
+ GstTagList *tags;
+ gchar *str;
+ guint rate;
+
+ /* Read some properties */
+ g_object_get (data->playbin, "n-video", &data->n_video, NULL);
+ g_object_get (data->playbin, "n-audio", &data->n_audio, NULL);
+ g_object_get (data->playbin, "n-text", &data->n_text, NULL);
+
+ g_print ("%d video stream(s), %d audio stream(s), %d text stream(s)\n",
+ data->n_video, data->n_audio, data->n_text);
+
+ g_print ("\n");
+ for (i = 0; i < data->n_video; i++) {
+ tags = NULL;
+ /* Retrieve the stream's video tags */
+ g_signal_emit_by_name (data->playbin, "get-video-tags", i, &tags);
+ if (tags) {
+ g_print ("video stream %d:\n", i);
+ gst_tag_list_get_string (tags, GST_TAG_VIDEO_CODEC, &str);
+ g_print (" codec: %s\n", str ? str : "unknown");
+ g_free (str);
+ gst_tag_list_free (tags);
+ }
+ }
+
+ g_print ("\n");
+ for (i = 0; i < data->n_audio; i++) {
+ tags = NULL;
+ /* Retrieve the stream's audio tags */
+ g_signal_emit_by_name (data->playbin, "get-audio-tags", i, &tags);
+ if (tags) {
+ g_print ("audio stream %d:\n", i);
+ if (gst_tag_list_get_string (tags, GST_TAG_AUDIO_CODEC, &str)) {
+ g_print (" codec: %s\n", str);
+ g_free (str);
+ }
+ if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)) {
+ g_print (" language: %s\n", str);
+ g_free (str);
+ }
+ if (gst_tag_list_get_uint (tags, GST_TAG_BITRATE, &rate)) {
+ g_print (" bitrate: %d\n", rate);
+ }
+ gst_tag_list_free (tags);
+ }
+ }
+
+ g_print ("\n");
+ for (i = 0; i < data->n_text; i++) {
+ tags = NULL;
+ /* Retrieve the stream's subtitle tags */
+ g_print ("subtitle stream %d:\n", i);
+ g_signal_emit_by_name (data->playbin, "get-text-tags", i, &tags);
+ if (tags) {
+ if (gst_tag_list_get_string (tags, GST_TAG_LANGUAGE_CODE, &str)) {
+ g_print (" language: %s\n", str);
+ g_free (str);
+ }
+ gst_tag_list_free (tags);
+ } else {
+ g_print (" no tags found\n");
+ }
+ }
+
+ g_object_get (data->playbin, "current-video", &data->current_video, NULL);
+ g_object_get (data->playbin, "current-audio", &data->current_audio, NULL);
+ g_object_get (data->playbin, "current-text", &data->current_text, NULL);
+
+ g_print ("\n");
+ g_print ("Currently playing video stream %d, audio stream %d and subtitle stream %d\n",
+ data->current_video, data->current_audio, data->current_text);
+ g_print ("Type any number and hit ENTER to select a different subtitle stream\n");
+}
+
+/* Process messages from GStreamer */
+static gboolean handle_message (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+ g_main_loop_quit (data->main_loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("End-Of-Stream reached.\n");
+ g_main_loop_quit (data->main_loop);
+ break;
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data->playbin)) {
+ if (new_state == GST_STATE_PLAYING) {
+ /* Once we are in the playing state, analyze the streams */
+ analyze_streams (data);
+ }
+ }
+ } break;
+ default:
+ break;
+ }
+
+ /* We want to keep receiving messages */
+ return TRUE;
+}
+
+/* Process keyboard input */
+static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) {
+ gchar *str = NULL;
+
+ if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) == G_IO_STATUS_NORMAL) {
+ int index = g_ascii_strtoull (str, NULL, 0);
+ if (index < 0 || index >= data->n_text) {
+ g_printerr ("Index out of bounds\n");
+ } else {
+ /* If the input was a valid subtitle stream index, set the current subtitle stream */
+ g_print ("Setting current subtitle stream to %d\n", index);
+ g_object_set (data->playbin, "current-text", index, NULL);
+ }
+ }
+ g_free (str);
+ return TRUE;
+}
diff --git a/tutorials/playback-tutorial-3.c b/tutorials/playback-tutorial-3.c
new file mode 100644
index 0000000..4f8b809
--- /dev/null
+++ b/tutorials/playback-tutorial-3.c
@@ -0,0 +1,154 @@
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include <string.h>
+
+#define CHUNK_SIZE 1024 /* Amount of bytes we are sending in each buffer */
+#define SAMPLE_RATE 44100 /* Samples per second we are sending */
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ GstElement *pipeline;
+ GstElement *app_source;
+
+ guint64 num_samples; /* Number of samples generated so far (for timestamp generation) */
+ gfloat a, b, c, d; /* For waveform generation */
+
+ guint sourceid; /* To control the GSource */
+
+ GMainLoop *main_loop; /* GLib's Main Loop */
+} CustomData;
+
+/* This method is called by the idle GSource in the mainloop, to feed CHUNK_SIZE bytes into appsrc.
+ * The ide handler is added to the mainloop when appsrc requests us to start sending data (need-data signal)
+ * and is removed when appsrc has enough data (enough-data signal).
+ */
+static gboolean push_data (CustomData *data) {
+ GstBuffer *buffer;
+ GstFlowReturn ret;
+ int i;
+ GstMapInfo map;
+ gint16 *raw;
+ gint num_samples = CHUNK_SIZE / 2; /* Because each sample is 16 bits */
+ gfloat freq;
+
+ /* Create a new empty buffer */
+ buffer = gst_buffer_new_and_alloc (CHUNK_SIZE);
+
+ /* Set its timestamp and duration */
+ GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (data->num_samples, GST_SECOND, SAMPLE_RATE);
+ GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale (CHUNK_SIZE, GST_SECOND, SAMPLE_RATE);
+
+ /* Generate some psychodelic waveforms */
+ gst_buffer_map (buffer, &map, GST_MAP_WRITE);
+ raw = (gint16 *)map.data;
+ data->c += data->d;
+ data->d -= data->c / 1000;
+ freq = 1100 + 1000 * data->d;
+ for (i = 0; i < num_samples; i++) {
+ data->a += data->b;
+ data->b -= data->a / freq;
+ raw[i] = (gint16)(500 * data->a);
+ }
+ gst_buffer_unmap (buffer, &map);
+ data->num_samples += num_samples;
+
+ /* Push the buffer into the appsrc */
+ g_signal_emit_by_name (data->app_source, "push-buffer", buffer, &ret);
+
+ /* Free the buffer now that we are done with it */
+ gst_buffer_unref (buffer);
+
+ if (ret != GST_FLOW_OK) {
+ /* We got some error, stop sending data */
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* This signal callback triggers when appsrc needs data. Here, we add an idle handler
+ * to the mainloop to start pushing data into the appsrc */
+static void start_feed (GstElement *source, guint size, CustomData *data) {
+ if (data->sourceid == 0) {
+ g_print ("Start feeding\n");
+ data->sourceid = g_idle_add ((GSourceFunc) push_data, data);
+ }
+}
+
+/* This callback triggers when appsrc has enough data and we can stop sending.
+ * We remove the idle handler from the mainloop */
+static void stop_feed (GstElement *source, CustomData *data) {
+ if (data->sourceid != 0) {
+ g_print ("Stop feeding\n");
+ g_source_remove (data->sourceid);
+ data->sourceid = 0;
+ }
+}
+
+/* This function is called when an error message is posted on the bus */
+static void error_cb (GstBus *bus, GstMessage *msg, CustomData *data) {
+ GError *err;
+ gchar *debug_info;
+
+ /* Print error details on the screen */
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+
+ g_main_loop_quit (data->main_loop);
+}
+
+/* This function is called when playbin has created the appsrc element, so we have
+ * a chance to configure it. */
+static void source_setup (GstElement *pipeline, GstElement *source, CustomData *data) {
+ GstAudioInfo info;
+ GstCaps *audio_caps;
+
+ g_print ("Source has been created. Configuring.\n");
+ data->app_source = source;
+
+ /* Configure appsrc */
+ gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S16, SAMPLE_RATE, 1, NULL);
+ audio_caps = gst_audio_info_to_caps (&info);
+ g_object_set (source, "caps", audio_caps, "format", GST_FORMAT_TIME, NULL);
+ g_signal_connect (source, "need-data", G_CALLBACK (start_feed), data);
+ g_signal_connect (source, "enough-data", G_CALLBACK (stop_feed), data);
+ gst_caps_unref (audio_caps);
+}
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstBus *bus;
+
+ /* Initialize cumstom data structure */
+ memset (&data, 0, sizeof (data));
+ data.b = 1; /* For waveform generation */
+ data.d = 1;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the playbin element */
+ data.pipeline = gst_parse_launch ("playbin uri=appsrc://", NULL);
+ g_signal_connect (data.pipeline, "source-setup", G_CALLBACK (source_setup), &data);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (data.pipeline);
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, &data);
+ gst_object_unref (bus);
+
+ /* Start playing the pipeline */
+ gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
+
+ /* Create a GLib Main Loop and set it to run */
+ data.main_loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (data.main_loop);
+
+ /* Free resources */
+ gst_element_set_state (data.pipeline, GST_STATE_NULL);
+ gst_object_unref (data.pipeline);
+ return 0;
+}
diff --git a/tutorials/playback-tutorial-4.c b/tutorials/playback-tutorial-4.c
new file mode 100644
index 0000000..cfcf434
--- /dev/null
+++ b/tutorials/playback-tutorial-4.c
@@ -0,0 +1,172 @@
+#include <gst/gst.h>
+#include <string.h>
+
+#define GRAPH_LENGTH 78
+
+/* playbin flags */
+typedef enum {
+ GST_PLAY_FLAG_DOWNLOAD = (1 << 7) /* Enable progressive download (on selected formats) */
+} GstPlayFlags;
+
+typedef struct _CustomData {
+ gboolean is_live;
+ GstElement *pipeline;
+ GMainLoop *loop;
+ gint buffering_level;
+} CustomData;
+
+static void got_location (GstObject *gstobject, GstObject *prop_object, GParamSpec *prop, gpointer data) {
+ gchar *location;
+ g_object_get (G_OBJECT (prop_object), "temp-location", &location, NULL);
+ g_print ("Temporary file: %s\n", location);
+ g_free (location);
+ /* Uncomment this line to keep the temporary file after the program exits */
+ /* g_object_set (G_OBJECT (prop_object), "temp-remove", FALSE, NULL); */
+}
+
+static void cb_message (GstBus *bus, GstMessage *msg, CustomData *data) {
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (msg, &err, &debug);
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+ g_free (debug);
+
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ g_main_loop_quit (data->loop);
+ break;
+ }
+ case GST_MESSAGE_EOS:
+ /* end-of-stream */
+ gst_element_set_state (data->pipeline, GST_STATE_READY);
+ g_main_loop_quit (data->loop);
+ break;
+ case GST_MESSAGE_BUFFERING:
+ /* If the stream is live, we do not care about buffering. */
+ if (data->is_live) break;
+
+ gst_message_parse_buffering (msg, &data->buffering_level);
+
+ /* Wait until buffering is complete before start/resume playing */
+ if (data->buffering_level < 100)
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ else
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ break;
+ case GST_MESSAGE_CLOCK_LOST:
+ /* Get a new clock */
+ gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
+ break;
+ default:
+ /* Unhandled message */
+ break;
+ }
+}
+
+static gboolean refresh_ui (CustomData *data) {
+ GstQuery *query;
+ gboolean result;
+
+ query = gst_query_new_buffering (GST_FORMAT_PERCENT);
+ result = gst_element_query (data->pipeline, query);
+ if (result) {
+ gint n_ranges, range, i;
+ gchar graph[GRAPH_LENGTH + 1];
+ gint64 position = 0, duration = 0;
+
+ memset (graph, ' ', GRAPH_LENGTH);
+ graph[GRAPH_LENGTH] = '\0';
+
+ n_ranges = gst_query_get_n_buffering_ranges (query);
+ for (range = 0; range < n_ranges; range++) {
+ gint64 start, stop;
+ gst_query_parse_nth_buffering_range (query, range, &start, &stop);
+ start = start * GRAPH_LENGTH / (stop - start);
+ stop = stop * GRAPH_LENGTH / (stop - start);
+ for (i = (gint)start; i < stop; i++)
+ graph [i] = '-';
+ }
+ if (gst_element_query_position (data->pipeline, GST_FORMAT_TIME, &position) &&
+ GST_CLOCK_TIME_IS_VALID (position) &&
+ gst_element_query_duration (data->pipeline, GST_FORMAT_TIME, &duration) &&
+ GST_CLOCK_TIME_IS_VALID (duration)) {
+ i = (gint)(GRAPH_LENGTH * (double)position / (double)(duration + 1));
+ graph [i] = data->buffering_level < 100 ? 'X' : '>';
+ }
+ g_print ("[%s]", graph);
+ if (data->buffering_level < 100) {
+ g_print (" Buffering: %3d%%", data->buffering_level);
+ } else {
+ g_print (" ");
+ }
+ g_print ("\r");
+ }
+
+ return TRUE;
+
+}
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+ GMainLoop *main_loop;
+ CustomData data;
+ guint flags;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Initialize our data structure */
+ memset (&data, 0, sizeof (data));
+ data.buffering_level = 100;
+
+ /* Build the pipeline */
+ pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+ bus = gst_element_get_bus (pipeline);
+
+ /* Set the download flag */
+ g_object_get (pipeline, "flags", &flags, NULL);
+ flags |= GST_PLAY_FLAG_DOWNLOAD;
+ g_object_set (pipeline, "flags", flags, NULL);
+
+ /* Uncomment this line to limit the amount of downloaded data */
+ /* g_object_set (pipeline, "ring-buffer-max-size", (guint64)4000000, NULL); */
+
+ /* Start playing */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (pipeline);
+ return -1;
+ } else if (ret == GST_STATE_CHANGE_NO_PREROLL) {
+ data.is_live = TRUE;
+ }
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+ data.loop = main_loop;
+ data.pipeline = pipeline;
+
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message", G_CALLBACK (cb_message), &data);
+ g_signal_connect (pipeline, "deep-notify::temp-location", G_CALLBACK (got_location), NULL);
+
+ /* Register a function that GLib will call every second */
+ g_timeout_add_seconds (1, (GSourceFunc)refresh_ui, &data);
+
+ g_main_loop_run (main_loop);
+
+ /* Free resources */
+ g_main_loop_unref (main_loop);
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ g_print ("\n");
+ return 0;
+}
diff --git a/tutorials/playback-tutorial-5.c b/tutorials/playback-tutorial-5.c
new file mode 100644
index 0000000..0b3f0a1
--- /dev/null
+++ b/tutorials/playback-tutorial-5.c
@@ -0,0 +1,146 @@
+#include <string.h>
+#include <stdio.h>
+#include <gst/gst.h>
+#include <gst/video/colorbalance.h>
+
+typedef struct _CustomData {
+ GstElement *pipeline;
+ GMainLoop *loop;
+} CustomData;
+
+/* Process a color balance command */
+static void update_color_channel (const gchar *channel_name, gboolean increase, GstColorBalance *cb) {
+ gdouble step;
+ gint value;
+ GstColorBalanceChannel *channel = NULL;
+ const GList *channels, *l;
+
+ /* Retrieve the list of channels and locate the requested one */
+ channels = gst_color_balance_list_channels (cb);
+ for (l = channels; l != NULL; l = l->next) {
+ GstColorBalanceChannel *tmp = (GstColorBalanceChannel *)l->data;
+
+ if (g_strrstr (tmp->label, channel_name)) {
+ channel = tmp;
+ break;
+ }
+ }
+ if (!channel)
+ return;
+
+ /* Change the channel's value */
+ step = 0.1 * (channel->max_value - channel->min_value);
+ value = gst_color_balance_get_value (cb, channel);
+ if (increase) {
+ value = (gint)(value + step);
+ if (value > channel->max_value)
+ value = channel->max_value;
+ } else {
+ value = (gint)(value - step);
+ if (value < channel->min_value)
+ value = channel->min_value;
+ }
+ gst_color_balance_set_value (cb, channel, value);
+}
+
+/* Output the current values of all Color Balance channels */
+static void print_current_values (GstElement *pipeline) {
+ const GList *channels, *l;
+
+ /* Output Color Balance values */
+ channels = gst_color_balance_list_channels (GST_COLOR_BALANCE (pipeline));
+ for (l = channels; l != NULL; l = l->next) {
+ GstColorBalanceChannel *channel = (GstColorBalanceChannel *)l->data;
+ gint value = gst_color_balance_get_value (GST_COLOR_BALANCE (pipeline), channel);
+ g_print ("%s: %3d%% ", channel->label,
+ 100 * (value - channel->min_value) / (channel->max_value - channel->min_value));
+ }
+ g_print ("\n");
+}
+
+/* Process keyboard input */
+static gboolean handle_keyboard (GIOChannel *source, GIOCondition cond, CustomData *data) {
+ gchar *str = NULL;
+
+ if (g_io_channel_read_line (source, &str, NULL, NULL, NULL) != G_IO_STATUS_NORMAL) {
+ return TRUE;
+ }
+
+ switch (g_ascii_tolower (str[0])) {
+ case 'c':
+ update_color_channel ("CONTRAST", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));
+ break;
+ case 'b':
+ update_color_channel ("BRIGHTNESS", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));
+ break;
+ case 'h':
+ update_color_channel ("HUE", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));
+ break;
+ case 's':
+ update_color_channel ("SATURATION", g_ascii_isupper (str[0]), GST_COLOR_BALANCE (data->pipeline));
+ break;
+ case 'q':
+ g_main_loop_quit (data->loop);
+ break;
+ default:
+ break;
+ }
+
+ g_free (str);
+
+ print_current_values (data->pipeline);
+
+ return TRUE;
+}
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstStateChangeReturn ret;
+ GIOChannel *io_stdin;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Initialize our data structure */
+ memset (&data, 0, sizeof (data));
+
+ /* Print usage map */
+ g_print (
+ "USAGE: Choose one of the following options, then press enter:\n"
+ " 'C' to increase contrast, 'c' to decrease contrast\n"
+ " 'B' to increase brightness, 'b' to decrease brightness\n"
+ " 'H' to increase hue, 'h' to decrease hue\n"
+ " 'S' to increase saturation, 's' to decrease saturation\n"
+ " 'Q' to quit\n");
+
+ /* Build the pipeline */
+ data.pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Add a keyboard watch so we get notified of keystrokes */
+#ifdef G_OS_WIN32
+ io_stdin = g_io_channel_win32_new_fd (fileno (stdin));
+#else
+ io_stdin = g_io_channel_unix_new (fileno (stdin));
+#endif
+ g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc)handle_keyboard, &data);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+ print_current_values (data.pipeline);
+
+ /* Create a GLib Main Loop and set it to run */
+ data.loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (data.loop);
+
+ /* Free resources */
+ g_main_loop_unref (data.loop);
+ g_io_channel_unref (io_stdin);
+ gst_element_set_state (data.pipeline, GST_STATE_NULL);
+ gst_object_unref (data.pipeline);
+ return 0;
+}
diff --git a/tutorials/playback-tutorial-6.c b/tutorials/playback-tutorial-6.c
new file mode 100644
index 0000000..cf33e16
--- /dev/null
+++ b/tutorials/playback-tutorial-6.c
@@ -0,0 +1,89 @@
+#include <gst/gst.h>
+
+/* playbin2 flags */
+typedef enum {
+ GST_PLAY_FLAG_VIS = (1 << 3) /* Enable rendering of visualizations when there is no video stream. */
+} GstPlayFlags;
+
+/* Return TRUE if this is a Visualization element */
+static gboolean filter_vis_features (GstPluginFeature *feature, gpointer data) {
+ GstElementFactory *factory;
+
+ if (!GST_IS_ELEMENT_FACTORY (feature))
+ return FALSE;
+ factory = GST_ELEMENT_FACTORY (feature);
+ if (!g_strrstr (gst_element_factory_get_klass (factory), "Visualization"))
+ return FALSE;
+
+ return TRUE;
+}
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline, *vis_plugin;
+ GstBus *bus;
+ GstMessage *msg;
+ GList *list, *walk;
+ GstElementFactory *selected_factory = NULL;
+ guint flags;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Get a list of all visualization plugins */
+ list = gst_registry_feature_filter (gst_registry_get (), filter_vis_features, FALSE, NULL);
+
+ /* Print their names */
+ g_print("Available visualization plugins:\n");
+ for (walk = list; walk != NULL; walk = g_list_next (walk)) {
+ const gchar *name;
+ GstElementFactory *factory;
+
+ factory = GST_ELEMENT_FACTORY (walk->data);
+ name = gst_element_factory_get_longname (factory);
+ g_print(" %s\n", name);
+
+ if (selected_factory == NULL || g_str_has_prefix (name, "GOOM")) {
+ selected_factory = factory;
+ }
+ }
+
+ /* Don't use the factory if it's still empty */
+ /* e.g. no visualization plugins found */
+ if (!selected_factory) {
+ g_print ("No visualization plugins found!\n");
+ return -1;
+ }
+
+ /* We have now selected a factory for the visualization element */
+ g_print ("Selected '%s'\n", gst_element_factory_get_longname (selected_factory));
+ vis_plugin = gst_element_factory_create (selected_factory, NULL);
+ if (!vis_plugin)
+ return -1;
+
+ /* Build the pipeline */
+ pipeline = gst_parse_launch ("playbin uri=http://radio.hbr1.com:19800/ambient.ogg", NULL);
+
+ /* Set the visualization flag */
+ g_object_get (pipeline, "flags", &flags, NULL);
+ flags |= GST_PLAY_FLAG_VIS;
+ g_object_set (pipeline, "flags", flags, NULL);
+
+ /* set vis plugin for playbin2 */
+ g_object_set (pipeline, "vis-plugin", vis_plugin, NULL);
+
+ /* Start playing */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* Wait until error or EOS */
+ bus = gst_element_get_bus (pipeline);
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
+
+ /* Free resources */
+ if (msg != NULL)
+ gst_message_unref (msg);
+ gst_plugin_feature_list_free (list);
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tutorials/playback-tutorial-7.c b/tutorials/playback-tutorial-7.c
new file mode 100644
index 0000000..4bdc66b
--- /dev/null
+++ b/tutorials/playback-tutorial-7.c
@@ -0,0 +1,55 @@
+#include <gst/gst.h>
+
+int main(int argc, char *argv[]) {
+ GstElement *pipeline, *bin, *equalizer, *convert, *sink;
+ GstPad *pad, *ghost_pad;
+ GstBus *bus;
+ GstMessage *msg;
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Build the pipeline */
+ pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);
+
+ /* Create the elements inside the sink bin */
+ equalizer = gst_element_factory_make ("equalizer-3bands", "equalizer");
+ convert = gst_element_factory_make ("audioconvert", "convert");
+ sink = gst_element_factory_make ("autoaudiosink", "audio_sink");
+ if (!equalizer || !convert || !sink) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Create the sink bin, add the elements and link them */
+ bin = gst_bin_new ("audio_sink_bin");
+ gst_bin_add_many (GST_BIN (bin), equalizer, convert, sink, NULL);
+ gst_element_link_many (equalizer, convert, sink, NULL);
+ pad = gst_element_get_static_pad (equalizer, "sink");
+ ghost_pad = gst_ghost_pad_new ("sink", pad);
+ gst_pad_set_active (ghost_pad, TRUE);
+ gst_element_add_pad (bin, ghost_pad);
+ gst_object_unref (pad);
+
+ /* Configure the equalizer */
+ g_object_set (G_OBJECT (equalizer), "band1", (gdouble)-24.0, NULL);
+ g_object_set (G_OBJECT (equalizer), "band2", (gdouble)-24.0, NULL);
+
+ /* Set playbin2's audio sink to be our sink bin */
+ g_object_set (GST_OBJECT (pipeline), "audio-sink", bin, NULL);
+
+ /* Start playing */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* Wait until error or EOS */
+ bus = gst_element_get_bus (pipeline);
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
+
+ /* Free resources */
+ if (msg != NULL)
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj b/tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj
new file mode 100644
index 0000000..67fd093
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-1.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{63AEFB51-5FB8-409B-BDF3-893A23D28BF3}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj.filters b/tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj.filters
new file mode 100644
index 0000000..b5b0063
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-1/basic-tutorial-1.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-1.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj b/tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj
new file mode 100644
index 0000000..477166f
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-12.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{A2E63C29-3375-4930-B7D3-2F23EC824EAF}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj.filters b/tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj.filters
new file mode 100644
index 0000000..3f66ae1
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-12/basic-tutorial-12.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-12.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj b/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj
new file mode 100644
index 0000000..4c8f40f
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-13.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{6D962544-E7A2-450B-998B-6D09B17ACCB3}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters b/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters
new file mode 100644
index 0000000..910fa05
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-13/basic-tutorial-13.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-13.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj b/tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj
new file mode 100644
index 0000000..3e5b9cd
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj
@@ -0,0 +1,100 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-15.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{94A762CB-2856-4CFF-BF1A-DB44882D4BD5}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\clutter-gst-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\clutter-gst-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\clutter-win32-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\clutter-win32-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\clutter-gst-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\clutter-gst-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\clutter-win32-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\clutter-win32-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ShowIncludes Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ShowIncludes>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj.filters b/tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj.filters
new file mode 100644
index 0000000..790763f
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-15/basic-tutorial-15.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-15.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj b/tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj
new file mode 100644
index 0000000..fded79d
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-2.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj.filters b/tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj.filters
new file mode 100644
index 0000000..20de244
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-2/basic-tutorial-2.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-2.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj b/tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj
new file mode 100644
index 0000000..6d6d88f
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-3.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{48361596-FE9B-4CC8-B846-B2897550E3A0}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj.filters b/tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj.filters
new file mode 100644
index 0000000..db211db
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-3/basic-tutorial-3.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-3.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj b/tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj
new file mode 100644
index 0000000..ff4b549
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-4.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{38771206-5047-4FE6-B0F8-E36C2C44EA3F}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj.filters b/tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj.filters
new file mode 100644
index 0000000..42706ff
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-4/basic-tutorial-4.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-4.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj b/tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj
new file mode 100644
index 0000000..5204272
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj
@@ -0,0 +1,99 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-5.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{71882E71-E5D8-47BE-A8FF-35F99B78A5A6}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-video-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-video-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gtk+-2.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gtk+-2.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-video-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-video-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gtk+-2.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gtk+-2.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj.filters b/tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj.filters
new file mode 100644
index 0000000..a4a46c3
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-5/basic-tutorial-5.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-5.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj b/tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj
new file mode 100644
index 0000000..b3763ae
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-6.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{22CBF273-BFBC-41AB-842C-5E56045C1220}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj.filters b/tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj.filters
new file mode 100644
index 0000000..97b4a54
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-6/basic-tutorial-6.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-6.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj b/tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj
new file mode 100644
index 0000000..18442b0
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-7.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{16607817-1262-46A5-8FA2-5C5865189FE2}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj.filters b/tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj.filters
new file mode 100644
index 0000000..e2bbe80
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-7/basic-tutorial-7.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-7.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj b/tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj
new file mode 100644
index 0000000..163e31d
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-8.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{7D5B2500-D176-45D5-AA39-BC70C6A58D59}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj.filters b/tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj.filters
new file mode 100644
index 0000000..e14f0f5
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-8/basic-tutorial-8.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-8.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj b/tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj
new file mode 100644
index 0000000..712187d
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj
@@ -0,0 +1,97 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-9.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{7B61F2C6-5202-48B7-8589-164F81BC636C}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-pbutils-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-pbutils-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-pbutils-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-pbutils-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj.filters b/tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj.filters
new file mode 100644
index 0000000..965f49c
--- /dev/null
+++ b/tutorials/vs2010/basic-tutorial-9/basic-tutorial-9.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\basic-tutorial-9.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj b/tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj
new file mode 100644
index 0000000..c0efc33
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-1.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{EE66402B-FA3A-473F-ADC6-484B25B4B1DB}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj.filters b/tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj.filters
new file mode 100644
index 0000000..98ab89a
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-1/playback-tutorial-1.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-1.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj b/tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj
new file mode 100644
index 0000000..68d5167
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-2.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{9AC36197-6B43-49D2-B747-75AA06550637}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj.filters b/tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj.filters
new file mode 100644
index 0000000..92690d5
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-2/playback-tutorial-2.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-2.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj b/tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj
new file mode 100644
index 0000000..cb664f2
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-3.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{B84F4F87-E804-456C-874E-AC76E0116268}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj.filters b/tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj.filters
new file mode 100644
index 0000000..97cf279
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-3/playback-tutorial-3.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-3.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj b/tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj
new file mode 100644
index 0000000..4964c26
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-4.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{0342A79A-3522-416B-A4F8-58F5664B8415}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj.filters b/tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj.filters
new file mode 100644
index 0000000..9e1c365
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-4/playback-tutorial-4.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-4.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj b/tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj
new file mode 100644
index 0000000..bbad658
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj
@@ -0,0 +1,97 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-5.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{57F94395-E9A1-430E-AF28-165FD9BE0872}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-video-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-video-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-video-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-video-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj.filters b/tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj.filters
new file mode 100644
index 0000000..d11ad27
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-5/playback-tutorial-5.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-5.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj b/tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj
new file mode 100644
index 0000000..76b178b
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-6.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{D6293AFD-41DA-44B6-AE57-F1EEE74338AC}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj.filters b/tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj.filters
new file mode 100644
index 0000000..44ffbcd
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-6/playback-tutorial-6.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-6.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj b/tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj
new file mode 100644
index 0000000..f6c7756
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj
@@ -0,0 +1,95 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-7.c" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}</ProjectGuid>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86)\share\vs\2010\msvc\x86.props')" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Platform)'=='x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\libs\gstreamer-1.0.props')" />
+ <Import Project="$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props" Condition="exists('$(GSTREAMER_1_0_ROOT_X86_64)\share\vs\2010\msvc\x86_64.props')" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
+ <ClCompile>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
diff --git a/tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj.filters b/tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj.filters
new file mode 100644
index 0000000..46528cc
--- /dev/null
+++ b/tutorials/vs2010/playback-tutorial-7/playback-tutorial-7.vcxproj.filters
@@ -0,0 +1,6 @@
+ï»ż<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="..\..\playback-tutorial-7.c" />
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/tutorials/vs2010/tutorials.sln b/tutorials/vs2010/tutorials.sln
new file mode 100644
index 0000000..b755671
--- /dev/null
+++ b/tutorials/vs2010/tutorials.sln
@@ -0,0 +1,206 @@
+ï»ż
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-1", "basic-tutorial-1\basic-tutorial-1.vcxproj", "{63AEFB51-5FB8-409B-BDF3-893A23D28BF3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-2", "basic-tutorial-2\basic-tutorial-2.vcxproj", "{4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-3", "basic-tutorial-3\basic-tutorial-3.vcxproj", "{48361596-FE9B-4CC8-B846-B2897550E3A0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-4", "basic-tutorial-4\basic-tutorial-4.vcxproj", "{38771206-5047-4FE6-B0F8-E36C2C44EA3F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-5", "basic-tutorial-5\basic-tutorial-5.vcxproj", "{71882E71-E5D8-47BE-A8FF-35F99B78A5A6}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-6", "basic-tutorial-6\basic-tutorial-6.vcxproj", "{22CBF273-BFBC-41AB-842C-5E56045C1220}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-7", "basic-tutorial-7\basic-tutorial-7.vcxproj", "{16607817-1262-46A5-8FA2-5C5865189FE2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-8", "basic-tutorial-8\basic-tutorial-8.vcxproj", "{7D5B2500-D176-45D5-AA39-BC70C6A58D59}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-1", "playback-tutorial-1\playback-tutorial-1.vcxproj", "{EE66402B-FA3A-473F-ADC6-484B25B4B1DB}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-2", "playback-tutorial-2\playback-tutorial-2.vcxproj", "{9AC36197-6B43-49D2-B747-75AA06550637}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-9", "basic-tutorial-9\basic-tutorial-9.vcxproj", "{7B61F2C6-5202-48B7-8589-164F81BC636C}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-12", "basic-tutorial-12\basic-tutorial-12.vcxproj", "{A2E63C29-3375-4930-B7D3-2F23EC824EAF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-4", "playback-tutorial-4\playback-tutorial-4.vcxproj", "{0342A79A-3522-416B-A4F8-58F5664B8415}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-3", "playback-tutorial-3\playback-tutorial-3.vcxproj", "{B84F4F87-E804-456C-874E-AC76E0116268}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-5", "playback-tutorial-5\playback-tutorial-5.vcxproj", "{57F94395-E9A1-430E-AF28-165FD9BE0872}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-6", "playback-tutorial-6\playback-tutorial-6.vcxproj", "{D6293AFD-41DA-44B6-AE57-F1EEE74338AC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-7", "playback-tutorial-7\playback-tutorial-7.vcxproj", "{9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-13", "basic-tutorial-13\basic-tutorial-13.vcxproj", "{6D962544-E7A2-450B-998B-6D09B17ACCB3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-15", "basic-tutorial-15\basic-tutorial-15.vcxproj", "{94A762CB-2856-4CFF-BF1A-DB44882D4BD5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Debug|Win32.Build.0 = Debug|Win32
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Debug|x64.ActiveCfg = Debug|x64
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Debug|x64.Build.0 = Debug|x64
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Release|Win32.ActiveCfg = Release|Win32
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Release|Win32.Build.0 = Release|Win32
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Release|x64.ActiveCfg = Release|x64
+ {63AEFB51-5FB8-409B-BDF3-893A23D28BF3}.Release|x64.Build.0 = Release|x64
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Debug|Win32.Build.0 = Debug|Win32
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Debug|x64.ActiveCfg = Debug|x64
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Debug|x64.Build.0 = Debug|x64
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Release|Win32.ActiveCfg = Release|Win32
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Release|Win32.Build.0 = Release|Win32
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Release|x64.ActiveCfg = Release|x64
+ {4FA695D0-7A7B-4ED6-BA2B-B14997D8231E}.Release|x64.Build.0 = Release|x64
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Debug|Win32.Build.0 = Debug|Win32
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Debug|x64.ActiveCfg = Debug|x64
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Debug|x64.Build.0 = Debug|x64
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Release|Win32.ActiveCfg = Release|Win32
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Release|Win32.Build.0 = Release|Win32
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Release|x64.ActiveCfg = Release|x64
+ {48361596-FE9B-4CC8-B846-B2897550E3A0}.Release|x64.Build.0 = Release|x64
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Debug|Win32.Build.0 = Debug|Win32
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Debug|x64.ActiveCfg = Debug|x64
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Debug|x64.Build.0 = Debug|x64
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Release|Win32.ActiveCfg = Release|Win32
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Release|Win32.Build.0 = Release|Win32
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Release|x64.ActiveCfg = Release|x64
+ {38771206-5047-4FE6-B0F8-E36C2C44EA3F}.Release|x64.Build.0 = Release|x64
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Debug|Win32.ActiveCfg = Debug|Win32
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Debug|Win32.Build.0 = Debug|Win32
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Debug|x64.ActiveCfg = Debug|x64
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Debug|x64.Build.0 = Debug|x64
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Release|Win32.ActiveCfg = Release|Win32
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Release|Win32.Build.0 = Release|Win32
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Release|x64.ActiveCfg = Release|x64
+ {71882E71-E5D8-47BE-A8FF-35F99B78A5A6}.Release|x64.Build.0 = Release|x64
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Debug|Win32.ActiveCfg = Debug|Win32
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Debug|Win32.Build.0 = Debug|Win32
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Debug|x64.ActiveCfg = Debug|x64
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Debug|x64.Build.0 = Debug|x64
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Release|Win32.ActiveCfg = Release|Win32
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Release|Win32.Build.0 = Release|Win32
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Release|x64.ActiveCfg = Release|x64
+ {22CBF273-BFBC-41AB-842C-5E56045C1220}.Release|x64.Build.0 = Release|x64
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Debug|Win32.Build.0 = Debug|Win32
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Debug|x64.ActiveCfg = Debug|x64
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Debug|x64.Build.0 = Debug|x64
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Release|Win32.ActiveCfg = Release|Win32
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Release|Win32.Build.0 = Release|Win32
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Release|x64.ActiveCfg = Release|x64
+ {16607817-1262-46A5-8FA2-5C5865189FE2}.Release|x64.Build.0 = Release|x64
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Debug|Win32.Build.0 = Debug|Win32
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Debug|x64.ActiveCfg = Debug|x64
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Debug|x64.Build.0 = Debug|x64
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Release|Win32.ActiveCfg = Release|Win32
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Release|Win32.Build.0 = Release|Win32
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Release|x64.ActiveCfg = Release|x64
+ {7D5B2500-D176-45D5-AA39-BC70C6A58D59}.Release|x64.Build.0 = Release|x64
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Debug|Win32.Build.0 = Debug|Win32
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Debug|x64.ActiveCfg = Debug|x64
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Debug|x64.Build.0 = Debug|x64
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Release|Win32.ActiveCfg = Release|Win32
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Release|Win32.Build.0 = Release|Win32
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Release|x64.ActiveCfg = Release|x64
+ {EE66402B-FA3A-473F-ADC6-484B25B4B1DB}.Release|x64.Build.0 = Release|x64
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Debug|Win32.Build.0 = Debug|Win32
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Debug|x64.ActiveCfg = Debug|x64
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Debug|x64.Build.0 = Debug|x64
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Release|Win32.ActiveCfg = Release|Win32
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Release|Win32.Build.0 = Release|Win32
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Release|x64.ActiveCfg = Release|x64
+ {9AC36197-6B43-49D2-B747-75AA06550637}.Release|x64.Build.0 = Release|x64
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Debug|Win32.Build.0 = Debug|Win32
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Debug|x64.ActiveCfg = Debug|x64
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Debug|x64.Build.0 = Debug|x64
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|Win32.ActiveCfg = Release|Win32
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|Win32.Build.0 = Release|Win32
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|x64.ActiveCfg = Release|x64
+ {7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|x64.Build.0 = Release|x64
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|Win32.Build.0 = Debug|Win32
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|x64.ActiveCfg = Debug|x64
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|x64.Build.0 = Debug|x64
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|Win32.ActiveCfg = Release|Win32
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|Win32.Build.0 = Release|Win32
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|x64.ActiveCfg = Release|x64
+ {A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|x64.Build.0 = Release|x64
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Debug|Win32.Build.0 = Debug|Win32
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Debug|x64.ActiveCfg = Debug|x64
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Debug|x64.Build.0 = Debug|x64
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Release|Win32.ActiveCfg = Release|Win32
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Release|Win32.Build.0 = Release|Win32
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Release|x64.ActiveCfg = Release|x64
+ {0342A79A-3522-416B-A4F8-58F5664B8415}.Release|x64.Build.0 = Release|x64
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Debug|Win32.Build.0 = Debug|Win32
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Debug|x64.ActiveCfg = Debug|x64
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Debug|x64.Build.0 = Debug|x64
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Release|Win32.ActiveCfg = Release|Win32
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Release|Win32.Build.0 = Release|Win32
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Release|x64.ActiveCfg = Release|x64
+ {B84F4F87-E804-456C-874E-AC76E0116268}.Release|x64.Build.0 = Release|x64
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Debug|Win32.ActiveCfg = Debug|Win32
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Debug|Win32.Build.0 = Debug|Win32
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Debug|x64.ActiveCfg = Debug|x64
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Debug|x64.Build.0 = Debug|x64
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Release|Win32.ActiveCfg = Release|Win32
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Release|Win32.Build.0 = Release|Win32
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Release|x64.ActiveCfg = Release|x64
+ {57F94395-E9A1-430E-AF28-165FD9BE0872}.Release|x64.Build.0 = Release|x64
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Debug|Win32.Build.0 = Debug|Win32
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Debug|x64.ActiveCfg = Debug|x64
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Debug|x64.Build.0 = Debug|x64
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Release|Win32.ActiveCfg = Release|Win32
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Release|Win32.Build.0 = Release|Win32
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Release|x64.ActiveCfg = Release|x64
+ {D6293AFD-41DA-44B6-AE57-F1EEE74338AC}.Release|x64.Build.0 = Release|x64
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Debug|Win32.Build.0 = Debug|Win32
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Debug|x64.ActiveCfg = Debug|x64
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Debug|x64.Build.0 = Debug|x64
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Release|Win32.ActiveCfg = Release|Win32
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Release|Win32.Build.0 = Release|Win32
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Release|x64.ActiveCfg = Release|x64
+ {9C06FA1E-E571-42EA-B4AA-B91F9DA77D5A}.Release|x64.Build.0 = Release|x64
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|Win32.Build.0 = Debug|Win32
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|x64.ActiveCfg = Debug|x64
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Debug|x64.Build.0 = Debug|x64
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|Win32.ActiveCfg = Release|Win32
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|Win32.Build.0 = Release|Win32
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|x64.ActiveCfg = Release|x64
+ {6D962544-E7A2-450B-998B-6D09B17ACCB3}.Release|x64.Build.0 = Release|x64
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Debug|Win32.Build.0 = Debug|Win32
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Debug|x64.ActiveCfg = Debug|x64
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Debug|x64.Build.0 = Debug|x64
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Release|Win32.ActiveCfg = Release|Win32
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Release|Win32.Build.0 = Release|Win32
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Release|x64.ActiveCfg = Release|x64
+ {94A762CB-2856-4CFF-BF1A-DB44882D4BD5}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.pbxproj b/tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..5b9826d
--- /dev/null
+++ b/tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.pbxproj
@@ -0,0 +1,1761 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ C67B40CD172EBEA3008359CC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CC172EBEA3008359CC /* UIKit.framework */; };
+ C67B40CF172EBEA3008359CC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CE172EBEA3008359CC /* Foundation.framework */; };
+ C67B40D1172EBEA3008359CC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D0172EBEA3008359CC /* CoreGraphics.framework */; };
+ C67B40D3172EBEA3008359CC /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D2172EBEA3008359CC /* GStreamer.framework */; };
+ C67B40D9172EBEA3008359CC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C67B40D7172EBEA3008359CC /* InfoPlist.strings */; };
+ C67B40DB172EBEA3008359CC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B40DA172EBEA3008359CC /* main.m */; };
+ C67B40DF172EBEA3008359CC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B40DE172EBEA3008359CC /* AppDelegate.m */; };
+ C67B40E1172EBEA3008359CC /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B40E0172EBEA3008359CC /* Default.png */; };
+ C67B40E5172EBEA3008359CC /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B40E4172EBEA3008359CC /* Default-568h@2x.png */; };
+ C67B40E8172EBEA3008359CC /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C67B40E6172EBEA3008359CC /* MainStoryboard_iPhone.storyboard */; };
+ C67B40EB172EBEA3008359CC /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C67B40E9172EBEA3008359CC /* MainStoryboard_iPad.storyboard */; };
+ C67B40EE172EBEA3008359CC /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B40ED172EBEA3008359CC /* ViewController.m */; };
+ C67B40FA172EC27D008359CC /* GStreamerBackend.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B40F9172EC27D008359CC /* GStreamerBackend.m */; };
+ C67B4100172FC7F4008359CC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CC172EBEA3008359CC /* UIKit.framework */; };
+ C67B4101172FC7F4008359CC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CE172EBEA3008359CC /* Foundation.framework */; };
+ C67B4102172FC7F4008359CC /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D0172EBEA3008359CC /* CoreGraphics.framework */; };
+ C67B4103172FC7F4008359CC /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D2172EBEA3008359CC /* GStreamer.framework */; };
+ C67B4109172FC7F4008359CC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C67B4107172FC7F4008359CC /* InfoPlist.strings */; };
+ C67B410B172FC7F4008359CC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B410A172FC7F4008359CC /* main.m */; };
+ C67B410F172FC7F5008359CC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B410E172FC7F5008359CC /* AppDelegate.m */; };
+ C67B4111172FC7F5008359CC /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4110172FC7F5008359CC /* Default.png */; };
+ C67B4113172FC7F5008359CC /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4112172FC7F5008359CC /* Default@2x.png */; };
+ C67B4115172FC7F5008359CC /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4114172FC7F5008359CC /* Default-568h@2x.png */; };
+ C67B4118172FC7F5008359CC /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C67B4116172FC7F5008359CC /* MainStoryboard_iPhone.storyboard */; };
+ C67B411B172FC7F5008359CC /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C67B4119172FC7F5008359CC /* MainStoryboard_iPad.storyboard */; };
+ C67B411E172FC7F5008359CC /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B411D172FC7F5008359CC /* ViewController.m */; };
+ C67B412E172FCC4C008359CC /* GStreamerBackend.m in Sources */ = {isa = PBXBuildFile; fileRef = C67B412C172FCC4C008359CC /* GStreamerBackend.m */; };
+ C67B4134172FE4E9008359CC /* appicon-1-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4130172FE4E9008359CC /* appicon-1-iPad.png */; };
+ C67B4135172FE4E9008359CC /* appicon-1-iPad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4131172FE4E9008359CC /* appicon-1-iPad@2x.png */; };
+ C67B4136172FE4E9008359CC /* appicon-1-iPhone.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4132172FE4E9008359CC /* appicon-1-iPhone.png */; };
+ C67B4137172FE4E9008359CC /* appicon-1-iPhone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4133172FE4E9008359CC /* appicon-1-iPhone@2x.png */; };
+ C67B4145172FEA3C008359CC /* appicon-2-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4141172FEA3C008359CC /* appicon-2-iPad.png */; };
+ C67B4146172FEA3C008359CC /* appicon-2-iPad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4142172FEA3C008359CC /* appicon-2-iPad@2x.png */; };
+ C67B4147172FEA3C008359CC /* appicon-2-iPhone.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4143172FEA3C008359CC /* appicon-2-iPhone.png */; };
+ C67B4148172FEA3C008359CC /* appicon-2-iPhone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C67B4144172FEA3C008359CC /* appicon-2-iPhone@2x.png */; };
+ C68B1D8917465EB7004FD7D0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CC172EBEA3008359CC /* UIKit.framework */; };
+ C68B1D8A17465EB7004FD7D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CE172EBEA3008359CC /* Foundation.framework */; };
+ C68B1D8B17465EB7004FD7D0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D0172EBEA3008359CC /* CoreGraphics.framework */; };
+ C68B1D8C17465EB7004FD7D0 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D2172EBEA3008359CC /* GStreamer.framework */; };
+ C68B1D9217465EB7004FD7D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C68B1D9017465EB7004FD7D0 /* InfoPlist.strings */; };
+ C68B1D9417465EB7004FD7D0 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C68B1D9317465EB7004FD7D0 /* main.m */; };
+ C68B1D9817465EB7004FD7D0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C68B1D9717465EB7004FD7D0 /* AppDelegate.m */; };
+ C68B1D9A17465EB7004FD7D0 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = C68B1D9917465EB7004FD7D0 /* Default.png */; };
+ C68B1D9C17465EB7004FD7D0 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C68B1D9B17465EB7004FD7D0 /* Default@2x.png */; };
+ C68B1D9E17465EB7004FD7D0 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C68B1D9D17465EB7004FD7D0 /* Default-568h@2x.png */; };
+ C68B1DA117465EB7004FD7D0 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C68B1D9F17465EB7004FD7D0 /* MainStoryboard_iPhone.storyboard */; };
+ C68B1DA417465EB7004FD7D0 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C68B1DA217465EB7004FD7D0 /* MainStoryboard_iPad.storyboard */; };
+ C68B1DB617465F96004FD7D0 /* GStreamerBackend.m in Sources */ = {isa = PBXBuildFile; fileRef = C68B1DB017465F95004FD7D0 /* GStreamerBackend.m */; };
+ C68B1DB717465F96004FD7D0 /* LibraryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C68B1DB317465F95004FD7D0 /* LibraryViewController.m */; };
+ C68B1DB817465F96004FD7D0 /* VideoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C68B1DB517465F95004FD7D0 /* VideoViewController.m */; };
+ C68B1DBA17465FD4004FD7D0 /* EaglUIVIew.m in Sources */ = {isa = PBXBuildFile; fileRef = C68B1DB917465FD4004FD7D0 /* EaglUIVIew.m */; };
+ C68B1DC0174660D4004FD7D0 /* appicon-5-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = C68B1DBC174660D4004FD7D0 /* appicon-5-iPad.png */; };
+ C68B1DC1174660D4004FD7D0 /* appicon-5-iPad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C68B1DBD174660D4004FD7D0 /* appicon-5-iPad@2x.png */; };
+ C68B1DC2174660D4004FD7D0 /* appicon-5-iPhone.png in Resources */ = {isa = PBXBuildFile; fileRef = C68B1DBE174660D4004FD7D0 /* appicon-5-iPhone.png */; };
+ C68B1DC3174660D4004FD7D0 /* appicon-5-iPhone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C68B1DBF174660D4004FD7D0 /* appicon-5-iPhone@2x.png */; };
+ C68C527E174D11F0007A0729 /* fonts.conf in Resources */ = {isa = PBXBuildFile; fileRef = C68C527B174D11F0007A0729 /* fonts.conf */; };
+ C68C527F174D11F0007A0729 /* gst_ios_init.m in Sources */ = {isa = PBXBuildFile; fileRef = C68C527C174D11F0007A0729 /* gst_ios_init.m */; };
+ C68C5280174D11F0007A0729 /* Ubuntu-R.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C68C527D174D11F0007A0729 /* Ubuntu-R.ttf */; };
+ C68C5284174D137B007A0729 /* fonts.conf in Resources */ = {isa = PBXBuildFile; fileRef = C68C5281174D137B007A0729 /* fonts.conf */; };
+ C68C5285174D137B007A0729 /* gst_ios_init.m in Sources */ = {isa = PBXBuildFile; fileRef = C68C5282174D137B007A0729 /* gst_ios_init.m */; };
+ C68C5286174D137B007A0729 /* Ubuntu-R.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C68C5283174D137B007A0729 /* Ubuntu-R.ttf */; };
+ C68C528A174D13EB007A0729 /* fonts.conf in Resources */ = {isa = PBXBuildFile; fileRef = C68C5287174D13EB007A0729 /* fonts.conf */; };
+ C68C528B174D13EB007A0729 /* gst_ios_init.m in Sources */ = {isa = PBXBuildFile; fileRef = C68C5288174D13EB007A0729 /* gst_ios_init.m */; };
+ C68C528C174D13EB007A0729 /* Ubuntu-R.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C68C5289174D13EB007A0729 /* Ubuntu-R.ttf */; };
+ C68C5290174D1408007A0729 /* fonts.conf in Resources */ = {isa = PBXBuildFile; fileRef = C68C528D174D1408007A0729 /* fonts.conf */; };
+ C68C5291174D1408007A0729 /* gst_ios_init.m in Sources */ = {isa = PBXBuildFile; fileRef = C68C528E174D1408007A0729 /* gst_ios_init.m */; };
+ C68C5292174D1408007A0729 /* Ubuntu-R.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C68C528F174D1408007A0729 /* Ubuntu-R.ttf */; };
+ C68C5296174D1427007A0729 /* fonts.conf in Resources */ = {isa = PBXBuildFile; fileRef = C68C5293174D1427007A0729 /* fonts.conf */; };
+ C68C5297174D1427007A0729 /* gst_ios_init.m in Sources */ = {isa = PBXBuildFile; fileRef = C68C5294174D1427007A0729 /* gst_ios_init.m */; };
+ C68C5298174D1427007A0729 /* Ubuntu-R.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C68C5295174D1427007A0729 /* Ubuntu-R.ttf */; };
+ C6B6126017395CF2003FC410 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CC172EBEA3008359CC /* UIKit.framework */; };
+ C6B6126117395CF2003FC410 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CE172EBEA3008359CC /* Foundation.framework */; };
+ C6B6126217395CF2003FC410 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D0172EBEA3008359CC /* CoreGraphics.framework */; };
+ C6B6126317395CF2003FC410 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D2172EBEA3008359CC /* GStreamer.framework */; };
+ C6B6126917395CF2003FC410 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C6B6126717395CF2003FC410 /* InfoPlist.strings */; };
+ C6B6126B17395CF2003FC410 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C6B6126A17395CF2003FC410 /* main.m */; };
+ C6B6126F17395CF2003FC410 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C6B6126E17395CF2003FC410 /* AppDelegate.m */; };
+ C6B6127117395CF2003FC410 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B6127017395CF2003FC410 /* Default.png */; };
+ C6B6127317395CF2003FC410 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B6127217395CF2003FC410 /* Default@2x.png */; };
+ C6B6127517395CF2003FC410 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B6127417395CF2003FC410 /* Default-568h@2x.png */; };
+ C6B6127817395CF2003FC410 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C6B6127617395CF2003FC410 /* MainStoryboard_iPhone.storyboard */; };
+ C6B6127B17395CF2003FC410 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C6B6127917395CF2003FC410 /* MainStoryboard_iPad.storyboard */; };
+ C6B6127E17395CF2003FC410 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C6B6127D17395CF2003FC410 /* ViewController.m */; };
+ C6B6128B17395D4F003FC410 /* GStreamerBackend.m in Sources */ = {isa = PBXBuildFile; fileRef = C6B6128917395D4F003FC410 /* GStreamerBackend.m */; };
+ C6B6129417396231003FC410 /* appicon-3-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B6129017396231003FC410 /* appicon-3-iPad.png */; };
+ C6B6129517396231003FC410 /* appicon-3-iPad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B6129117396231003FC410 /* appicon-3-iPad@2x.png */; };
+ C6B6129617396231003FC410 /* appicon-3-iPhone.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B6129217396231003FC410 /* appicon-3-iPhone.png */; };
+ C6B6129717396231003FC410 /* appicon-3-iPhone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6B6129317396231003FC410 /* appicon-3-iPhone@2x.png */; };
+ C6EB857C173A4D9500C3953D /* EaglUIVIew.m in Sources */ = {isa = PBXBuildFile; fileRef = C6EB857B173A4D9500C3953D /* EaglUIVIew.m */; };
+ C6EB8582173BEE5E00C3953D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CC172EBEA3008359CC /* UIKit.framework */; };
+ C6EB8583173BEE5E00C3953D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40CE172EBEA3008359CC /* Foundation.framework */; };
+ C6EB8584173BEE5E00C3953D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D0172EBEA3008359CC /* CoreGraphics.framework */; };
+ C6EB8585173BEE5E00C3953D /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C67B40D2172EBEA3008359CC /* GStreamer.framework */; };
+ C6EB858B173BEE5E00C3953D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C6EB8589173BEE5E00C3953D /* InfoPlist.strings */; };
+ C6EB858D173BEE5E00C3953D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C6EB858C173BEE5E00C3953D /* main.m */; };
+ C6EB8591173BEE5E00C3953D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C6EB8590173BEE5E00C3953D /* AppDelegate.m */; };
+ C6EB8593173BEE5E00C3953D /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = C6EB8592173BEE5E00C3953D /* Default.png */; };
+ C6EB8595173BEE5E00C3953D /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6EB8594173BEE5E00C3953D /* Default@2x.png */; };
+ C6EB8597173BEE5E00C3953D /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6EB8596173BEE5E00C3953D /* Default-568h@2x.png */; };
+ C6EB859A173BEE5E00C3953D /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C6EB8598173BEE5E00C3953D /* MainStoryboard_iPhone.storyboard */; };
+ C6EB859D173BEE5E00C3953D /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C6EB859B173BEE5E00C3953D /* MainStoryboard_iPad.storyboard */; };
+ C6EB85A0173BEE5E00C3953D /* VideoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C6EB859F173BEE5E00C3953D /* VideoViewController.m */; };
+ C6EB85B1173BEF2600C3953D /* EaglUIVIew.m in Sources */ = {isa = PBXBuildFile; fileRef = C6EB85AB173BEF2600C3953D /* EaglUIVIew.m */; };
+ C6EB85B3173BEF2600C3953D /* GStreamerBackend.m in Sources */ = {isa = PBXBuildFile; fileRef = C6EB85AF173BEF2600C3953D /* GStreamerBackend.m */; };
+ C6EB85B9173BEFF800C3953D /* appicon-4-iPad.png in Resources */ = {isa = PBXBuildFile; fileRef = C6EB85B5173BEFF800C3953D /* appicon-4-iPad.png */; };
+ C6EB85BA173BEFF800C3953D /* appicon-4-iPad@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6EB85B6173BEFF800C3953D /* appicon-4-iPad@2x.png */; };
+ C6EB85BB173BEFF800C3953D /* appicon-4-iPhone.png in Resources */ = {isa = PBXBuildFile; fileRef = C6EB85B7173BEFF800C3953D /* appicon-4-iPhone.png */; };
+ C6EB85BC173BEFF800C3953D /* appicon-4-iPhone@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C6EB85B8173BEFF800C3953D /* appicon-4-iPhone@2x.png */; };
+ C987C0DB1BAB090B00D54784 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C987C0DA1BAB090B00D54784 /* libiconv.2.dylib */; };
+ C987C0DC1BAB096C00D54784 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C987C0DA1BAB090B00D54784 /* libiconv.2.dylib */; };
+ C987C0DD1BAB09A100D54784 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C987C0DA1BAB090B00D54784 /* libiconv.2.dylib */; };
+ C987C0DE1BAB09AA00D54784 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C987C0DA1BAB090B00D54784 /* libiconv.2.dylib */; };
+ C987C0DF1BAB09AF00D54784 /* libiconv.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C987C0DA1BAB090B00D54784 /* libiconv.2.dylib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ C67B40C9172EBEA3008359CC /* Tutorial 1.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Tutorial 1.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ C67B40CC172EBEA3008359CC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ C67B40CE172EBEA3008359CC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+ C67B40D0172EBEA3008359CC /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
+ C67B40D2172EBEA3008359CC /* GStreamer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GStreamer.framework; path = Library/Frameworks/GStreamer.framework; sourceTree = SDKROOT; };
+ C67B40D6172EBEA3008359CC /* Tutorial 1-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tutorial 1-Info.plist"; sourceTree = "<group>"; };
+ C67B40D8172EBEA3008359CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ C67B40DA172EBEA3008359CC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ C67B40DC172EBEA3008359CC /* Tutorial 1-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tutorial 1-Prefix.pch"; sourceTree = "<group>"; };
+ C67B40DD172EBEA3008359CC /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ C67B40DE172EBEA3008359CC /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ C67B40E0172EBEA3008359CC /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ C67B40E2172EBEA3008359CC /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+ C67B40E4172EBEA3008359CC /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ C67B40E7172EBEA3008359CC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = "<group>"; };
+ C67B40EA172EBEA3008359CC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
+ C67B40EC172EBEA3008359CC /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+ C67B40ED172EBEA3008359CC /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+ C67B40F1172EBEA3008359CC /* gst_ios_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gst_ios_init.h; sourceTree = "<group>"; };
+ C67B40F8172EC27D008359CC /* GStreamerBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackend.h; sourceTree = "<group>"; };
+ C67B40F9172EC27D008359CC /* GStreamerBackend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GStreamerBackend.m; sourceTree = "<group>"; };
+ C67B40FF172FC7F4008359CC /* Tutorial 2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Tutorial 2.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ C67B4106172FC7F4008359CC /* Tutorial 2-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tutorial 2-Info.plist"; sourceTree = "<group>"; };
+ C67B4108172FC7F4008359CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ C67B410A172FC7F4008359CC /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ C67B410C172FC7F5008359CC /* Tutorial 2-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tutorial 2-Prefix.pch"; sourceTree = "<group>"; };
+ C67B410D172FC7F5008359CC /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ C67B410E172FC7F5008359CC /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ C67B4110172FC7F5008359CC /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ C67B4112172FC7F5008359CC /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+ C67B4114172FC7F5008359CC /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ C67B4117172FC7F5008359CC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = "<group>"; };
+ C67B411A172FC7F5008359CC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
+ C67B411C172FC7F5008359CC /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+ C67B411D172FC7F5008359CC /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+ C67B4129172FC85D008359CC /* gst_ios_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gst_ios_init.h; sourceTree = "<group>"; };
+ C67B412B172FCC4C008359CC /* GStreamerBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackend.h; sourceTree = "<group>"; };
+ C67B412C172FCC4C008359CC /* GStreamerBackend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GStreamerBackend.m; sourceTree = "<group>"; };
+ C67B412D172FCC4C008359CC /* GStreamerBackendDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackendDelegate.h; sourceTree = "<group>"; };
+ C67B4130172FE4E9008359CC /* appicon-1-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-1-iPad.png"; sourceTree = "<group>"; };
+ C67B4131172FE4E9008359CC /* appicon-1-iPad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-1-iPad@2x.png"; sourceTree = "<group>"; };
+ C67B4132172FE4E9008359CC /* appicon-1-iPhone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-1-iPhone.png"; sourceTree = "<group>"; };
+ C67B4133172FE4E9008359CC /* appicon-1-iPhone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-1-iPhone@2x.png"; sourceTree = "<group>"; };
+ C67B4141172FEA3C008359CC /* appicon-2-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-2-iPad.png"; sourceTree = "<group>"; };
+ C67B4142172FEA3C008359CC /* appicon-2-iPad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-2-iPad@2x.png"; sourceTree = "<group>"; };
+ C67B4143172FEA3C008359CC /* appicon-2-iPhone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-2-iPhone.png"; sourceTree = "<group>"; };
+ C67B4144172FEA3C008359CC /* appicon-2-iPhone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-2-iPhone@2x.png"; sourceTree = "<group>"; };
+ C68B1D8817465EB7004FD7D0 /* Tutorial 5.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Tutorial 5.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ C68B1D8F17465EB7004FD7D0 /* Tutorial 5-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tutorial 5-Info.plist"; sourceTree = "<group>"; };
+ C68B1D9117465EB7004FD7D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ C68B1D9317465EB7004FD7D0 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ C68B1D9517465EB7004FD7D0 /* Tutorial 5-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tutorial 5-Prefix.pch"; sourceTree = "<group>"; };
+ C68B1D9617465EB7004FD7D0 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ C68B1D9717465EB7004FD7D0 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ C68B1D9917465EB7004FD7D0 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ C68B1D9B17465EB7004FD7D0 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+ C68B1D9D17465EB7004FD7D0 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ C68B1DA017465EB7004FD7D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = "<group>"; };
+ C68B1DA317465EB7004FD7D0 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
+ C68B1DAA17465EB8004FD7D0 /* gst_ios_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gst_ios_init.h; sourceTree = "<group>"; };
+ C68B1DAE17465F95004FD7D0 /* EaglUIVIew.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EaglUIVIew.h; sourceTree = "<group>"; };
+ C68B1DAF17465F95004FD7D0 /* GStreamerBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackend.h; sourceTree = "<group>"; };
+ C68B1DB017465F95004FD7D0 /* GStreamerBackend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GStreamerBackend.m; sourceTree = "<group>"; };
+ C68B1DB117465F95004FD7D0 /* GStreamerBackendDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackendDelegate.h; sourceTree = "<group>"; };
+ C68B1DB217465F95004FD7D0 /* LibraryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LibraryViewController.h; sourceTree = "<group>"; };
+ C68B1DB317465F95004FD7D0 /* LibraryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LibraryViewController.m; sourceTree = "<group>"; };
+ C68B1DB417465F95004FD7D0 /* VideoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoViewController.h; sourceTree = "<group>"; };
+ C68B1DB517465F95004FD7D0 /* VideoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoViewController.m; sourceTree = "<group>"; };
+ C68B1DB917465FD4004FD7D0 /* EaglUIVIew.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EaglUIVIew.m; sourceTree = "<group>"; };
+ C68B1DBC174660D4004FD7D0 /* appicon-5-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-5-iPad.png"; sourceTree = "<group>"; };
+ C68B1DBD174660D4004FD7D0 /* appicon-5-iPad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-5-iPad@2x.png"; sourceTree = "<group>"; };
+ C68B1DBE174660D4004FD7D0 /* appicon-5-iPhone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-5-iPhone.png"; sourceTree = "<group>"; };
+ C68B1DBF174660D4004FD7D0 /* appicon-5-iPhone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-5-iPhone@2x.png"; sourceTree = "<group>"; };
+ C68C527B174D11F0007A0729 /* fonts.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = fonts.conf; sourceTree = "<group>"; };
+ C68C527C174D11F0007A0729 /* gst_ios_init.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = gst_ios_init.m; sourceTree = "<group>"; };
+ C68C527D174D11F0007A0729 /* Ubuntu-R.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Ubuntu-R.ttf"; sourceTree = "<group>"; };
+ C68C5281174D137B007A0729 /* fonts.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = fonts.conf; sourceTree = "<group>"; };
+ C68C5282174D137B007A0729 /* gst_ios_init.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = gst_ios_init.m; sourceTree = "<group>"; };
+ C68C5283174D137B007A0729 /* Ubuntu-R.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Ubuntu-R.ttf"; sourceTree = "<group>"; };
+ C68C5287174D13EB007A0729 /* fonts.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = fonts.conf; sourceTree = "<group>"; };
+ C68C5288174D13EB007A0729 /* gst_ios_init.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = gst_ios_init.m; sourceTree = "<group>"; };
+ C68C5289174D13EB007A0729 /* Ubuntu-R.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Ubuntu-R.ttf"; sourceTree = "<group>"; };
+ C68C528D174D1408007A0729 /* fonts.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = fonts.conf; sourceTree = "<group>"; };
+ C68C528E174D1408007A0729 /* gst_ios_init.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = gst_ios_init.m; sourceTree = "<group>"; };
+ C68C528F174D1408007A0729 /* Ubuntu-R.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Ubuntu-R.ttf"; sourceTree = "<group>"; };
+ C68C5293174D1427007A0729 /* fonts.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = fonts.conf; sourceTree = "<group>"; };
+ C68C5294174D1427007A0729 /* gst_ios_init.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = gst_ios_init.m; sourceTree = "<group>"; };
+ C68C5295174D1427007A0729 /* Ubuntu-R.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Ubuntu-R.ttf"; sourceTree = "<group>"; };
+ C6B6125F17395CF1003FC410 /* Tutorial 3.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Tutorial 3.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ C6B6126617395CF2003FC410 /* Tutorial 3-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tutorial 3-Info.plist"; sourceTree = "<group>"; };
+ C6B6126817395CF2003FC410 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ C6B6126A17395CF2003FC410 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ C6B6126C17395CF2003FC410 /* Tutorial 3-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tutorial 3-Prefix.pch"; sourceTree = "<group>"; };
+ C6B6126D17395CF2003FC410 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ C6B6126E17395CF2003FC410 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ C6B6127017395CF2003FC410 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ C6B6127217395CF2003FC410 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+ C6B6127417395CF2003FC410 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ C6B6127717395CF2003FC410 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = "<group>"; };
+ C6B6127A17395CF2003FC410 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
+ C6B6127C17395CF2003FC410 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+ C6B6127D17395CF2003FC410 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+ C6B6128817395D4F003FC410 /* GStreamerBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackend.h; sourceTree = "<group>"; };
+ C6B6128917395D4F003FC410 /* GStreamerBackend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GStreamerBackend.m; sourceTree = "<group>"; };
+ C6B6128A17395D4F003FC410 /* GStreamerBackendDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackendDelegate.h; sourceTree = "<group>"; };
+ C6B6128D17395EE2003FC410 /* gst_ios_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gst_ios_init.h; sourceTree = "<group>"; };
+ C6B6129017396231003FC410 /* appicon-3-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-3-iPad.png"; sourceTree = "<group>"; };
+ C6B6129117396231003FC410 /* appicon-3-iPad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-3-iPad@2x.png"; sourceTree = "<group>"; };
+ C6B6129217396231003FC410 /* appicon-3-iPhone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-3-iPhone.png"; sourceTree = "<group>"; };
+ C6B6129317396231003FC410 /* appicon-3-iPhone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-3-iPhone@2x.png"; sourceTree = "<group>"; };
+ C6EB857A173A4D9500C3953D /* EaglUIVIew.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EaglUIVIew.h; sourceTree = "<group>"; };
+ C6EB857B173A4D9500C3953D /* EaglUIVIew.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EaglUIVIew.m; sourceTree = "<group>"; };
+ C6EB8581173BEE5D00C3953D /* Tutorial 4.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Tutorial 4.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ C6EB8588173BEE5E00C3953D /* Tutorial 4-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tutorial 4-Info.plist"; sourceTree = "<group>"; };
+ C6EB858A173BEE5E00C3953D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ C6EB858C173BEE5E00C3953D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ C6EB858E173BEE5E00C3953D /* Tutorial 4-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tutorial 4-Prefix.pch"; sourceTree = "<group>"; };
+ C6EB858F173BEE5E00C3953D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ C6EB8590173BEE5E00C3953D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ C6EB8592173BEE5E00C3953D /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ C6EB8594173BEE5E00C3953D /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = "<group>"; };
+ C6EB8596173BEE5E00C3953D /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
+ C6EB8599173BEE5E00C3953D /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = "<group>"; };
+ C6EB859C173BEE5E00C3953D /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = "<group>"; };
+ C6EB859E173BEE5E00C3953D /* VideoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoViewController.h; sourceTree = "<group>"; };
+ C6EB859F173BEE5E00C3953D /* VideoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VideoViewController.m; sourceTree = "<group>"; };
+ C6EB85AA173BEF2600C3953D /* EaglUIVIew.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EaglUIVIew.h; sourceTree = "<group>"; };
+ C6EB85AB173BEF2600C3953D /* EaglUIVIew.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EaglUIVIew.m; sourceTree = "<group>"; };
+ C6EB85AD173BEF2600C3953D /* gst_ios_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gst_ios_init.h; sourceTree = "<group>"; };
+ C6EB85AE173BEF2600C3953D /* GStreamerBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackend.h; sourceTree = "<group>"; };
+ C6EB85AF173BEF2600C3953D /* GStreamerBackend.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GStreamerBackend.m; sourceTree = "<group>"; };
+ C6EB85B0173BEF2600C3953D /* GStreamerBackendDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GStreamerBackendDelegate.h; sourceTree = "<group>"; };
+ C6EB85B5173BEFF800C3953D /* appicon-4-iPad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-4-iPad.png"; sourceTree = "<group>"; };
+ C6EB85B6173BEFF800C3953D /* appicon-4-iPad@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-4-iPad@2x.png"; sourceTree = "<group>"; };
+ C6EB85B7173BEFF800C3953D /* appicon-4-iPhone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-4-iPhone.png"; sourceTree = "<group>"; };
+ C6EB85B8173BEFF800C3953D /* appicon-4-iPhone@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "appicon-4-iPhone@2x.png"; sourceTree = "<group>"; };
+ C987C0DA1BAB090B00D54784 /* libiconv.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.2.dylib; path = usr/lib/libiconv.2.dylib; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ C67B40C6172EBEA3008359CC /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C987C0DB1BAB090B00D54784 /* libiconv.2.dylib in Frameworks */,
+ C67B40CD172EBEA3008359CC /* UIKit.framework in Frameworks */,
+ C67B40CF172EBEA3008359CC /* Foundation.framework in Frameworks */,
+ C67B40D1172EBEA3008359CC /* CoreGraphics.framework in Frameworks */,
+ C67B40D3172EBEA3008359CC /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C67B40FC172FC7F4008359CC /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C987C0DC1BAB096C00D54784 /* libiconv.2.dylib in Frameworks */,
+ C67B4100172FC7F4008359CC /* UIKit.framework in Frameworks */,
+ C67B4101172FC7F4008359CC /* Foundation.framework in Frameworks */,
+ C67B4102172FC7F4008359CC /* CoreGraphics.framework in Frameworks */,
+ C67B4103172FC7F4008359CC /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C68B1D8517465EB7004FD7D0 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C987C0DF1BAB09AF00D54784 /* libiconv.2.dylib in Frameworks */,
+ C68B1D8917465EB7004FD7D0 /* UIKit.framework in Frameworks */,
+ C68B1D8A17465EB7004FD7D0 /* Foundation.framework in Frameworks */,
+ C68B1D8B17465EB7004FD7D0 /* CoreGraphics.framework in Frameworks */,
+ C68B1D8C17465EB7004FD7D0 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C6B6125C17395CF1003FC410 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C987C0DD1BAB09A100D54784 /* libiconv.2.dylib in Frameworks */,
+ C6B6126017395CF2003FC410 /* UIKit.framework in Frameworks */,
+ C6B6126117395CF2003FC410 /* Foundation.framework in Frameworks */,
+ C6B6126217395CF2003FC410 /* CoreGraphics.framework in Frameworks */,
+ C6B6126317395CF2003FC410 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C6EB857E173BEE5D00C3953D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C987C0DE1BAB09AA00D54784 /* libiconv.2.dylib in Frameworks */,
+ C6EB8582173BEE5E00C3953D /* UIKit.framework in Frameworks */,
+ C6EB8583173BEE5E00C3953D /* Foundation.framework in Frameworks */,
+ C6EB8584173BEE5E00C3953D /* CoreGraphics.framework in Frameworks */,
+ C6EB8585173BEE5E00C3953D /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ C67B40BE172EBDF1008359CC = {
+ isa = PBXGroup;
+ children = (
+ C67B40D4172EBEA3008359CC /* Tutorial 1 */,
+ C67B4104172FC7F4008359CC /* Tutorial 2 */,
+ C6B6126417395CF2003FC410 /* Tutorial 3 */,
+ C6EB8586173BEE5E00C3953D /* Tutorial 4 */,
+ C68B1D8D17465EB7004FD7D0 /* Tutorial 5 */,
+ C67B40CB172EBEA3008359CC /* Frameworks */,
+ C67B40CA172EBEA3008359CC /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ C67B40CA172EBEA3008359CC /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ C67B40C9172EBEA3008359CC /* Tutorial 1.app */,
+ C67B40FF172FC7F4008359CC /* Tutorial 2.app */,
+ C6B6125F17395CF1003FC410 /* Tutorial 3.app */,
+ C6EB8581173BEE5D00C3953D /* Tutorial 4.app */,
+ C68B1D8817465EB7004FD7D0 /* Tutorial 5.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ C67B40CB172EBEA3008359CC /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ C987C0DA1BAB090B00D54784 /* libiconv.2.dylib */,
+ C67B40CC172EBEA3008359CC /* UIKit.framework */,
+ C67B40CE172EBEA3008359CC /* Foundation.framework */,
+ C67B40D0172EBEA3008359CC /* CoreGraphics.framework */,
+ C67B40D2172EBEA3008359CC /* GStreamer.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ C67B40D4172EBEA3008359CC /* Tutorial 1 */ = {
+ isa = PBXGroup;
+ children = (
+ C67B412F172FE4E9008359CC /* Images */,
+ C67B40F8172EC27D008359CC /* GStreamerBackend.h */,
+ C67B40F9172EC27D008359CC /* GStreamerBackend.m */,
+ C67B40DD172EBEA3008359CC /* AppDelegate.h */,
+ C67B40DE172EBEA3008359CC /* AppDelegate.m */,
+ C67B40E6172EBEA3008359CC /* MainStoryboard_iPhone.storyboard */,
+ C67B40E9172EBEA3008359CC /* MainStoryboard_iPad.storyboard */,
+ C67B40EC172EBEA3008359CC /* ViewController.h */,
+ C67B40ED172EBEA3008359CC /* ViewController.m */,
+ C67B40D5172EBEA3008359CC /* Supporting Files */,
+ );
+ path = "Tutorial 1";
+ sourceTree = SOURCE_ROOT;
+ };
+ C67B40D5172EBEA3008359CC /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ C68C5293174D1427007A0729 /* fonts.conf */,
+ C68C5295174D1427007A0729 /* Ubuntu-R.ttf */,
+ C67B40D6172EBEA3008359CC /* Tutorial 1-Info.plist */,
+ C67B40D7172EBEA3008359CC /* InfoPlist.strings */,
+ C67B40DA172EBEA3008359CC /* main.m */,
+ C67B40DC172EBEA3008359CC /* Tutorial 1-Prefix.pch */,
+ C67B40E0172EBEA3008359CC /* Default.png */,
+ C67B40E2172EBEA3008359CC /* Default@2x.png */,
+ C67B40E4172EBEA3008359CC /* Default-568h@2x.png */,
+ C67B40F1172EBEA3008359CC /* gst_ios_init.h */,
+ C68C5294174D1427007A0729 /* gst_ios_init.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ C67B4104172FC7F4008359CC /* Tutorial 2 */ = {
+ isa = PBXGroup;
+ children = (
+ C67B4140172FEA3C008359CC /* Images */,
+ C67B412B172FCC4C008359CC /* GStreamerBackend.h */,
+ C67B412C172FCC4C008359CC /* GStreamerBackend.m */,
+ C67B410D172FC7F5008359CC /* AppDelegate.h */,
+ C67B410E172FC7F5008359CC /* AppDelegate.m */,
+ C67B4116172FC7F5008359CC /* MainStoryboard_iPhone.storyboard */,
+ C67B4119172FC7F5008359CC /* MainStoryboard_iPad.storyboard */,
+ C67B411C172FC7F5008359CC /* ViewController.h */,
+ C67B411D172FC7F5008359CC /* ViewController.m */,
+ C67B4105172FC7F4008359CC /* Supporting Files */,
+ );
+ path = "Tutorial 2";
+ sourceTree = "<group>";
+ };
+ C67B4105172FC7F4008359CC /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ C68C528D174D1408007A0729 /* fonts.conf */,
+ C68C528F174D1408007A0729 /* Ubuntu-R.ttf */,
+ C67B4106172FC7F4008359CC /* Tutorial 2-Info.plist */,
+ C67B4107172FC7F4008359CC /* InfoPlist.strings */,
+ C67B410A172FC7F4008359CC /* main.m */,
+ C67B410C172FC7F5008359CC /* Tutorial 2-Prefix.pch */,
+ C67B4110172FC7F5008359CC /* Default.png */,
+ C67B4112172FC7F5008359CC /* Default@2x.png */,
+ C67B4114172FC7F5008359CC /* Default-568h@2x.png */,
+ C67B4129172FC85D008359CC /* gst_ios_init.h */,
+ C68C528E174D1408007A0729 /* gst_ios_init.m */,
+ C67B412D172FCC4C008359CC /* GStreamerBackendDelegate.h */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ C67B412F172FE4E9008359CC /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ C67B4130172FE4E9008359CC /* appicon-1-iPad.png */,
+ C67B4131172FE4E9008359CC /* appicon-1-iPad@2x.png */,
+ C67B4132172FE4E9008359CC /* appicon-1-iPhone.png */,
+ C67B4133172FE4E9008359CC /* appicon-1-iPhone@2x.png */,
+ );
+ path = Images;
+ sourceTree = "<group>";
+ };
+ C67B4140172FEA3C008359CC /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ C67B4141172FEA3C008359CC /* appicon-2-iPad.png */,
+ C67B4142172FEA3C008359CC /* appicon-2-iPad@2x.png */,
+ C67B4143172FEA3C008359CC /* appicon-2-iPhone.png */,
+ C67B4144172FEA3C008359CC /* appicon-2-iPhone@2x.png */,
+ );
+ path = Images;
+ sourceTree = "<group>";
+ };
+ C68B1D8D17465EB7004FD7D0 /* Tutorial 5 */ = {
+ isa = PBXGroup;
+ children = (
+ C68B1DAE17465F95004FD7D0 /* EaglUIVIew.h */,
+ C68B1DB917465FD4004FD7D0 /* EaglUIVIew.m */,
+ C68B1DBB174660D4004FD7D0 /* Images */,
+ C68B1DAF17465F95004FD7D0 /* GStreamerBackend.h */,
+ C68B1DB017465F95004FD7D0 /* GStreamerBackend.m */,
+ C68B1D9617465EB7004FD7D0 /* AppDelegate.h */,
+ C68B1D9717465EB7004FD7D0 /* AppDelegate.m */,
+ C68B1D9F17465EB7004FD7D0 /* MainStoryboard_iPhone.storyboard */,
+ C68B1DA217465EB7004FD7D0 /* MainStoryboard_iPad.storyboard */,
+ C68B1DB217465F95004FD7D0 /* LibraryViewController.h */,
+ C68B1DB317465F95004FD7D0 /* LibraryViewController.m */,
+ C68B1DB417465F95004FD7D0 /* VideoViewController.h */,
+ C68B1DB517465F95004FD7D0 /* VideoViewController.m */,
+ C68B1D8E17465EB7004FD7D0 /* Supporting Files */,
+ );
+ path = "Tutorial 5";
+ sourceTree = "<group>";
+ };
+ C68B1D8E17465EB7004FD7D0 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ C68C527B174D11F0007A0729 /* fonts.conf */,
+ C68C527D174D11F0007A0729 /* Ubuntu-R.ttf */,
+ C68B1D8F17465EB7004FD7D0 /* Tutorial 5-Info.plist */,
+ C68B1D9017465EB7004FD7D0 /* InfoPlist.strings */,
+ C68B1D9317465EB7004FD7D0 /* main.m */,
+ C68B1D9517465EB7004FD7D0 /* Tutorial 5-Prefix.pch */,
+ C68B1D9917465EB7004FD7D0 /* Default.png */,
+ C68B1D9B17465EB7004FD7D0 /* Default@2x.png */,
+ C68B1D9D17465EB7004FD7D0 /* Default-568h@2x.png */,
+ C68B1DAA17465EB8004FD7D0 /* gst_ios_init.h */,
+ C68C527C174D11F0007A0729 /* gst_ios_init.m */,
+ C68B1DB117465F95004FD7D0 /* GStreamerBackendDelegate.h */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ C68B1DBB174660D4004FD7D0 /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ C68B1DBC174660D4004FD7D0 /* appicon-5-iPad.png */,
+ C68B1DBD174660D4004FD7D0 /* appicon-5-iPad@2x.png */,
+ C68B1DBE174660D4004FD7D0 /* appicon-5-iPhone.png */,
+ C68B1DBF174660D4004FD7D0 /* appicon-5-iPhone@2x.png */,
+ );
+ path = Images;
+ sourceTree = "<group>";
+ };
+ C6B6126417395CF2003FC410 /* Tutorial 3 */ = {
+ isa = PBXGroup;
+ children = (
+ C6EB857A173A4D9500C3953D /* EaglUIVIew.h */,
+ C6EB857B173A4D9500C3953D /* EaglUIVIew.m */,
+ C6B6128F17396231003FC410 /* Images */,
+ C6B6128817395D4F003FC410 /* GStreamerBackend.h */,
+ C6B6128917395D4F003FC410 /* GStreamerBackend.m */,
+ C6B6126D17395CF2003FC410 /* AppDelegate.h */,
+ C6B6126E17395CF2003FC410 /* AppDelegate.m */,
+ C6B6127617395CF2003FC410 /* MainStoryboard_iPhone.storyboard */,
+ C6B6127917395CF2003FC410 /* MainStoryboard_iPad.storyboard */,
+ C6B6127C17395CF2003FC410 /* ViewController.h */,
+ C6B6127D17395CF2003FC410 /* ViewController.m */,
+ C6B6126517395CF2003FC410 /* Supporting Files */,
+ );
+ path = "Tutorial 3";
+ sourceTree = "<group>";
+ };
+ C6B6126517395CF2003FC410 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ C68C5287174D13EB007A0729 /* fonts.conf */,
+ C68C5289174D13EB007A0729 /* Ubuntu-R.ttf */,
+ C6B6126617395CF2003FC410 /* Tutorial 3-Info.plist */,
+ C6B6126717395CF2003FC410 /* InfoPlist.strings */,
+ C6B6126A17395CF2003FC410 /* main.m */,
+ C6B6126C17395CF2003FC410 /* Tutorial 3-Prefix.pch */,
+ C6B6127017395CF2003FC410 /* Default.png */,
+ C6B6127217395CF2003FC410 /* Default@2x.png */,
+ C6B6127417395CF2003FC410 /* Default-568h@2x.png */,
+ C6B6128D17395EE2003FC410 /* gst_ios_init.h */,
+ C68C5288174D13EB007A0729 /* gst_ios_init.m */,
+ C6B6128A17395D4F003FC410 /* GStreamerBackendDelegate.h */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ C6B6128F17396231003FC410 /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ C6B6129017396231003FC410 /* appicon-3-iPad.png */,
+ C6B6129117396231003FC410 /* appicon-3-iPad@2x.png */,
+ C6B6129217396231003FC410 /* appicon-3-iPhone.png */,
+ C6B6129317396231003FC410 /* appicon-3-iPhone@2x.png */,
+ );
+ path = Images;
+ sourceTree = "<group>";
+ };
+ C6EB8586173BEE5E00C3953D /* Tutorial 4 */ = {
+ isa = PBXGroup;
+ children = (
+ C6EB85AA173BEF2600C3953D /* EaglUIVIew.h */,
+ C6EB85AB173BEF2600C3953D /* EaglUIVIew.m */,
+ C6EB85AE173BEF2600C3953D /* GStreamerBackend.h */,
+ C6EB85AF173BEF2600C3953D /* GStreamerBackend.m */,
+ C6EB858F173BEE5E00C3953D /* AppDelegate.h */,
+ C6EB8590173BEE5E00C3953D /* AppDelegate.m */,
+ C6EB8598173BEE5E00C3953D /* MainStoryboard_iPhone.storyboard */,
+ C6EB859B173BEE5E00C3953D /* MainStoryboard_iPad.storyboard */,
+ C6EB859E173BEE5E00C3953D /* VideoViewController.h */,
+ C6EB859F173BEE5E00C3953D /* VideoViewController.m */,
+ C6EB85B4173BEFF800C3953D /* Images */,
+ C6EB8587173BEE5E00C3953D /* Supporting Files */,
+ );
+ path = "Tutorial 4";
+ sourceTree = "<group>";
+ };
+ C6EB8587173BEE5E00C3953D /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ C68C5281174D137B007A0729 /* fonts.conf */,
+ C68C5283174D137B007A0729 /* Ubuntu-R.ttf */,
+ C6EB8588173BEE5E00C3953D /* Tutorial 4-Info.plist */,
+ C6EB8589173BEE5E00C3953D /* InfoPlist.strings */,
+ C6EB858C173BEE5E00C3953D /* main.m */,
+ C6EB858E173BEE5E00C3953D /* Tutorial 4-Prefix.pch */,
+ C6EB8592173BEE5E00C3953D /* Default.png */,
+ C6EB8594173BEE5E00C3953D /* Default@2x.png */,
+ C6EB8596173BEE5E00C3953D /* Default-568h@2x.png */,
+ C6EB85AD173BEF2600C3953D /* gst_ios_init.h */,
+ C68C5282174D137B007A0729 /* gst_ios_init.m */,
+ C6EB85B0173BEF2600C3953D /* GStreamerBackendDelegate.h */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ C6EB85B4173BEFF800C3953D /* Images */ = {
+ isa = PBXGroup;
+ children = (
+ C6EB85B5173BEFF800C3953D /* appicon-4-iPad.png */,
+ C6EB85B6173BEFF800C3953D /* appicon-4-iPad@2x.png */,
+ C6EB85B7173BEFF800C3953D /* appicon-4-iPhone.png */,
+ C6EB85B8173BEFF800C3953D /* appicon-4-iPhone@2x.png */,
+ );
+ path = Images;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ C67B40C8172EBEA3008359CC /* Tutorial 1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C67B40F7172EBEA4008359CC /* Build configuration list for PBXNativeTarget "Tutorial 1" */;
+ buildPhases = (
+ C67B40C5172EBEA3008359CC /* Sources */,
+ C67B40C6172EBEA3008359CC /* Frameworks */,
+ C67B40C7172EBEA3008359CC /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 1";
+ productName = "Tutorial 1";
+ productReference = C67B40C9172EBEA3008359CC /* Tutorial 1.app */;
+ productType = "com.apple.product-type.application";
+ };
+ C67B40FE172FC7F4008359CC /* Tutorial 2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C67B4125172FC7F5008359CC /* Build configuration list for PBXNativeTarget "Tutorial 2" */;
+ buildPhases = (
+ C67B40FB172FC7F4008359CC /* Sources */,
+ C67B40FC172FC7F4008359CC /* Frameworks */,
+ C67B40FD172FC7F4008359CC /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 2";
+ productName = "Tutorial 2";
+ productReference = C67B40FF172FC7F4008359CC /* Tutorial 2.app */;
+ productType = "com.apple.product-type.application";
+ };
+ C68B1D8717465EB7004FD7D0 /* Tutorial 5 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C68B1DAD17465EB8004FD7D0 /* Build configuration list for PBXNativeTarget "Tutorial 5" */;
+ buildPhases = (
+ C68B1D8417465EB7004FD7D0 /* Sources */,
+ C68B1D8517465EB7004FD7D0 /* Frameworks */,
+ C68B1D8617465EB7004FD7D0 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 5";
+ productName = "Tutorial 5";
+ productReference = C68B1D8817465EB7004FD7D0 /* Tutorial 5.app */;
+ productType = "com.apple.product-type.application";
+ };
+ C6B6125E17395CF1003FC410 /* Tutorial 3 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C6B6128517395CF2003FC410 /* Build configuration list for PBXNativeTarget "Tutorial 3" */;
+ buildPhases = (
+ C6B6125B17395CF1003FC410 /* Sources */,
+ C6B6125C17395CF1003FC410 /* Frameworks */,
+ C6B6125D17395CF1003FC410 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 3";
+ productName = "Tutorial 3";
+ productReference = C6B6125F17395CF1003FC410 /* Tutorial 3.app */;
+ productType = "com.apple.product-type.application";
+ };
+ C6EB8580173BEE5D00C3953D /* Tutorial 4 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C6EB85A7173BEE5F00C3953D /* Build configuration list for PBXNativeTarget "Tutorial 4" */;
+ buildPhases = (
+ C6EB857D173BEE5D00C3953D /* Sources */,
+ C6EB857E173BEE5D00C3953D /* Frameworks */,
+ C6EB857F173BEE5D00C3953D /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 4";
+ productName = "Tutorial 4";
+ productReference = C6EB8581173BEE5D00C3953D /* Tutorial 4.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ C67B40BF172EBDF1008359CC /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0500;
+ };
+ buildConfigurationList = C67B40C2172EBDF1008359CC /* Build configuration list for PBXProject "GStreamer iOS Tutorials" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = C67B40BE172EBDF1008359CC;
+ productRefGroup = C67B40CA172EBEA3008359CC /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ C67B40C8172EBEA3008359CC /* Tutorial 1 */,
+ C67B40FE172FC7F4008359CC /* Tutorial 2 */,
+ C6B6125E17395CF1003FC410 /* Tutorial 3 */,
+ C6EB8580173BEE5D00C3953D /* Tutorial 4 */,
+ C68B1D8717465EB7004FD7D0 /* Tutorial 5 */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ C67B40C7172EBEA3008359CC /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C67B40D9172EBEA3008359CC /* InfoPlist.strings in Resources */,
+ C67B40E1172EBEA3008359CC /* Default.png in Resources */,
+ C67B40E5172EBEA3008359CC /* Default-568h@2x.png in Resources */,
+ C67B40E8172EBEA3008359CC /* MainStoryboard_iPhone.storyboard in Resources */,
+ C67B40EB172EBEA3008359CC /* MainStoryboard_iPad.storyboard in Resources */,
+ C67B4134172FE4E9008359CC /* appicon-1-iPad.png in Resources */,
+ C67B4135172FE4E9008359CC /* appicon-1-iPad@2x.png in Resources */,
+ C67B4136172FE4E9008359CC /* appicon-1-iPhone.png in Resources */,
+ C67B4137172FE4E9008359CC /* appicon-1-iPhone@2x.png in Resources */,
+ C68C5296174D1427007A0729 /* fonts.conf in Resources */,
+ C68C5298174D1427007A0729 /* Ubuntu-R.ttf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C67B40FD172FC7F4008359CC /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C67B4109172FC7F4008359CC /* InfoPlist.strings in Resources */,
+ C67B4111172FC7F5008359CC /* Default.png in Resources */,
+ C67B4113172FC7F5008359CC /* Default@2x.png in Resources */,
+ C67B4115172FC7F5008359CC /* Default-568h@2x.png in Resources */,
+ C67B4118172FC7F5008359CC /* MainStoryboard_iPhone.storyboard in Resources */,
+ C67B411B172FC7F5008359CC /* MainStoryboard_iPad.storyboard in Resources */,
+ C67B4145172FEA3C008359CC /* appicon-2-iPad.png in Resources */,
+ C67B4146172FEA3C008359CC /* appicon-2-iPad@2x.png in Resources */,
+ C67B4147172FEA3C008359CC /* appicon-2-iPhone.png in Resources */,
+ C67B4148172FEA3C008359CC /* appicon-2-iPhone@2x.png in Resources */,
+ C68C5290174D1408007A0729 /* fonts.conf in Resources */,
+ C68C5292174D1408007A0729 /* Ubuntu-R.ttf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C68B1D8617465EB7004FD7D0 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C68B1D9217465EB7004FD7D0 /* InfoPlist.strings in Resources */,
+ C68B1D9A17465EB7004FD7D0 /* Default.png in Resources */,
+ C68B1D9C17465EB7004FD7D0 /* Default@2x.png in Resources */,
+ C68B1D9E17465EB7004FD7D0 /* Default-568h@2x.png in Resources */,
+ C68B1DA117465EB7004FD7D0 /* MainStoryboard_iPhone.storyboard in Resources */,
+ C68B1DA417465EB7004FD7D0 /* MainStoryboard_iPad.storyboard in Resources */,
+ C68B1DC0174660D4004FD7D0 /* appicon-5-iPad.png in Resources */,
+ C68B1DC1174660D4004FD7D0 /* appicon-5-iPad@2x.png in Resources */,
+ C68B1DC2174660D4004FD7D0 /* appicon-5-iPhone.png in Resources */,
+ C68B1DC3174660D4004FD7D0 /* appicon-5-iPhone@2x.png in Resources */,
+ C68C527E174D11F0007A0729 /* fonts.conf in Resources */,
+ C68C5280174D11F0007A0729 /* Ubuntu-R.ttf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C6B6125D17395CF1003FC410 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C6B6126917395CF2003FC410 /* InfoPlist.strings in Resources */,
+ C6B6127117395CF2003FC410 /* Default.png in Resources */,
+ C6B6127317395CF2003FC410 /* Default@2x.png in Resources */,
+ C6B6127517395CF2003FC410 /* Default-568h@2x.png in Resources */,
+ C6B6127817395CF2003FC410 /* MainStoryboard_iPhone.storyboard in Resources */,
+ C6B6127B17395CF2003FC410 /* MainStoryboard_iPad.storyboard in Resources */,
+ C6B6129417396231003FC410 /* appicon-3-iPad.png in Resources */,
+ C6B6129517396231003FC410 /* appicon-3-iPad@2x.png in Resources */,
+ C6B6129617396231003FC410 /* appicon-3-iPhone.png in Resources */,
+ C6B6129717396231003FC410 /* appicon-3-iPhone@2x.png in Resources */,
+ C68C528A174D13EB007A0729 /* fonts.conf in Resources */,
+ C68C528C174D13EB007A0729 /* Ubuntu-R.ttf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C6EB857F173BEE5D00C3953D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C6EB858B173BEE5E00C3953D /* InfoPlist.strings in Resources */,
+ C6EB8593173BEE5E00C3953D /* Default.png in Resources */,
+ C6EB8595173BEE5E00C3953D /* Default@2x.png in Resources */,
+ C6EB8597173BEE5E00C3953D /* Default-568h@2x.png in Resources */,
+ C6EB859A173BEE5E00C3953D /* MainStoryboard_iPhone.storyboard in Resources */,
+ C6EB859D173BEE5E00C3953D /* MainStoryboard_iPad.storyboard in Resources */,
+ C6EB85B9173BEFF800C3953D /* appicon-4-iPad.png in Resources */,
+ C6EB85BA173BEFF800C3953D /* appicon-4-iPad@2x.png in Resources */,
+ C6EB85BB173BEFF800C3953D /* appicon-4-iPhone.png in Resources */,
+ C6EB85BC173BEFF800C3953D /* appicon-4-iPhone@2x.png in Resources */,
+ C68C5284174D137B007A0729 /* fonts.conf in Resources */,
+ C68C5286174D137B007A0729 /* Ubuntu-R.ttf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ C67B40C5172EBEA3008359CC /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C67B40DB172EBEA3008359CC /* main.m in Sources */,
+ C67B40DF172EBEA3008359CC /* AppDelegate.m in Sources */,
+ C67B40EE172EBEA3008359CC /* ViewController.m in Sources */,
+ C67B40FA172EC27D008359CC /* GStreamerBackend.m in Sources */,
+ C68C5297174D1427007A0729 /* gst_ios_init.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C67B40FB172FC7F4008359CC /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C67B410B172FC7F4008359CC /* main.m in Sources */,
+ C67B410F172FC7F5008359CC /* AppDelegate.m in Sources */,
+ C67B411E172FC7F5008359CC /* ViewController.m in Sources */,
+ C67B412E172FCC4C008359CC /* GStreamerBackend.m in Sources */,
+ C68C5291174D1408007A0729 /* gst_ios_init.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C68B1D8417465EB7004FD7D0 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C68B1D9417465EB7004FD7D0 /* main.m in Sources */,
+ C68B1D9817465EB7004FD7D0 /* AppDelegate.m in Sources */,
+ C68B1DB617465F96004FD7D0 /* GStreamerBackend.m in Sources */,
+ C68B1DB717465F96004FD7D0 /* LibraryViewController.m in Sources */,
+ C68B1DB817465F96004FD7D0 /* VideoViewController.m in Sources */,
+ C68B1DBA17465FD4004FD7D0 /* EaglUIVIew.m in Sources */,
+ C68C527F174D11F0007A0729 /* gst_ios_init.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C6B6125B17395CF1003FC410 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C6B6126B17395CF2003FC410 /* main.m in Sources */,
+ C6B6126F17395CF2003FC410 /* AppDelegate.m in Sources */,
+ C6B6127E17395CF2003FC410 /* ViewController.m in Sources */,
+ C6B6128B17395D4F003FC410 /* GStreamerBackend.m in Sources */,
+ C6EB857C173A4D9500C3953D /* EaglUIVIew.m in Sources */,
+ C68C528B174D13EB007A0729 /* gst_ios_init.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ C6EB857D173BEE5D00C3953D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C6EB858D173BEE5E00C3953D /* main.m in Sources */,
+ C6EB8591173BEE5E00C3953D /* AppDelegate.m in Sources */,
+ C6EB85A0173BEE5E00C3953D /* VideoViewController.m in Sources */,
+ C6EB85B1173BEF2600C3953D /* EaglUIVIew.m in Sources */,
+ C6EB85B3173BEF2600C3953D /* GStreamerBackend.m in Sources */,
+ C68C5285174D137B007A0729 /* gst_ios_init.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ C67B40D7172EBEA3008359CC /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C67B40D8172EBEA3008359CC /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ C67B40E6172EBEA3008359CC /* MainStoryboard_iPhone.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C67B40E7172EBEA3008359CC /* en */,
+ );
+ name = MainStoryboard_iPhone.storyboard;
+ sourceTree = "<group>";
+ };
+ C67B40E9172EBEA3008359CC /* MainStoryboard_iPad.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C67B40EA172EBEA3008359CC /* en */,
+ );
+ name = MainStoryboard_iPad.storyboard;
+ sourceTree = "<group>";
+ };
+ C67B4107172FC7F4008359CC /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C67B4108172FC7F4008359CC /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ C67B4116172FC7F5008359CC /* MainStoryboard_iPhone.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C67B4117172FC7F5008359CC /* en */,
+ );
+ name = MainStoryboard_iPhone.storyboard;
+ sourceTree = "<group>";
+ };
+ C67B4119172FC7F5008359CC /* MainStoryboard_iPad.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C67B411A172FC7F5008359CC /* en */,
+ );
+ name = MainStoryboard_iPad.storyboard;
+ sourceTree = "<group>";
+ };
+ C68B1D9017465EB7004FD7D0 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C68B1D9117465EB7004FD7D0 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ C68B1D9F17465EB7004FD7D0 /* MainStoryboard_iPhone.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C68B1DA017465EB7004FD7D0 /* en */,
+ );
+ name = MainStoryboard_iPhone.storyboard;
+ sourceTree = "<group>";
+ };
+ C68B1DA217465EB7004FD7D0 /* MainStoryboard_iPad.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C68B1DA317465EB7004FD7D0 /* en */,
+ );
+ name = MainStoryboard_iPad.storyboard;
+ sourceTree = "<group>";
+ };
+ C6B6126717395CF2003FC410 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C6B6126817395CF2003FC410 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ C6B6127617395CF2003FC410 /* MainStoryboard_iPhone.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C6B6127717395CF2003FC410 /* en */,
+ );
+ name = MainStoryboard_iPhone.storyboard;
+ sourceTree = "<group>";
+ };
+ C6B6127917395CF2003FC410 /* MainStoryboard_iPad.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C6B6127A17395CF2003FC410 /* en */,
+ );
+ name = MainStoryboard_iPad.storyboard;
+ sourceTree = "<group>";
+ };
+ C6EB8589173BEE5E00C3953D /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C6EB858A173BEE5E00C3953D /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ C6EB8598173BEE5E00C3953D /* MainStoryboard_iPhone.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C6EB8599173BEE5E00C3953D /* en */,
+ );
+ name = MainStoryboard_iPhone.storyboard;
+ sourceTree = "<group>";
+ };
+ C6EB859B173BEE5E00C3953D /* MainStoryboard_iPad.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ C6EB859C173BEE5E00C3953D /* en */,
+ );
+ name = MainStoryboard_iPad.storyboard;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ C67B40C3172EBDF1008359CC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = 2;
+ VALID_ARCHS = "armv7 i386 arm64";
+ };
+ name = Debug;
+ };
+ C67B40C4172EBDF1008359CC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = NO;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = 2;
+ VALID_ARCHS = "armv7 i386 arm64";
+ };
+ name = Release;
+ };
+ C67B40F5172EBEA4008359CC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 1/Tutorial 1-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 1/Tutorial 1-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ C67B40F6172EBEA4008359CC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 1/Tutorial 1-Prefix.pch";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 1/Tutorial 1-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C67B4126172FC7F5008359CC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 2/Tutorial 2-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 2/Tutorial 2-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ C67B4127172FC7F5008359CC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 2/Tutorial 2-Prefix.pch";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 2/Tutorial 2-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C68B1DAB17465EB8004FD7D0 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 5/Tutorial 5-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 5/Tutorial 5-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ C68B1DAC17465EB8004FD7D0 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 5/Tutorial 5-Prefix.pch";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 5/Tutorial 5-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C6B6128617395CF2003FC410 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 3/Tutorial 3-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 3/Tutorial 3-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ C6B6128717395CF2003FC410 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 3/Tutorial 3-Prefix.pch";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 3/Tutorial 3-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C6EB85A8173BEE5F00C3953D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 4/Tutorial 4-Prefix.pch";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 4/Tutorial 4-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ ONLY_ACTIVE_ARCH = YES;
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ C6EB85A9173BEE5F00C3953D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = YES;
+ FRAMEWORK_SEARCH_PATHS = (
+ "\"~/Library/Developer/GStreamer/iPhone.sdk\"",
+ "\"$(SYSTEM_APPS_DIR)/Xcode.app/Contents/Developer/Library/Frameworks\"",
+ );
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "Tutorial 4/Tutorial 4-Prefix.pch";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "\"~/Library/Developer/GStreamer/iPhone.sdk/GStreamer.framework/Headers\"";
+ INFOPLIST_FILE = "Tutorial 4/Tutorial 4-Info.plist";
+ IPHONEOS_DEPLOYMENT_TARGET = 6.1;
+ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
+ OTHER_LDFLAGS = (
+ "-lresolv",
+ "-lstdc++",
+ "-framework",
+ CoreFoundation,
+ "-framework",
+ Foundation,
+ "-framework",
+ AVFoundation,
+ "-framework",
+ CoreMedia,
+ "-framework",
+ CoreVideo,
+ "-framework",
+ CoreAudio,
+ "-framework",
+ AudioToolbox,
+ "-framework",
+ OpenGLES,
+ "-framework",
+ AssetsLibrary,
+ "-framework",
+ QuartzCore,
+ "-framework",
+ AssetsLibrary,
+ "-weak_framework",
+ VideoToolBox,
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ C67B40C2172EBDF1008359CC /* Build configuration list for PBXProject "GStreamer iOS Tutorials" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C67B40C3172EBDF1008359CC /* Debug */,
+ C67B40C4172EBDF1008359CC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C67B40F7172EBEA4008359CC /* Build configuration list for PBXNativeTarget "Tutorial 1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C67B40F5172EBEA4008359CC /* Debug */,
+ C67B40F6172EBEA4008359CC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C67B4125172FC7F5008359CC /* Build configuration list for PBXNativeTarget "Tutorial 2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C67B4126172FC7F5008359CC /* Debug */,
+ C67B4127172FC7F5008359CC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C68B1DAD17465EB8004FD7D0 /* Build configuration list for PBXNativeTarget "Tutorial 5" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C68B1DAB17465EB8004FD7D0 /* Debug */,
+ C68B1DAC17465EB8004FD7D0 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C6B6128517395CF2003FC410 /* Build configuration list for PBXNativeTarget "Tutorial 3" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C6B6128617395CF2003FC410 /* Debug */,
+ C6B6128717395CF2003FC410 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C6EB85A7173BEE5F00C3953D /* Build configuration list for PBXNativeTarget "Tutorial 4" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C6EB85A8173BEE5F00C3953D /* Debug */,
+ C6EB85A9173BEE5F00C3953D /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = C67B40BF172EBDF1008359CC /* Project object */;
+}
diff --git a/tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..a0742b4
--- /dev/null
+++ b/tutorials/xcode iOS/GStreamer iOS Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:GStreamer iOS Tutorials.xcodeproj">
+ </FileRef>
+</Workspace>
diff --git a/tutorials/xcode iOS/Tutorial 1/AppDelegate.h b/tutorials/xcode iOS/Tutorial 1/AppDelegate.h
new file mode 100644
index 0000000..a5a8b38
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/AppDelegate.h
@@ -0,0 +1,7 @@
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 1/AppDelegate.m b/tutorials/xcode iOS/Tutorial 1/AppDelegate.m
new file mode 100644
index 0000000..31ef04e
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/AppDelegate.m
@@ -0,0 +1,38 @@
+#import "AppDelegate.h"
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ // Override point for customization after application launch.
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 1/Default-568h@2x.png b/tutorials/xcode iOS/Tutorial 1/Default-568h@2x.png
new file mode 100644
index 0000000..0891b7a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Default-568h@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/Default.png b/tutorials/xcode iOS/Tutorial 1/Default.png
new file mode 100644
index 0000000..4c8ca6f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Default.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/Default@2x.png b/tutorials/xcode iOS/Tutorial 1/Default@2x.png
new file mode 100644
index 0000000..35b84cf
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Default@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/GStreamerBackend.h b/tutorials/xcode iOS/Tutorial 1/GStreamerBackend.h
new file mode 100644
index 0000000..3996f00
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/GStreamerBackend.h
@@ -0,0 +1,7 @@
+#import <Foundation/Foundation.h>
+
+@interface GStreamerBackend : NSObject
+
+-(NSString*) getGStreamerVersion;
+
+@end \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 1/GStreamerBackend.m b/tutorials/xcode iOS/Tutorial 1/GStreamerBackend.m
new file mode 100644
index 0000000..e36233b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/GStreamerBackend.m
@@ -0,0 +1,16 @@
+#import "GStreamerBackend.h"
+
+#include <gst/gst.h>
+
+@implementation GStreamerBackend
+
+-(NSString*) getGStreamerVersion
+{
+ char *version_utf8 = gst_version_string();
+ NSString *version_string = [NSString stringWithUTF8String:version_utf8];
+ g_free(version_utf8);
+ return version_string;
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad.png b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad.png
new file mode 100755
index 0000000..a1d3177
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad@2x.png b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad@2x.png
new file mode 100755
index 0000000..d76e887
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPad@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone.png b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone.png
new file mode 100755
index 0000000..775df1b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone@2x.png b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone@2x.png
new file mode 100755
index 0000000..a0743ab
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Images/appicon-1-iPhone@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/Tutorial 1-Info.plist b/tutorials/xcode iOS/Tutorial 1/Tutorial 1-Info.plist
new file mode 100644
index 0000000..6f7335a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Tutorial 1-Info.plist
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIcons</key>
+ <dict>
+ <key>CFBundlePrimaryIcon</key>
+ <dict>
+ <key>CFBundleIconFiles</key>
+ <array>
+ <string>appicon-1-iPhone.png</string>
+ <string>appicon-1-iPhone@2x.png</string>
+ <string>appicon-1-iPad.png</string>
+ <string>appicon-1-iPad@2x.png</string>
+ </array>
+ </dict>
+ </dict>
+ <key>CFBundleIdentifier</key>
+ <string>gstreamer-sdk.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIMainStoryboardFile</key>
+ <string>MainStoryboard_iPhone</string>
+ <key>UIMainStoryboardFile~ipad</key>
+ <string>MainStoryboard_iPad</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/tutorials/xcode iOS/Tutorial 1/Tutorial 1-Prefix.pch b/tutorials/xcode iOS/Tutorial 1/Tutorial 1-Prefix.pch
new file mode 100644
index 0000000..99c2d37
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Tutorial 1-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'Tutorial 1' target in the 'Tutorial 1' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 1/Ubuntu-R.ttf b/tutorials/xcode iOS/Tutorial 1/Ubuntu-R.ttf
new file mode 100644
index 0000000..45a038b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/Ubuntu-R.ttf
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 1/ViewController.h b/tutorials/xcode iOS/Tutorial 1/ViewController.h
new file mode 100644
index 0000000..2440159
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/ViewController.h
@@ -0,0 +1,9 @@
+#import <UIKit/UIKit.h>
+
+@interface ViewController : UIViewController {
+ IBOutlet UILabel *label;
+}
+
+@property (retain,nonatomic) UILabel *label;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 1/ViewController.m b/tutorials/xcode iOS/Tutorial 1/ViewController.m
new file mode 100644
index 0000000..96c8b29
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/ViewController.m
@@ -0,0 +1,29 @@
+#import "ViewController.h"
+#import "GStreamerBackend.h"
+
+@interface ViewController () {
+ GStreamerBackend *gst_backend;
+}
+
+@end
+
+@implementation ViewController
+
+@synthesize label;
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ // Do any additional setup after loading the view, typically from a nib.
+ gst_backend = [[GStreamerBackend alloc] init];
+
+ label.text = [NSString stringWithFormat:@"Welcome to %@!", [gst_backend getGStreamerVersion]];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 1/en.lproj/InfoPlist.strings b/tutorials/xcode iOS/Tutorial 1/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPad.storyboard b/tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPad.storyboard
new file mode 100644
index 0000000..ed6ac57
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPad.storyboard
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="2">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="4">
+ <objects>
+ <viewController id="2" customClass="ViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="5">
+ <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Qf4-xK-TZW">
+ <constraints>
+ <constraint firstAttribute="height" constant="21" id="wKa-F6-8ex"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="24"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="trailing" secondItem="Qf4-xK-TZW" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="M3D-vu-V58"/>
+ <constraint firstItem="Qf4-xK-TZW" firstAttribute="leading" secondItem="5" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="dIE-DO-Gz2"/>
+ <constraint firstAttribute="centerY" secondItem="Qf4-xK-TZW" secondAttribute="centerY" type="user" id="zSb-ID-5rm"/>
+ </constraints>
+ </view>
+ <connections>
+ <outlet property="label" destination="Qf4-xK-TZW" id="rAV-on-WKC"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="3" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="NSLayoutConstraint" superclassName="NSObject">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
+ </class>
+ <class className="ViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+ <relationships>
+ <relationship kind="outlet" name="label" candidateClass="UILabel"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPhone.storyboard b/tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPhone.storyboard
new file mode 100644
index 0000000..4f755aa
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/en.lproj/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="2">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="5">
+ <objects>
+ <viewController id="2" customClass="ViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="3">
+ <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Label" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="Cit-jt-jhM">
+ <constraints>
+ <constraint firstAttribute="height" priority="1" constant="21" type="user" id="dt5-5x-Dso"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="24"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="Cit-jt-jhM" firstAttribute="centerY" secondItem="3" secondAttribute="centerY" type="default" id="YA8-1j-h9C"/>
+ <constraint firstItem="Cit-jt-jhM" firstAttribute="leading" secondItem="3" secondAttribute="leading" constant="20" symbolic="YES" type="default" id="jqu-jH-Hiu"/>
+ <constraint firstAttribute="trailing" secondItem="Cit-jt-jhM" secondAttribute="trailing" constant="20" symbolic="YES" type="default" id="opu-rY-WAR"/>
+ </constraints>
+ </view>
+ <connections>
+ <outlet property="label" destination="Cit-jt-jhM" id="CGz-Sd-R0d"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="4" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="NSLayoutConstraint" superclassName="NSObject">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
+ </class>
+ <class className="ViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+ <relationships>
+ <relationship kind="outlet" name="label" candidateClass="UILabel"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 1/fonts.conf b/tutorials/xcode iOS/Tutorial 1/fonts.conf
new file mode 100644
index 0000000..6b780ea
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/fonts.conf
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!-- Font directory list -->
+
+ <dir prefix="xdg"></dir>
+
+<!-- Font cache directory list -->
+
+ <cachedir prefix="xdg"></cachedir>
+
+<!--
+ Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>monospace</string>
+ </edit>
+ </match>
+
+<!--
+ Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans serif</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+ <config>
+<!--
+ These are the default Unicode chars that are expected to be blank
+ in fonts. All other blank chars are assumed to be broken and
+ won't appear in the resulting charsets
+ -->
+ <blank>
+ <int>0x0020</int> <!-- SPACE -->
+ <int>0x00A0</int> <!-- NO-BREAK SPACE -->
+ <int>0x00AD</int> <!-- SOFT HYPHEN -->
+ <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
+ <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
+ <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
+ <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
+ <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
+ <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
+ <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
+ <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
+ <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
+ <int>0x1680</int> <!-- OGHAM SPACE MARK -->
+ <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
+ <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
+ <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
+ <int>0x2000</int> <!-- EN QUAD -->
+ <int>0x2001</int> <!-- EM QUAD -->
+ <int>0x2002</int> <!-- EN SPACE -->
+ <int>0x2003</int> <!-- EM SPACE -->
+ <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
+ <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
+ <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
+ <int>0x2007</int> <!-- FIGURE SPACE -->
+ <int>0x2008</int> <!-- PUNCTUATION SPACE -->
+ <int>0x2009</int> <!-- THIN SPACE -->
+ <int>0x200A</int> <!-- HAIR SPACE -->
+ <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
+ <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
+ <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
+ <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
+ <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
+ <int>0x2028</int> <!-- LINE SEPARATOR -->
+ <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
+ <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
+ <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
+ <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
+ <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
+ <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
+ <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
+ <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
+ <int>0x2060</int> <!-- WORD JOINER -->
+ <int>0x2061</int> <!-- FUNCTION APPLICATION -->
+ <int>0x2062</int> <!-- INVISIBLE TIMES -->
+ <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
+ <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
+ <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
+ <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
+ <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
+ <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
+ <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
+ <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
+ <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
+ <int>0x3164</int> <!-- HANGUL FILLER -->
+ <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
+ <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
+ <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
+ <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+ <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+ </blank>
+<!--
+ Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+ <rescan>
+ <int>30</int>
+ </rescan>
+ </config>
+
+</fontconfig>
+
diff --git a/tutorials/xcode iOS/Tutorial 1/gst_ios_init.h b/tutorials/xcode iOS/Tutorial 1/gst_ios_init.h
new file mode 100644
index 0000000..c5c929f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/gst_ios_init.h
@@ -0,0 +1,39 @@
+#ifndef __GST_IOS_INIT_H__
+#define __GST_IOS_INIT_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_G_IO_MODULE_DECLARE(name) \
+extern void G_PASTE(g_io_module_, G_PASTE(name, _load_static)) (void)
+
+#define GST_G_IO_MODULE_LOAD(name) \
+G_PASTE(g_io_module_, G_PASTE(name, _load_static)) ()
+
+/* Uncomment each line to enable the plugin categories that your application needs.
+ * You can also enable individual plugins. See gst_ios_init.c to see their names
+ */
+
+#define GST_IOS_PLUGINS_CORE
+//#define GST_IOS_PLUGINS_CAPTURE
+//#define GST_IOS_PLUGINS_CODECS_RESTRICTED
+//#define GST_IOS_PLUGINS_ENCODING
+//#define GST_IOS_PLUGINS_CODECS_GPL
+//#define GST_IOS_PLUGINS_NET_RESTRICTED
+//#define GST_IOS_PLUGINS_SYS
+//#define GST_IOS_PLUGINS_VIS
+//#define GST_IOS_PLUGINS_PLAYBACK
+//#define GST_IOS_PLUGINS_EFFECTS
+//#define GST_IOS_PLUGINS_CODECS
+//#define GST_IOS_PLUGINS_NET
+//#define GST_IOS_PLUGINS_EDITING
+
+
+//#define GST_IOS_GIO_MODULE_GNUTLS
+
+void gst_ios_init ();
+
+G_END_DECLS
+
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 1/gst_ios_init.m b/tutorials/xcode iOS/Tutorial 1/gst_ios_init.m
new file mode 100644
index 0000000..403f9f9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/gst_ios_init.m
@@ -0,0 +1,988 @@
+#include "gst_ios_init.h"
+
+#if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+GST_PLUGIN_STATIC_DECLARE(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+GST_PLUGIN_STATIC_DECLARE(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+GST_PLUGIN_STATIC_DECLARE(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+GST_PLUGIN_STATIC_DECLARE(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+GST_PLUGIN_STATIC_DECLARE(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ #include <gio/gio.h>
+ GST_G_IO_MODULE_DECLARE(gnutls);
+#endif
+
+void
+gst_ios_init (void)
+{
+ GstPluginFeature *plugin;
+ GstRegistry *reg;
+ NSString *resources = [[NSBundle mainBundle] resourcePath];
+ NSString *tmp = NSTemporaryDirectory();
+ NSString *cache = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
+ NSString *docs = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
+
+ const gchar *resources_dir = [resources UTF8String];
+ const gchar *tmp_dir = [tmp UTF8String];
+ const gchar *cache_dir = [cache UTF8String];
+ const gchar *docs_dir = [docs UTF8String];
+ gchar *ca_certificates;
+
+ g_setenv ("TMP", tmp_dir, TRUE);
+ g_setenv ("TEMP", tmp_dir, TRUE);
+ g_setenv ("TMPDIR", tmp_dir, TRUE);
+ g_setenv ("XDG_RUNTIME_DIR", resources_dir, TRUE);
+ g_setenv ("XDG_CACHE_HOME", cache_dir, TRUE);
+
+ g_setenv ("HOME", docs_dir, TRUE);
+ g_setenv ("XDG_DATA_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_HOME", cache_dir, TRUE);
+ g_setenv ("XDG_DATA_HOME", resources_dir, TRUE);
+ g_setenv ("FONTCONFIG_PATH", resources_dir, TRUE);
+
+ ca_certificates = g_build_filename (resources_dir, "ssl", "certs", "ca-certifcates.crt", NULL);
+ g_setenv ("CA_CERTIFICATES", ca_certificates, TRUE);
+ g_free (ca_certificates);
+
+ gst_init (NULL, NULL);
+
+ #if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+ GST_PLUGIN_STATIC_REGISTER(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+ GST_PLUGIN_STATIC_REGISTER(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+ GST_PLUGIN_STATIC_REGISTER(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+ GST_PLUGIN_STATIC_REGISTER(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+ GST_PLUGIN_STATIC_REGISTER(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ GST_G_IO_MODULE_LOAD(gnutls);
+#endif
+
+ /* Lower the ranks of filesrc and giosrc so iosavassetsrc is
+ * tried first in gst_element_make_from_uri() for file:// */
+ reg = gst_registry_get();
+ plugin = gst_registry_lookup_feature(reg, "filesrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY);
+ plugin = gst_registry_lookup_feature(reg, "giosrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY-1);
+}
diff --git a/tutorials/xcode iOS/Tutorial 1/main.m b/tutorials/xcode iOS/Tutorial 1/main.m
new file mode 100644
index 0000000..6cf4e0f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 1/main.m
@@ -0,0 +1,12 @@
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+#include "gst_ios_init.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ gst_ios_init();
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/tutorials/xcode iOS/Tutorial 2/AppDelegate.h b/tutorials/xcode iOS/Tutorial 2/AppDelegate.h
new file mode 100644
index 0000000..a5a8b38
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/AppDelegate.h
@@ -0,0 +1,7 @@
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 2/AppDelegate.m b/tutorials/xcode iOS/Tutorial 2/AppDelegate.m
new file mode 100644
index 0000000..31ef04e
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/AppDelegate.m
@@ -0,0 +1,38 @@
+#import "AppDelegate.h"
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ // Override point for customization after application launch.
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 2/Default-568h@2x.png b/tutorials/xcode iOS/Tutorial 2/Default-568h@2x.png
new file mode 100644
index 0000000..0891b7a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Default-568h@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/Default.png b/tutorials/xcode iOS/Tutorial 2/Default.png
new file mode 100644
index 0000000..4c8ca6f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Default.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/Default@2x.png b/tutorials/xcode iOS/Tutorial 2/Default@2x.png
new file mode 100644
index 0000000..35b84cf
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Default@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/GStreamerBackend.h b/tutorials/xcode iOS/Tutorial 2/GStreamerBackend.h
new file mode 100644
index 0000000..b00f758
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/GStreamerBackend.h
@@ -0,0 +1,16 @@
+#import <Foundation/Foundation.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface GStreamerBackend : NSObject
+
+/* Initialization method. Pass the delegate that will take care of the UI.
+ * This delegate must implement the GStreamerBackendDelegate protocol */
+-(id) init:(id) uiDelegate;
+
+/* Set the pipeline to PLAYING */
+-(void) play;
+
+/* Set the pipeline to PAUSED */
+-(void) pause;
+
+@end \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 2/GStreamerBackend.m b/tutorials/xcode iOS/Tutorial 2/GStreamerBackend.m
new file mode 100644
index 0000000..814d15a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/GStreamerBackend.m
@@ -0,0 +1,177 @@
+#import "GStreamerBackend.h"
+
+#include <gst/gst.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+@interface GStreamerBackend()
+-(void)setUIMessage:(gchar*) message;
+-(void)app_function;
+-(void)check_initialization_complete;
+@end
+
+@implementation GStreamerBackend {
+ id ui_delegate; /* Class that we use to interact with the user interface */
+ GstElement *pipeline; /* The running pipeline */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+}
+
+/*
+ * Interface methods
+ */
+
+-(id) init:(id) uiDelegate
+{
+ if (self = [super init])
+ {
+ self->ui_delegate = uiDelegate;
+
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-2", 0, "iOS tutorial 2");
+ gst_debug_set_threshold_for_name("tutorial-2", GST_LEVEL_DEBUG);
+
+ /* Start the bus monitoring task */
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [self app_function];
+ });
+ }
+
+ return self;
+}
+
+-(void) dealloc
+{
+ if (pipeline) {
+ GST_DEBUG("Setting the pipeline to NULL");
+ gst_element_set_state(pipeline, GST_STATE_NULL);
+ gst_object_unref(pipeline);
+ pipeline = NULL;
+ }
+}
+
+-(void) play
+{
+ if(gst_element_set_state(pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+ [self setUIMessage:"Failed to set pipeline to playing"];
+ }
+}
+
+-(void) pause
+{
+ if(gst_element_set_state(pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) {
+ [self setUIMessage:"Failed to set pipeline to paused"];
+ }
+}
+
+/*
+ * Private methods
+ */
+
+/* Change the message on the UI through the UI delegate */
+-(void)setUIMessage:(gchar*) message
+{
+ NSString *string = [NSString stringWithUTF8String:message];
+ if(ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerSetUIMessage:)])
+ {
+ [ui_delegate gstreamerSetUIMessage:string];
+ }
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ [self setUIMessage:message_string];
+ g_free (message_string);
+ gst_element_set_state (self->pipeline, GST_STATE_NULL);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (self->pipeline)) {
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ [self setUIMessage:message];
+ g_free (message);
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+-(void) check_initialization_complete
+{
+ if (!initialized && main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application.");
+ if (ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerInitialized)])
+ {
+ [ui_delegate gstreamerInitialized];
+ }
+ initialized = TRUE;
+ }
+}
+
+/* Main method for the bus monitoring code */
+-(void) app_function
+{
+ GstBus *bus;
+ GSource *bus_source;
+ GError *error = NULL;
+
+ GST_DEBUG ("Creating pipeline");
+
+ /* Create our own GLib Main Context and make it the default one */
+ context = g_main_context_new ();
+ g_main_context_push_thread_default(context);
+
+ /* Build pipeline */
+ pipeline = gst_parse_launch("audiotestsrc ! audioconvert ! audioresample ! autoaudiosink", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ [self setUIMessage:message];
+ g_free (message);
+ return;
+ }
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, (__bridge void *)self);
+ gst_object_unref (bus);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop...");
+ main_loop = g_main_loop_new (context, FALSE);
+ [self check_initialization_complete];
+ g_main_loop_run (main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (main_loop);
+ main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(context);
+ g_main_context_unref (context);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return;
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 2/GStreamerBackendDelegate.h b/tutorials/xcode iOS/Tutorial 2/GStreamerBackendDelegate.h
new file mode 100644
index 0000000..5586373
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/GStreamerBackendDelegate.h
@@ -0,0 +1,14 @@
+#import <Foundation/Foundation.h>
+
+@protocol GStreamerBackendDelegate <NSObject>
+
+@optional
+/* Called when the GStreamer backend has finished initializing
+ * and is ready to accept orders. */
+-(void) gstreamerInitialized;
+
+/* Called when the GStreamer backend wants to output some message
+ * to the screen. */
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad.png b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad.png
new file mode 100755
index 0000000..56f58fe
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad@2x.png b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad@2x.png
new file mode 100755
index 0000000..e2236f9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPad@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone.png b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone.png
new file mode 100755
index 0000000..0416f13
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone@2x.png b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone@2x.png
new file mode 100755
index 0000000..5c9ee26
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Images/appicon-2-iPhone@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/Tutorial 2-Info.plist b/tutorials/xcode iOS/Tutorial 2/Tutorial 2-Info.plist
new file mode 100644
index 0000000..ee2efae
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Tutorial 2-Info.plist
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIcons</key>
+ <dict>
+ <key>CFBundlePrimaryIcon</key>
+ <dict>
+ <key>CFBundleIconFiles</key>
+ <array>
+ <string>appicon-2-iPad.png</string>
+ <string>appicon-2-iPad@2x.png</string>
+ <string>appicon-2-iPhone.png</string>
+ <string>appicon-2-iPhone@2x.png</string>
+ </array>
+ </dict>
+ </dict>
+ <key>CFBundleIdentifier</key>
+ <string>gstreamer-sdk.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIMainStoryboardFile</key>
+ <string>MainStoryboard_iPhone</string>
+ <key>UIMainStoryboardFile~ipad</key>
+ <string>MainStoryboard_iPad</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/tutorials/xcode iOS/Tutorial 2/Tutorial 2-Prefix.pch b/tutorials/xcode iOS/Tutorial 2/Tutorial 2-Prefix.pch
new file mode 100644
index 0000000..69d1459
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Tutorial 2-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'Tutorial 2' target in the 'Tutorial 2' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 2/Tutorial2-Info.plist b/tutorials/xcode iOS/Tutorial 2/Tutorial2-Info.plist
new file mode 100644
index 0000000..91c26b9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Tutorial2-Info.plist
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>gstsdk.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIMainStoryboardFile</key>
+ <string>MainStoryboard_iPhone</string>
+ <key>UIMainStoryboardFile~ipad</key>
+ <string>MainStoryboard_iPad</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/tutorials/xcode iOS/Tutorial 2/Ubuntu-R.ttf b/tutorials/xcode iOS/Tutorial 2/Ubuntu-R.ttf
new file mode 100644
index 0000000..45a038b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/Ubuntu-R.ttf
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 2/ViewController.h b/tutorials/xcode iOS/Tutorial 2/ViewController.h
new file mode 100644
index 0000000..be19276
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/ViewController.h
@@ -0,0 +1,17 @@
+#import <UIKit/UIKit.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface ViewController : UIViewController <GStreamerBackendDelegate> {
+ IBOutlet UILabel *message_label;
+ IBOutlet UIBarButtonItem *play_button;
+ IBOutlet UIBarButtonItem *pause_button;
+}
+
+-(IBAction) play:(id)sender;
+-(IBAction) pause:(id)sender;
+
+/* From GStreamerBackendDelegate */
+-(void) gstreamerInitialized;
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 2/ViewController.m b/tutorials/xcode iOS/Tutorial 2/ViewController.m
new file mode 100644
index 0000000..512ede7
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/ViewController.m
@@ -0,0 +1,65 @@
+#import "ViewController.h"
+#import "GStreamerBackend.h"
+#import <UIKit/UIKit.h>
+
+@interface ViewController () {
+ GStreamerBackend *gst_backend;
+}
+
+@end
+
+@implementation ViewController
+
+/*
+ * Methods from UIViewController
+ */
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ play_button.enabled = FALSE;
+ pause_button.enabled = FALSE;
+
+ gst_backend = [[GStreamerBackend alloc] init:self];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+/* Called when the Play button is pressed */
+-(IBAction) play:(id)sender
+{
+ [gst_backend play];
+}
+
+/* Called when the Pause button is pressed */
+-(IBAction) pause:(id)sender
+{
+ [gst_backend pause];
+}
+
+/*
+ * Methods from GstreamerBackendDelegate
+ */
+
+-(void) gstreamerInitialized
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ play_button.enabled = TRUE;
+ pause_button.enabled = TRUE;
+ message_label.text = @"Ready";
+ });
+}
+
+-(void) gstreamerSetUIMessage:(NSString *)message
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ message_label.text = message;
+ });
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 2/en.lproj/InfoPlist.strings b/tutorials/xcode iOS/Tutorial 2/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPad.storyboard b/tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPad.storyboard
new file mode 100644
index 0000000..c96f025
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPad.storyboard
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="z7O-8l-Zeo">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="P93-nn-HBJ">
+ <objects>
+ <viewController id="z7O-8l-Zeo" customClass="ViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="CqS-Gu-I1O">
+ <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="728" translatesAutoresizingMaskIntoConstraints="NO" id="iLX-h1-Ko5" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="7Z8-1b-Y41"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUi-CE-Ydy">
+ <items>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="onU-hf-FS4"/>
+ <barButtonItem systemItem="play" id="UlF-Ga-2VX">
+ <connections>
+ <action selector="play:" destination="z7O-8l-Zeo" id="5xC-uv-9lM"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="J3O-8j-Tkt">
+ <connections>
+ <action selector="pause:" destination="z7O-8l-Zeo" id="BYM-2X-Tel"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="urI-U7-ALw"/>
+ </items>
+ </toolbar>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="bottom" secondItem="MUi-CE-Ydy" secondAttribute="top" constant="8" symbolic="YES" type="user" id="FXP-eH-VSK"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="OM9-gE-OVP"/>
+ <constraint firstAttribute="trailing" secondItem="iLX-h1-Ko5" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="Xdr-12-E1r"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="bT2-TE-X7Q"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="trailing" secondItem="CqS-Gu-I1O" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="iRT-XF-W0f"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="bottom" secondItem="CqS-Gu-I1O" secondAttribute="bottom" constant="20" symbolic="YES" type="user" id="w6K-xy-EJe"/>
+ </constraints>
+ </view>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics" statusBarStyle="blackTranslucent"/>
+ <connections>
+ <outlet property="message_label" destination="iLX-h1-Ko5" id="Q0Y-3J-zis"/>
+ <outlet property="pause_button" destination="J3O-8j-Tkt" id="Dls-sg-FPm"/>
+ <outlet property="play_button" destination="UlF-Ga-2VX" id="243-yq-GEe"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iRS-GG-bR6" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="ViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="pause:"/>
+ <relationship kind="action" name="play:"/>
+ <relationship kind="outlet" name="label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="message_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="pause_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="play_button" candidateClass="UIBarButtonItem"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPhone.storyboard b/tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPhone.storyboard
new file mode 100644
index 0000000..0d14c30
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/en.lproj/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="kYn-Hr-MJq">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="3nc-d3-XH9">
+ <objects>
+ <viewController id="kYn-Hr-MJq" customClass="ViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="JOS-rK-Hts">
+ <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="8wd-E5-Owx" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="WIW-Im-XnF"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="o22-1p-nvT">
+ <items>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="BPU-1t-gy3"/>
+ <barButtonItem systemItem="play" id="6LZ-7a-xKf">
+ <connections>
+ <action selector="play:" destination="kYn-Hr-MJq" id="hIx-MW-CFA"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="bfY-YY-jiu">
+ <connections>
+ <action selector="pause:" destination="kYn-Hr-MJq" id="dQ5-mO-cMh"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="hSc-4x-myS"/>
+ </items>
+ </toolbar>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="8wd-E5-Owx" firstAttribute="bottom" secondItem="o22-1p-nvT" secondAttribute="top" constant="8" symbolic="YES" type="user" id="CHF-CI-6CL"/>
+ <constraint firstAttribute="trailing" secondItem="8wd-E5-Owx" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="WDw-jT-tbz"/>
+ <constraint firstItem="o22-1p-nvT" firstAttribute="leading" secondItem="JOS-rK-Hts" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="Zvb-2h-v7A"/>
+ <constraint firstItem="o22-1p-nvT" firstAttribute="bottom" secondItem="JOS-rK-Hts" secondAttribute="bottom" constant="20" symbolic="YES" type="user" id="l3D-e3-Z7R"/>
+ <constraint firstItem="8wd-E5-Owx" firstAttribute="leading" secondItem="JOS-rK-Hts" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="lwj-ty-IXl"/>
+ <constraint firstItem="o22-1p-nvT" firstAttribute="trailing" secondItem="JOS-rK-Hts" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="mL0-QH-ra6"/>
+ </constraints>
+ </view>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
+ <connections>
+ <outlet property="message_label" destination="8wd-E5-Owx" id="7Xw-cg-3hH"/>
+ <outlet property="pause_button" destination="bfY-YY-jiu" id="GBf-vm-mbR"/>
+ <outlet property="play_button" destination="6LZ-7a-xKf" id="Tk2-4w-9Px"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="25z-hu-OZW" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 2/fonts.conf b/tutorials/xcode iOS/Tutorial 2/fonts.conf
new file mode 100644
index 0000000..6b780ea
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/fonts.conf
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!-- Font directory list -->
+
+ <dir prefix="xdg"></dir>
+
+<!-- Font cache directory list -->
+
+ <cachedir prefix="xdg"></cachedir>
+
+<!--
+ Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>monospace</string>
+ </edit>
+ </match>
+
+<!--
+ Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans serif</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+ <config>
+<!--
+ These are the default Unicode chars that are expected to be blank
+ in fonts. All other blank chars are assumed to be broken and
+ won't appear in the resulting charsets
+ -->
+ <blank>
+ <int>0x0020</int> <!-- SPACE -->
+ <int>0x00A0</int> <!-- NO-BREAK SPACE -->
+ <int>0x00AD</int> <!-- SOFT HYPHEN -->
+ <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
+ <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
+ <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
+ <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
+ <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
+ <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
+ <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
+ <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
+ <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
+ <int>0x1680</int> <!-- OGHAM SPACE MARK -->
+ <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
+ <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
+ <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
+ <int>0x2000</int> <!-- EN QUAD -->
+ <int>0x2001</int> <!-- EM QUAD -->
+ <int>0x2002</int> <!-- EN SPACE -->
+ <int>0x2003</int> <!-- EM SPACE -->
+ <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
+ <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
+ <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
+ <int>0x2007</int> <!-- FIGURE SPACE -->
+ <int>0x2008</int> <!-- PUNCTUATION SPACE -->
+ <int>0x2009</int> <!-- THIN SPACE -->
+ <int>0x200A</int> <!-- HAIR SPACE -->
+ <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
+ <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
+ <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
+ <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
+ <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
+ <int>0x2028</int> <!-- LINE SEPARATOR -->
+ <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
+ <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
+ <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
+ <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
+ <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
+ <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
+ <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
+ <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
+ <int>0x2060</int> <!-- WORD JOINER -->
+ <int>0x2061</int> <!-- FUNCTION APPLICATION -->
+ <int>0x2062</int> <!-- INVISIBLE TIMES -->
+ <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
+ <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
+ <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
+ <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
+ <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
+ <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
+ <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
+ <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
+ <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
+ <int>0x3164</int> <!-- HANGUL FILLER -->
+ <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
+ <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
+ <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
+ <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+ <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+ </blank>
+<!--
+ Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+ <rescan>
+ <int>30</int>
+ </rescan>
+ </config>
+
+</fontconfig>
+
diff --git a/tutorials/xcode iOS/Tutorial 2/gst_ios_init.h b/tutorials/xcode iOS/Tutorial 2/gst_ios_init.h
new file mode 100644
index 0000000..b1471b2
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/gst_ios_init.h
@@ -0,0 +1,39 @@
+#ifndef __GST_IOS_INIT_H__
+#define __GST_IOS_INIT_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_G_IO_MODULE_DECLARE(name) \
+extern void G_PASTE(g_io_module_, G_PASTE(name, _load_static)) (void)
+
+#define GST_G_IO_MODULE_LOAD(name) \
+G_PASTE(g_io_module_, G_PASTE(name, _load_static)) ()
+
+/* Uncomment each line to enable the plugin categories that your application needs.
+ * You can also enable individual plugins. See gst_ios_init.c to see their names
+ */
+
+#define GST_IOS_PLUGINS_CORE
+//#define GST_IOS_PLUGINS_CAPTURE
+//#define GST_IOS_PLUGINS_CODECS_RESTRICTED
+//#define GST_IOS_PLUGINS_ENCODING
+//#define GST_IOS_PLUGINS_CODECS_GPL
+//#define GST_IOS_PLUGINS_NET_RESTRICTED
+#define GST_IOS_PLUGINS_SYS
+//#define GST_IOS_PLUGINS_VIS
+//#define GST_IOS_PLUGINS_PLAYBACK
+//#define GST_IOS_PLUGINS_EFFECTS
+//#define GST_IOS_PLUGINS_CODECS
+//#define GST_IOS_PLUGINS_NET
+//#define GST_IOS_PLUGINS_EDITING
+
+
+//#define GST_IOS_GIO_MODULE_GNUTLS
+
+void gst_ios_init ();
+
+G_END_DECLS
+
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 2/gst_ios_init.m b/tutorials/xcode iOS/Tutorial 2/gst_ios_init.m
new file mode 100644
index 0000000..403f9f9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/gst_ios_init.m
@@ -0,0 +1,988 @@
+#include "gst_ios_init.h"
+
+#if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+GST_PLUGIN_STATIC_DECLARE(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+GST_PLUGIN_STATIC_DECLARE(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+GST_PLUGIN_STATIC_DECLARE(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+GST_PLUGIN_STATIC_DECLARE(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+GST_PLUGIN_STATIC_DECLARE(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ #include <gio/gio.h>
+ GST_G_IO_MODULE_DECLARE(gnutls);
+#endif
+
+void
+gst_ios_init (void)
+{
+ GstPluginFeature *plugin;
+ GstRegistry *reg;
+ NSString *resources = [[NSBundle mainBundle] resourcePath];
+ NSString *tmp = NSTemporaryDirectory();
+ NSString *cache = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
+ NSString *docs = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
+
+ const gchar *resources_dir = [resources UTF8String];
+ const gchar *tmp_dir = [tmp UTF8String];
+ const gchar *cache_dir = [cache UTF8String];
+ const gchar *docs_dir = [docs UTF8String];
+ gchar *ca_certificates;
+
+ g_setenv ("TMP", tmp_dir, TRUE);
+ g_setenv ("TEMP", tmp_dir, TRUE);
+ g_setenv ("TMPDIR", tmp_dir, TRUE);
+ g_setenv ("XDG_RUNTIME_DIR", resources_dir, TRUE);
+ g_setenv ("XDG_CACHE_HOME", cache_dir, TRUE);
+
+ g_setenv ("HOME", docs_dir, TRUE);
+ g_setenv ("XDG_DATA_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_HOME", cache_dir, TRUE);
+ g_setenv ("XDG_DATA_HOME", resources_dir, TRUE);
+ g_setenv ("FONTCONFIG_PATH", resources_dir, TRUE);
+
+ ca_certificates = g_build_filename (resources_dir, "ssl", "certs", "ca-certifcates.crt", NULL);
+ g_setenv ("CA_CERTIFICATES", ca_certificates, TRUE);
+ g_free (ca_certificates);
+
+ gst_init (NULL, NULL);
+
+ #if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+ GST_PLUGIN_STATIC_REGISTER(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+ GST_PLUGIN_STATIC_REGISTER(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+ GST_PLUGIN_STATIC_REGISTER(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+ GST_PLUGIN_STATIC_REGISTER(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+ GST_PLUGIN_STATIC_REGISTER(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ GST_G_IO_MODULE_LOAD(gnutls);
+#endif
+
+ /* Lower the ranks of filesrc and giosrc so iosavassetsrc is
+ * tried first in gst_element_make_from_uri() for file:// */
+ reg = gst_registry_get();
+ plugin = gst_registry_lookup_feature(reg, "filesrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY);
+ plugin = gst_registry_lookup_feature(reg, "giosrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY-1);
+}
diff --git a/tutorials/xcode iOS/Tutorial 2/main.m b/tutorials/xcode iOS/Tutorial 2/main.m
new file mode 100644
index 0000000..6cf4e0f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 2/main.m
@@ -0,0 +1,12 @@
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+#include "gst_ios_init.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ gst_ios_init();
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/tutorials/xcode iOS/Tutorial 3/AppDelegate.h b/tutorials/xcode iOS/Tutorial 3/AppDelegate.h
new file mode 100644
index 0000000..a5a8b38
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/AppDelegate.h
@@ -0,0 +1,7 @@
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 3/AppDelegate.m b/tutorials/xcode iOS/Tutorial 3/AppDelegate.m
new file mode 100644
index 0000000..31ef04e
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/AppDelegate.m
@@ -0,0 +1,38 @@
+#import "AppDelegate.h"
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ // Override point for customization after application launch.
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 3/Default-568h@2x.png b/tutorials/xcode iOS/Tutorial 3/Default-568h@2x.png
new file mode 100644
index 0000000..0891b7a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Default-568h@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/Default.png b/tutorials/xcode iOS/Tutorial 3/Default.png
new file mode 100644
index 0000000..4c8ca6f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Default.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/Default@2x.png b/tutorials/xcode iOS/Tutorial 3/Default@2x.png
new file mode 100644
index 0000000..35b84cf
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Default@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/EaglUIVIew.h b/tutorials/xcode iOS/Tutorial 3/EaglUIVIew.h
new file mode 100644
index 0000000..ac4e798
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/EaglUIVIew.h
@@ -0,0 +1,11 @@
+#import <Foundation/Foundation.h>
+#import <QuartzCore/QuartzCore.h>
+#include <OpenGLES/ES2/gl.h>
+#include <OpenGLES/ES2/glext.h>
+
+@interface EaglUIView : UIView
+{
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 3/EaglUIVIew.m b/tutorials/xcode iOS/Tutorial 3/EaglUIVIew.m
new file mode 100644
index 0000000..91cdd9d
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/EaglUIVIew.m
@@ -0,0 +1,13 @@
+#import "EaglUIVIew.h"
+
+#import <QuartzCore/QuartzCore.h>
+
+@implementation EaglUIView
+
+
++ (Class) layerClass
+{
+ return [CAEAGLLayer class];
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 3/GStreamerBackend.h b/tutorials/xcode iOS/Tutorial 3/GStreamerBackend.h
new file mode 100644
index 0000000..a23c4ce
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/GStreamerBackend.h
@@ -0,0 +1,17 @@
+#import <Foundation/Foundation.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface GStreamerBackend : NSObject
+
+/* Initialization method. Pass the delegate that will take care of the UI.
+ * This delegate must implement the GStreamerBackendDelegate protocol.
+ * Pass also the UIView object that will hold the video window. */
+-(id) init:(id) uiDelegate videoView:(UIView*) video_view;
+
+/* Set the pipeline to PLAYING */
+-(void) play;
+
+/* Set the pipeline to PAUSED */
+-(void) pause;
+
+@end \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 3/GStreamerBackend.m b/tutorials/xcode iOS/Tutorial 3/GStreamerBackend.m
new file mode 100644
index 0000000..0942bb0
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/GStreamerBackend.m
@@ -0,0 +1,191 @@
+#import "GStreamerBackend.h"
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+@interface GStreamerBackend()
+-(void)setUIMessage:(gchar*) message;
+-(void)app_function;
+-(void)check_initialization_complete;
+@end
+
+@implementation GStreamerBackend {
+ id ui_delegate; /* Class that we use to interact with the user interface */
+ GstElement *pipeline; /* The running pipeline */
+ GstElement *video_sink;/* The video sink element which receives XOverlay commands */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+ UIView *ui_video_view; /* UIView that holds the video */
+}
+
+/*
+ * Interface methods
+ */
+
+-(id) init:(id) uiDelegate videoView:(UIView *)video_view
+{
+ if (self = [super init])
+ {
+ self->ui_delegate = uiDelegate;
+ self->ui_video_view = video_view;
+
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-3", 0, "iOS tutorial 3");
+ gst_debug_set_threshold_for_name("tutorial-3", GST_LEVEL_DEBUG);
+
+ /* Start the bus monitoring task */
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [self app_function];
+ });
+ }
+
+ return self;
+}
+
+-(void) dealloc
+{
+ if (pipeline) {
+ GST_DEBUG("Setting the pipeline to NULL");
+ gst_element_set_state(pipeline, GST_STATE_NULL);
+ gst_object_unref(pipeline);
+ pipeline = NULL;
+ }
+}
+
+-(void) play
+{
+ if(gst_element_set_state(pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+ [self setUIMessage:"Failed to set pipeline to playing"];
+ }
+}
+
+-(void) pause
+{
+ if(gst_element_set_state(pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE) {
+ [self setUIMessage:"Failed to set pipeline to paused"];
+ }
+}
+
+/*
+ * Private methods
+ */
+
+/* Change the message on the UI through the UI delegate */
+-(void)setUIMessage:(gchar*) message
+{
+ NSString *string = [NSString stringWithUTF8String:message];
+ if(ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerSetUIMessage:)])
+ {
+ [ui_delegate gstreamerSetUIMessage:string];
+ }
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ [self setUIMessage:message_string];
+ g_free (message_string);
+ gst_element_set_state (self->pipeline, GST_STATE_NULL);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (self->pipeline)) {
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ [self setUIMessage:message];
+ g_free (message);
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+-(void) check_initialization_complete
+{
+ if (!initialized && main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application.");
+ if (ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerInitialized)])
+ {
+ [ui_delegate gstreamerInitialized];
+ }
+ initialized = TRUE;
+ }
+}
+
+/* Main method for the bus monitoring code */
+-(void) app_function
+{
+ GstBus *bus;
+ GSource *bus_source;
+ GError *error = NULL;
+
+ GST_DEBUG ("Creating pipeline");
+
+ /* Create our own GLib Main Context and make it the default one */
+ context = g_main_context_new ();
+ g_main_context_push_thread_default(context);
+
+ /* Build pipeline */
+ pipeline = gst_parse_launch("videotestsrc ! warptv ! videoconvert ! autovideosink", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ [self setUIMessage:message];
+ g_free (message);
+ return;
+ }
+
+ /* Set the pipeline to READY, so it can already accept a window handle */
+ gst_element_set_state(pipeline, GST_STATE_READY);
+
+ video_sink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
+ if (!video_sink) {
+ GST_ERROR ("Could not retrieve video sink");
+ return;
+ }
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(video_sink), (guintptr) (id) ui_video_view);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, (__bridge void *)self);
+ gst_object_unref (bus);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop...");
+ main_loop = g_main_loop_new (context, FALSE);
+ [self check_initialization_complete];
+ g_main_loop_run (main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (main_loop);
+ main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(context);
+ g_main_context_unref (context);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return;
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 3/GStreamerBackendDelegate.h b/tutorials/xcode iOS/Tutorial 3/GStreamerBackendDelegate.h
new file mode 100644
index 0000000..5586373
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/GStreamerBackendDelegate.h
@@ -0,0 +1,14 @@
+#import <Foundation/Foundation.h>
+
+@protocol GStreamerBackendDelegate <NSObject>
+
+@optional
+/* Called when the GStreamer backend has finished initializing
+ * and is ready to accept orders. */
+-(void) gstreamerInitialized;
+
+/* Called when the GStreamer backend wants to output some message
+ * to the screen. */
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad.png b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad.png
new file mode 100755
index 0000000..d119186
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad@2x.png b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad@2x.png
new file mode 100755
index 0000000..2fa612a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPad@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone.png b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone.png
new file mode 100755
index 0000000..9fded2d
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone@2x.png b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone@2x.png
new file mode 100755
index 0000000..1a4b4f9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Images/appicon-3-iPhone@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/Tutorial 3-Info.plist b/tutorials/xcode iOS/Tutorial 3/Tutorial 3-Info.plist
new file mode 100644
index 0000000..b00c1bf
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Tutorial 3-Info.plist
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIcons</key>
+ <dict>
+ <key>CFBundlePrimaryIcon</key>
+ <dict>
+ <key>CFBundleIconFiles</key>
+ <array>
+ <string>appicon-3-iPad.png</string>
+ <string>appicon-3-iPad@2x.png</string>
+ <string>appicon-3-iPhone.png</string>
+ <string>appicon-3-iPhone@2x.png</string>
+ </array>
+ </dict>
+ </dict>
+ <key>CFBundleIdentifier</key>
+ <string>gstreamer-sdk.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIMainStoryboardFile</key>
+ <string>MainStoryboard_iPhone</string>
+ <key>UIMainStoryboardFile~ipad</key>
+ <string>MainStoryboard_iPad</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/tutorials/xcode iOS/Tutorial 3/Tutorial 3-Prefix.pch b/tutorials/xcode iOS/Tutorial 3/Tutorial 3-Prefix.pch
new file mode 100644
index 0000000..e41cee4
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Tutorial 3-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'Tutorial 3' target in the 'Tutorial 3' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 3/Ubuntu-R.ttf b/tutorials/xcode iOS/Tutorial 3/Ubuntu-R.ttf
new file mode 100644
index 0000000..45a038b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/Ubuntu-R.ttf
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 3/ViewController.h b/tutorials/xcode iOS/Tutorial 3/ViewController.h
new file mode 100644
index 0000000..677f65b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/ViewController.h
@@ -0,0 +1,21 @@
+#import <UIKit/UIKit.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface ViewController : UIViewController <GStreamerBackendDelegate> {
+ IBOutlet UILabel *message_label;
+ IBOutlet UIBarButtonItem *play_button;
+ IBOutlet UIBarButtonItem *pause_button;
+ IBOutlet UIView *video_view;
+ IBOutlet UIView *video_container_view;
+ IBOutlet NSLayoutConstraint *video_width_constraint;
+ IBOutlet NSLayoutConstraint *video_height_constraint;
+}
+
+-(IBAction) play:(id)sender;
+-(IBAction) pause:(id)sender;
+
+/* From GStreamerBackendDelegate */
+-(void) gstreamerInitialized;
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 3/ViewController.m b/tutorials/xcode iOS/Tutorial 3/ViewController.m
new file mode 100644
index 0000000..93eae20
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/ViewController.m
@@ -0,0 +1,88 @@
+#import "ViewController.h"
+#import "GStreamerBackend.h"
+#import <UIKit/UIKit.h>
+
+@interface ViewController () {
+ GStreamerBackend *gst_backend;
+ int media_width;
+ int media_height;
+}
+
+@end
+
+@implementation ViewController
+
+/*
+ * Methods from UIViewController
+ */
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ play_button.enabled = FALSE;
+ pause_button.enabled = FALSE;
+
+ /* Make these constant for now, later tutorials will change them */
+ media_width = 320;
+ media_height = 240;
+
+ gst_backend = [[GStreamerBackend alloc] init:self videoView:video_view];
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+/* Called when the Play button is pressed */
+-(IBAction) play:(id)sender
+{
+ [gst_backend play];
+}
+
+/* Called when the Pause button is pressed */
+-(IBAction) pause:(id)sender
+{
+ [gst_backend pause];
+}
+
+- (void)viewDidLayoutSubviews
+{
+ CGFloat view_width = video_container_view.bounds.size.width;
+ CGFloat view_height = video_container_view.bounds.size.height;
+
+ CGFloat correct_height = view_width * media_height / media_width;
+ CGFloat correct_width = view_height * media_width / media_height;
+
+ if (correct_height < view_height) {
+ video_height_constraint.constant = correct_height;
+ video_width_constraint.constant = view_width;
+ } else {
+ video_width_constraint.constant = correct_width;
+ video_height_constraint.constant = view_height;
+ }
+}
+
+/*
+ * Methods from GstreamerBackendDelegate
+ */
+
+-(void) gstreamerInitialized
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ play_button.enabled = TRUE;
+ pause_button.enabled = TRUE;
+ message_label.text = @"Ready";
+ });
+}
+
+-(void) gstreamerSetUIMessage:(NSString *)message
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ message_label.text = message;
+ });
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 3/en.lproj/InfoPlist.strings b/tutorials/xcode iOS/Tutorial 3/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPad.storyboard b/tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPad.storyboard
new file mode 100644
index 0000000..98d0b70
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPad.storyboard
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="z7O-8l-Zeo">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="P93-nn-HBJ">
+ <objects>
+ <viewController id="z7O-8l-Zeo" customClass="ViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="CqS-Gu-I1O">
+ <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xWd-bg-0b6" userLabel="VideoContainer">
+ <subviews>
+ <view contentMode="scaleAspectFit" translatesAutoresizingMaskIntoConstraints="NO" id="6tN-97-YoQ" userLabel="Video" customClass="EaglUIView">
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="240" type="user" id="A9A-eK-7QX"/>
+ <constraint firstAttribute="width" constant="320" type="user" id="xcj-6M-2KJ"/>
+ </constraints>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="centerY" secondItem="6tN-97-YoQ" secondAttribute="centerY" type="user" id="UYa-oM-cdf"/>
+ <constraint firstAttribute="centerX" secondItem="6tN-97-YoQ" secondAttribute="centerX" type="user" id="w9H-W0-MfF"/>
+ </constraints>
+ </view>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="728" translatesAutoresizingMaskIntoConstraints="NO" id="iLX-h1-Ko5" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="7Z8-1b-Y41"/>
+ <constraint firstAttribute="height" constant="21" type="user" id="jAS-RD-k2d"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUi-CE-Ydy">
+ <constraints>
+ <constraint firstAttribute="height" constant="44" type="user" id="EwL-Ma-A4v"/>
+ </constraints>
+ <items>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="onU-hf-FS4"/>
+ <barButtonItem systemItem="play" id="UlF-Ga-2VX">
+ <connections>
+ <action selector="play:" destination="z7O-8l-Zeo" id="5xC-uv-9lM"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="J3O-8j-Tkt">
+ <connections>
+ <action selector="pause:" destination="z7O-8l-Zeo" id="BYM-2X-Tel"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="urI-U7-ALw"/>
+ </items>
+ </toolbar>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="trailing" secondItem="CqS-Gu-I1O" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="4vm-hF-9E8"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="bottom" secondItem="MUi-CE-Ydy" secondAttribute="top" constant="8" symbolic="YES" type="user" id="FXP-eH-VSK"/>
+ <constraint firstItem="xWd-bg-0b6" firstAttribute="top" secondItem="CqS-Gu-I1O" secondAttribute="top" type="user" id="MXr-HK-07f"/>
+ <constraint firstAttribute="trailing" secondItem="xWd-bg-0b6" secondAttribute="trailing" type="user" id="NGT-7D-rHD"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="OM9-gE-OVP"/>
+ <constraint firstItem="xWd-bg-0b6" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" type="user" id="XO5-WJ-Y3R"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="top" secondItem="xWd-bg-0b6" secondAttribute="bottom" type="user" id="aP8-7M-Fq3"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="bT2-TE-X7Q"/>
+ <constraint firstAttribute="trailing" secondItem="iLX-h1-Ko5" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="ruI-5P-l7I"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="bottom" secondItem="CqS-Gu-I1O" secondAttribute="bottom" constant="20" symbolic="YES" type="user" id="w6K-xy-EJe"/>
+ </constraints>
+ </view>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics"/>
+ <connections>
+ <outlet property="message_label" destination="iLX-h1-Ko5" id="Q0Y-3J-zis"/>
+ <outlet property="pause_button" destination="J3O-8j-Tkt" id="Dls-sg-FPm"/>
+ <outlet property="play_button" destination="UlF-Ga-2VX" id="243-yq-GEe"/>
+ <outlet property="video_container_view" destination="xWd-bg-0b6" id="7dL-Mp-QGc"/>
+ <outlet property="video_height_constraint" destination="A9A-eK-7QX" id="rMe-ze-8l5"/>
+ <outlet property="video_view" destination="6tN-97-YoQ" id="Q0n-dR-hqv"/>
+ <outlet property="video_width_constraint" destination="xcj-6M-2KJ" id="oTt-9z-KCW"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iRS-GG-bR6" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="EaglUIView" superclassName="UIView">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EaglUIView.h"/>
+ </class>
+ <class className="ViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="pause:"/>
+ <relationship kind="action" name="play:"/>
+ <relationship kind="outlet" name="label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="message_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="pause_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="play_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="video_container_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_height_constraint" candidateClass="NSLayoutConstraint"/>
+ <relationship kind="outlet" name="video_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_width_constraint" candidateClass="NSLayoutConstraint"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPhone.storyboard b/tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPhone.storyboard
new file mode 100644
index 0000000..262d114
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/en.lproj/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="kYn-Hr-MJq">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="3nc-d3-XH9">
+ <objects>
+ <viewController id="kYn-Hr-MJq" customClass="ViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="JOS-rK-Hts">
+ <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0dR-Db-Wxo" userLabel="VideoContainer">
+ <subviews>
+ <view contentMode="scaleAspectFit" translatesAutoresizingMaskIntoConstraints="NO" id="YVj-fp-BtA" userLabel="Video" customClass="EaglUIView">
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="320" type="user" id="9zy-ya-q8u"/>
+ <constraint firstAttribute="height" constant="240" type="user" id="DNz-za-Lsb"/>
+ </constraints>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="centerY" secondItem="YVj-fp-BtA" secondAttribute="centerY" type="user" id="5B7-CE-mxw"/>
+ <constraint firstAttribute="centerX" secondItem="YVj-fp-BtA" secondAttribute="centerX" type="user" id="mCK-0x-q1w"/>
+ </constraints>
+ </view>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="8wd-E5-Owx" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="WIW-Im-XnF"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="o22-1p-nvT">
+ <items>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="BPU-1t-gy3"/>
+ <barButtonItem systemItem="play" id="6LZ-7a-xKf">
+ <connections>
+ <action selector="play:" destination="kYn-Hr-MJq" id="hIx-MW-CFA"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="bfY-YY-jiu">
+ <connections>
+ <action selector="pause:" destination="kYn-Hr-MJq" id="dQ5-mO-cMh"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="hSc-4x-myS"/>
+ </items>
+ </toolbar>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="8wd-E5-Owx" firstAttribute="bottom" secondItem="o22-1p-nvT" secondAttribute="top" constant="8" symbolic="YES" type="user" id="CHF-CI-6CL"/>
+ <constraint firstItem="8wd-E5-Owx" firstAttribute="top" secondItem="0dR-Db-Wxo" secondAttribute="bottom" type="user" id="IMP-UH-PGT"/>
+ <constraint firstItem="0dR-Db-Wxo" firstAttribute="trailing" secondItem="JOS-rK-Hts" secondAttribute="trailing" type="default" id="MMJ-ra-NNH"/>
+ <constraint firstAttribute="trailing" secondItem="8wd-E5-Owx" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="WDw-jT-tbz"/>
+ <constraint firstItem="o22-1p-nvT" firstAttribute="leading" secondItem="JOS-rK-Hts" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="Zvb-2h-v7A"/>
+ <constraint firstItem="0dR-Db-Wxo" firstAttribute="leading" secondItem="JOS-rK-Hts" secondAttribute="leading" type="user" id="bfN-MR-7nC"/>
+ <constraint firstItem="o22-1p-nvT" firstAttribute="bottom" secondItem="JOS-rK-Hts" secondAttribute="bottom" constant="20" symbolic="YES" type="user" id="l3D-e3-Z7R"/>
+ <constraint firstItem="8wd-E5-Owx" firstAttribute="leading" secondItem="JOS-rK-Hts" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="lwj-ty-IXl"/>
+ <constraint firstItem="o22-1p-nvT" firstAttribute="trailing" secondItem="JOS-rK-Hts" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="mL0-QH-ra6"/>
+ <constraint firstItem="0dR-Db-Wxo" firstAttribute="top" secondItem="JOS-rK-Hts" secondAttribute="top" type="user" id="qsc-BJ-NM7"/>
+ </constraints>
+ </view>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
+ <connections>
+ <outlet property="message_label" destination="8wd-E5-Owx" id="7Xw-cg-3hH"/>
+ <outlet property="pause_button" destination="bfY-YY-jiu" id="GBf-vm-mbR"/>
+ <outlet property="play_button" destination="6LZ-7a-xKf" id="Tk2-4w-9Px"/>
+ <outlet property="video_container_view" destination="0dR-Db-Wxo" id="buw-S2-Ctk"/>
+ <outlet property="video_view" destination="YVj-fp-BtA" id="Qk6-Be-oIR"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="25z-hu-OZW" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="EaglUIView" superclassName="UIView">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EaglUIView.h"/>
+ </class>
+ <class className="ViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="pause:"/>
+ <relationship kind="action" name="play:"/>
+ <relationship kind="outlet" name="label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="message_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="pause_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="play_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="video_container_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_height_constraint" candidateClass="NSLayoutConstraint"/>
+ <relationship kind="outlet" name="video_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_width_constraint" candidateClass="NSLayoutConstraint"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 3/fonts.conf b/tutorials/xcode iOS/Tutorial 3/fonts.conf
new file mode 100644
index 0000000..6b780ea
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/fonts.conf
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!-- Font directory list -->
+
+ <dir prefix="xdg"></dir>
+
+<!-- Font cache directory list -->
+
+ <cachedir prefix="xdg"></cachedir>
+
+<!--
+ Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>monospace</string>
+ </edit>
+ </match>
+
+<!--
+ Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans serif</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+ <config>
+<!--
+ These are the default Unicode chars that are expected to be blank
+ in fonts. All other blank chars are assumed to be broken and
+ won't appear in the resulting charsets
+ -->
+ <blank>
+ <int>0x0020</int> <!-- SPACE -->
+ <int>0x00A0</int> <!-- NO-BREAK SPACE -->
+ <int>0x00AD</int> <!-- SOFT HYPHEN -->
+ <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
+ <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
+ <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
+ <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
+ <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
+ <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
+ <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
+ <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
+ <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
+ <int>0x1680</int> <!-- OGHAM SPACE MARK -->
+ <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
+ <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
+ <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
+ <int>0x2000</int> <!-- EN QUAD -->
+ <int>0x2001</int> <!-- EM QUAD -->
+ <int>0x2002</int> <!-- EN SPACE -->
+ <int>0x2003</int> <!-- EM SPACE -->
+ <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
+ <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
+ <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
+ <int>0x2007</int> <!-- FIGURE SPACE -->
+ <int>0x2008</int> <!-- PUNCTUATION SPACE -->
+ <int>0x2009</int> <!-- THIN SPACE -->
+ <int>0x200A</int> <!-- HAIR SPACE -->
+ <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
+ <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
+ <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
+ <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
+ <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
+ <int>0x2028</int> <!-- LINE SEPARATOR -->
+ <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
+ <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
+ <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
+ <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
+ <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
+ <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
+ <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
+ <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
+ <int>0x2060</int> <!-- WORD JOINER -->
+ <int>0x2061</int> <!-- FUNCTION APPLICATION -->
+ <int>0x2062</int> <!-- INVISIBLE TIMES -->
+ <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
+ <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
+ <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
+ <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
+ <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
+ <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
+ <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
+ <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
+ <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
+ <int>0x3164</int> <!-- HANGUL FILLER -->
+ <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
+ <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
+ <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
+ <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+ <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+ </blank>
+<!--
+ Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+ <rescan>
+ <int>30</int>
+ </rescan>
+ </config>
+
+</fontconfig>
+
diff --git a/tutorials/xcode iOS/Tutorial 3/gst_ios_init.h b/tutorials/xcode iOS/Tutorial 3/gst_ios_init.h
new file mode 100644
index 0000000..f87cfe1
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/gst_ios_init.h
@@ -0,0 +1,39 @@
+#ifndef __GST_IOS_INIT_H__
+#define __GST_IOS_INIT_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_G_IO_MODULE_DECLARE(name) \
+extern void G_PASTE(g_io_module_, G_PASTE(name, _load_static)) (void)
+
+#define GST_G_IO_MODULE_LOAD(name) \
+G_PASTE(g_io_module_, G_PASTE(name, _load_static)) ()
+
+/* Uncomment each line to enable the plugin categories that your application needs.
+ * You can also enable individual plugins. See gst_ios_init.c to see their names
+ */
+
+#define GST_IOS_PLUGINS_CORE
+//#define GST_IOS_PLUGINS_CAPTURE
+//#define GST_IOS_PLUGINS_CODECS_RESTRICTED
+//#define GST_IOS_PLUGINS_ENCODING
+//#define GST_IOS_PLUGINS_CODECS_GPL
+//#define GST_IOS_PLUGINS_NET_RESTRICTED
+#define GST_IOS_PLUGINS_SYS
+//#define GST_IOS_PLUGINS_VIS
+//#define GST_IOS_PLUGINS_PLAYBACK
+#define GST_IOS_PLUGINS_EFFECTS
+//#define GST_IOS_PLUGINS_CODECS
+//#define GST_IOS_PLUGINS_NET
+//#define GST_IOS_PLUGINS_EDITING
+
+
+//#define GST_IOS_GIO_MODULE_GNUTLS
+
+void gst_ios_init ();
+
+G_END_DECLS
+
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 3/gst_ios_init.m b/tutorials/xcode iOS/Tutorial 3/gst_ios_init.m
new file mode 100644
index 0000000..403f9f9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/gst_ios_init.m
@@ -0,0 +1,988 @@
+#include "gst_ios_init.h"
+
+#if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+GST_PLUGIN_STATIC_DECLARE(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+GST_PLUGIN_STATIC_DECLARE(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+GST_PLUGIN_STATIC_DECLARE(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+GST_PLUGIN_STATIC_DECLARE(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+GST_PLUGIN_STATIC_DECLARE(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ #include <gio/gio.h>
+ GST_G_IO_MODULE_DECLARE(gnutls);
+#endif
+
+void
+gst_ios_init (void)
+{
+ GstPluginFeature *plugin;
+ GstRegistry *reg;
+ NSString *resources = [[NSBundle mainBundle] resourcePath];
+ NSString *tmp = NSTemporaryDirectory();
+ NSString *cache = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
+ NSString *docs = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
+
+ const gchar *resources_dir = [resources UTF8String];
+ const gchar *tmp_dir = [tmp UTF8String];
+ const gchar *cache_dir = [cache UTF8String];
+ const gchar *docs_dir = [docs UTF8String];
+ gchar *ca_certificates;
+
+ g_setenv ("TMP", tmp_dir, TRUE);
+ g_setenv ("TEMP", tmp_dir, TRUE);
+ g_setenv ("TMPDIR", tmp_dir, TRUE);
+ g_setenv ("XDG_RUNTIME_DIR", resources_dir, TRUE);
+ g_setenv ("XDG_CACHE_HOME", cache_dir, TRUE);
+
+ g_setenv ("HOME", docs_dir, TRUE);
+ g_setenv ("XDG_DATA_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_HOME", cache_dir, TRUE);
+ g_setenv ("XDG_DATA_HOME", resources_dir, TRUE);
+ g_setenv ("FONTCONFIG_PATH", resources_dir, TRUE);
+
+ ca_certificates = g_build_filename (resources_dir, "ssl", "certs", "ca-certifcates.crt", NULL);
+ g_setenv ("CA_CERTIFICATES", ca_certificates, TRUE);
+ g_free (ca_certificates);
+
+ gst_init (NULL, NULL);
+
+ #if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+ GST_PLUGIN_STATIC_REGISTER(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+ GST_PLUGIN_STATIC_REGISTER(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+ GST_PLUGIN_STATIC_REGISTER(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+ GST_PLUGIN_STATIC_REGISTER(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+ GST_PLUGIN_STATIC_REGISTER(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ GST_G_IO_MODULE_LOAD(gnutls);
+#endif
+
+ /* Lower the ranks of filesrc and giosrc so iosavassetsrc is
+ * tried first in gst_element_make_from_uri() for file:// */
+ reg = gst_registry_get();
+ plugin = gst_registry_lookup_feature(reg, "filesrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY);
+ plugin = gst_registry_lookup_feature(reg, "giosrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY-1);
+}
diff --git a/tutorials/xcode iOS/Tutorial 3/main.m b/tutorials/xcode iOS/Tutorial 3/main.m
new file mode 100644
index 0000000..6cf4e0f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 3/main.m
@@ -0,0 +1,12 @@
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+#include "gst_ios_init.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ gst_ios_init();
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/tutorials/xcode iOS/Tutorial 4/AppDelegate.h b/tutorials/xcode iOS/Tutorial 4/AppDelegate.h
new file mode 100644
index 0000000..a5a8b38
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/AppDelegate.h
@@ -0,0 +1,7 @@
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 4/AppDelegate.m b/tutorials/xcode iOS/Tutorial 4/AppDelegate.m
new file mode 100644
index 0000000..31ef04e
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/AppDelegate.m
@@ -0,0 +1,38 @@
+#import "AppDelegate.h"
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ // Override point for customization after application launch.
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 4/Default-568h@2x.png b/tutorials/xcode iOS/Tutorial 4/Default-568h@2x.png
new file mode 100644
index 0000000..0891b7a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Default-568h@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/Default.png b/tutorials/xcode iOS/Tutorial 4/Default.png
new file mode 100644
index 0000000..4c8ca6f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Default.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/Default@2x.png b/tutorials/xcode iOS/Tutorial 4/Default@2x.png
new file mode 100644
index 0000000..35b84cf
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Default@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/EaglUIVIew.h b/tutorials/xcode iOS/Tutorial 4/EaglUIVIew.h
new file mode 100644
index 0000000..ac4e798
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/EaglUIVIew.h
@@ -0,0 +1,11 @@
+#import <Foundation/Foundation.h>
+#import <QuartzCore/QuartzCore.h>
+#include <OpenGLES/ES2/gl.h>
+#include <OpenGLES/ES2/glext.h>
+
+@interface EaglUIView : UIView
+{
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 4/EaglUIVIew.m b/tutorials/xcode iOS/Tutorial 4/EaglUIVIew.m
new file mode 100644
index 0000000..91cdd9d
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/EaglUIVIew.m
@@ -0,0 +1,13 @@
+#import "EaglUIVIew.h"
+
+#import <QuartzCore/QuartzCore.h>
+
+@implementation EaglUIView
+
+
++ (Class) layerClass
+{
+ return [CAEAGLLayer class];
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 4/GStreamerBackend.h b/tutorials/xcode iOS/Tutorial 4/GStreamerBackend.h
new file mode 100644
index 0000000..f16ea70
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/GStreamerBackend.h
@@ -0,0 +1,28 @@
+#import <Foundation/Foundation.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface GStreamerBackend : NSObject
+
+/* Initialization method. Pass the delegate that will take care of the UI.
+ * This delegate must implement the GStreamerBackendDelegate protocol.
+ * Pass also the UIView object that will hold the video window. */
+-(id) init:(id) uiDelegate videoView:(UIView*) video_view;
+
+/* Quit the main loop and free all resources, including the pipeline and
+ * the references to the ui delegate and the UIView used for rendering, so
+ * these objects can be deallocated. */
+-(void) deinit;
+
+/* Set the pipeline to PLAYING */
+-(void) play;
+
+/* Set the pipeline to PAUSED */
+-(void) pause;
+
+/* Set the URI to be played */
+-(void) setUri:(NSString*)uri;
+
+/* Set the position to seek to, in milliseconds */
+-(void) setPosition:(NSInteger)milliseconds;
+
+@end \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 4/GStreamerBackend.m b/tutorials/xcode iOS/Tutorial 4/GStreamerBackend.m
new file mode 100644
index 0000000..c6170bc
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/GStreamerBackend.m
@@ -0,0 +1,387 @@
+#import "GStreamerBackend.h"
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+/* Do not allow seeks to be performed closer than this distance. It is visually useless, and will probably
+ * confuse some demuxers. */
+#define SEEK_MIN_DELAY (500 * GST_MSECOND)
+
+@interface GStreamerBackend()
+-(void)setUIMessage:(gchar*) message;
+-(void)app_function;
+-(void)check_initialization_complete;
+@end
+
+@implementation GStreamerBackend {
+ id ui_delegate; /* Class that we use to interact with the user interface */
+ GstElement *pipeline; /* The running pipeline */
+ GstElement *video_sink; /* The video sink element which receives XOverlay commands */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+ UIView *ui_video_view; /* UIView that holds the video */
+ GstState state; /* Current pipeline state */
+ GstState target_state; /* Desired pipeline state, to be set once buffering is complete */
+ gint64 duration; /* Cached clip duration */
+ gint64 desired_position; /* Position to seek to, once the pipeline is running */
+ GstClockTime last_seek_time; /* For seeking overflow prevention (throttling) */
+ gboolean is_live; /* Live streams do not use buffering */
+}
+
+/*
+ * Interface methods
+ */
+
+-(id) init:(id) uiDelegate videoView:(UIView *)video_view
+{
+ if (self = [super init])
+ {
+ self->ui_delegate = uiDelegate;
+ self->ui_video_view = video_view;
+ self->duration = GST_CLOCK_TIME_NONE;
+
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-4", 0, "iOS tutorial 4");
+ gst_debug_set_threshold_for_name("tutorial-4", GST_LEVEL_DEBUG);
+
+ /* Start the bus monitoring task */
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [self app_function];
+ });
+ }
+
+ return self;
+}
+
+-(void) deinit
+{
+ if (main_loop) {
+ g_main_loop_quit(main_loop);
+ }
+}
+
+-(void) play
+{
+ target_state = GST_STATE_PLAYING;
+ is_live = (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+-(void) pause
+{
+ target_state = GST_STATE_PAUSED;
+ is_live = (gst_element_set_state (pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+-(void) setUri:(NSString*)uri
+{
+ const char *char_uri = [uri UTF8String];
+ g_object_set(pipeline, "uri", char_uri, NULL);
+ GST_DEBUG ("URI set to %s", char_uri);
+}
+
+-(void) setPosition:(NSInteger)milliseconds
+{
+ gint64 position = (gint64)(milliseconds * GST_MSECOND);
+ if (state >= GST_STATE_PAUSED) {
+ execute_seek(position, self);
+ } else {
+ GST_DEBUG ("Scheduling seek to %" GST_TIME_FORMAT " for later", GST_TIME_ARGS (position));
+ self->desired_position = position;
+ }
+}
+
+/*
+ * Private methods
+ */
+
+/* Change the message on the UI through the UI delegate */
+-(void)setUIMessage:(gchar*) message
+{
+ NSString *string = [NSString stringWithUTF8String:message];
+ if(ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerSetUIMessage:)])
+ {
+ [ui_delegate gstreamerSetUIMessage:string];
+ }
+}
+
+/* Tell the application what is the current position and clip duration */
+-(void) setCurrentUIPosition:(gint)pos duration:(gint)dur
+{
+ if(ui_delegate && [ui_delegate respondsToSelector:@selector(setCurrentPosition:duration:)])
+ {
+ [ui_delegate setCurrentPosition:pos duration:dur];
+ }
+}
+
+/* If we have pipeline and it is running, query the current position and clip duration and inform
+ * the application */
+static gboolean refresh_ui (GStreamerBackend *self) {
+ gint64 position;
+
+ /* We do not want to update anything unless we have a working pipeline in the PAUSED or PLAYING state */
+ if (!self || !self->pipeline || self->state < GST_STATE_PAUSED)
+ return TRUE;
+
+ /* If we didn't know it yet, query the stream duration */
+ if (!GST_CLOCK_TIME_IS_VALID (self->duration)) {
+ gst_element_query_duration (self->pipeline, GST_FORMAT_TIME, &self->duration);
+ }
+
+ if (gst_element_query_position (self->pipeline, GST_FORMAT_TIME, &position)) {
+ /* The UI expects these values in milliseconds, and GStreamer provides nanoseconds */
+ [self setCurrentUIPosition:position / GST_MSECOND duration:self->duration / GST_MSECOND];
+ }
+ return TRUE;
+}
+
+/* Forward declaration for the delayed seek callback */
+static gboolean delayed_seek_cb (GStreamerBackend *self);
+
+/* Perform seek, if we are not too close to the previous seek. Otherwise, schedule the seek for
+ * some time in the future. */
+static void execute_seek (gint64 position, GStreamerBackend *self) {
+ gint64 diff;
+
+ if (position == GST_CLOCK_TIME_NONE)
+ return;
+
+ diff = gst_util_get_timestamp () - self->last_seek_time;
+
+ if (GST_CLOCK_TIME_IS_VALID (self->last_seek_time) && diff < SEEK_MIN_DELAY) {
+ /* The previous seek was too close, delay this one */
+ GSource *timeout_source;
+
+ if (self->desired_position == GST_CLOCK_TIME_NONE) {
+ /* There was no previous seek scheduled. Setup a timer for some time in the future */
+ timeout_source = g_timeout_source_new ((SEEK_MIN_DELAY - diff) / GST_MSECOND);
+ g_source_set_callback (timeout_source, (GSourceFunc)delayed_seek_cb, (__bridge void *)self, NULL);
+ g_source_attach (timeout_source, self->context);
+ g_source_unref (timeout_source);
+ }
+ /* Update the desired seek position. If multiple requests are received before it is time
+ * to perform a seek, only the last one is remembered. */
+ self->desired_position = position;
+ GST_DEBUG ("Throttling seek to %" GST_TIME_FORMAT ", will be in %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (position), GST_TIME_ARGS (SEEK_MIN_DELAY - diff));
+ } else {
+ /* Perform the seek now */
+ GST_DEBUG ("Seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+ self->last_seek_time = gst_util_get_timestamp ();
+ gst_element_seek_simple (self->pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, position);
+ self->desired_position = GST_CLOCK_TIME_NONE;
+ }
+}
+
+/* Delayed seek callback. This gets called by the timer setup in the above function. */
+static gboolean delayed_seek_cb (GStreamerBackend *self) {
+ GST_DEBUG ("Doing delayed seek to %" GST_TIME_FORMAT, GST_TIME_ARGS (self->desired_position));
+ execute_seek (self->desired_position, self);
+ return FALSE;
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ [self setUIMessage:message_string];
+ g_free (message_string);
+ gst_element_set_state (self->pipeline, GST_STATE_NULL);
+}
+
+/* Called when the End Of the Stream is reached. Just move to the beginning of the media and pause. */
+static void eos_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ self->target_state = GST_STATE_PAUSED;
+ self->is_live = (gst_element_set_state (self->pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+ execute_seek (0, self);
+}
+
+/* Called when the duration of the media changes. Just mark it as unknown, so we re-query it in the next UI refresh. */
+static void duration_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ self->duration = GST_CLOCK_TIME_NONE;
+}
+
+/* Called when buffering messages are received. We inform the UI about the current buffering level and
+ * keep the pipeline paused until 100% buffering is reached. At that point, set the desired state. */
+static void buffering_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ gint percent;
+
+ if (self->is_live)
+ return;
+
+ gst_message_parse_buffering (msg, &percent);
+ if (percent < 100 && self->target_state >= GST_STATE_PAUSED) {
+ gchar * message_string = g_strdup_printf ("Buffering %d%%", percent);
+ gst_element_set_state (self->pipeline, GST_STATE_PAUSED);
+ [self setUIMessage:message_string];
+ g_free (message_string);
+ } else if (self->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (self->pipeline, GST_STATE_PLAYING);
+ } else if (self->target_state >= GST_STATE_PAUSED) {
+ [self setUIMessage:"Buffering complete"];
+ }
+}
+
+/* Called when the clock is lost */
+static void clock_lost_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ if (self->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (self->pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (self->pipeline, GST_STATE_PLAYING);
+ }
+}
+
+/* Retrieve the video sink's Caps and tell the application about the media size */
+static void check_media_size (GStreamerBackend *self) {
+ GstElement *video_sink;
+ GstPad *video_sink_pad;
+ GstCaps *caps;
+ GstVideoInfo info;
+
+ /* Retrieve the Caps at the entrance of the video sink */
+ g_object_get (self->pipeline, "video-sink", &video_sink, NULL);
+
+ /* Do nothing if there is no video sink (this might be an audio-only clip */
+ if (!video_sink) return;
+
+ video_sink_pad = gst_element_get_static_pad (video_sink, "sink");
+ caps = gst_pad_get_current_caps (video_sink_pad);
+
+ if (gst_video_info_from_caps (&info, caps)) {
+ info.width = info.width * info.par_n / info.par_d;
+ GST_DEBUG ("Media size is %dx%d, notifying application", info.width, info.height);
+
+ if (self->ui_delegate && [self->ui_delegate respondsToSelector:@selector(mediaSizeChanged:height:)])
+ {
+ [self->ui_delegate mediaSizeChanged:info.width height:info.height];
+ }
+ }
+
+ gst_caps_unref(caps);
+ gst_object_unref (video_sink_pad);
+ gst_object_unref(video_sink);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (self->pipeline)) {
+ self->state = new_state;
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ [self setUIMessage:message];
+ g_free (message);
+
+ if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED)
+ {
+ check_media_size(self);
+
+ /* If there was a scheduled seek, perform it now that we have moved to the Paused state */
+ if (GST_CLOCK_TIME_IS_VALID (self->desired_position))
+ execute_seek (self->desired_position, self);
+ }
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+-(void) check_initialization_complete
+{
+ if (!initialized && main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application.");
+ if (ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerInitialized)])
+ {
+ [ui_delegate gstreamerInitialized];
+ }
+ initialized = TRUE;
+ }
+}
+
+/* Main method for the bus monitoring code */
+-(void) app_function
+{
+ GstBus *bus;
+ GSource *timeout_source;
+ GSource *bus_source;
+ GError *error = NULL;
+
+ GST_DEBUG ("Creating pipeline");
+
+ /* Create our own GLib Main Context and make it the default one */
+ context = g_main_context_new ();
+ g_main_context_push_thread_default(context);
+
+ /* Build pipeline */
+ pipeline = gst_parse_launch("playbin", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ [self setUIMessage:message];
+ g_free (message);
+ return;
+ }
+
+ /* Set the pipeline to READY, so it can already accept a window handle */
+ gst_element_set_state(pipeline, GST_STATE_READY);
+
+ video_sink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
+ if (!video_sink) {
+ GST_ERROR ("Could not retrieve video sink");
+ return;
+ }
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(video_sink), (guintptr) (id) ui_video_view);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::eos", (GCallback)eos_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::duration", (GCallback)duration_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::buffering", (GCallback)buffering_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::clock-lost", (GCallback)clock_lost_cb, (__bridge void *)self);
+ gst_object_unref (bus);
+
+ /* Register a function that GLib will call 4 times per second */
+ timeout_source = g_timeout_source_new (250);
+ g_source_set_callback (timeout_source, (GSourceFunc)refresh_ui, (__bridge void *)self, NULL);
+ g_source_attach (timeout_source, context);
+ g_source_unref (timeout_source);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop...");
+ main_loop = g_main_loop_new (context, FALSE);
+ [self check_initialization_complete];
+ g_main_loop_run (main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (main_loop);
+ main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(context);
+ g_main_context_unref (context);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ pipeline = NULL;
+
+ ui_delegate = NULL;
+ ui_video_view = NULL;
+
+ return;
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 4/GStreamerBackendDelegate.h b/tutorials/xcode iOS/Tutorial 4/GStreamerBackendDelegate.h
new file mode 100644
index 0000000..01981fa
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/GStreamerBackendDelegate.h
@@ -0,0 +1,20 @@
+#import <Foundation/Foundation.h>
+
+@protocol GStreamerBackendDelegate <NSObject>
+
+@optional
+/* Called when the GStreamer backend has finished initializing
+ * and is ready to accept orders. */
+-(void) gstreamerInitialized;
+
+/* Called when the GStreamer backend wants to output some message
+ * to the screen. */
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+/* Called when the media size is first discovered or it changes */
+-(void) mediaSizeChanged:(NSInteger)width height:(NSInteger)height;
+
+/* Called when the media position changes. Times in milliseconds */
+-(void) setCurrentPosition:(NSInteger)position duration:(NSInteger)duration;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad.png b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad.png
new file mode 100755
index 0000000..ceea35d
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad@2x.png b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad@2x.png
new file mode 100755
index 0000000..9613a6f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPad@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone.png b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone.png
new file mode 100755
index 0000000..6535733
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone@2x.png b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone@2x.png
new file mode 100755
index 0000000..06fa7eb
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Images/appicon-4-iPhone@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/Tutorial 4-Info.plist b/tutorials/xcode iOS/Tutorial 4/Tutorial 4-Info.plist
new file mode 100644
index 0000000..548df05
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Tutorial 4-Info.plist
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIcons</key>
+ <dict>
+ <key>CFBundlePrimaryIcon</key>
+ <dict>
+ <key>CFBundleIconFiles</key>
+ <array>
+ <string>appicon-4-iPhone.png</string>
+ <string>appicon-4-iPhone@2x.png</string>
+ <string>appicon-4-iPad.png</string>
+ <string>appicon-4-iPad@2x.png</string>
+ </array>
+ </dict>
+ </dict>
+ <key>CFBundleIdentifier</key>
+ <string>gstreamer-sdk.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIFileSharingEnabled</key>
+ <true/>
+ <key>UIMainStoryboardFile</key>
+ <string>MainStoryboard_iPhone</string>
+ <key>UIMainStoryboardFile~ipad</key>
+ <string>MainStoryboard_iPad</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/tutorials/xcode iOS/Tutorial 4/Tutorial 4-Prefix.pch b/tutorials/xcode iOS/Tutorial 4/Tutorial 4-Prefix.pch
new file mode 100644
index 0000000..9288e96
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Tutorial 4-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'Tutorial 4' target in the 'Tutorial 4' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 4/Ubuntu-R.ttf b/tutorials/xcode iOS/Tutorial 4/Ubuntu-R.ttf
new file mode 100644
index 0000000..45a038b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/Ubuntu-R.ttf
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 4/VideoViewController.h b/tutorials/xcode iOS/Tutorial 4/VideoViewController.h
new file mode 100644
index 0000000..5935306
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/VideoViewController.h
@@ -0,0 +1,29 @@
+#import <UIKit/UIKit.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface VideoViewController : UIViewController <GStreamerBackendDelegate> {
+ IBOutlet UILabel *message_label;
+ IBOutlet UIBarButtonItem *play_button;
+ IBOutlet UIBarButtonItem *pause_button;
+ IBOutlet UIView *video_view;
+ IBOutlet UIView *video_container_view;
+ IBOutlet NSLayoutConstraint *video_width_constraint;
+ IBOutlet NSLayoutConstraint *video_height_constraint;
+ IBOutlet UIToolbar *toolbar;
+ IBOutlet UITextField *time_label;
+ IBOutlet UISlider *time_slider;
+}
+
+@property (retain,nonatomic) NSString *uri;
+
+-(IBAction) play:(id)sender;
+-(IBAction) pause:(id)sender;
+-(IBAction) sliderValueChanged:(id)sender;
+-(IBAction) sliderTouchDown:(id)sender;
+-(IBAction) sliderTouchUp:(id)sender;
+
+/* From GStreamerBackendDelegate */
+-(void) gstreamerInitialized;
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 4/VideoViewController.m b/tutorials/xcode iOS/Tutorial 4/VideoViewController.m
new file mode 100644
index 0000000..b213a00
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/VideoViewController.m
@@ -0,0 +1,196 @@
+#import "VideoViewController.h"
+#import "GStreamerBackend.h"
+#import <UIKit/UIKit.h>
+
+@interface VideoViewController () {
+ GStreamerBackend *gst_backend;
+ int media_width; /* Width of the clip */
+ int media_height; /* height of the clip */
+ Boolean dragging_slider; /* Whether the time slider is being dragged or not */
+ Boolean is_local_media; /* Whether this clip is stored locally or is being streamed */
+ Boolean is_playing_desired; /* Whether the user asked to go to PLAYING */
+}
+
+@end
+
+@implementation VideoViewController
+
+@synthesize uri;
+
+/*
+ * Private methods
+ */
+
+/* The text widget acts as an slave for the seek bar, so it reflects what the seek bar shows, whether
+ * it is an actual pipeline position or the position the user is currently dragging to. */
+- (void) updateTimeWidget
+{
+ NSInteger position = time_slider.value / 1000;
+ NSInteger duration = time_slider.maximumValue / 1000;
+ NSString *position_txt = @" -- ";
+ NSString *duration_txt = @" -- ";
+
+ if (duration > 0) {
+ NSUInteger hours = duration / (60 * 60);
+ NSUInteger minutes = (duration / 60) % 60;
+ NSUInteger seconds = duration % 60;
+
+ duration_txt = [NSString stringWithFormat:@"%02u:%02u:%02u", hours, minutes, seconds];
+ }
+ if (position > 0) {
+ NSUInteger hours = position / (60 * 60);
+ NSUInteger minutes = (position / 60) % 60;
+ NSUInteger seconds = position % 60;
+
+ position_txt = [NSString stringWithFormat:@"%02u:%02u:%02u", hours, minutes, seconds];
+ }
+
+ NSString *text = [NSString stringWithFormat:@"%@ / %@",
+ position_txt, duration_txt];
+
+ time_label.text = text;
+}
+
+/*
+ * Methods from UIViewController
+ */
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ play_button.enabled = FALSE;
+ pause_button.enabled = FALSE;
+
+ /* As soon as the GStreamer backend knows the real values, these ones will be replaced */
+ media_width = 320;
+ media_height = 240;
+
+ uri = @"https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.ogv";
+
+ gst_backend = [[GStreamerBackend alloc] init:self videoView:video_view];
+}
+
+- (void)viewDidDisappear:(BOOL)animated
+{
+ if (gst_backend)
+ {
+ [gst_backend deinit];
+ }
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+/* Called when the Play button is pressed */
+-(IBAction) play:(id)sender
+{
+ [gst_backend play];
+ is_playing_desired = YES;
+}
+
+/* Called when the Pause button is pressed */
+-(IBAction) pause:(id)sender
+{
+ [gst_backend pause];
+ is_playing_desired = NO;
+}
+
+/* Called when the time slider position has changed, either because the user dragged it or
+ * we programmatically changed its position. dragging_slider tells us which one happened */
+- (IBAction)sliderValueChanged:(id)sender {
+ if (!dragging_slider) return;
+ // If this is a local file, allow scrub seeking, this is, seek as soon as the slider is moved.
+ if (is_local_media)
+ [gst_backend setPosition:time_slider.value];
+ [self updateTimeWidget];
+}
+
+/* Called when the user starts to drag the time slider */
+- (IBAction)sliderTouchDown:(id)sender {
+ [gst_backend pause];
+ dragging_slider = YES;
+}
+
+/* Called when the user stops dragging the time slider */
+- (IBAction)sliderTouchUp:(id)sender {
+ dragging_slider = NO;
+ // If this is a remote file, scrub seeking is probably not going to work smoothly enough.
+ // Therefore, perform only the seek when the slider is released.
+ if (!is_local_media)
+ [gst_backend setPosition:time_slider.value];
+ if (is_playing_desired)
+ [gst_backend play];
+}
+
+/* Called when the size of the main view has changed, so we can
+ * resize the sub-views in ways not allowed by storyboarding. */
+- (void)viewDidLayoutSubviews
+{
+ CGFloat view_width = video_container_view.bounds.size.width;
+ CGFloat view_height = video_container_view.bounds.size.height;
+
+ CGFloat correct_height = view_width * media_height / media_width;
+ CGFloat correct_width = view_height * media_width / media_height;
+
+ if (correct_height < view_height) {
+ video_height_constraint.constant = correct_height;
+ video_width_constraint.constant = view_width;
+ } else {
+ video_width_constraint.constant = correct_width;
+ video_height_constraint.constant = view_height;
+ }
+
+ time_slider.frame = CGRectMake(time_slider.frame.origin.x, time_slider.frame.origin.y, toolbar.frame.size.width - time_slider.frame.origin.x - 8, time_slider.frame.size.height);
+}
+
+/*
+ * Methods from GstreamerBackendDelegate
+ */
+
+-(void) gstreamerInitialized
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ play_button.enabled = TRUE;
+ pause_button.enabled = TRUE;
+ message_label.text = @"Ready";
+ [gst_backend setUri:uri];
+ is_local_media = [uri hasPrefix:@"file://"];
+ is_playing_desired = NO;
+ });
+}
+
+-(void) gstreamerSetUIMessage:(NSString *)message
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ message_label.text = message;
+ });
+}
+
+-(void) mediaSizeChanged:(NSInteger)width height:(NSInteger)height
+{
+ media_width = width;
+ media_height = height;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [self viewDidLayoutSubviews];
+ [video_view setNeedsLayout];
+ [video_view layoutIfNeeded];
+ });
+}
+
+-(void) setCurrentPosition:(NSInteger)position duration:(NSInteger)duration
+{
+ /* Ignore messages from the pipeline if the time sliders is being dragged */
+ if (dragging_slider) return;
+
+ dispatch_async(dispatch_get_main_queue(), ^{
+ time_slider.maximumValue = duration;
+ time_slider.value = position;
+ [self updateTimeWidget];
+ });
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 4/en.lproj/InfoPlist.strings b/tutorials/xcode iOS/Tutorial 4/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPad.storyboard b/tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPad.storyboard
new file mode 100644
index 0000000..5507fda
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPad.storyboard
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="z7O-8l-Zeo">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--VideoViewController-->
+ <scene sceneID="P93-nn-HBJ">
+ <objects>
+ <viewController title="Playback" id="z7O-8l-Zeo" userLabel="VideoViewController" customClass="VideoViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="CqS-Gu-I1O">
+ <rect key="frame" x="0.0" y="20" width="768" height="1004"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xWd-bg-0b6" userLabel="VideoContainer">
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6tN-97-YoQ" userLabel="Video" customClass="EaglUIView">
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="240" type="user" id="A9A-eK-7QX"/>
+ <constraint firstAttribute="width" constant="320" type="user" id="xcj-6M-2KJ"/>
+ </constraints>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="centerY" secondItem="6tN-97-YoQ" secondAttribute="centerY" type="user" id="UYa-oM-cdf"/>
+ <constraint firstAttribute="centerX" secondItem="6tN-97-YoQ" secondAttribute="centerX" type="user" id="w9H-W0-MfF"/>
+ </constraints>
+ </view>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="728" translatesAutoresizingMaskIntoConstraints="NO" id="iLX-h1-Ko5" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="7Z8-1b-Y41"/>
+ <constraint firstAttribute="height" constant="21" type="user" id="jAS-RD-k2d"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUi-CE-Ydy">
+ <constraints>
+ <constraint firstAttribute="height" constant="44" type="user" id="EwL-Ma-A4v"/>
+ </constraints>
+ <items>
+ <barButtonItem systemItem="play" id="UlF-Ga-2VX">
+ <connections>
+ <action selector="play:" destination="z7O-8l-Zeo" id="5xC-uv-9lM"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="J3O-8j-Tkt">
+ <connections>
+ <action selector="pause:" destination="z7O-8l-Zeo" id="BYM-2X-Tel"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" id="s39-nx-e0L">
+ <textField key="customView" opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="00:00:00 / 00:00:00" borderStyle="roundedRect" textAlignment="center" minimumFontSize="17" id="G8q-Tu-Qx0" userLabel="Time">
+ <rect key="frame" x="90" y="7" width="140" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits"/>
+ </textField>
+ </barButtonItem>
+ <barButtonItem style="plain" id="2n0-TO-8Ss">
+ <slider key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" id="ufs-E5-87w" userLabel="Slider">
+ <rect key="frame" x="240" y="11" width="118" height="23"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <connections>
+ <action selector="sliderTouchDown:" destination="z7O-8l-Zeo" eventType="touchDown" id="yV6-eN-VUb"/>
+ <action selector="sliderTouchUp:" destination="z7O-8l-Zeo" eventType="touchCancel" id="OyS-WZ-sEk"/>
+ <action selector="sliderTouchUp:" destination="z7O-8l-Zeo" eventType="touchUpOutside" id="Vfz-se-pJg"/>
+ <action selector="sliderTouchUp:" destination="z7O-8l-Zeo" eventType="touchUpInside" id="kZF-uW-GRo"/>
+ <action selector="sliderValueChanged:" destination="z7O-8l-Zeo" eventType="valueChanged" id="cwm-pm-BfT"/>
+ </connections>
+ </slider>
+ </barButtonItem>
+ </items>
+ </toolbar>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="trailing" secondItem="CqS-Gu-I1O" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="4vm-hF-9E8"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="bottom" secondItem="MUi-CE-Ydy" secondAttribute="top" constant="8" symbolic="YES" type="user" id="FXP-eH-VSK"/>
+ <constraint firstItem="xWd-bg-0b6" firstAttribute="top" secondItem="CqS-Gu-I1O" secondAttribute="top" type="user" id="MXr-HK-07f"/>
+ <constraint firstAttribute="trailing" secondItem="xWd-bg-0b6" secondAttribute="trailing" type="user" id="NGT-7D-rHD"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="OM9-gE-OVP"/>
+ <constraint firstItem="xWd-bg-0b6" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" type="user" id="XO5-WJ-Y3R"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="top" secondItem="xWd-bg-0b6" secondAttribute="bottom" type="user" id="aP8-7M-Fq3"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="bT2-TE-X7Q"/>
+ <constraint firstAttribute="trailing" secondItem="iLX-h1-Ko5" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="ruI-5P-l7I"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="bottom" secondItem="CqS-Gu-I1O" secondAttribute="bottom" constant="20" symbolic="YES" type="user" id="w6K-xy-EJe"/>
+ </constraints>
+ </view>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics"/>
+ <connections>
+ <outlet property="message_label" destination="iLX-h1-Ko5" id="Q0Y-3J-zis"/>
+ <outlet property="pause_button" destination="J3O-8j-Tkt" id="Dls-sg-FPm"/>
+ <outlet property="play_button" destination="UlF-Ga-2VX" id="243-yq-GEe"/>
+ <outlet property="time_label" destination="G8q-Tu-Qx0" id="jpR-6u-zp0"/>
+ <outlet property="time_slider" destination="ufs-E5-87w" id="ZUd-jO-4qN"/>
+ <outlet property="toolbar" destination="MUi-CE-Ydy" id="Lme-0P-4Xq"/>
+ <outlet property="video_container_view" destination="xWd-bg-0b6" id="7dL-Mp-QGc"/>
+ <outlet property="video_height_constraint" destination="A9A-eK-7QX" id="rMe-ze-8l5"/>
+ <outlet property="video_view" destination="6tN-97-YoQ" id="Q0n-dR-hqv"/>
+ <outlet property="video_width_constraint" destination="xcj-6M-2KJ" id="oTt-9z-KCW"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iRS-GG-bR6" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="439" y="-199"/>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="EaglUIView" superclassName="UIView">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EaglUIView.h"/>
+ </class>
+ <class className="VideoViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/VideoViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="pause:"/>
+ <relationship kind="action" name="play:"/>
+ <relationship kind="action" name="sliderTouchDown:"/>
+ <relationship kind="action" name="sliderTouchUp:"/>
+ <relationship kind="action" name="sliderValueChanged:"/>
+ <relationship kind="outlet" name="message_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="pause_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="play_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="time_label" candidateClass="UITextField"/>
+ <relationship kind="outlet" name="time_slider" candidateClass="UISlider"/>
+ <relationship kind="outlet" name="toolbar" candidateClass="UIToolbar"/>
+ <relationship kind="outlet" name="video_container_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_height_constraint" candidateClass="NSLayoutConstraint"/>
+ <relationship kind="outlet" name="video_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_width_constraint" candidateClass="NSLayoutConstraint"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPhone.storyboard b/tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPhone.storyboard
new file mode 100644
index 0000000..d538d99
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/en.lproj/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="iMo-Z9-PrL">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--VideoViewController-->
+ <scene sceneID="cnz-j4-g9W">
+ <objects>
+ <viewController title="Playback" id="iMo-Z9-PrL" userLabel="VideoViewController" customClass="VideoViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="zgN-eK-M4Q">
+ <rect key="frame" x="0.0" y="20" width="320" height="548"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nA3-W2-kn7" userLabel="VideoContainer">
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WHW-sv-bWc" userLabel="Video" customClass="EaglUIView">
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="240" type="user" id="5z2-ux-czd"/>
+ <constraint firstAttribute="width" constant="320" type="user" id="76i-Rz-yha"/>
+ </constraints>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="centerY" secondItem="WHW-sv-bWc" secondAttribute="centerY" type="user" id="3wK-Zr-bQY"/>
+ <constraint firstAttribute="centerX" secondItem="WHW-sv-bWc" secondAttribute="centerX" type="user" id="X5U-dh-PaZ"/>
+ </constraints>
+ </view>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="LmB-wv-Ztp" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="8aS-9o-dME"/>
+ <constraint firstAttribute="height" constant="21" type="user" id="hUE-Fx-tsG"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="A2w-65-QSF">
+ <constraints>
+ <constraint firstAttribute="height" constant="44" type="user" id="apr-w6-VYs"/>
+ </constraints>
+ <items>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="Ixt-So-LpU"/>
+ <barButtonItem systemItem="play" id="8Yb-MS-rAF">
+ <connections>
+ <action selector="play:" destination="iMo-Z9-PrL" id="9nM-or-ZY7"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="nH5-s3-C0i">
+ <connections>
+ <action selector="pause:" destination="iMo-Z9-PrL" id="mef-Ij-Agl"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" id="VUJ-y8-aWS">
+ <textField key="customView" opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="00:00:00 / 00:00:00" borderStyle="roundedRect" textAlignment="center" minimumFontSize="17" id="R6T-PH-VPd" userLabel="Time">
+ <rect key="frame" x="132" y="7" width="139" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits"/>
+ </textField>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="LSl-TA-0qV"/>
+ </items>
+ </toolbar>
+ <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="4Ns-t9-gs7" userLabel="Slider">
+ <connections>
+ <action selector="sliderTouchDown:" destination="iMo-Z9-PrL" eventType="touchDown" id="jGO-Pw-b5d"/>
+ <action selector="sliderTouchUp:" destination="iMo-Z9-PrL" eventType="touchCancel" id="L1U-aK-FFn"/>
+ <action selector="sliderTouchUp:" destination="iMo-Z9-PrL" eventType="touchUpInside" id="jRZ-vw-FQR"/>
+ <action selector="sliderTouchUp:" destination="iMo-Z9-PrL" eventType="touchUpOutside" id="u1u-UD-WJw"/>
+ <action selector="sliderValueChanged:" destination="iMo-Z9-PrL" eventType="valueChanged" id="ZOq-XS-0M1"/>
+ </connections>
+ </slider>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="LmB-wv-Ztp" secondAttribute="bottom" constant="66" id="9mR-hc-MeV"/>
+ <constraint firstItem="A2w-65-QSF" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="Aki-Hx-2C9"/>
+ <constraint firstItem="4Ns-t9-gs7" firstAttribute="trailing" secondItem="zgN-eK-M4Q" secondAttribute="trailing" type="default" id="HFi-uV-wdo"/>
+ <constraint firstAttribute="bottom" secondItem="nA3-W2-kn7" secondAttribute="bottom" constant="87" id="Jdn-RD-NPI"/>
+ <constraint firstItem="A2w-65-QSF" firstAttribute="trailing" secondItem="zgN-eK-M4Q" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="WWj-l6-D2k"/>
+ <constraint firstAttribute="trailing" secondItem="LmB-wv-Ztp" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="ddw-6a-Ccz"/>
+ <constraint firstItem="A2w-65-QSF" firstAttribute="bottom" secondItem="zgN-eK-M4Q" secondAttribute="bottom" type="default" id="e3s-lP-iPh"/>
+ <constraint firstAttribute="trailing" secondItem="nA3-W2-kn7" secondAttribute="trailing" type="user" id="lOJ-ew-ZyI"/>
+ <constraint firstItem="nA3-W2-kn7" firstAttribute="top" secondItem="zgN-eK-M4Q" secondAttribute="top" type="user" id="lUb-ik-h6u"/>
+ <constraint firstItem="4Ns-t9-gs7" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" type="default" id="ma4-AV-cQs"/>
+ <constraint firstItem="LmB-wv-Ztp" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="nfT-8Y-Tvw"/>
+ <constraint firstItem="nA3-W2-kn7" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" type="user" id="p8G-QE-uZ8"/>
+ <constraint firstAttribute="bottom" secondItem="4Ns-t9-gs7" secondAttribute="bottom" constant="45" id="qfD-gf-vLB"/>
+ </constraints>
+ </view>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics"/>
+ <connections>
+ <outlet property="message_label" destination="LmB-wv-Ztp" id="YqJ-GW-DBG"/>
+ <outlet property="pause_button" destination="nH5-s3-C0i" id="VWV-EW-jB6"/>
+ <outlet property="play_button" destination="8Yb-MS-rAF" id="5SI-l2-mAJ"/>
+ <outlet property="time_label" destination="R6T-PH-VPd" id="bGs-Zr-rv3"/>
+ <outlet property="time_slider" destination="4Ns-t9-gs7" id="9Ne-1N-clc"/>
+ <outlet property="video_container_view" destination="nA3-W2-kn7" id="lEY-hP-YHD"/>
+ <outlet property="video_height_constraint" destination="5z2-ux-czd" id="9R7-fg-G0e"/>
+ <outlet property="video_view" destination="WHW-sv-bWc" id="c6W-td-a74"/>
+ <outlet property="video_width_constraint" destination="76i-Rz-yha" id="vSP-Kk-v8g"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="YOs-uD-FMw" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-609" y="-199"/>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="EaglUIView" superclassName="UIView">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EaglUIView.h"/>
+ </class>
+ <class className="NSLayoutConstraint" superclassName="NSObject">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
+ </class>
+ <class className="VideoViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/VideoViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="pause:"/>
+ <relationship kind="action" name="play:"/>
+ <relationship kind="action" name="sliderTouchDown:"/>
+ <relationship kind="action" name="sliderTouchUp:"/>
+ <relationship kind="action" name="sliderValueChanged:"/>
+ <relationship kind="outlet" name="message_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="pause_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="play_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="time_label" candidateClass="UITextField"/>
+ <relationship kind="outlet" name="time_slider" candidateClass="UISlider"/>
+ <relationship kind="outlet" name="toolbar" candidateClass="UIToolbar"/>
+ <relationship kind="outlet" name="video_container_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_height_constraint" candidateClass="NSLayoutConstraint"/>
+ <relationship kind="outlet" name="video_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_width_constraint" candidateClass="NSLayoutConstraint"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 4/fonts.conf b/tutorials/xcode iOS/Tutorial 4/fonts.conf
new file mode 100644
index 0000000..6b780ea
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/fonts.conf
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!-- Font directory list -->
+
+ <dir prefix="xdg"></dir>
+
+<!-- Font cache directory list -->
+
+ <cachedir prefix="xdg"></cachedir>
+
+<!--
+ Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>monospace</string>
+ </edit>
+ </match>
+
+<!--
+ Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans serif</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+ <config>
+<!--
+ These are the default Unicode chars that are expected to be blank
+ in fonts. All other blank chars are assumed to be broken and
+ won't appear in the resulting charsets
+ -->
+ <blank>
+ <int>0x0020</int> <!-- SPACE -->
+ <int>0x00A0</int> <!-- NO-BREAK SPACE -->
+ <int>0x00AD</int> <!-- SOFT HYPHEN -->
+ <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
+ <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
+ <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
+ <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
+ <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
+ <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
+ <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
+ <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
+ <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
+ <int>0x1680</int> <!-- OGHAM SPACE MARK -->
+ <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
+ <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
+ <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
+ <int>0x2000</int> <!-- EN QUAD -->
+ <int>0x2001</int> <!-- EM QUAD -->
+ <int>0x2002</int> <!-- EN SPACE -->
+ <int>0x2003</int> <!-- EM SPACE -->
+ <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
+ <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
+ <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
+ <int>0x2007</int> <!-- FIGURE SPACE -->
+ <int>0x2008</int> <!-- PUNCTUATION SPACE -->
+ <int>0x2009</int> <!-- THIN SPACE -->
+ <int>0x200A</int> <!-- HAIR SPACE -->
+ <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
+ <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
+ <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
+ <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
+ <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
+ <int>0x2028</int> <!-- LINE SEPARATOR -->
+ <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
+ <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
+ <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
+ <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
+ <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
+ <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
+ <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
+ <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
+ <int>0x2060</int> <!-- WORD JOINER -->
+ <int>0x2061</int> <!-- FUNCTION APPLICATION -->
+ <int>0x2062</int> <!-- INVISIBLE TIMES -->
+ <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
+ <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
+ <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
+ <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
+ <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
+ <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
+ <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
+ <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
+ <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
+ <int>0x3164</int> <!-- HANGUL FILLER -->
+ <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
+ <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
+ <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
+ <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+ <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+ </blank>
+<!--
+ Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+ <rescan>
+ <int>30</int>
+ </rescan>
+ </config>
+
+</fontconfig>
+
diff --git a/tutorials/xcode iOS/Tutorial 4/gst_ios_init.h b/tutorials/xcode iOS/Tutorial 4/gst_ios_init.h
new file mode 100644
index 0000000..79ee758
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/gst_ios_init.h
@@ -0,0 +1,39 @@
+#ifndef __GST_IOS_INIT_H__
+#define __GST_IOS_INIT_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_G_IO_MODULE_DECLARE(name) \
+extern void G_PASTE(g_io_module_, G_PASTE(name, _load_static)) (void)
+
+#define GST_G_IO_MODULE_LOAD(name) \
+G_PASTE(g_io_module_, G_PASTE(name, _load_static)) ()
+
+/* Uncomment each line to enable the plugin categories that your application needs.
+ * You can also enable individual plugins. See gst_ios_init.c to see their names
+ */
+
+#define GST_IOS_PLUGINS_CORE
+//#define GST_IOS_PLUGINS_CAPTURE
+//#define GST_IOS_PLUGINS_CODECS_RESTRICTED
+//#define GST_IOS_PLUGINS_ENCODING
+//#define GST_IOS_PLUGINS_CODECS_GPL
+//#define GST_IOS_PLUGINS_NET_RESTRICTED
+#define GST_IOS_PLUGINS_SYS
+//#define GST_IOS_PLUGINS_VIS
+#define GST_IOS_PLUGINS_PLAYBACK
+//#define GST_IOS_PLUGINS_EFFECTS
+#define GST_IOS_PLUGINS_CODECS
+#define GST_IOS_PLUGINS_NET
+//#define GST_IOS_PLUGINS_EDITING
+
+
+//#define GST_IOS_GIO_MODULE_GNUTLS
+
+void gst_ios_init ();
+
+G_END_DECLS
+
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 4/gst_ios_init.m b/tutorials/xcode iOS/Tutorial 4/gst_ios_init.m
new file mode 100644
index 0000000..403f9f9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/gst_ios_init.m
@@ -0,0 +1,988 @@
+#include "gst_ios_init.h"
+
+#if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+GST_PLUGIN_STATIC_DECLARE(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+GST_PLUGIN_STATIC_DECLARE(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+GST_PLUGIN_STATIC_DECLARE(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+GST_PLUGIN_STATIC_DECLARE(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+GST_PLUGIN_STATIC_DECLARE(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ #include <gio/gio.h>
+ GST_G_IO_MODULE_DECLARE(gnutls);
+#endif
+
+void
+gst_ios_init (void)
+{
+ GstPluginFeature *plugin;
+ GstRegistry *reg;
+ NSString *resources = [[NSBundle mainBundle] resourcePath];
+ NSString *tmp = NSTemporaryDirectory();
+ NSString *cache = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
+ NSString *docs = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
+
+ const gchar *resources_dir = [resources UTF8String];
+ const gchar *tmp_dir = [tmp UTF8String];
+ const gchar *cache_dir = [cache UTF8String];
+ const gchar *docs_dir = [docs UTF8String];
+ gchar *ca_certificates;
+
+ g_setenv ("TMP", tmp_dir, TRUE);
+ g_setenv ("TEMP", tmp_dir, TRUE);
+ g_setenv ("TMPDIR", tmp_dir, TRUE);
+ g_setenv ("XDG_RUNTIME_DIR", resources_dir, TRUE);
+ g_setenv ("XDG_CACHE_HOME", cache_dir, TRUE);
+
+ g_setenv ("HOME", docs_dir, TRUE);
+ g_setenv ("XDG_DATA_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_HOME", cache_dir, TRUE);
+ g_setenv ("XDG_DATA_HOME", resources_dir, TRUE);
+ g_setenv ("FONTCONFIG_PATH", resources_dir, TRUE);
+
+ ca_certificates = g_build_filename (resources_dir, "ssl", "certs", "ca-certifcates.crt", NULL);
+ g_setenv ("CA_CERTIFICATES", ca_certificates, TRUE);
+ g_free (ca_certificates);
+
+ gst_init (NULL, NULL);
+
+ #if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+ GST_PLUGIN_STATIC_REGISTER(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+ GST_PLUGIN_STATIC_REGISTER(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+ GST_PLUGIN_STATIC_REGISTER(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+ GST_PLUGIN_STATIC_REGISTER(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+ GST_PLUGIN_STATIC_REGISTER(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ GST_G_IO_MODULE_LOAD(gnutls);
+#endif
+
+ /* Lower the ranks of filesrc and giosrc so iosavassetsrc is
+ * tried first in gst_element_make_from_uri() for file:// */
+ reg = gst_registry_get();
+ plugin = gst_registry_lookup_feature(reg, "filesrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY);
+ plugin = gst_registry_lookup_feature(reg, "giosrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY-1);
+}
diff --git a/tutorials/xcode iOS/Tutorial 4/main.m b/tutorials/xcode iOS/Tutorial 4/main.m
new file mode 100644
index 0000000..6cf4e0f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 4/main.m
@@ -0,0 +1,12 @@
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+#include "gst_ios_init.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ gst_ios_init();
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/tutorials/xcode iOS/Tutorial 5/AppDelegate.h b/tutorials/xcode iOS/Tutorial 5/AppDelegate.h
new file mode 100644
index 0000000..a5a8b38
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/AppDelegate.h
@@ -0,0 +1,7 @@
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/AppDelegate.m b/tutorials/xcode iOS/Tutorial 5/AppDelegate.m
new file mode 100644
index 0000000..31ef04e
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/AppDelegate.m
@@ -0,0 +1,38 @@
+#import "AppDelegate.h"
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+{
+ // Override point for customization after application launch.
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application
+{
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application
+{
+ // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application
+{
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application
+{
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/Default-568h@2x.png b/tutorials/xcode iOS/Tutorial 5/Default-568h@2x.png
new file mode 100644
index 0000000..0891b7a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Default-568h@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/Default.png b/tutorials/xcode iOS/Tutorial 5/Default.png
new file mode 100644
index 0000000..4c8ca6f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Default.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/Default@2x.png b/tutorials/xcode iOS/Tutorial 5/Default@2x.png
new file mode 100644
index 0000000..35b84cf
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Default@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/EaglUIVIew.h b/tutorials/xcode iOS/Tutorial 5/EaglUIVIew.h
new file mode 100644
index 0000000..ac4e798
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/EaglUIVIew.h
@@ -0,0 +1,11 @@
+#import <Foundation/Foundation.h>
+#import <QuartzCore/QuartzCore.h>
+#include <OpenGLES/ES2/gl.h>
+#include <OpenGLES/ES2/glext.h>
+
+@interface EaglUIView : UIView
+{
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 5/EaglUIVIew.m b/tutorials/xcode iOS/Tutorial 5/EaglUIVIew.m
new file mode 100644
index 0000000..91cdd9d
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/EaglUIVIew.m
@@ -0,0 +1,13 @@
+#import "EaglUIVIew.h"
+
+#import <QuartzCore/QuartzCore.h>
+
+@implementation EaglUIView
+
+
++ (Class) layerClass
+{
+ return [CAEAGLLayer class];
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/GStreamerBackend.h b/tutorials/xcode iOS/Tutorial 5/GStreamerBackend.h
new file mode 100644
index 0000000..f16ea70
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/GStreamerBackend.h
@@ -0,0 +1,28 @@
+#import <Foundation/Foundation.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface GStreamerBackend : NSObject
+
+/* Initialization method. Pass the delegate that will take care of the UI.
+ * This delegate must implement the GStreamerBackendDelegate protocol.
+ * Pass also the UIView object that will hold the video window. */
+-(id) init:(id) uiDelegate videoView:(UIView*) video_view;
+
+/* Quit the main loop and free all resources, including the pipeline and
+ * the references to the ui delegate and the UIView used for rendering, so
+ * these objects can be deallocated. */
+-(void) deinit;
+
+/* Set the pipeline to PLAYING */
+-(void) play;
+
+/* Set the pipeline to PAUSED */
+-(void) pause;
+
+/* Set the URI to be played */
+-(void) setUri:(NSString*)uri;
+
+/* Set the position to seek to, in milliseconds */
+-(void) setPosition:(NSInteger)milliseconds;
+
+@end \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 5/GStreamerBackend.m b/tutorials/xcode iOS/Tutorial 5/GStreamerBackend.m
new file mode 100644
index 0000000..234eabc
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/GStreamerBackend.m
@@ -0,0 +1,387 @@
+#import "GStreamerBackend.h"
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+GST_DEBUG_CATEGORY_STATIC (debug_category);
+#define GST_CAT_DEFAULT debug_category
+
+/* Do not allow seeks to be performed closer than this distance. It is visually useless, and will probably
+ * confuse some demuxers. */
+#define SEEK_MIN_DELAY (500 * GST_MSECOND)
+
+@interface GStreamerBackend()
+-(void)setUIMessage:(gchar*) message;
+-(void)app_function;
+-(void)check_initialization_complete;
+@end
+
+@implementation GStreamerBackend {
+ id ui_delegate; /* Class that we use to interact with the user interface */
+ GstElement *pipeline; /* The running pipeline */
+ GstElement *video_sink; /* The video sink element which receives XOverlay commands */
+ GMainContext *context; /* GLib context used to run the main loop */
+ GMainLoop *main_loop; /* GLib main loop */
+ gboolean initialized; /* To avoid informing the UI multiple times about the initialization */
+ UIView *ui_video_view; /* UIView that holds the video */
+ GstState state; /* Current pipeline state */
+ GstState target_state; /* Desired pipeline state, to be set once buffering is complete */
+ gint64 duration; /* Cached clip duration */
+ gint64 desired_position; /* Position to seek to, once the pipeline is running */
+ GstClockTime last_seek_time; /* For seeking overflow prevention (throttling) */
+ gboolean is_live; /* Live streams do not use buffering */
+}
+
+/*
+ * Interface methods
+ */
+
+-(id) init:(id) uiDelegate videoView:(UIView *)video_view
+{
+ if (self = [super init])
+ {
+ self->ui_delegate = uiDelegate;
+ self->ui_video_view = video_view;
+ self->duration = GST_CLOCK_TIME_NONE;
+
+ GST_DEBUG_CATEGORY_INIT (debug_category, "tutorial-5", 0, "iOS tutorial 5");
+ gst_debug_set_threshold_for_name("tutorial-5", GST_LEVEL_DEBUG);
+
+ /* Start the bus monitoring task */
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [self app_function];
+ });
+ }
+
+ return self;
+}
+
+-(void) deinit
+{
+ if (main_loop) {
+ g_main_loop_quit(main_loop);
+ }
+}
+
+-(void) play
+{
+ target_state = GST_STATE_PLAYING;
+ is_live = (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+-(void) pause
+{
+ target_state = GST_STATE_PAUSED;
+ is_live = (gst_element_set_state (pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+}
+
+-(void) setUri:(NSString*)uri
+{
+ const char *char_uri = [uri UTF8String];
+ g_object_set(pipeline, "uri", char_uri, NULL);
+ GST_DEBUG ("URI set to %s", char_uri);
+}
+
+-(void) setPosition:(NSInteger)milliseconds
+{
+ gint64 position = (gint64)(milliseconds * GST_MSECOND);
+ if (state >= GST_STATE_PAUSED) {
+ execute_seek(position, self);
+ } else {
+ GST_DEBUG ("Scheduling seek to %" GST_TIME_FORMAT " for later", GST_TIME_ARGS (position));
+ self->desired_position = position;
+ }
+}
+
+/*
+ * Private methods
+ */
+
+/* Change the message on the UI through the UI delegate */
+-(void)setUIMessage:(gchar*) message
+{
+ NSString *string = [NSString stringWithUTF8String:message];
+ if(ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerSetUIMessage:)])
+ {
+ [ui_delegate gstreamerSetUIMessage:string];
+ }
+}
+
+/* Tell the application what is the current position and clip duration */
+-(void) setCurrentUIPosition:(gint)pos duration:(gint)dur
+{
+ if(ui_delegate && [ui_delegate respondsToSelector:@selector(setCurrentPosition:duration:)])
+ {
+ [ui_delegate setCurrentPosition:pos duration:dur];
+ }
+}
+
+/* If we have pipeline and it is running, query the current position and clip duration and inform
+ * the application */
+static gboolean refresh_ui (GStreamerBackend *self) {
+ gint64 position;
+
+ /* We do not want to update anything unless we have a working pipeline in the PAUSED or PLAYING state */
+ if (!self || !self->pipeline || self->state < GST_STATE_PAUSED)
+ return TRUE;
+
+ /* If we didn't know it yet, query the stream duration */
+ if (!GST_CLOCK_TIME_IS_VALID (self->duration)) {
+ gst_element_query_duration (self->pipeline, GST_FORMAT_TIME,&self->duration);
+ }
+
+ if (gst_element_query_position (self->pipeline, GST_FORMAT_TIME, &position)) {
+ /* The UI expects these values in milliseconds, and GStreamer provides nanoseconds */
+ [self setCurrentUIPosition:position / GST_MSECOND duration:self->duration / GST_MSECOND];
+ }
+ return TRUE;
+}
+
+/* Forward declaration for the delayed seek callback */
+static gboolean delayed_seek_cb (GStreamerBackend *self);
+
+/* Perform seek, if we are not too close to the previous seek. Otherwise, schedule the seek for
+ * some time in the future. */
+static void execute_seek (gint64 position, GStreamerBackend *self) {
+ gint64 diff;
+
+ if (position == GST_CLOCK_TIME_NONE)
+ return;
+
+ diff = gst_util_get_timestamp () - self->last_seek_time;
+
+ if (GST_CLOCK_TIME_IS_VALID (self->last_seek_time) && diff < SEEK_MIN_DELAY) {
+ /* The previous seek was too close, delay this one */
+ GSource *timeout_source;
+
+ if (self->desired_position == GST_CLOCK_TIME_NONE) {
+ /* There was no previous seek scheduled. Setup a timer for some time in the future */
+ timeout_source = g_timeout_source_new ((SEEK_MIN_DELAY - diff) / GST_MSECOND);
+ g_source_set_callback (timeout_source, (GSourceFunc)delayed_seek_cb, (__bridge void *)self, NULL);
+ g_source_attach (timeout_source, self->context);
+ g_source_unref (timeout_source);
+ }
+ /* Update the desired seek position. If multiple petitions are received before it is time
+ * to perform a seek, only the last one is remembered. */
+ self->desired_position = position;
+ GST_DEBUG ("Throttling seek to %" GST_TIME_FORMAT ", will be in %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (position), GST_TIME_ARGS (SEEK_MIN_DELAY - diff));
+ } else {
+ /* Perform the seek now */
+ GST_DEBUG ("Seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+ self->last_seek_time = gst_util_get_timestamp ();
+ gst_element_seek_simple (self->pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, position);
+ self->desired_position = GST_CLOCK_TIME_NONE;
+ }
+}
+
+/* Delayed seek callback. This gets called by the timer setup in the above function. */
+static gboolean delayed_seek_cb (GStreamerBackend *self) {
+ GST_DEBUG ("Doing delayed seek to %" GST_TIME_FORMAT, GST_TIME_ARGS (self->desired_position));
+ execute_seek (self->desired_position, self);
+ return FALSE;
+}
+
+/* Retrieve errors from the bus and show them on the UI */
+static void error_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GError *err;
+ gchar *debug_info;
+ gchar *message_string;
+
+ gst_message_parse_error (msg, &err, &debug_info);
+ message_string = g_strdup_printf ("Error received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
+ g_clear_error (&err);
+ g_free (debug_info);
+ [self setUIMessage:message_string];
+ g_free (message_string);
+ gst_element_set_state (self->pipeline, GST_STATE_NULL);
+}
+
+/* Called when the End Of the Stream is reached. Just move to the beginning of the media and pause. */
+static void eos_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ self->target_state = GST_STATE_PAUSED;
+ self->is_live = (gst_element_set_state (self->pipeline, GST_STATE_PAUSED) == GST_STATE_CHANGE_NO_PREROLL);
+ execute_seek (0, self);
+}
+
+/* Called when the duration of the media changes. Just mark it as unknown, so we re-query it in the next UI refresh. */
+static void duration_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ self->duration = GST_CLOCK_TIME_NONE;
+}
+
+/* Called when buffering messages are received. We inform the UI about the current buffering level and
+ * keep the pipeline paused until 100% buffering is reached. At that point, set the desired state. */
+static void buffering_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ gint percent;
+
+ if (self->is_live)
+ return;
+
+ gst_message_parse_buffering (msg, &percent);
+ if (percent < 100 && self->target_state >= GST_STATE_PAUSED) {
+ gchar * message_string = g_strdup_printf ("Buffering %d%%", percent);
+ gst_element_set_state (self->pipeline, GST_STATE_PAUSED);
+ [self setUIMessage:message_string];
+ g_free (message_string);
+ } else if (self->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (self->pipeline, GST_STATE_PLAYING);
+ } else if (self->target_state >= GST_STATE_PAUSED) {
+ [self setUIMessage:"Buffering complete"];
+ }
+}
+
+/* Called when the clock is lost */
+static void clock_lost_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self) {
+ if (self->target_state >= GST_STATE_PLAYING) {
+ gst_element_set_state (self->pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (self->pipeline, GST_STATE_PLAYING);
+ }
+}
+
+/* Retrieve the video sink's Caps and tell the application about the media size */
+static void check_media_size (GStreamerBackend *self) {
+ GstElement *video_sink;
+ GstPad *video_sink_pad;
+ GstCaps *caps;
+ GstVideoInfo info;
+
+ /* Retrieve the Caps at the entrance of the video sink */
+ g_object_get (self->pipeline, "video-sink", &video_sink, NULL);
+
+ /* Do nothing if there is no video sink (this might be an audio-only clip */
+ if (!video_sink) return;
+
+ video_sink_pad = gst_element_get_static_pad (video_sink, "sink");
+ caps = gst_pad_get_current_caps (video_sink_pad);
+
+ if (gst_video_info_from_caps (&info, caps)) {
+ info.width = info.width * info.par_n / info.par_d;
+ GST_DEBUG ("Media size is %dx%d, notifying application", info.width, info.height);
+
+ if (self->ui_delegate && [self->ui_delegate respondsToSelector:@selector(mediaSizeChanged:height:)])
+ {
+ [self->ui_delegate mediaSizeChanged:info.width height:info.height];
+ }
+ }
+
+ gst_caps_unref(caps);
+ gst_object_unref (video_sink_pad);
+ gst_object_unref(video_sink);
+}
+
+/* Notify UI about pipeline state changes */
+static void state_changed_cb (GstBus *bus, GstMessage *msg, GStreamerBackend *self)
+{
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ /* Only pay attention to messages coming from the pipeline, not its children */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (self->pipeline)) {
+ self->state = new_state;
+ gchar *message = g_strdup_printf("State changed to %s", gst_element_state_get_name(new_state));
+ [self setUIMessage:message];
+ g_free (message);
+
+ if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED)
+ {
+ check_media_size(self);
+
+ /* If there was a scheduled seek, perform it now that we have moved to the Paused state */
+ if (GST_CLOCK_TIME_IS_VALID (self->desired_position))
+ execute_seek (self->desired_position, self);
+ }
+ }
+}
+
+/* Check if all conditions are met to report GStreamer as initialized.
+ * These conditions will change depending on the application */
+-(void) check_initialization_complete
+{
+ if (!initialized && main_loop) {
+ GST_DEBUG ("Initialization complete, notifying application.");
+ if (ui_delegate && [ui_delegate respondsToSelector:@selector(gstreamerInitialized)])
+ {
+ [ui_delegate gstreamerInitialized];
+ }
+ initialized = TRUE;
+ }
+}
+
+/* Main method for the bus monitoring code */
+-(void) app_function
+{
+ GstBus *bus;
+ GSource *timeout_source;
+ GSource *bus_source;
+ GError *error = NULL;
+
+ GST_DEBUG ("Creating pipeline");
+
+ /* Create our own GLib Main Context and make it the default one */
+ context = g_main_context_new ();
+ g_main_context_push_thread_default(context);
+
+ /* Build pipeline */
+ pipeline = gst_parse_launch("playbin", &error);
+ if (error) {
+ gchar *message = g_strdup_printf("Unable to build pipeline: %s", error->message);
+ g_clear_error (&error);
+ [self setUIMessage:message];
+ g_free (message);
+ return;
+ }
+
+ /* Set the pipeline to READY, so it can already accept a window handle */
+ gst_element_set_state(pipeline, GST_STATE_READY);
+
+ video_sink = gst_bin_get_by_interface(GST_BIN(pipeline), GST_TYPE_VIDEO_OVERLAY);
+ if (!video_sink) {
+ GST_ERROR ("Could not retrieve video sink");
+ return;
+ }
+ gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(video_sink), (guintptr) (id) ui_video_view);
+
+ /* Instruct the bus to emit signals for each received message, and connect to the interesting signals */
+ bus = gst_element_get_bus (pipeline);
+ bus_source = gst_bus_create_watch (bus);
+ g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func, NULL, NULL);
+ g_source_attach (bus_source, context);
+ g_source_unref (bus_source);
+ g_signal_connect (G_OBJECT (bus), "message::error", (GCallback)error_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::eos", (GCallback)eos_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::duration", (GCallback)duration_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::buffering", (GCallback)buffering_cb, (__bridge void *)self);
+ g_signal_connect (G_OBJECT (bus), "message::clock-lost", (GCallback)clock_lost_cb, (__bridge void *)self);
+ gst_object_unref (bus);
+
+ /* Register a function that GLib will call 4 times per second */
+ timeout_source = g_timeout_source_new (250);
+ g_source_set_callback (timeout_source, (GSourceFunc)refresh_ui, (__bridge void *)self, NULL);
+ g_source_attach (timeout_source, context);
+ g_source_unref (timeout_source);
+
+ /* Create a GLib Main Loop and set it to run */
+ GST_DEBUG ("Entering main loop...");
+ main_loop = g_main_loop_new (context, FALSE);
+ [self check_initialization_complete];
+ g_main_loop_run (main_loop);
+ GST_DEBUG ("Exited main loop");
+ g_main_loop_unref (main_loop);
+ main_loop = NULL;
+
+ /* Free resources */
+ g_main_context_pop_thread_default(context);
+ g_main_context_unref (context);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ pipeline = NULL;
+
+ ui_delegate = NULL;
+ ui_video_view = NULL;
+
+ return;
+}
+
+@end
+
diff --git a/tutorials/xcode iOS/Tutorial 5/GStreamerBackendDelegate.h b/tutorials/xcode iOS/Tutorial 5/GStreamerBackendDelegate.h
new file mode 100644
index 0000000..01981fa
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/GStreamerBackendDelegate.h
@@ -0,0 +1,20 @@
+#import <Foundation/Foundation.h>
+
+@protocol GStreamerBackendDelegate <NSObject>
+
+@optional
+/* Called when the GStreamer backend has finished initializing
+ * and is ready to accept orders. */
+-(void) gstreamerInitialized;
+
+/* Called when the GStreamer backend wants to output some message
+ * to the screen. */
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+/* Called when the media size is first discovered or it changes */
+-(void) mediaSizeChanged:(NSInteger)width height:(NSInteger)height;
+
+/* Called when the media position changes. Times in milliseconds */
+-(void) setCurrentPosition:(NSInteger)position duration:(NSInteger)duration;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad.png b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad.png
new file mode 100755
index 0000000..826ddaa
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad@2x.png b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad@2x.png
new file mode 100755
index 0000000..a2b3a35
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPad@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone.png b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone.png
new file mode 100755
index 0000000..c681ddd
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone@2x.png b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone@2x.png
new file mode 100755
index 0000000..648a249
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Images/appicon-5-iPhone@2x.png
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/LibraryViewController.h b/tutorials/xcode iOS/Tutorial 5/LibraryViewController.h
new file mode 100644
index 0000000..6950b19
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/LibraryViewController.h
@@ -0,0 +1,12 @@
+#import <UIKit/UIKit.h>
+
+@interface LibraryViewController : UITableViewController
+{
+ NSArray *libraryEntries;
+ NSArray *mediaEntries;
+ NSArray *onlineEntries;
+}
+
+- (IBAction)refresh:(id)sender;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/LibraryViewController.m b/tutorials/xcode iOS/Tutorial 5/LibraryViewController.m
new file mode 100644
index 0000000..4abf1a8
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/LibraryViewController.m
@@ -0,0 +1,165 @@
+#import "LibraryViewController.h"
+#import "VideoViewController.h"
+#import <AssetsLibrary/AssetsLibrary.h>
+
+@interface LibraryViewController ()
+
+@end
+
+@implementation LibraryViewController
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+ [super setTitle:@"Library"];
+ [self refreshMediaItems];
+}
+
+- (IBAction)refresh:(id)sender
+{
+ [self refreshMediaItems];
+ [self.tableView reloadData];
+}
+
+static NSString *CellIdentifier = @"CellIdentifier";
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 3;
+}
+
+- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
+{
+ switch (section)
+ {
+ case 0: return @"Photo library";
+ case 1: return @"iTunes file sharing";
+ default: return @"Online files";
+ }
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ switch (section) {
+ case 0:
+ return [self->libraryEntries count];
+ case 1:
+ return [self->mediaEntries count];
+ case 2:
+ return [self->onlineEntries count];
+ default:
+ return 0;
+ }
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ // Configure Cell
+ UILabel *title = (UILabel *)[cell.contentView viewWithTag:10];
+ UILabel *subtitle = (UILabel *)[cell.contentView viewWithTag:11];
+
+ switch (indexPath.section) {
+ case 0: subtitle.text = [self->libraryEntries objectAtIndex:indexPath.item];
+ break;
+ case 1: subtitle.text = [self->mediaEntries objectAtIndex:indexPath.item];
+ break;
+ case 2: subtitle.text = [self->onlineEntries objectAtIndex:indexPath.item];
+ break;
+ default:
+ break;
+ }
+
+ NSArray *components = [subtitle.text pathComponents];
+ title.text = components.lastObject;
+
+ return cell;
+}
+
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+ return NO;
+}
+
+- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+ return NO;
+}
+
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+ if ([segue.identifier isEqualToString:@"playVideo"]) {
+ NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
+ VideoViewController *destViewController = segue.destinationViewController;
+ UITableViewCell *cell = [[self tableView] cellForRowAtIndexPath:indexPath];
+ UILabel *label = (UILabel *)[cell.contentView viewWithTag:10];
+ destViewController.title = label.text;
+ label = (UILabel *)[cell.contentView viewWithTag:11];
+ destViewController.uri = label.text;
+ }
+}
+
+- (void)refreshMediaItems {
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSAllDomainsMask, YES);
+ NSString *docsPath = [paths objectAtIndex:0];
+
+ /* Entries from the Photo Library */
+ NSMutableArray *entries = [[NSMutableArray alloc] init];
+ ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
+ [library enumerateGroupsWithTypes:ALAssetsGroupAll
+ usingBlock:^(ALAssetsGroup *group, BOOL *stop)
+ {
+ if (group) {
+ [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
+ {
+ if(result) {
+ [entries addObject:[NSString stringWithFormat:@"%@",[result valueForProperty:ALAssetPropertyAssetURL]]];
+ *stop = NO;
+
+ }
+ }];
+ } else {
+ [self.tableView reloadData];
+ }
+ }
+ failureBlock:^(NSError *error)
+ {
+ NSLog(@"ERROR");
+ }
+ ];
+ self->libraryEntries = entries;
+
+ /* Retrieve entries from iTunes file sharing */
+ entries = [[NSMutableArray alloc] init];
+ for (NSString *e in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsPath error:nil])
+ {
+ [entries addObject:[NSString stringWithFormat:@"file://%@/%@", docsPath, e]];
+ }
+ self->mediaEntries = entries;
+
+ /* Hardcoded list of Online media files */
+ entries = [[NSMutableArray alloc] init];
+
+ // Big Buck Bunny
+ [entries addObject:@"http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_surround-fix.avi"];
+ [entries addObject:@"http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_h264.mov"];
+ [entries addObject:@"http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg"];
+ [entries addObject:@"http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.avi"];
+
+ // Sintel
+ [entries addObject:@"http://ftp.nluug.nl/ftp/graphics/blender/apricot/trailer/Sintel_Trailer1.480p.DivX_Plus_HD.mkv"];
+ [entries addObject:@"http://ftp.nluug.nl/ftp/graphics/blender/apricot/trailer/sintel_trailer-480p.mp4"];
+ [entries addObject:@"http://ftp.nluug.nl/ftp/graphics/blender/apricot/trailer/sintel_trailer-480p.ogv"];
+ [entries addObject:@"http://mirrorblender.top-ix.org/movies/sintel-1024-surround.mp4"];
+
+ // Tears of Steel
+ [entries addObject:@"http://blender-mirror.kino3d.org/mango/download.blender.org/demo/movies/ToS/tears_of_steel_720p.mkv"];
+ [entries addObject:@"http://blender-mirror.kino3d.org/mango/download.blender.org/demo/movies/ToS/tears_of_steel_720p.mov"];
+ [entries addObject:@"http://media.xiph.org/mango/tears_of_steel_1080p.webm"];
+
+ // Radio stations
+ [entries addObject:@"http://radio.hbr1.com:19800/trance.ogg"];
+ [entries addObject:@"http://radio.hbr1.com:19800/tronic.aac"];
+
+ // Non-existing entries (to debug error reporting facilities)
+ [entries addObject:@"http://non-existing.org/Non_Existing_Server"];
+ [entries addObject:@"https://www.freedesktop.org/software/gstreamer-sdk/data/media/Non_Existing_File"];
+
+ self->onlineEntries = entries;
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/Tutorial 5-Info.plist b/tutorials/xcode iOS/Tutorial 5/Tutorial 5-Info.plist
new file mode 100644
index 0000000..38b2f62
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Tutorial 5-Info.plist
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIcons</key>
+ <dict>
+ <key>CFBundlePrimaryIcon</key>
+ <dict>
+ <key>CFBundleIconFiles</key>
+ <array>
+ <string>appicon-4-iPhone.png</string>
+ <string>appicon-4-iPhone@2x.png</string>
+ <string>appicon-4-iPad.png</string>
+ <string>appicon-4-iPad@2x.png</string>
+ <string>appicon-5-iPhone.png</string>
+ <string>appicon-5-iPhone@2x.png</string>
+ <string>appicon-5-iPad.png</string>
+ <string>appicon-5-iPad@2x.png</string>
+ </array>
+ </dict>
+ </dict>
+ <key>CFBundleIdentifier</key>
+ <string>gstreamer-sdk.${PRODUCT_NAME:rfc1034identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UIFileSharingEnabled</key>
+ <true/>
+ <key>UIMainStoryboardFile</key>
+ <string>MainStoryboard_iPhone</string>
+ <key>UIMainStoryboardFile~ipad</key>
+ <string>MainStoryboard_iPad</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/tutorials/xcode iOS/Tutorial 5/Tutorial 5-Prefix.pch b/tutorials/xcode iOS/Tutorial 5/Tutorial 5-Prefix.pch
new file mode 100644
index 0000000..35ed66a
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Tutorial 5-Prefix.pch
@@ -0,0 +1,14 @@
+//
+// Prefix header for all source files of the 'Tutorial 5' target in the 'Tutorial 5' project
+//
+
+#import <Availability.h>
+
+#ifndef __IPHONE_5_0
+#warning "This project uses features only available in iOS SDK 5.0 and later."
+#endif
+
+#ifdef __OBJC__
+ #import <UIKit/UIKit.h>
+ #import <Foundation/Foundation.h>
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 5/Ubuntu-R.ttf b/tutorials/xcode iOS/Tutorial 5/Ubuntu-R.ttf
new file mode 100644
index 0000000..45a038b
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/Ubuntu-R.ttf
Binary files differ
diff --git a/tutorials/xcode iOS/Tutorial 5/VideoViewController.h b/tutorials/xcode iOS/Tutorial 5/VideoViewController.h
new file mode 100644
index 0000000..5935306
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/VideoViewController.h
@@ -0,0 +1,29 @@
+#import <UIKit/UIKit.h>
+#import "GStreamerBackendDelegate.h"
+
+@interface VideoViewController : UIViewController <GStreamerBackendDelegate> {
+ IBOutlet UILabel *message_label;
+ IBOutlet UIBarButtonItem *play_button;
+ IBOutlet UIBarButtonItem *pause_button;
+ IBOutlet UIView *video_view;
+ IBOutlet UIView *video_container_view;
+ IBOutlet NSLayoutConstraint *video_width_constraint;
+ IBOutlet NSLayoutConstraint *video_height_constraint;
+ IBOutlet UIToolbar *toolbar;
+ IBOutlet UITextField *time_label;
+ IBOutlet UISlider *time_slider;
+}
+
+@property (retain,nonatomic) NSString *uri;
+
+-(IBAction) play:(id)sender;
+-(IBAction) pause:(id)sender;
+-(IBAction) sliderValueChanged:(id)sender;
+-(IBAction) sliderTouchDown:(id)sender;
+-(IBAction) sliderTouchUp:(id)sender;
+
+/* From GStreamerBackendDelegate */
+-(void) gstreamerInitialized;
+-(void) gstreamerSetUIMessage:(NSString *)message;
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/VideoViewController.m b/tutorials/xcode iOS/Tutorial 5/VideoViewController.m
new file mode 100644
index 0000000..19f6f0e
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/VideoViewController.m
@@ -0,0 +1,197 @@
+#import "VideoViewController.h"
+#import "GStreamerBackend.h"
+#import <UIKit/UIKit.h>
+
+@interface VideoViewController () {
+ GStreamerBackend *gst_backend;
+ int media_width; /* Width of the clip */
+ int media_height; /* height ofthe clip */
+ Boolean dragging_slider; /* Whether the time slider is being dragged or not */
+ Boolean is_local_media; /* Whether this clip is stored locally or is being streamed */
+ Boolean is_playing_desired; /* Whether the user asked to go to PLAYING */
+}
+
+@end
+
+@implementation VideoViewController
+
+@synthesize uri;
+
+/*
+ * Private methods
+ */
+
+/* The text widget acts as an slave for the seek bar, so it reflects what the seek bar shows, whether
+ * it is an actual pipeline position or the position the user is currently dragging to. */
+- (void) updateTimeWidget
+{
+ NSInteger position = time_slider.value / 1000;
+ NSInteger duration = time_slider.maximumValue / 1000;
+ NSString *position_txt = @" -- ";
+ NSString *duration_txt = @" -- ";
+
+ if (duration > 0) {
+ NSUInteger hours = duration / (60 * 60);
+ NSUInteger minutes = (duration / 60) % 60;
+ NSUInteger seconds = duration % 60;
+
+ duration_txt = [NSString stringWithFormat:@"%02u:%02u:%02u", hours, minutes, seconds];
+ }
+ if (position > 0) {
+ NSUInteger hours = position / (60 * 60);
+ NSUInteger minutes = (position / 60) % 60;
+ NSUInteger seconds = position % 60;
+
+ position_txt = [NSString stringWithFormat:@"%02u:%02u:%02u", hours, minutes, seconds];
+ }
+
+ NSString *text = [NSString stringWithFormat:@"%@ / %@",
+ position_txt, duration_txt];
+
+ time_label.text = text;
+}
+
+/*
+ * Methods from UIViewController
+ */
+
+- (void)viewDidLoad
+{
+ [super viewDidLoad];
+
+ play_button.enabled = FALSE;
+ pause_button.enabled = FALSE;
+
+ /* As soon as the GStreamer backend knows the real values, these ones will be replaced */
+ media_width = 320;
+ media_height = 240;
+
+ gst_backend = [[GStreamerBackend alloc] init:self videoView:video_view];
+}
+
+- (void)viewDidDisappear:(BOOL)animated
+{
+ if (gst_backend)
+ {
+ [gst_backend deinit];
+ }
+ [UIApplication sharedApplication].idleTimerDisabled = NO;
+}
+
+- (void)didReceiveMemoryWarning
+{
+ [super didReceiveMemoryWarning];
+ // Dispose of any resources that can be recreated.
+}
+
+/* Called when the Play button is pressed */
+-(IBAction) play:(id)sender
+{
+ [gst_backend play];
+ is_playing_desired = YES;
+ [UIApplication sharedApplication].idleTimerDisabled = YES;
+}
+
+/* Called when the Pause button is pressed */
+-(IBAction) pause:(id)sender
+{
+ [gst_backend pause];
+ is_playing_desired = NO;
+ [UIApplication sharedApplication].idleTimerDisabled = NO;
+}
+
+/* Called when the time slider position has changed, either because the user dragged it or
+ * we programmatically changed its position. dragging_slider tells us which one happened */
+- (IBAction)sliderValueChanged:(id)sender {
+ if (!dragging_slider) return;
+ // If this is a local file, allow scrub seeking, this is, seek as soon as the slider is moved.
+ if (is_local_media)
+ [gst_backend setPosition:time_slider.value];
+ [self updateTimeWidget];
+}
+
+/* Called when the user starts to drag the time slider */
+- (IBAction)sliderTouchDown:(id)sender {
+ [gst_backend pause];
+ dragging_slider = YES;
+}
+
+/* Called when the user stops dragging the time slider */
+- (IBAction)sliderTouchUp:(id)sender {
+ dragging_slider = NO;
+ // If this is a remote file, scrub seeking is probably not going to work smoothly enough.
+ // Therefore, perform only the seek when the slider is released.
+ if (!is_local_media)
+ [gst_backend setPosition:time_slider.value];
+ if (is_playing_desired)
+ [gst_backend play];
+}
+
+/* Called when the size of the main view has changed, so we can
+ * resize the sub-views in ways not allowed by storyboarding. */
+- (void)viewDidLayoutSubviews
+{
+ CGFloat view_width = video_container_view.bounds.size.width;
+ CGFloat view_height = video_container_view.bounds.size.height;
+
+ CGFloat correct_height = view_width * media_height / media_width;
+ CGFloat correct_width = view_height * media_width / media_height;
+
+ if (correct_height < view_height) {
+ video_height_constraint.constant = correct_height;
+ video_width_constraint.constant = view_width;
+ } else {
+ video_width_constraint.constant = correct_width;
+ video_height_constraint.constant = view_height;
+ }
+
+ time_slider.frame = CGRectMake(time_slider.frame.origin.x, time_slider.frame.origin.y, toolbar.frame.size.width - time_slider.frame.origin.x - 8, time_slider.frame.size.height);
+}
+
+/*
+ * Methods from GstreamerBackendDelegate
+ */
+
+-(void) gstreamerInitialized
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ play_button.enabled = TRUE;
+ pause_button.enabled = TRUE;
+ message_label.text = @"Ready";
+ [gst_backend setUri:uri];
+ is_local_media = [uri hasPrefix:@"file://"];
+ is_playing_desired = NO;
+ });
+}
+
+-(void) gstreamerSetUIMessage:(NSString *)message
+{
+ dispatch_async(dispatch_get_main_queue(), ^{
+ message_label.text = message;
+ });
+}
+
+-(void) mediaSizeChanged:(NSInteger)width height:(NSInteger)height
+{
+ media_width = width;
+ media_height = height;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [self viewDidLayoutSubviews];
+ [video_view setNeedsLayout];
+ [video_view layoutIfNeeded];
+ });
+}
+
+-(void) setCurrentPosition:(NSInteger)position duration:(NSInteger)duration
+{
+ /* Ignore messages from the pipeline if the time sliders is being dragged */
+ if (dragging_slider) return;
+
+ dispatch_async(dispatch_get_main_queue(), ^{
+ time_slider.maximumValue = duration;
+ time_slider.value = position;
+ [self updateTimeWidget];
+ });
+}
+
+@end
diff --git a/tutorials/xcode iOS/Tutorial 5/en.lproj/InfoPlist.strings b/tutorials/xcode iOS/Tutorial 5/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..477b28f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
diff --git a/tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPad.storyboard b/tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPad.storyboard
new file mode 100644
index 0000000..d912866
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPad.storyboard
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="b7k-ZL-0G1">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--Navigation Controller-->
+ <scene sceneID="3gA-ZI-2k3">
+ <objects>
+ <navigationController definesPresentationContext="YES" id="b7k-ZL-0G1" sceneMemberID="viewController">
+ <navigationBar key="navigationBar" contentMode="scaleToFill" id="zhK-zc-ohc">
+ <autoresizingMask key="autoresizingMask"/>
+ </navigationBar>
+ <connections>
+ <segue destination="VW0-ax-bPv" kind="relationship" relationship="rootViewController" id="bWs-EK-FdN"/>
+ </connections>
+ </navigationController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="Sqh-T0-zkr" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-1459" y="-199"/>
+ </scene>
+ <!--VideoViewController-->
+ <scene sceneID="P93-nn-HBJ">
+ <objects>
+ <viewController title="Playback" id="z7O-8l-Zeo" userLabel="VideoViewController" customClass="VideoViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="CqS-Gu-I1O">
+ <rect key="frame" x="0.0" y="64" width="768" height="960"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xWd-bg-0b6" userLabel="VideoContainer">
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="6tN-97-YoQ" userLabel="Video" customClass="EaglUIView">
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="240" type="user" id="A9A-eK-7QX"/>
+ <constraint firstAttribute="width" constant="320" type="user" id="xcj-6M-2KJ"/>
+ </constraints>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="centerY" secondItem="6tN-97-YoQ" secondAttribute="centerY" type="user" id="UYa-oM-cdf"/>
+ <constraint firstAttribute="centerX" secondItem="6tN-97-YoQ" secondAttribute="centerX" type="user" id="w9H-W0-MfF"/>
+ </constraints>
+ </view>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="728" translatesAutoresizingMaskIntoConstraints="NO" id="iLX-h1-Ko5" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="7Z8-1b-Y41"/>
+ <constraint firstAttribute="height" constant="21" type="user" id="jAS-RD-k2d"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="MUi-CE-Ydy">
+ <constraints>
+ <constraint firstAttribute="height" constant="44" type="user" id="EwL-Ma-A4v"/>
+ </constraints>
+ <items>
+ <barButtonItem systemItem="play" id="UlF-Ga-2VX">
+ <connections>
+ <action selector="play:" destination="z7O-8l-Zeo" id="5xC-uv-9lM"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="J3O-8j-Tkt">
+ <connections>
+ <action selector="pause:" destination="z7O-8l-Zeo" id="BYM-2X-Tel"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" id="s39-nx-e0L">
+ <textField key="customView" opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="00:00:00 / 00:00:00" borderStyle="roundedRect" textAlignment="center" minimumFontSize="17" id="G8q-Tu-Qx0" userLabel="Time">
+ <rect key="frame" x="90" y="7" width="140" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits"/>
+ </textField>
+ </barButtonItem>
+ <barButtonItem style="plain" id="2n0-TO-8Ss">
+ <slider key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" id="ufs-E5-87w" userLabel="Slider">
+ <rect key="frame" x="240" y="11" width="118" height="23"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <connections>
+ <action selector="sliderTouchDown:" destination="z7O-8l-Zeo" eventType="touchDown" id="yV6-eN-VUb"/>
+ <action selector="sliderTouchUp:" destination="z7O-8l-Zeo" eventType="touchCancel" id="OyS-WZ-sEk"/>
+ <action selector="sliderTouchUp:" destination="z7O-8l-Zeo" eventType="touchUpOutside" id="Vfz-se-pJg"/>
+ <action selector="sliderTouchUp:" destination="z7O-8l-Zeo" eventType="touchUpInside" id="kZF-uW-GRo"/>
+ <action selector="sliderValueChanged:" destination="z7O-8l-Zeo" eventType="valueChanged" id="cwm-pm-BfT"/>
+ </connections>
+ </slider>
+ </barButtonItem>
+ </items>
+ </toolbar>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="trailing" secondItem="CqS-Gu-I1O" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="4vm-hF-9E8"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="bottom" secondItem="MUi-CE-Ydy" secondAttribute="top" constant="8" symbolic="YES" type="user" id="FXP-eH-VSK"/>
+ <constraint firstItem="xWd-bg-0b6" firstAttribute="top" secondItem="CqS-Gu-I1O" secondAttribute="top" type="user" id="MXr-HK-07f"/>
+ <constraint firstAttribute="trailing" secondItem="xWd-bg-0b6" secondAttribute="trailing" type="user" id="NGT-7D-rHD"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="OM9-gE-OVP"/>
+ <constraint firstItem="xWd-bg-0b6" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" type="user" id="XO5-WJ-Y3R"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="top" secondItem="xWd-bg-0b6" secondAttribute="bottom" type="user" id="aP8-7M-Fq3"/>
+ <constraint firstItem="iLX-h1-Ko5" firstAttribute="leading" secondItem="CqS-Gu-I1O" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="bT2-TE-X7Q"/>
+ <constraint firstAttribute="trailing" secondItem="iLX-h1-Ko5" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="ruI-5P-l7I"/>
+ <constraint firstItem="MUi-CE-Ydy" firstAttribute="bottom" secondItem="CqS-Gu-I1O" secondAttribute="bottom" constant="20" symbolic="YES" type="user" id="w6K-xy-EJe"/>
+ </constraints>
+ </view>
+ <navigationItem key="navigationItem" id="fGF-kQ-bge"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics"/>
+ <connections>
+ <outlet property="message_label" destination="iLX-h1-Ko5" id="Q0Y-3J-zis"/>
+ <outlet property="pause_button" destination="J3O-8j-Tkt" id="Dls-sg-FPm"/>
+ <outlet property="play_button" destination="UlF-Ga-2VX" id="243-yq-GEe"/>
+ <outlet property="time_label" destination="G8q-Tu-Qx0" id="jpR-6u-zp0"/>
+ <outlet property="time_slider" destination="ufs-E5-87w" id="ZUd-jO-4qN"/>
+ <outlet property="toolbar" destination="MUi-CE-Ydy" id="Lme-0P-4Xq"/>
+ <outlet property="video_container_view" destination="xWd-bg-0b6" id="7dL-Mp-QGc"/>
+ <outlet property="video_height_constraint" destination="A9A-eK-7QX" id="rMe-ze-8l5"/>
+ <outlet property="video_view" destination="6tN-97-YoQ" id="Q0n-dR-hqv"/>
+ <outlet property="video_width_constraint" destination="xcj-6M-2KJ" id="oTt-9z-KCW"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iRS-GG-bR6" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="439" y="-199"/>
+ </scene>
+ <!--LibraryViewController-->
+ <scene sceneID="bq0-Ch-DBo">
+ <objects>
+ <tableViewController title="Library" id="VW0-ax-bPv" userLabel="LibraryViewController" customClass="LibraryViewController" sceneMemberID="viewController">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="hAr-jJ-10J">
+ <rect key="frame" x="0.0" y="64" width="768" height="960"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
+ <prototypes>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CellIdentifier" textLabel="HoX-KW-H9G" detailTextLabel="iD6-8p-XIU" style="IBUITableViewCellStyleSubtitle" id="ujV-TF-eMq">
+ <rect key="frame" x="0.0" y="54" width="768" height="46"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+ <rect key="frame" x="45" y="1" width="658" height="43"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" tag="10" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HoX-KW-H9G">
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" tag="11" contentMode="left" text="Subtitle" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iD6-8p-XIU">
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <color key="textColor" red="0.50196078431372548" green="0.50196078431372548" blue="0.50196078431372548" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <connections>
+ <segue destination="z7O-8l-Zeo" kind="push" identifier="playVideo" id="wKB-w6-zJS"/>
+ </connections>
+ </tableViewCell>
+ </prototypes>
+ <connections>
+ <outlet property="dataSource" destination="VW0-ax-bPv" id="9qF-zP-TH5"/>
+ <outlet property="delegate" destination="VW0-ax-bPv" id="9Ss-rm-lAe"/>
+ </connections>
+ </tableView>
+ <navigationItem key="navigationItem" id="G3n-WN-bmw">
+ <barButtonItem key="rightBarButtonItem" systemItem="refresh" id="Gpf-LU-6E1" userLabel="Refresh">
+ <connections>
+ <action selector="refresh:" destination="VW0-ax-bPv" id="nUp-eS-LmM"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="7RK-lx-45a" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-478" y="-199"/>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="EaglUIView" superclassName="UIView">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EaglUIView.h"/>
+ </class>
+ <class className="LibraryViewController" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/LibraryViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="refresh:"/>
+ </relationships>
+ </class>
+ <class className="VideoViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/VideoViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="pause:"/>
+ <relationship kind="action" name="play:"/>
+ <relationship kind="action" name="sliderTouchDown:"/>
+ <relationship kind="action" name="sliderTouchUp:"/>
+ <relationship kind="action" name="sliderValueChanged:"/>
+ <relationship kind="outlet" name="message_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="pause_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="play_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="time_label" candidateClass="UITextField"/>
+ <relationship kind="outlet" name="time_slider" candidateClass="UISlider"/>
+ <relationship kind="outlet" name="toolbar" candidateClass="UIToolbar"/>
+ <relationship kind="outlet" name="video_container_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_height_constraint" candidateClass="NSLayoutConstraint"/>
+ <relationship kind="outlet" name="video_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_width_constraint" candidateClass="NSLayoutConstraint"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPhone.storyboard b/tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPhone.storyboard
new file mode 100644
index 0000000..deb9a86
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/en.lproj/MainStoryboard_iPhone.storyboard
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="3084" systemVersion="11G63" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="z4I-U6-JHy">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="2083"/>
+ </dependencies>
+ <scenes>
+ <!--Navigation Controller-->
+ <scene sceneID="2zM-sj-9dA">
+ <objects>
+ <navigationController definesPresentationContext="YES" id="z4I-U6-JHy" sceneMemberID="viewController">
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
+ <navigationBar key="navigationBar" contentMode="scaleToFill" id="eHD-Ir-W2J">
+ <autoresizingMask key="autoresizingMask"/>
+ </navigationBar>
+ <connections>
+ <segue destination="bdY-7c-pia" kind="relationship" relationship="rootViewController" id="2oM-BQ-UIl"/>
+ </connections>
+ </navigationController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="7VH-OE-ZqU" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-1459" y="-199"/>
+ </scene>
+ <!--VideoViewController-->
+ <scene sceneID="cnz-j4-g9W">
+ <objects>
+ <viewController title="Playback" id="iMo-Z9-PrL" userLabel="VideoViewController" customClass="VideoViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="zgN-eK-M4Q">
+ <rect key="frame" x="0.0" y="64" width="320" height="504"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="nA3-W2-kn7" userLabel="VideoContainer">
+ <subviews>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="WHW-sv-bWc" userLabel="Video" customClass="EaglUIView">
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="240" type="user" id="5z2-ux-czd"/>
+ <constraint firstAttribute="width" constant="320" type="user" id="76i-Rz-yha"/>
+ </constraints>
+ </view>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="centerY" secondItem="WHW-sv-bWc" secondAttribute="centerY" type="user" id="3wK-Zr-bQY"/>
+ <constraint firstAttribute="centerX" secondItem="WHW-sv-bWc" secondAttribute="centerX" type="user" id="X5U-dh-PaZ"/>
+ </constraints>
+ </view>
+ <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Initializing..." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="LmB-wv-Ztp" userLabel="Message">
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" type="user" id="8aS-9o-dME"/>
+ <constraint firstAttribute="height" constant="21" type="user" id="hUE-Fx-tsG"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="16"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="A2w-65-QSF">
+ <constraints>
+ <constraint firstAttribute="height" constant="44" type="user" id="apr-w6-VYs"/>
+ </constraints>
+ <items>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="Ixt-So-LpU"/>
+ <barButtonItem systemItem="play" id="8Yb-MS-rAF">
+ <connections>
+ <action selector="play:" destination="iMo-Z9-PrL" id="9nM-or-ZY7"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem systemItem="pause" id="nH5-s3-C0i">
+ <connections>
+ <action selector="pause:" destination="iMo-Z9-PrL" id="mef-Ij-Agl"/>
+ </connections>
+ </barButtonItem>
+ <barButtonItem style="plain" id="VUJ-y8-aWS">
+ <textField key="customView" opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="00:00:00 / 00:00:00" borderStyle="roundedRect" textAlignment="center" minimumFontSize="17" id="R6T-PH-VPd" userLabel="Time">
+ <rect key="frame" x="132" y="7" width="139" height="30"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits"/>
+ </textField>
+ </barButtonItem>
+ <barButtonItem style="plain" systemItem="flexibleSpace" id="LSl-TA-0qV"/>
+ </items>
+ </toolbar>
+ <slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="4Ns-t9-gs7" userLabel="Slider">
+ <connections>
+ <action selector="sliderTouchDown:" destination="iMo-Z9-PrL" eventType="touchDown" id="jGO-Pw-b5d"/>
+ <action selector="sliderTouchUp:" destination="iMo-Z9-PrL" eventType="touchCancel" id="L1U-aK-FFn"/>
+ <action selector="sliderTouchUp:" destination="iMo-Z9-PrL" eventType="touchUpInside" id="jRZ-vw-FQR"/>
+ <action selector="sliderTouchUp:" destination="iMo-Z9-PrL" eventType="touchUpOutside" id="u1u-UD-WJw"/>
+ <action selector="sliderValueChanged:" destination="iMo-Z9-PrL" eventType="valueChanged" id="ZOq-XS-0M1"/>
+ </connections>
+ </slider>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="LmB-wv-Ztp" secondAttribute="bottom" constant="66" id="9mR-hc-MeV"/>
+ <constraint firstItem="A2w-65-QSF" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="Aki-Hx-2C9"/>
+ <constraint firstItem="4Ns-t9-gs7" firstAttribute="trailing" secondItem="zgN-eK-M4Q" secondAttribute="trailing" type="default" id="HFi-uV-wdo"/>
+ <constraint firstAttribute="bottom" secondItem="nA3-W2-kn7" secondAttribute="bottom" constant="87" id="Jdn-RD-NPI"/>
+ <constraint firstItem="A2w-65-QSF" firstAttribute="trailing" secondItem="zgN-eK-M4Q" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="WWj-l6-D2k"/>
+ <constraint firstAttribute="trailing" secondItem="LmB-wv-Ztp" secondAttribute="trailing" constant="20" symbolic="YES" type="user" id="ddw-6a-Ccz"/>
+ <constraint firstItem="A2w-65-QSF" firstAttribute="bottom" secondItem="zgN-eK-M4Q" secondAttribute="bottom" type="default" id="e3s-lP-iPh"/>
+ <constraint firstAttribute="trailing" secondItem="nA3-W2-kn7" secondAttribute="trailing" type="user" id="lOJ-ew-ZyI"/>
+ <constraint firstItem="nA3-W2-kn7" firstAttribute="top" secondItem="zgN-eK-M4Q" secondAttribute="top" type="user" id="lUb-ik-h6u"/>
+ <constraint firstItem="4Ns-t9-gs7" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" type="default" id="ma4-AV-cQs"/>
+ <constraint firstItem="LmB-wv-Ztp" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" constant="20" symbolic="YES" type="user" id="nfT-8Y-Tvw"/>
+ <constraint firstItem="nA3-W2-kn7" firstAttribute="leading" secondItem="zgN-eK-M4Q" secondAttribute="leading" type="user" id="p8G-QE-uZ8"/>
+ <constraint firstAttribute="bottom" secondItem="4Ns-t9-gs7" secondAttribute="bottom" constant="45" id="qfD-gf-vLB"/>
+ </constraints>
+ </view>
+ <navigationItem key="navigationItem" id="xMw-um-vMA"/>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
+ <simulatedOrientationMetrics key="simulatedOrientationMetrics"/>
+ <connections>
+ <outlet property="message_label" destination="LmB-wv-Ztp" id="YqJ-GW-DBG"/>
+ <outlet property="pause_button" destination="nH5-s3-C0i" id="VWV-EW-jB6"/>
+ <outlet property="play_button" destination="8Yb-MS-rAF" id="5SI-l2-mAJ"/>
+ <outlet property="time_label" destination="R6T-PH-VPd" id="bGs-Zr-rv3"/>
+ <outlet property="time_slider" destination="4Ns-t9-gs7" id="9Ne-1N-clc"/>
+ <outlet property="video_container_view" destination="nA3-W2-kn7" id="lEY-hP-YHD"/>
+ <outlet property="video_height_constraint" destination="5z2-ux-czd" id="9R7-fg-G0e"/>
+ <outlet property="video_view" destination="WHW-sv-bWc" id="c6W-td-a74"/>
+ <outlet property="video_width_constraint" destination="76i-Rz-yha" id="vSP-Kk-v8g"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="YOs-uD-FMw" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-609" y="-199"/>
+ </scene>
+ <!--LibraryViewController-->
+ <scene sceneID="5eb-Di-aQ1">
+ <objects>
+ <tableViewController title="Library" id="bdY-7c-pia" userLabel="LibraryViewController" customClass="LibraryViewController" sceneMemberID="viewController">
+ <tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="singleLineEtched" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="4vG-QM-31k">
+ <rect key="frame" x="0.0" y="64" width="320" height="504"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
+ <prototypes>
+ <tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CellIdentifier" textLabel="QLZ-ec-hHM" detailTextLabel="kAu-kE-DrP" style="IBUITableViewCellStyleSubtitle" id="nmS-s6-sIj">
+ <rect key="frame" x="0.0" y="46" width="320" height="46"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+ <rect key="frame" x="10" y="1" width="280" height="43"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <subviews>
+ <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" tag="10" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="QLZ-ec-hHM">
+ <rect key="frame" x="10" y="2" width="38" height="22"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
+ <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+ <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </label>
+ <label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" tag="11" contentMode="left" text="Subtitle" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="kAu-kE-DrP">
+ <rect key="frame" x="10" y="24" width="47" height="18"/>
+ <autoresizingMask key="autoresizingMask"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="highlightedColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
+ </label>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ </view>
+ <connections>
+ <segue destination="iMo-Z9-PrL" kind="push" identifier="playVideo" id="jW0-JJ-SqQ"/>
+ </connections>
+ </tableViewCell>
+ </prototypes>
+ <connections>
+ <outlet property="dataSource" destination="bdY-7c-pia" id="yhT-ag-TvP"/>
+ <outlet property="delegate" destination="bdY-7c-pia" id="usy-2O-hgr"/>
+ </connections>
+ </tableView>
+ <navigationItem key="navigationItem" id="3Tj-RI-j7Z">
+ <barButtonItem key="rightBarButtonItem" systemItem="refresh" id="B0E-4z-3fo" userLabel="Refresh">
+ <connections>
+ <action selector="refresh:" destination="bdY-7c-pia" id="3oQ-nv-MUd"/>
+ </connections>
+ </barButtonItem>
+ </navigationItem>
+ <simulatedStatusBarMetrics key="simulatedStatusBarMetrics"/>
+ </tableViewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="pXd-g9-Hdc" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="-1036" y="-199"/>
+ </scene>
+ </scenes>
+ <classes>
+ <class className="EaglUIView" superclassName="UIView">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EaglUIView.h"/>
+ </class>
+ <class className="LibraryViewController" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/LibraryViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="refresh:"/>
+ </relationships>
+ </class>
+ <class className="NSLayoutConstraint" superclassName="NSObject">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
+ </class>
+ <class className="VideoViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/VideoViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="pause:"/>
+ <relationship kind="action" name="play:"/>
+ <relationship kind="action" name="sliderTouchDown:"/>
+ <relationship kind="action" name="sliderTouchUp:"/>
+ <relationship kind="action" name="sliderValueChanged:"/>
+ <relationship kind="outlet" name="message_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="pause_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="play_button" candidateClass="UIBarButtonItem"/>
+ <relationship kind="outlet" name="time_label" candidateClass="UITextField"/>
+ <relationship kind="outlet" name="time_slider" candidateClass="UISlider"/>
+ <relationship kind="outlet" name="toolbar" candidateClass="UIToolbar"/>
+ <relationship kind="outlet" name="video_container_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_height_constraint" candidateClass="NSLayoutConstraint"/>
+ <relationship kind="outlet" name="video_view" candidateClass="UIView"/>
+ <relationship kind="outlet" name="video_width_constraint" candidateClass="NSLayoutConstraint"/>
+ </relationships>
+ </class>
+ </classes>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document> \ No newline at end of file
diff --git a/tutorials/xcode iOS/Tutorial 5/fonts.conf b/tutorials/xcode iOS/Tutorial 5/fonts.conf
new file mode 100644
index 0000000..6b780ea
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/fonts.conf
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!-- Font directory list -->
+
+ <dir prefix="xdg"></dir>
+
+<!-- Font cache directory list -->
+
+ <cachedir prefix="xdg"></cachedir>
+
+<!--
+ Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>monospace</string>
+ </edit>
+ </match>
+
+<!--
+ Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans serif</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans</string>
+ </test>
+ <edit name="family" mode="assign" binding="same">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+ <config>
+<!--
+ These are the default Unicode chars that are expected to be blank
+ in fonts. All other blank chars are assumed to be broken and
+ won't appear in the resulting charsets
+ -->
+ <blank>
+ <int>0x0020</int> <!-- SPACE -->
+ <int>0x00A0</int> <!-- NO-BREAK SPACE -->
+ <int>0x00AD</int> <!-- SOFT HYPHEN -->
+ <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
+ <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
+ <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
+ <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
+ <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
+ <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
+ <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
+ <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
+ <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
+ <int>0x1680</int> <!-- OGHAM SPACE MARK -->
+ <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
+ <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
+ <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
+ <int>0x2000</int> <!-- EN QUAD -->
+ <int>0x2001</int> <!-- EM QUAD -->
+ <int>0x2002</int> <!-- EN SPACE -->
+ <int>0x2003</int> <!-- EM SPACE -->
+ <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
+ <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
+ <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
+ <int>0x2007</int> <!-- FIGURE SPACE -->
+ <int>0x2008</int> <!-- PUNCTUATION SPACE -->
+ <int>0x2009</int> <!-- THIN SPACE -->
+ <int>0x200A</int> <!-- HAIR SPACE -->
+ <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
+ <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
+ <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
+ <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
+ <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
+ <int>0x2028</int> <!-- LINE SEPARATOR -->
+ <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
+ <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
+ <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
+ <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
+ <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
+ <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
+ <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
+ <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
+ <int>0x2060</int> <!-- WORD JOINER -->
+ <int>0x2061</int> <!-- FUNCTION APPLICATION -->
+ <int>0x2062</int> <!-- INVISIBLE TIMES -->
+ <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
+ <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
+ <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
+ <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
+ <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
+ <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
+ <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
+ <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
+ <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
+ <int>0x3164</int> <!-- HANGUL FILLER -->
+ <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
+ <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
+ <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
+ <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+ <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+ </blank>
+<!--
+ Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+ <rescan>
+ <int>30</int>
+ </rescan>
+ </config>
+
+</fontconfig>
+
diff --git a/tutorials/xcode iOS/Tutorial 5/gst_ios_init.h b/tutorials/xcode iOS/Tutorial 5/gst_ios_init.h
new file mode 100644
index 0000000..79ee758
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/gst_ios_init.h
@@ -0,0 +1,39 @@
+#ifndef __GST_IOS_INIT_H__
+#define __GST_IOS_INIT_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_G_IO_MODULE_DECLARE(name) \
+extern void G_PASTE(g_io_module_, G_PASTE(name, _load_static)) (void)
+
+#define GST_G_IO_MODULE_LOAD(name) \
+G_PASTE(g_io_module_, G_PASTE(name, _load_static)) ()
+
+/* Uncomment each line to enable the plugin categories that your application needs.
+ * You can also enable individual plugins. See gst_ios_init.c to see their names
+ */
+
+#define GST_IOS_PLUGINS_CORE
+//#define GST_IOS_PLUGINS_CAPTURE
+//#define GST_IOS_PLUGINS_CODECS_RESTRICTED
+//#define GST_IOS_PLUGINS_ENCODING
+//#define GST_IOS_PLUGINS_CODECS_GPL
+//#define GST_IOS_PLUGINS_NET_RESTRICTED
+#define GST_IOS_PLUGINS_SYS
+//#define GST_IOS_PLUGINS_VIS
+#define GST_IOS_PLUGINS_PLAYBACK
+//#define GST_IOS_PLUGINS_EFFECTS
+#define GST_IOS_PLUGINS_CODECS
+#define GST_IOS_PLUGINS_NET
+//#define GST_IOS_PLUGINS_EDITING
+
+
+//#define GST_IOS_GIO_MODULE_GNUTLS
+
+void gst_ios_init ();
+
+G_END_DECLS
+
+#endif
diff --git a/tutorials/xcode iOS/Tutorial 5/gst_ios_init.m b/tutorials/xcode iOS/Tutorial 5/gst_ios_init.m
new file mode 100644
index 0000000..403f9f9
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/gst_ios_init.m
@@ -0,0 +1,988 @@
+#include "gst_ios_init.h"
+
+#if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+GST_PLUGIN_STATIC_DECLARE(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+GST_PLUGIN_STATIC_DECLARE(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+GST_PLUGIN_STATIC_DECLARE(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+GST_PLUGIN_STATIC_DECLARE(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+GST_PLUGIN_STATIC_DECLARE(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+GST_PLUGIN_STATIC_DECLARE(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+GST_PLUGIN_STATIC_DECLARE(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+GST_PLUGIN_STATIC_DECLARE(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+GST_PLUGIN_STATIC_DECLARE(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+GST_PLUGIN_STATIC_DECLARE(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+GST_PLUGIN_STATIC_DECLARE(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+GST_PLUGIN_STATIC_DECLARE(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ #include <gio/gio.h>
+ GST_G_IO_MODULE_DECLARE(gnutls);
+#endif
+
+void
+gst_ios_init (void)
+{
+ GstPluginFeature *plugin;
+ GstRegistry *reg;
+ NSString *resources = [[NSBundle mainBundle] resourcePath];
+ NSString *tmp = NSTemporaryDirectory();
+ NSString *cache = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
+ NSString *docs = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
+
+ const gchar *resources_dir = [resources UTF8String];
+ const gchar *tmp_dir = [tmp UTF8String];
+ const gchar *cache_dir = [cache UTF8String];
+ const gchar *docs_dir = [docs UTF8String];
+ gchar *ca_certificates;
+
+ g_setenv ("TMP", tmp_dir, TRUE);
+ g_setenv ("TEMP", tmp_dir, TRUE);
+ g_setenv ("TMPDIR", tmp_dir, TRUE);
+ g_setenv ("XDG_RUNTIME_DIR", resources_dir, TRUE);
+ g_setenv ("XDG_CACHE_HOME", cache_dir, TRUE);
+
+ g_setenv ("HOME", docs_dir, TRUE);
+ g_setenv ("XDG_DATA_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_DIRS", resources_dir, TRUE);
+ g_setenv ("XDG_CONFIG_HOME", cache_dir, TRUE);
+ g_setenv ("XDG_DATA_HOME", resources_dir, TRUE);
+ g_setenv ("FONTCONFIG_PATH", resources_dir, TRUE);
+
+ ca_certificates = g_build_filename (resources_dir, "ssl", "certs", "ca-certifcates.crt", NULL);
+ g_setenv ("CA_CERTIFICATES", ca_certificates, TRUE);
+ g_free (ca_certificates);
+
+ gst_init (NULL, NULL);
+
+ #if defined(GST_IOS_PLUGIN_COREELEMENTS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(coreelements);
+#endif
+#if defined(GST_IOS_PLUGIN_ADDER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(adder);
+#endif
+#if defined(GST_IOS_PLUGIN_APP) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(app);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiorate);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIORESAMPLE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audioresample);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(audiotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_GIO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(gio);
+#endif
+#if defined(GST_IOS_PLUGIN_PANGO) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(pango);
+#endif
+#if defined(GST_IOS_PLUGIN_TYPEFINDFUNCTIONS) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(typefindfunctions);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCONVERT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEORATE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videorate);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOSCALE) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videoscale);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOTESTSRC) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videotestsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_VOLUME) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(volume);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTODETECT) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(autodetect);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTER) || defined(GST_IOS_PLUGINS_CORE)
+ GST_PLUGIN_STATIC_REGISTER(videofilter);
+#endif
+#if defined(GST_IOS_PLUGIN_CAMERABIN) || defined(GST_IOS_PLUGINS_CAPTURE)
+ GST_PLUGIN_STATIC_REGISTER(camerabin);
+#endif
+#if defined(GST_IOS_PLUGIN_ASFMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asfmux);
+#endif
+#if defined(GST_IOS_PLUGIN_DTSDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dtsdec);
+#endif
+#if defined(GST_IOS_PLUGIN_FAAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(faad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGPSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegpsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSDEMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEGTSMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpegtsmux);
+#endif
+#if defined(GST_IOS_PLUGIN_VOAACENC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(voaacenc);
+#endif
+#if defined(GST_IOS_PLUGIN_A52DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(a52dec);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRNB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrnb);
+#endif
+#if defined(GST_IOS_PLUGIN_AMRWBDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(amrwbdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ASF) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(asf);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSUB) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdsub);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDLPCMDEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(dvdlpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_MAD) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mad);
+#endif
+#if defined(GST_IOS_PLUGIN_MPEG2DEC) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mpeg2dec);
+#endif
+#if defined(GST_IOS_PLUGIN_XINGMUX) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(xingmux);
+#endif
+#if defined(GST_IOS_PLUGIN_REALMEDIA) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(realmedia);
+#endif
+#if defined(GST_IOS_PLUGIN_X264) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(x264);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBAV) || defined(GST_IOS_PLUGINS_CODECS_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(libav);
+#endif
+#if defined(GST_IOS_PLUGIN_ENCODING) || defined(GST_IOS_PLUGINS_ENCODING)
+ GST_PLUGIN_STATIC_REGISTER(encoding);
+#endif
+#if defined(GST_IOS_PLUGIN_ASSRENDER) || defined(GST_IOS_PLUGINS_CODECS_GPL)
+ GST_PLUGIN_STATIC_REGISTER(assrender);
+#endif
+#if defined(GST_IOS_PLUGIN_MMS) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(mms);
+#endif
+#if defined(GST_IOS_PLUGIN_RTMP) || defined(GST_IOS_PLUGINS_NET_RESTRICTED)
+ GST_PLUGIN_STATIC_REGISTER(rtmp);
+#endif
+#if defined(GST_IOS_PLUGIN_OSXAUDIO) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(osxaudio);
+#endif
+#if defined(GST_IOS_PLUGIN_APPLEMEDIA) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(applemedia);
+#endif
+#if defined(GST_IOS_PLUGIN_SHM) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(shm);
+#endif
+#if defined(GST_IOS_PLUGIN_OPENGL) || defined(GST_IOS_PLUGINS_SYS)
+ GST_PLUGIN_STATIC_REGISTER(opengl);
+#endif
+#if defined(GST_IOS_PLUGIN_LIBVISUAL) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(libvisual);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom);
+#endif
+#if defined(GST_IOS_PLUGIN_GOOM2K1) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(goom2k1);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOVISUALIZERS) || defined(GST_IOS_PLUGINS_VIS)
+ GST_PLUGIN_STATIC_REGISTER(audiovisualizers);
+#endif
+#if defined(GST_IOS_PLUGIN_PLAYBACK) || defined(GST_IOS_PLUGINS_PLAYBACK)
+ GST_PLUGIN_STATIC_REGISTER(playback);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHA) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alpha);
+#endif
+#if defined(GST_IOS_PLUGIN_ALPHACOLOR) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(alphacolor);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofx);
+#endif
+#if defined(GST_IOS_PLUGIN_CAIRO) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cairo);
+#endif
+#if defined(GST_IOS_PLUGIN_CUTTER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(cutter);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUG) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debug);
+#endif
+#if defined(GST_IOS_PLUGIN_DEINTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(deinterlace);
+#endif
+#if defined(GST_IOS_PLUGIN_DTMF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(dtmf);
+#endif
+#if defined(GST_IOS_PLUGIN_EFFECTV) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(effectv);
+#endif
+#if defined(GST_IOS_PLUGIN_EQUALIZER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(equalizer);
+#endif
+#if defined(GST_IOS_PLUGIN_GDKPIXBUF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gdkpixbuf);
+#endif
+#if defined(GST_IOS_PLUGIN_IMAGEFREEZE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(imagefreeze);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLEAVE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interleave);
+#endif
+#if defined(GST_IOS_PLUGIN_LEVEL) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(level);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIFILE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(multifile);
+#endif
+#if defined(GST_IOS_PLUGIN_REPLAYGAIN) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(replaygain);
+#endif
+#if defined(GST_IOS_PLUGIN_SHAPEWIPE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(shapewipe);
+#endif
+#if defined(GST_IOS_PLUGIN_SMPTE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smpte);
+#endif
+#if defined(GST_IOS_PLUGIN_SPECTRUM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(spectrum);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOBOX) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videobox);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOCROP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videocrop);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOMIXER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videomixer);
+#endif
+#if defined(GST_IOS_PLUGIN_ACCURIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(accurip);
+#endif
+#if defined(GST_IOS_PLUGIN_AIFF) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(aiff);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOFXBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(audiofxbad);
+#endif
+#if defined(GST_IOS_PLUGIN_AUTOCONVERT) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(autoconvert);
+#endif
+#if defined(GST_IOS_PLUGIN_BAYER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(bayer);
+#endif
+#if defined(GST_IOS_PLUGIN_COLOREFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(coloreffects);
+#endif
+#if defined(GST_IOS_PLUGIN_DEBUGUTILSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(debugutilsbad);
+#endif
+#if defined(GST_IOS_PLUGIN_FIELDANALYSIS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(fieldanalysis);
+#endif
+#if defined(GST_IOS_PLUGIN_FREEVERB) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(freeverb);
+#endif
+#if defined(GST_IOS_PLUGIN_FREI0R) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(frei0r);
+#endif
+#if defined(GST_IOS_PLUGIN_GAUDIEFFECTS) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(gaudieffects);
+#endif
+#if defined(GST_IOS_PLUGIN_GEOMETRICTRANSFORM) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(geometrictransform);
+#endif
+#if defined(GST_IOS_PLUGIN_INTERLACE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(interlace);
+#endif
+#if defined(GST_IOS_PLUGIN_IVTC) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(ivtc);
+#endif
+#if defined(GST_IOS_PLUGIN_LIVEADDER) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(liveadder);
+#endif
+#if defined(GST_IOS_PLUGIN_RAWPARSE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(rawparse);
+#endif
+#if defined(GST_IOS_PLUGIN_REMOVESILENCE) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(removesilence);
+#endif
+#if defined(GST_IOS_PLUGIN_SEGMENTCLIP) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(segmentclip);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTH) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(smooth);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEED) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(speed);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOFILTERSBAD) || defined(GST_IOS_PLUGINS_EFFECTS)
+ GST_PLUGIN_STATIC_REGISTER(videofiltersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subparse);
+#endif
+#if defined(GST_IOS_PLUGIN_OGG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ogg);
+#endif
+#if defined(GST_IOS_PLUGIN_THEORA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(theora);
+#endif
+#if defined(GST_IOS_PLUGIN_VORBIS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vorbis);
+#endif
+#if defined(GST_IOS_PLUGIN_IVORBISDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(ivorbisdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ALAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(alaw);
+#endif
+#if defined(GST_IOS_PLUGIN_APETAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(apetag);
+#endif
+#if defined(GST_IOS_PLUGIN_AUDIOPARSERS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(audioparsers);
+#endif
+#if defined(GST_IOS_PLUGIN_AUPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(auparse);
+#endif
+#if defined(GST_IOS_PLUGIN_AVI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(avi);
+#endif
+#if defined(GST_IOS_PLUGIN_DV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLAC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flac);
+#endif
+#if defined(GST_IOS_PLUGIN_FLV) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flv);
+#endif
+#if defined(GST_IOS_PLUGIN_FLXDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(flxdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ICYDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(icydemux);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3DEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3demux);
+#endif
+#if defined(GST_IOS_PLUGIN_ISOMP4) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(isomp4);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpeg);
+#endif
+#if defined(GST_IOS_PLUGIN_MATROSKA) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(matroska);
+#endif
+#if defined(GST_IOS_PLUGIN_MULAW) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mulaw);
+#endif
+#if defined(GST_IOS_PLUGIN_MULTIPART) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(multipart);
+#endif
+#if defined(GST_IOS_PLUGIN_PNG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(png);
+#endif
+#if defined(GST_IOS_PLUGIN_SPEEX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(speex);
+#endif
+#if defined(GST_IOS_PLUGIN_TAGLIB) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(taglib);
+#endif
+#if defined(GST_IOS_PLUGIN_VPX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(vpx);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavenc);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPACK) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavpack);
+#endif
+#if defined(GST_IOS_PLUGIN_WAVPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(wavparse);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4menc);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmdec);
+#endif
+#if defined(GST_IOS_PLUGIN_ADPCMENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(adpcmenc);
+#endif
+#if defined(GST_IOS_PLUGIN_DASHDEMUX) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dashdemux);
+#endif
+#if defined(GST_IOS_PLUGIN_DVBSUBOVERLAY) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvbsuboverlay);
+#endif
+#if defined(GST_IOS_PLUGIN_DVDSPU) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(dvdspu);
+#endif
+#if defined(GST_IOS_PLUGIN_FRAGMENTED) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(fragmented);
+#endif
+#if defined(GST_IOS_PLUGIN_ID3TAG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(id3tag);
+#endif
+#if defined(GST_IOS_PLUGIN_KATE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(kate);
+#endif
+#if defined(GST_IOS_PLUGIN_MIDI) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(midi);
+#endif
+#if defined(GST_IOS_PLUGIN_MXF) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(mxf);
+#endif
+#if defined(GST_IOS_PLUGIN_OPUS) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(opus);
+#endif
+#if defined(GST_IOS_PLUGIN_PCAPPARSE) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pcapparse);
+#endif
+#if defined(GST_IOS_PLUGIN_PNM) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(pnm);
+#endif
+#if defined(GST_IOS_PLUGIN_RFBSRC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rfbsrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SCHRO) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(schro);
+#endif
+#if defined(GST_IOS_PLUGIN_GSTSIREN) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gstsiren);
+#endif
+#if defined(GST_IOS_PLUGIN_SMOOTHSTREAMING) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(smoothstreaming);
+#endif
+#if defined(GST_IOS_PLUGIN_SUBENC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(subenc);
+#endif
+#if defined(GST_IOS_PLUGIN_VIDEOPARSERSBAD) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(videoparsersbad);
+#endif
+#if defined(GST_IOS_PLUGIN_Y4MDEC) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(y4mdec);
+#endif
+#if defined(GST_IOS_PLUGIN_JPEGFORMAT) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(jpegformat);
+#endif
+#if defined(GST_IOS_PLUGIN_GDP) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(gdp);
+#endif
+#if defined(GST_IOS_PLUGIN_RSVG) || defined(GST_IOS_PLUGINS_CODECS)
+ GST_PLUGIN_STATIC_REGISTER(rsvg);
+#endif
+#if defined(GST_IOS_PLUGIN_TCP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(tcp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTSP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtsp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtp);
+#endif
+#if defined(GST_IOS_PLUGIN_RTPMANAGER) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(rtpmanager);
+#endif
+#if defined(GST_IOS_PLUGIN_SOUP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(soup);
+#endif
+#if defined(GST_IOS_PLUGIN_UDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(udp);
+#endif
+#if defined(GST_IOS_PLUGIN_DATAURISRC) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(dataurisrc);
+#endif
+#if defined(GST_IOS_PLUGIN_SDP) || defined(GST_IOS_PLUGINS_NET)
+ GST_PLUGIN_STATIC_REGISTER(sdp);
+#endif
+#if defined(GST_IOS_PLUGIN_GNONLIN) || defined(GST_IOS_PLUGINS_EDITING)
+ GST_PLUGIN_STATIC_REGISTER(gnonlin);
+#endif
+
+#if defined(GST_IOS_GIO_MODULE_GNUTLS)
+ GST_G_IO_MODULE_LOAD(gnutls);
+#endif
+
+ /* Lower the ranks of filesrc and giosrc so iosavassetsrc is
+ * tried first in gst_element_make_from_uri() for file:// */
+ reg = gst_registry_get();
+ plugin = gst_registry_lookup_feature(reg, "filesrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY);
+ plugin = gst_registry_lookup_feature(reg, "giosrc");
+ if (plugin)
+ gst_plugin_feature_set_rank(plugin, GST_RANK_SECONDARY-1);
+}
diff --git a/tutorials/xcode iOS/Tutorial 5/main.m b/tutorials/xcode iOS/Tutorial 5/main.m
new file mode 100644
index 0000000..6cf4e0f
--- /dev/null
+++ b/tutorials/xcode iOS/Tutorial 5/main.m
@@ -0,0 +1,12 @@
+#import <UIKit/UIKit.h>
+
+#import "AppDelegate.h"
+#include "gst_ios_init.h"
+
+int main(int argc, char *argv[])
+{
+ @autoreleasepool {
+ gst_ios_init();
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/project.pbxproj b/tutorials/xcode/GStreamer Tutorials.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..60bc000
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/project.pbxproj
@@ -0,0 +1,1853 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 63118C62156D2AF10085CF03 /* basic-tutorial-3.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118C60156D2AA70085CF03 /* basic-tutorial-3.c */; };
+ 63118C81156D2BAE0085CF03 /* basic-tutorial-4.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118C7F156D2BA30085CF03 /* basic-tutorial-4.c */; };
+ 63118C93156D2D630085CF03 /* basic-tutorial-1.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118C92156D2D630085CF03 /* basic-tutorial-1.c */; };
+ 63118CA3156D2E400085CF03 /* basic-tutorial-5.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118CA2156D2E400085CF03 /* basic-tutorial-5.c */; };
+ 63118CC3156D31300085CF03 /* basic-tutorial-2.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118C4D156D29530085CF03 /* basic-tutorial-2.c */; };
+ 63118CD4156D33040085CF03 /* playback-tutorial-1.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118CD2156D32FE0085CF03 /* playback-tutorial-1.c */; };
+ 63118CE5156D35610085CF03 /* playback-tutorial-2.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118CE3156D35390085CF03 /* playback-tutorial-2.c */; };
+ 63118CF6156D3ACB0085CF03 /* basic-tutorial-6.c in Sources */ = {isa = PBXBuildFile; fileRef = 63118CF4156D3AB60085CF03 /* basic-tutorial-6.c */; };
+ 63B8A64C1754AC1D00121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63B8A64D1754AC1E00121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63B8A64E1754AC1F00121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63B8A64F1754AC2000121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63B8A6501754AC2100121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63B8A6511754AC2100121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63B8A6521754AC2200121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63B8A6531754AC2200121B88 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63DE883E156DAC18006F2D3B /* basic-tutorial-7.c in Sources */ = {isa = PBXBuildFile; fileRef = 63DE8838156DAC09006F2D3B /* basic-tutorial-7.c */; };
+ 63DE883F156DAC1D006F2D3B /* basic-tutorial-8.c in Sources */ = {isa = PBXBuildFile; fileRef = 63DE883A156DAC0E006F2D3B /* basic-tutorial-8.c */; };
+ 63DE8840156DAC21006F2D3B /* basic-tutorial-9.c in Sources */ = {isa = PBXBuildFile; fileRef = 63DE883C156DAC15006F2D3B /* basic-tutorial-9.c */; };
+ 63E2230316075E05001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230416075E24001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230616075E34001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230716075E3A001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230816075E41001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230916075E48001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230A16075E4F001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230B16075E55001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63E2230C16076969001954D7 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ 63EA7B0F1753A1D50032388A /* basic-tutorial-12.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B0E1753A1D50032388A /* basic-tutorial-12.c */; };
+ 63EA7B1E1753A29C0032388A /* basic-tutorial-13.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B1D1753A29C0032388A /* basic-tutorial-13.c */; };
+ 63EA7B2D1753A2DF0032388A /* basic-tutorial-15.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B2C1753A2DF0032388A /* basic-tutorial-15.c */; };
+ 63EA7B3C1753A3740032388A /* playback-tutorial-3.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B3B1753A3740032388A /* playback-tutorial-3.c */; };
+ 63EA7B4B1753A3AA0032388A /* playback-tutorial-4.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B4A1753A3AA0032388A /* playback-tutorial-4.c */; };
+ 63EA7B5A1753A3D00032388A /* playback-tutorial-5.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B591753A3D00032388A /* playback-tutorial-5.c */; };
+ 63EA7B691753A4100032388A /* playback-tutorial-6.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B681753A4100032388A /* playback-tutorial-6.c */; };
+ 63EA7B781753A4370032388A /* playback-tutorial-7.c in Sources */ = {isa = PBXBuildFile; fileRef = 63EA7B771753A4370032388A /* playback-tutorial-7.c */; };
+ C3EC97E31BC69D7900DD7808 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+ C3EC97E41BC69DD700DD7808 /* GStreamer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E2230016073E04001954D7 /* GStreamer.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 63118C52156D29DE0085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63118C73156D2B970085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63118C86156D2D190085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63118C96156D2E2F0085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63118CB7156D31240085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63118CC6156D32E20085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63118CD7156D34BA0085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63118CE8156D3A870085CF03 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63DE8810156DABDF006F2D3B /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63DE881E156DABE6006F2D3B /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63DE882C156DABEE006F2D3B /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B0317539E570032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B121753A2700032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B211753A2B90032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B301753A2FE0032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B3F1753A38D0032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B4E1753A3B60032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B5D1753A3F70032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+ 63EA7B6C1753A41C0032388A /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = /usr/share/man/man1/;
+ dstSubfolderSpec = 0;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 1;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 63118C4D156D29530085CF03 /* basic-tutorial-2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-2.c"; path = "../basic-tutorial-2.c"; sourceTree = SOURCE_ROOT; };
+ 63118C54156D29DE0085CF03 /* Turorial 3 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Turorial 3"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118C60156D2AA70085CF03 /* basic-tutorial-3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-3.c"; path = "../basic-tutorial-3.c"; sourceTree = SOURCE_ROOT; };
+ 63118C75156D2B970085CF03 /* Tutorial 4 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 4"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118C7F156D2BA30085CF03 /* basic-tutorial-4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-4.c"; path = "../basic-tutorial-4.c"; sourceTree = SOURCE_ROOT; };
+ 63118C88156D2D190085CF03 /* Tutorial 1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 1"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118C92156D2D630085CF03 /* basic-tutorial-1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-1.c"; path = "../basic-tutorial-1.c"; sourceTree = SOURCE_ROOT; };
+ 63118C98156D2E2F0085CF03 /* Tutorial 5 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 5"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118CA2156D2E400085CF03 /* basic-tutorial-5.c */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.objc; fileEncoding = 4; name = "basic-tutorial-5.c"; path = "../basic-tutorial-5.c"; sourceTree = SOURCE_ROOT; };
+ 63118CB9156D31240085CF03 /* Tutorial 2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 2"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118CC8156D32E20085CF03 /* Playback Tutorial 1 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Playback Tutorial 1"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118CD2156D32FE0085CF03 /* playback-tutorial-1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "playback-tutorial-1.c"; path = "../playback-tutorial-1.c"; sourceTree = SOURCE_ROOT; };
+ 63118CD9156D34BA0085CF03 /* Playback Tutorial 2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Playback Tutorial 2"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118CE3156D35390085CF03 /* playback-tutorial-2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "playback-tutorial-2.c"; path = "../playback-tutorial-2.c"; sourceTree = SOURCE_ROOT; };
+ 63118CEA156D3A870085CF03 /* Tutorial 6 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 6"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63118CF4156D3AB60085CF03 /* basic-tutorial-6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-6.c"; path = "../basic-tutorial-6.c"; sourceTree = SOURCE_ROOT; };
+ 63DE8812156DABDF006F2D3B /* Tutorial 7 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 7"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63DE8820156DABE6006F2D3B /* Tutorial 8 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 8"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63DE882E156DABEE006F2D3B /* Tutorial 9 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 9"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63DE8838156DAC09006F2D3B /* basic-tutorial-7.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-7.c"; path = "../basic-tutorial-7.c"; sourceTree = SOURCE_ROOT; };
+ 63DE883A156DAC0E006F2D3B /* basic-tutorial-8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-8.c"; path = "../basic-tutorial-8.c"; sourceTree = SOURCE_ROOT; };
+ 63DE883C156DAC15006F2D3B /* basic-tutorial-9.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-9.c"; path = "../basic-tutorial-9.c"; sourceTree = SOURCE_ROOT; };
+ 63E2230016073E04001954D7 /* GStreamer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GStreamer.framework; path = /Library/Frameworks/GStreamer.framework; sourceTree = "<absolute>"; };
+ 63EA7B0517539E570032388A /* Tutorial 12 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 12"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B0E1753A1D50032388A /* basic-tutorial-12.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-12.c"; path = "../basic-tutorial-12.c"; sourceTree = SOURCE_ROOT; };
+ 63EA7B141753A2700032388A /* Tutorial 13 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 13"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B1D1753A29C0032388A /* basic-tutorial-13.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-13.c"; path = "../basic-tutorial-13.c"; sourceTree = SOURCE_ROOT; };
+ 63EA7B231753A2B90032388A /* Tutorial 15 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Tutorial 15"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B2C1753A2DF0032388A /* basic-tutorial-15.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "basic-tutorial-15.c"; path = "../basic-tutorial-15.c"; sourceTree = SOURCE_ROOT; };
+ 63EA7B321753A2FE0032388A /* Playback Tutorial 3 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Playback Tutorial 3"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B3B1753A3740032388A /* playback-tutorial-3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "playback-tutorial-3.c"; path = "../playback-tutorial-3.c"; sourceTree = SOURCE_ROOT; };
+ 63EA7B411753A38D0032388A /* Playback Tutorial 4 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Playback Tutorial 4"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B4A1753A3AA0032388A /* playback-tutorial-4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "playback-tutorial-4.c"; path = "../playback-tutorial-4.c"; sourceTree = SOURCE_ROOT; };
+ 63EA7B501753A3B60032388A /* Playback Tutorial 5 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Playback Tutorial 5"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B591753A3D00032388A /* playback-tutorial-5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "playback-tutorial-5.c"; path = "../playback-tutorial-5.c"; sourceTree = SOURCE_ROOT; };
+ 63EA7B5F1753A3F70032388A /* Playback Tutorial 6 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Playback Tutorial 6"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B681753A4100032388A /* playback-tutorial-6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "playback-tutorial-6.c"; path = "../playback-tutorial-6.c"; sourceTree = SOURCE_ROOT; };
+ 63EA7B6E1753A41C0032388A /* Playback Tutorial 7 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Playback Tutorial 7"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 63EA7B771753A4370032388A /* playback-tutorial-7.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "playback-tutorial-7.c"; path = "../playback-tutorial-7.c"; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 63118C51156D29DE0085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230316075E05001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118C72156D2B970085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230416075E24001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118C85156D2D190085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C3EC97E31BC69D7900DD7808 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118C95156D2E2F0085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230C16076969001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CB6156D31240085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ C3EC97E41BC69DD700DD7808 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CC5156D32E20085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230B16075E55001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CD6156D34BA0085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230A16075E4F001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CE7156D3A870085CF03 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230616075E34001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63DE880F156DABDF006F2D3B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230716075E3A001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63DE881D156DABE6006F2D3B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230816075E41001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63DE882B156DABEE006F2D3B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63E2230916075E48001954D7 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B0217539E570032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A64C1754AC1D00121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B111753A2700032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A64D1754AC1E00121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B201753A2B90032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A64E1754AC1F00121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B2F1753A2FE0032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A64F1754AC2000121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B3E1753A38D0032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A6501754AC2100121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B4D1753A3B60032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A6511754AC2100121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B5C1753A3F70032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A6521754AC2200121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B6B1753A41C0032388A /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63B8A6531754AC2200121B88 /* GStreamer.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 63118C35156D29340085CF03 = {
+ isa = PBXGroup;
+ children = (
+ 63E2230016073E04001954D7 /* GStreamer.framework */,
+ 63118C8A156D2D190085CF03 /* Tutorial 1 */,
+ 63118C43156D29340085CF03 /* Tutorial 2 */,
+ 63118C56156D29DE0085CF03 /* Tutorial 3 */,
+ 63118C77156D2B970085CF03 /* Tutorial 4 */,
+ 63118C9A156D2E2F0085CF03 /* Tutorial 5 */,
+ 63118CEC156D3A870085CF03 /* Tutorial 6 */,
+ 63DE8814156DABDF006F2D3B /* Tutorial 7 */,
+ 63DE8822156DABE6006F2D3B /* Tutorial 8 */,
+ 63DE8830156DABEE006F2D3B /* Tutorial 9 */,
+ 63EA7B0617539E570032388A /* Tutorial 12 */,
+ 63EA7B151753A2700032388A /* Tutorial 13 */,
+ 63EA7B241753A2B90032388A /* Tutorial 15 */,
+ 63118CCA156D32E20085CF03 /* Playback Tutorial 1 */,
+ 63118CDB156D34BA0085CF03 /* Playback Tutorial 2 */,
+ 63EA7B331753A2FE0032388A /* Playback Tutorial 3 */,
+ 63EA7B421753A38E0032388A /* Playback Tutorial 4 */,
+ 63EA7B511753A3B60032388A /* Playback Tutorial 5 */,
+ 63EA7B601753A3F70032388A /* Playback Tutorial 6 */,
+ 63EA7B6F1753A41C0032388A /* Playback Tutorial 7 */,
+ 63118C41156D29340085CF03 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 63118C41156D29340085CF03 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 63118C88156D2D190085CF03 /* Tutorial 1 */,
+ 63118CB9156D31240085CF03 /* Tutorial 2 */,
+ 63118C54156D29DE0085CF03 /* Turorial 3 */,
+ 63118C75156D2B970085CF03 /* Tutorial 4 */,
+ 63118C98156D2E2F0085CF03 /* Tutorial 5 */,
+ 63118CEA156D3A870085CF03 /* Tutorial 6 */,
+ 63DE8812156DABDF006F2D3B /* Tutorial 7 */,
+ 63DE8820156DABE6006F2D3B /* Tutorial 8 */,
+ 63DE882E156DABEE006F2D3B /* Tutorial 9 */,
+ 63118CC8156D32E20085CF03 /* Playback Tutorial 1 */,
+ 63118CD9156D34BA0085CF03 /* Playback Tutorial 2 */,
+ 63EA7B0517539E570032388A /* Tutorial 12 */,
+ 63EA7B141753A2700032388A /* Tutorial 13 */,
+ 63EA7B231753A2B90032388A /* Tutorial 15 */,
+ 63EA7B321753A2FE0032388A /* Playback Tutorial 3 */,
+ 63EA7B411753A38D0032388A /* Playback Tutorial 4 */,
+ 63EA7B501753A3B60032388A /* Playback Tutorial 5 */,
+ 63EA7B5F1753A3F70032388A /* Playback Tutorial 6 */,
+ 63EA7B6E1753A41C0032388A /* Playback Tutorial 7 */,
+ );
+ name = Products;
+ sourceTree = SOURCE_ROOT;
+ };
+ 63118C43156D29340085CF03 /* Tutorial 2 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118C4D156D29530085CF03 /* basic-tutorial-2.c */,
+ );
+ name = "Tutorial 2";
+ path = "GStreamer Tutorials";
+ sourceTree = SOURCE_ROOT;
+ };
+ 63118C56156D29DE0085CF03 /* Tutorial 3 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118C60156D2AA70085CF03 /* basic-tutorial-3.c */,
+ );
+ name = "Tutorial 3";
+ path = Turorial3;
+ sourceTree = SOURCE_ROOT;
+ };
+ 63118C77156D2B970085CF03 /* Tutorial 4 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118C7F156D2BA30085CF03 /* basic-tutorial-4.c */,
+ );
+ path = "Tutorial 4";
+ sourceTree = "<group>";
+ };
+ 63118C8A156D2D190085CF03 /* Tutorial 1 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118C92156D2D630085CF03 /* basic-tutorial-1.c */,
+ );
+ path = "Tutorial 1";
+ sourceTree = "<group>";
+ };
+ 63118C9A156D2E2F0085CF03 /* Tutorial 5 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118CA2156D2E400085CF03 /* basic-tutorial-5.c */,
+ );
+ path = "Tutorial 5";
+ sourceTree = "<group>";
+ };
+ 63118CCA156D32E20085CF03 /* Playback Tutorial 1 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118CD2156D32FE0085CF03 /* playback-tutorial-1.c */,
+ );
+ path = "Playback Tutorial 1";
+ sourceTree = "<group>";
+ };
+ 63118CDB156D34BA0085CF03 /* Playback Tutorial 2 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118CE3156D35390085CF03 /* playback-tutorial-2.c */,
+ );
+ path = "Playback Tutorial 2";
+ sourceTree = "<group>";
+ };
+ 63118CEC156D3A870085CF03 /* Tutorial 6 */ = {
+ isa = PBXGroup;
+ children = (
+ 63118CF4156D3AB60085CF03 /* basic-tutorial-6.c */,
+ );
+ path = "Tutorial 6";
+ sourceTree = "<group>";
+ };
+ 63DE8814156DABDF006F2D3B /* Tutorial 7 */ = {
+ isa = PBXGroup;
+ children = (
+ 63DE8838156DAC09006F2D3B /* basic-tutorial-7.c */,
+ );
+ path = "Tutorial 7";
+ sourceTree = "<group>";
+ };
+ 63DE8822156DABE6006F2D3B /* Tutorial 8 */ = {
+ isa = PBXGroup;
+ children = (
+ 63DE883A156DAC0E006F2D3B /* basic-tutorial-8.c */,
+ );
+ path = "Tutorial 8";
+ sourceTree = "<group>";
+ };
+ 63DE8830156DABEE006F2D3B /* Tutorial 9 */ = {
+ isa = PBXGroup;
+ children = (
+ 63DE883C156DAC15006F2D3B /* basic-tutorial-9.c */,
+ );
+ path = "Tutorial 9";
+ sourceTree = "<group>";
+ };
+ 63EA7B0617539E570032388A /* Tutorial 12 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B0E1753A1D50032388A /* basic-tutorial-12.c */,
+ );
+ path = "Tutorial 12";
+ sourceTree = "<group>";
+ };
+ 63EA7B151753A2700032388A /* Tutorial 13 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B1D1753A29C0032388A /* basic-tutorial-13.c */,
+ );
+ path = "Tutorial 13";
+ sourceTree = "<group>";
+ };
+ 63EA7B241753A2B90032388A /* Tutorial 15 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B2C1753A2DF0032388A /* basic-tutorial-15.c */,
+ );
+ path = "Tutorial 15";
+ sourceTree = "<group>";
+ };
+ 63EA7B331753A2FE0032388A /* Playback Tutorial 3 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B3B1753A3740032388A /* playback-tutorial-3.c */,
+ );
+ path = "Playback Tutorial 3";
+ sourceTree = "<group>";
+ };
+ 63EA7B421753A38E0032388A /* Playback Tutorial 4 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B4A1753A3AA0032388A /* playback-tutorial-4.c */,
+ );
+ path = "Playback Tutorial 4";
+ sourceTree = "<group>";
+ };
+ 63EA7B511753A3B60032388A /* Playback Tutorial 5 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B591753A3D00032388A /* playback-tutorial-5.c */,
+ );
+ path = "Playback Tutorial 5";
+ sourceTree = "<group>";
+ };
+ 63EA7B601753A3F70032388A /* Playback Tutorial 6 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B681753A4100032388A /* playback-tutorial-6.c */,
+ );
+ path = "Playback Tutorial 6";
+ sourceTree = "<group>";
+ };
+ 63EA7B6F1753A41C0032388A /* Playback Tutorial 7 */ = {
+ isa = PBXGroup;
+ children = (
+ 63EA7B771753A4370032388A /* playback-tutorial-7.c */,
+ );
+ path = "Playback Tutorial 7";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 63118C53156D29DE0085CF03 /* Turorial 3 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118C5B156D29DE0085CF03 /* Build configuration list for PBXNativeTarget "Turorial 3" */;
+ buildPhases = (
+ 63118C50156D29DE0085CF03 /* Sources */,
+ 63118C51156D29DE0085CF03 /* Frameworks */,
+ 63118C52156D29DE0085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Turorial 3";
+ productName = Turorial3;
+ productReference = 63118C54156D29DE0085CF03 /* Turorial 3 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63118C74156D2B970085CF03 /* Tutorial 4 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118C7C156D2B970085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 4" */;
+ buildPhases = (
+ 63118C71156D2B970085CF03 /* Sources */,
+ 63118C72156D2B970085CF03 /* Frameworks */,
+ 63118C73156D2B970085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 4";
+ productName = "Tutorial 4";
+ productReference = 63118C75156D2B970085CF03 /* Tutorial 4 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63118C87156D2D190085CF03 /* Tutorial 1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118C8F156D2D190085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 1" */;
+ buildPhases = (
+ 63118C84156D2D190085CF03 /* Sources */,
+ 63118C85156D2D190085CF03 /* Frameworks */,
+ 63118C86156D2D190085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 1";
+ productName = "Tutorial 1";
+ productReference = 63118C88156D2D190085CF03 /* Tutorial 1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63118C97156D2E2F0085CF03 /* Tutorial 5 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118C9F156D2E2F0085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 5" */;
+ buildPhases = (
+ 63118C94156D2E2F0085CF03 /* Sources */,
+ 63118C95156D2E2F0085CF03 /* Frameworks */,
+ 63118C96156D2E2F0085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 5";
+ productName = "Tutorial 5";
+ productReference = 63118C98156D2E2F0085CF03 /* Tutorial 5 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63118CB8156D31240085CF03 /* Tutorial 2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118CC0156D31240085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 2" */;
+ buildPhases = (
+ 63118CB5156D31240085CF03 /* Sources */,
+ 63118CB6156D31240085CF03 /* Frameworks */,
+ 63118CB7156D31240085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 2";
+ productName = "Tutorial 2";
+ productReference = 63118CB9156D31240085CF03 /* Tutorial 2 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63118CC7156D32E20085CF03 /* Playback Tutorial 1 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118CCF156D32E20085CF03 /* Build configuration list for PBXNativeTarget "Playback Tutorial 1" */;
+ buildPhases = (
+ 63118CC4156D32E20085CF03 /* Sources */,
+ 63118CC5156D32E20085CF03 /* Frameworks */,
+ 63118CC6156D32E20085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Playback Tutorial 1";
+ productName = "Playback Tutorial 1";
+ productReference = 63118CC8156D32E20085CF03 /* Playback Tutorial 1 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63118CD8156D34BA0085CF03 /* Playback Tutorial 2 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118CE0156D34BA0085CF03 /* Build configuration list for PBXNativeTarget "Playback Tutorial 2" */;
+ buildPhases = (
+ 63118CD5156D34BA0085CF03 /* Sources */,
+ 63118CD6156D34BA0085CF03 /* Frameworks */,
+ 63118CD7156D34BA0085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Playback Tutorial 2";
+ productName = "Playback Tutorial 2";
+ productReference = 63118CD9156D34BA0085CF03 /* Playback Tutorial 2 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63118CE9156D3A870085CF03 /* Tutorial 6 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63118CF1156D3A870085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 6" */;
+ buildPhases = (
+ 63118CE6156D3A870085CF03 /* Sources */,
+ 63118CE7156D3A870085CF03 /* Frameworks */,
+ 63118CE8156D3A870085CF03 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 6";
+ productName = "Tutorial 6";
+ productReference = 63118CEA156D3A870085CF03 /* Tutorial 6 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63DE8811156DABDF006F2D3B /* Tutorial 7 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63DE8819156DABDF006F2D3B /* Build configuration list for PBXNativeTarget "Tutorial 7" */;
+ buildPhases = (
+ 63DE880E156DABDF006F2D3B /* Sources */,
+ 63DE880F156DABDF006F2D3B /* Frameworks */,
+ 63DE8810156DABDF006F2D3B /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 7";
+ productName = "Tutorial 7";
+ productReference = 63DE8812156DABDF006F2D3B /* Tutorial 7 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63DE881F156DABE6006F2D3B /* Tutorial 8 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63DE8827156DABE7006F2D3B /* Build configuration list for PBXNativeTarget "Tutorial 8" */;
+ buildPhases = (
+ 63DE881C156DABE6006F2D3B /* Sources */,
+ 63DE881D156DABE6006F2D3B /* Frameworks */,
+ 63DE881E156DABE6006F2D3B /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 8";
+ productName = "Tutorial 8";
+ productReference = 63DE8820156DABE6006F2D3B /* Tutorial 8 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63DE882D156DABEE006F2D3B /* Tutorial 9 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63DE8835156DABEE006F2D3B /* Build configuration list for PBXNativeTarget "Tutorial 9" */;
+ buildPhases = (
+ 63DE882A156DABEE006F2D3B /* Sources */,
+ 63DE882B156DABEE006F2D3B /* Frameworks */,
+ 63DE882C156DABEE006F2D3B /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 9";
+ productName = "Tutorial 9";
+ productReference = 63DE882E156DABEE006F2D3B /* Tutorial 9 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B0417539E570032388A /* Tutorial 12 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B0B17539E570032388A /* Build configuration list for PBXNativeTarget "Tutorial 12" */;
+ buildPhases = (
+ 63EA7B0117539E570032388A /* Sources */,
+ 63EA7B0217539E570032388A /* Frameworks */,
+ 63EA7B0317539E570032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 12";
+ productName = "Tutorial 12";
+ productReference = 63EA7B0517539E570032388A /* Tutorial 12 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B131753A2700032388A /* Tutorial 13 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B1A1753A2700032388A /* Build configuration list for PBXNativeTarget "Tutorial 13" */;
+ buildPhases = (
+ 63EA7B101753A2700032388A /* Sources */,
+ 63EA7B111753A2700032388A /* Frameworks */,
+ 63EA7B121753A2700032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 13";
+ productName = "Tutorial 13";
+ productReference = 63EA7B141753A2700032388A /* Tutorial 13 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B221753A2B90032388A /* Tutorial 15 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B291753A2B90032388A /* Build configuration list for PBXNativeTarget "Tutorial 15" */;
+ buildPhases = (
+ 63EA7B1F1753A2B90032388A /* Sources */,
+ 63EA7B201753A2B90032388A /* Frameworks */,
+ 63EA7B211753A2B90032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Tutorial 15";
+ productName = "Tutorial 15";
+ productReference = 63EA7B231753A2B90032388A /* Tutorial 15 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B311753A2FE0032388A /* Playback Tutorial 3 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B381753A2FE0032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 3" */;
+ buildPhases = (
+ 63EA7B2E1753A2FE0032388A /* Sources */,
+ 63EA7B2F1753A2FE0032388A /* Frameworks */,
+ 63EA7B301753A2FE0032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Playback Tutorial 3";
+ productName = "Playback Tutorial 3";
+ productReference = 63EA7B321753A2FE0032388A /* Playback Tutorial 3 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B401753A38D0032388A /* Playback Tutorial 4 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B471753A38E0032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 4" */;
+ buildPhases = (
+ 63EA7B3D1753A38D0032388A /* Sources */,
+ 63EA7B3E1753A38D0032388A /* Frameworks */,
+ 63EA7B3F1753A38D0032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Playback Tutorial 4";
+ productName = "Playback Tutorial 4";
+ productReference = 63EA7B411753A38D0032388A /* Playback Tutorial 4 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B4F1753A3B60032388A /* Playback Tutorial 5 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B561753A3B60032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 5" */;
+ buildPhases = (
+ 63EA7B4C1753A3B60032388A /* Sources */,
+ 63EA7B4D1753A3B60032388A /* Frameworks */,
+ 63EA7B4E1753A3B60032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Playback Tutorial 5";
+ productName = "Playback Tutorial 5";
+ productReference = 63EA7B501753A3B60032388A /* Playback Tutorial 5 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B5E1753A3F70032388A /* Playback Tutorial 6 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B651753A3F70032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 6" */;
+ buildPhases = (
+ 63EA7B5B1753A3F70032388A /* Sources */,
+ 63EA7B5C1753A3F70032388A /* Frameworks */,
+ 63EA7B5D1753A3F70032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Playback Tutorial 6";
+ productName = "Playback Tutorial 6";
+ productReference = 63EA7B5F1753A3F70032388A /* Playback Tutorial 6 */;
+ productType = "com.apple.product-type.tool";
+ };
+ 63EA7B6D1753A41C0032388A /* Playback Tutorial 7 */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 63EA7B741753A41C0032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 7" */;
+ buildPhases = (
+ 63EA7B6A1753A41C0032388A /* Sources */,
+ 63EA7B6B1753A41C0032388A /* Frameworks */,
+ 63EA7B6C1753A41C0032388A /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "Playback Tutorial 7";
+ productName = "Playback Tutorial 7";
+ productReference = 63EA7B6E1753A41C0032388A /* Playback Tutorial 7 */;
+ productType = "com.apple.product-type.tool";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 63118C37156D29340085CF03 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0420;
+ };
+ buildConfigurationList = 63118C3A156D29340085CF03 /* Build configuration list for PBXProject "GStreamer Tutorials" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = 63118C35156D29340085CF03;
+ productRefGroup = 63118C41156D29340085CF03 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 63118C87156D2D190085CF03 /* Tutorial 1 */,
+ 63118CB8156D31240085CF03 /* Tutorial 2 */,
+ 63118C53156D29DE0085CF03 /* Turorial 3 */,
+ 63118C74156D2B970085CF03 /* Tutorial 4 */,
+ 63118C97156D2E2F0085CF03 /* Tutorial 5 */,
+ 63118CE9156D3A870085CF03 /* Tutorial 6 */,
+ 63DE8811156DABDF006F2D3B /* Tutorial 7 */,
+ 63DE881F156DABE6006F2D3B /* Tutorial 8 */,
+ 63DE882D156DABEE006F2D3B /* Tutorial 9 */,
+ 63EA7B0417539E570032388A /* Tutorial 12 */,
+ 63EA7B131753A2700032388A /* Tutorial 13 */,
+ 63EA7B221753A2B90032388A /* Tutorial 15 */,
+ 63118CC7156D32E20085CF03 /* Playback Tutorial 1 */,
+ 63118CD8156D34BA0085CF03 /* Playback Tutorial 2 */,
+ 63EA7B311753A2FE0032388A /* Playback Tutorial 3 */,
+ 63EA7B401753A38D0032388A /* Playback Tutorial 4 */,
+ 63EA7B4F1753A3B60032388A /* Playback Tutorial 5 */,
+ 63EA7B5E1753A3F70032388A /* Playback Tutorial 6 */,
+ 63EA7B6D1753A41C0032388A /* Playback Tutorial 7 */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 63118C50156D29DE0085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118C62156D2AF10085CF03 /* basic-tutorial-3.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118C71156D2B970085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118C81156D2BAE0085CF03 /* basic-tutorial-4.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118C84156D2D190085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118C93156D2D630085CF03 /* basic-tutorial-1.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118C94156D2E2F0085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118CA3156D2E400085CF03 /* basic-tutorial-5.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CB5156D31240085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118CC3156D31300085CF03 /* basic-tutorial-2.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CC4156D32E20085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118CD4156D33040085CF03 /* playback-tutorial-1.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CD5156D34BA0085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118CE5156D35610085CF03 /* playback-tutorial-2.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63118CE6156D3A870085CF03 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63118CF6156D3ACB0085CF03 /* basic-tutorial-6.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63DE880E156DABDF006F2D3B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63DE883E156DAC18006F2D3B /* basic-tutorial-7.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63DE881C156DABE6006F2D3B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63DE883F156DAC1D006F2D3B /* basic-tutorial-8.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63DE882A156DABEE006F2D3B /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63DE8840156DAC21006F2D3B /* basic-tutorial-9.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B0117539E570032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B0F1753A1D50032388A /* basic-tutorial-12.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B101753A2700032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B1E1753A29C0032388A /* basic-tutorial-13.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B1F1753A2B90032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B2D1753A2DF0032388A /* basic-tutorial-15.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B2E1753A2FE0032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B3C1753A3740032388A /* playback-tutorial-3.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B3D1753A38D0032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B4B1753A3AA0032388A /* playback-tutorial-4.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B4C1753A3B60032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B5A1753A3D00032388A /* playback-tutorial-5.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B5B1753A3F70032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B691753A4100032388A /* playback-tutorial-6.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 63EA7B6A1753A41C0032388A /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 63EA7B781753A4370032388A /* playback-tutorial-7.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 63118C48156D29340085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ CLANG_ENABLE_OBJC_ARC = NO;
+ COPY_PHASE_STRIP = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "/Library/Frameworks/GStreamer.framework/Versions/1.0/Headers/**";
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = "";
+ VALID_ARCHS = "x86_64 i386";
+ };
+ name = Debug;
+ };
+ 63118C49156D29340085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ CLANG_ENABLE_OBJC_ARC = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = "/Library/Frameworks/GStreamer.framework/Versions/1.0/Headers/**";
+ MACOSX_DEPLOYMENT_TARGET = 10.6;
+ SDKROOT = "";
+ VALID_ARCHS = "x86_64 i386";
+ };
+ name = Release;
+ };
+ 63118C5C156D29DE0085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118C5D156D29DE0085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63118C7D156D2B970085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118C7E156D2B970085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63118C90156D2D190085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(LOCAL_LIBRARY_DIR)/Frameworks",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118C91156D2D190085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(LOCAL_LIBRARY_DIR)/Frameworks",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63118CA0156D2E2F0085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "-framework",
+ Cocoa,
+ "-L/Library/Frameworks/GStreamer.framework/Libraries",
+ "-lcairo",
+ "-lgtk-quartz-2.0",
+ "-lgdk-quartz-2.0",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118CA1156D2E2F0085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ OTHER_LDFLAGS = (
+ "-framework",
+ Cocoa,
+ "-L/Library/Frameworks/GStreamer.framework/Libraries",
+ "-lcairo",
+ "-lgtk-quartz-2.0",
+ "-lgdk-quartz-2.0",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63118CC1156D31240085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(LOCAL_LIBRARY_DIR)/Frameworks",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118CC2156D31240085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = (
+ "$(inherited)",
+ "$(LOCAL_LIBRARY_DIR)/Frameworks",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63118CD0156D32E20085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118CD1156D32E20085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63118CE1156D34BA0085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118CE2156D34BA0085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63118CF2156D3A870085CF03 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63118CF3156D3A870085CF03 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63DE881A156DABDF006F2D3B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63DE881B156DABDF006F2D3B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63DE8828156DABE7006F2D3B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63DE8829156DABE7006F2D3B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63DE8836156DABEE006F2D3B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63DE8837156DABEE006F2D3B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B0C17539E570032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B0D17539E570032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B1B1753A2700032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B1C1753A2700032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B2A1753A2B90032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ OTHER_LDFLAGS = (
+ "-lclutter-osx-1.0",
+ "-lclutter-gst-1.0",
+ "-L/Library/Frameworks/GStreamer.framework/Libraries",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B2B1753A2B90032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ OTHER_LDFLAGS = (
+ "-lclutter-osx-1.0",
+ "-lclutter-gst-1.0",
+ "-L/Library/Frameworks/GStreamer.framework/Libraries",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B391753A2FE0032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B3A1753A2FE0032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B481753A38E0032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B491753A38E0032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B571753A3B60032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B581753A3B60032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B661753A3F70032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B671753A3F70032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+ 63EA7B751753A41C0032388A /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 63EA7B761753A41C0032388A /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 63118C3A156D29340085CF03 /* Build configuration list for PBXProject "GStreamer Tutorials" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118C48156D29340085CF03 /* Debug */,
+ 63118C49156D29340085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118C5B156D29DE0085CF03 /* Build configuration list for PBXNativeTarget "Turorial 3" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118C5C156D29DE0085CF03 /* Debug */,
+ 63118C5D156D29DE0085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118C7C156D2B970085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 4" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118C7D156D2B970085CF03 /* Debug */,
+ 63118C7E156D2B970085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118C8F156D2D190085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118C90156D2D190085CF03 /* Debug */,
+ 63118C91156D2D190085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118C9F156D2E2F0085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 5" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118CA0156D2E2F0085CF03 /* Debug */,
+ 63118CA1156D2E2F0085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118CC0156D31240085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118CC1156D31240085CF03 /* Debug */,
+ 63118CC2156D31240085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118CCF156D32E20085CF03 /* Build configuration list for PBXNativeTarget "Playback Tutorial 1" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118CD0156D32E20085CF03 /* Debug */,
+ 63118CD1156D32E20085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118CE0156D34BA0085CF03 /* Build configuration list for PBXNativeTarget "Playback Tutorial 2" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118CE1156D34BA0085CF03 /* Debug */,
+ 63118CE2156D34BA0085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63118CF1156D3A870085CF03 /* Build configuration list for PBXNativeTarget "Tutorial 6" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63118CF2156D3A870085CF03 /* Debug */,
+ 63118CF3156D3A870085CF03 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63DE8819156DABDF006F2D3B /* Build configuration list for PBXNativeTarget "Tutorial 7" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63DE881A156DABDF006F2D3B /* Debug */,
+ 63DE881B156DABDF006F2D3B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63DE8827156DABE7006F2D3B /* Build configuration list for PBXNativeTarget "Tutorial 8" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63DE8828156DABE7006F2D3B /* Debug */,
+ 63DE8829156DABE7006F2D3B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63DE8835156DABEE006F2D3B /* Build configuration list for PBXNativeTarget "Tutorial 9" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63DE8836156DABEE006F2D3B /* Debug */,
+ 63DE8837156DABEE006F2D3B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B0B17539E570032388A /* Build configuration list for PBXNativeTarget "Tutorial 12" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B0C17539E570032388A /* Debug */,
+ 63EA7B0D17539E570032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B1A1753A2700032388A /* Build configuration list for PBXNativeTarget "Tutorial 13" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B1B1753A2700032388A /* Debug */,
+ 63EA7B1C1753A2700032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B291753A2B90032388A /* Build configuration list for PBXNativeTarget "Tutorial 15" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B2A1753A2B90032388A /* Debug */,
+ 63EA7B2B1753A2B90032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B381753A2FE0032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 3" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B391753A2FE0032388A /* Debug */,
+ 63EA7B3A1753A2FE0032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B471753A38E0032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 4" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B481753A38E0032388A /* Debug */,
+ 63EA7B491753A38E0032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B561753A3B60032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 5" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B571753A3B60032388A /* Debug */,
+ 63EA7B581753A3B60032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B651753A3F70032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 6" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B661753A3F70032388A /* Debug */,
+ 63EA7B671753A3F70032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 63EA7B741753A41C0032388A /* Build configuration list for PBXNativeTarget "Playback Tutorial 7" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 63EA7B751753A41C0032388A /* Debug */,
+ 63EA7B761753A41C0032388A /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 63118C37156D29340085CF03 /* Project object */;
+}
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/tutorials/xcode/GStreamer Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..98cf3a3
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:GStreamer Tutorials.xcodeproj">
+ </FileRef>
+</Workspace>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/01-Tutorial 1.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/01-Tutorial 1.xcscheme
new file mode 100644
index 0000000..503d97e
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/01-Tutorial 1.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C87156D2D190085CF03"
+ BuildableName = "Tutorial 1"
+ BlueprintName = "Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C87156D2D190085CF03"
+ BuildableName = "Tutorial 1"
+ BlueprintName = "Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C87156D2D190085CF03"
+ BuildableName = "Tutorial 1"
+ BlueprintName = "Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C87156D2D190085CF03"
+ BuildableName = "Tutorial 1"
+ BlueprintName = "Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/02-Tutorial 2.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/02-Tutorial 2.xcscheme
new file mode 100644
index 0000000..e98502b
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/02-Tutorial 2.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CB8156D31240085CF03"
+ BuildableName = "Tutorial 2"
+ BlueprintName = "Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CB8156D31240085CF03"
+ BuildableName = "Tutorial 2"
+ BlueprintName = "Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CB8156D31240085CF03"
+ BuildableName = "Tutorial 2"
+ BlueprintName = "Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CB8156D31240085CF03"
+ BuildableName = "Tutorial 2"
+ BlueprintName = "Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/03-Turorial 3.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/03-Turorial 3.xcscheme
new file mode 100644
index 0000000..7b1edf5
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/03-Turorial 3.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C53156D29DE0085CF03"
+ BuildableName = "Turorial 3"
+ BlueprintName = "Turorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C53156D29DE0085CF03"
+ BuildableName = "Turorial 3"
+ BlueprintName = "Turorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C53156D29DE0085CF03"
+ BuildableName = "Turorial 3"
+ BlueprintName = "Turorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C53156D29DE0085CF03"
+ BuildableName = "Turorial 3"
+ BlueprintName = "Turorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/04-Tutorial 4.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/04-Tutorial 4.xcscheme
new file mode 100644
index 0000000..2401936
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/04-Tutorial 4.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C74156D2B970085CF03"
+ BuildableName = "Tutorial 4"
+ BlueprintName = "Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C74156D2B970085CF03"
+ BuildableName = "Tutorial 4"
+ BlueprintName = "Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C74156D2B970085CF03"
+ BuildableName = "Tutorial 4"
+ BlueprintName = "Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C74156D2B970085CF03"
+ BuildableName = "Tutorial 4"
+ BlueprintName = "Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/05-Tutorial 5.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/05-Tutorial 5.xcscheme
new file mode 100644
index 0000000..30f512a
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/05-Tutorial 5.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C97156D2E2F0085CF03"
+ BuildableName = "Tutorial 5"
+ BlueprintName = "Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C97156D2E2F0085CF03"
+ BuildableName = "Tutorial 5"
+ BlueprintName = "Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C97156D2E2F0085CF03"
+ BuildableName = "Tutorial 5"
+ BlueprintName = "Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118C97156D2E2F0085CF03"
+ BuildableName = "Tutorial 5"
+ BlueprintName = "Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/06-Tutorial 6.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/06-Tutorial 6.xcscheme
new file mode 100644
index 0000000..a72f41d
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/06-Tutorial 6.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CE9156D3A870085CF03"
+ BuildableName = "Tutorial 6"
+ BlueprintName = "Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CE9156D3A870085CF03"
+ BuildableName = "Tutorial 6"
+ BlueprintName = "Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CE9156D3A870085CF03"
+ BuildableName = "Tutorial 6"
+ BlueprintName = "Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CE9156D3A870085CF03"
+ BuildableName = "Tutorial 6"
+ BlueprintName = "Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/07-Tutorial 7.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/07-Tutorial 7.xcscheme
new file mode 100644
index 0000000..84fccd6
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/07-Tutorial 7.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE8811156DABDF006F2D3B"
+ BuildableName = "Tutorial 7"
+ BlueprintName = "Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE8811156DABDF006F2D3B"
+ BuildableName = "Tutorial 7"
+ BlueprintName = "Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE8811156DABDF006F2D3B"
+ BuildableName = "Tutorial 7"
+ BlueprintName = "Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE8811156DABDF006F2D3B"
+ BuildableName = "Tutorial 7"
+ BlueprintName = "Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/08-Tutorial 8.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/08-Tutorial 8.xcscheme
new file mode 100644
index 0000000..aecc95c
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/08-Tutorial 8.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE881F156DABE6006F2D3B"
+ BuildableName = "Tutorial 8"
+ BlueprintName = "Tutorial 8"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE881F156DABE6006F2D3B"
+ BuildableName = "Tutorial 8"
+ BlueprintName = "Tutorial 8"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE881F156DABE6006F2D3B"
+ BuildableName = "Tutorial 8"
+ BlueprintName = "Tutorial 8"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE881F156DABE6006F2D3B"
+ BuildableName = "Tutorial 8"
+ BlueprintName = "Tutorial 8"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/09-Tutorial 9.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/09-Tutorial 9.xcscheme
new file mode 100644
index 0000000..9f6bec9
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/09-Tutorial 9.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE882D156DABEE006F2D3B"
+ BuildableName = "Tutorial 9"
+ BlueprintName = "Tutorial 9"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE882D156DABEE006F2D3B"
+ BuildableName = "Tutorial 9"
+ BlueprintName = "Tutorial 9"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE882D156DABEE006F2D3B"
+ BuildableName = "Tutorial 9"
+ BlueprintName = "Tutorial 9"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63DE882D156DABEE006F2D3B"
+ BuildableName = "Tutorial 9"
+ BlueprintName = "Tutorial 9"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/12-Tutorial 12.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/12-Tutorial 12.xcscheme
new file mode 100644
index 0000000..a891d23
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/12-Tutorial 12.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B0417539E570032388A"
+ BuildableName = "Tutorial 12"
+ BlueprintName = "Tutorial 12"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B0417539E570032388A"
+ BuildableName = "Tutorial 12"
+ BlueprintName = "Tutorial 12"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B0417539E570032388A"
+ BuildableName = "Tutorial 12"
+ BlueprintName = "Tutorial 12"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B0417539E570032388A"
+ BuildableName = "Tutorial 12"
+ BlueprintName = "Tutorial 12"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/13-Tutorial 13.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/13-Tutorial 13.xcscheme
new file mode 100644
index 0000000..e624154
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/13-Tutorial 13.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B131753A2700032388A"
+ BuildableName = "Tutorial 13"
+ BlueprintName = "Tutorial 13"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B131753A2700032388A"
+ BuildableName = "Tutorial 13"
+ BlueprintName = "Tutorial 13"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B131753A2700032388A"
+ BuildableName = "Tutorial 13"
+ BlueprintName = "Tutorial 13"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B131753A2700032388A"
+ BuildableName = "Tutorial 13"
+ BlueprintName = "Tutorial 13"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/15-Tutorial 15.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/15-Tutorial 15.xcscheme
new file mode 100644
index 0000000..9f8f4f8
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/15-Tutorial 15.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B221753A2B90032388A"
+ BuildableName = "Tutorial 15"
+ BlueprintName = "Tutorial 15"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B221753A2B90032388A"
+ BuildableName = "Tutorial 15"
+ BlueprintName = "Tutorial 15"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B221753A2B90032388A"
+ BuildableName = "Tutorial 15"
+ BlueprintName = "Tutorial 15"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B221753A2B90032388A"
+ BuildableName = "Tutorial 15"
+ BlueprintName = "Tutorial 15"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/21-Playback Tutorial 1.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/21-Playback Tutorial 1.xcscheme
new file mode 100644
index 0000000..807d156
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/21-Playback Tutorial 1.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CC7156D32E20085CF03"
+ BuildableName = "Playback Tutorial 1"
+ BlueprintName = "Playback Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CC7156D32E20085CF03"
+ BuildableName = "Playback Tutorial 1"
+ BlueprintName = "Playback Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CC7156D32E20085CF03"
+ BuildableName = "Playback Tutorial 1"
+ BlueprintName = "Playback Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CC7156D32E20085CF03"
+ BuildableName = "Playback Tutorial 1"
+ BlueprintName = "Playback Tutorial 1"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/22-Playback Tutorial 2.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/22-Playback Tutorial 2.xcscheme
new file mode 100644
index 0000000..a7abd55
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/22-Playback Tutorial 2.xcscheme
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CD8156D34BA0085CF03"
+ BuildableName = "Playback Tutorial 2"
+ BlueprintName = "Playback Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CD8156D34BA0085CF03"
+ BuildableName = "Playback Tutorial 2"
+ BlueprintName = "Playback Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CD8156D34BA0085CF03"
+ BuildableName = "Playback Tutorial 2"
+ BlueprintName = "Playback Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63118CD8156D34BA0085CF03"
+ BuildableName = "Playback Tutorial 2"
+ BlueprintName = "Playback Tutorial 2"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/23-Playback Tutorial 3.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/23-Playback Tutorial 3.xcscheme
new file mode 100644
index 0000000..05fdae3
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/23-Playback Tutorial 3.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B311753A2FE0032388A"
+ BuildableName = "Playback Tutorial 3"
+ BlueprintName = "Playback Tutorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B311753A2FE0032388A"
+ BuildableName = "Playback Tutorial 3"
+ BlueprintName = "Playback Tutorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B311753A2FE0032388A"
+ BuildableName = "Playback Tutorial 3"
+ BlueprintName = "Playback Tutorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B311753A2FE0032388A"
+ BuildableName = "Playback Tutorial 3"
+ BlueprintName = "Playback Tutorial 3"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/24-Playback Tutorial 4.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/24-Playback Tutorial 4.xcscheme
new file mode 100644
index 0000000..08839c8
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/24-Playback Tutorial 4.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B401753A38D0032388A"
+ BuildableName = "Playback Tutorial 4"
+ BlueprintName = "Playback Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B401753A38D0032388A"
+ BuildableName = "Playback Tutorial 4"
+ BlueprintName = "Playback Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B401753A38D0032388A"
+ BuildableName = "Playback Tutorial 4"
+ BlueprintName = "Playback Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B401753A38D0032388A"
+ BuildableName = "Playback Tutorial 4"
+ BlueprintName = "Playback Tutorial 4"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/25-Playback Tutorial 5.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/25-Playback Tutorial 5.xcscheme
new file mode 100644
index 0000000..ff41ea8
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/25-Playback Tutorial 5.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B4F1753A3B60032388A"
+ BuildableName = "Playback Tutorial 5"
+ BlueprintName = "Playback Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B4F1753A3B60032388A"
+ BuildableName = "Playback Tutorial 5"
+ BlueprintName = "Playback Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B4F1753A3B60032388A"
+ BuildableName = "Playback Tutorial 5"
+ BlueprintName = "Playback Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B4F1753A3B60032388A"
+ BuildableName = "Playback Tutorial 5"
+ BlueprintName = "Playback Tutorial 5"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/26-Playback Tutorial 6.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/26-Playback Tutorial 6.xcscheme
new file mode 100644
index 0000000..ea06915
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/26-Playback Tutorial 6.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B5E1753A3F70032388A"
+ BuildableName = "Playback Tutorial 6"
+ BlueprintName = "Playback Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B5E1753A3F70032388A"
+ BuildableName = "Playback Tutorial 6"
+ BlueprintName = "Playback Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B5E1753A3F70032388A"
+ BuildableName = "Playback Tutorial 6"
+ BlueprintName = "Playback Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B5E1753A3F70032388A"
+ BuildableName = "Playback Tutorial 6"
+ BlueprintName = "Playback Tutorial 6"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/27-Playback Tutorial 7.xcscheme b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/27-Playback Tutorial 7.xcscheme
new file mode 100644
index 0000000..7499f15
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/27-Playback Tutorial 7.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B6D1753A41C0032388A"
+ BuildableName = "Playback Tutorial 7"
+ BlueprintName = "Playback Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B6D1753A41C0032388A"
+ BuildableName = "Playback Tutorial 7"
+ BlueprintName = "Playback Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B6D1753A41C0032388A"
+ BuildableName = "Playback Tutorial 7"
+ BlueprintName = "Playback Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "63EA7B6D1753A41C0032388A"
+ BuildableName = "Playback Tutorial 7"
+ BlueprintName = "Playback Tutorial 7"
+ ReferencedContainer = "container:GStreamer Tutorials.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..9f45ecf
--- /dev/null
+++ b/tutorials/xcode/GStreamer Tutorials.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>SuppressBuildableAutocreation</key>
+ <dict>
+ <key>63118C53156D29DE0085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63118C74156D2B970085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63118C87156D2D190085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63118C97156D2E2F0085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63118CB8156D31240085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63118CC7156D32E20085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63118CD8156D34BA0085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63118CE9156D3A870085CF03</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63DE8811156DABDF006F2D3B</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63DE881F156DABE6006F2D3B</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ <key>63DE882D156DABEE006F2D3B</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ </dict>
+</dict>
+</plist>