pax_global_header00006660000000000000000000000064125024020720014504gustar00rootroot0000000000000052 comment=2c91f373b18281930fc97f714445a23d7ce201d6 .gitignore000066400000000000000000000002711250240207200130400ustar00rootroot00000000000000!Makefile *.mode* *.pbxuser *.xcworkspace xcuserdata MobileVLCKit/vlc-plugins.xcconfig MobileVLCKit/vlc-plugins.h .DS_Store build /vlc-unstable DerivedData MobileVLCKit/ImportedSources COPYING000066400000000000000000000636421250240207200121160ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! Configure.sh000066400000000000000000000062021250240207200133250ustar00rootroot00000000000000# # Configure script # # used by VLCKit.xcodeproj if test "x$SYMROOT" = "x"; then echo " This script is bound to be launched by VLCKit.xcodeproj, not you" exit 1 fi if test "$ACTION" = "clean"; then rm -Rf $VLC_BUILD_DIR exit 0 fi # Construct the vlc_build_dir mkdir -p $VLC_BUILD_DIR cd $VLC_BUILD_DIR # Construct the argument list echo "Building for $ARCHS with sdk=\"$SDKROOT\" in $VLC_BUILD_DIR" args="--disable-nls $args" # Mac OS X related options args="--disable-macosx $args" # Disable old gui/macosx args="--disable-macosx-vlc-app $args" # Don't build old vlc.app args="--with-macosx-version-min=10.6 $args" # optional modules args="--enable-merge-ffmpeg $args" args="--enable-faad $args" args="--enable-flac $args" args="--enable-theora $args" args="--enable-shout $args" args="--enable-twolame $args" args="--enable-realrtsp $args" args="--enable-libass $args" args="--enable-macosx-audio $args" args="--enable-macosx-dialog-provider $args" args="--enable-macosx-eyetv $args" args="--disable-macosx-qtkit $args" args="--disable-quicktime $args" args="--enable-macosx-vout $args" # disabled stuff args="--disable-growl $args" args="--disable-caca $args" args="--disable-ncurses $args" args="--disable-httpd $args" args="--disable-vlm $args" args="--disable-skins2 $args" args="--disable-glx $args" args="--disable-xvideo $args" args="--disable-xcb $args" args="--disable-sdl $args" args="--disable-sdl-image $args" args="--disable-samplerate $args" args="--disable-vda $args" if test "x$SDKROOT" != "x" then args="--with-macosx-sdk=$SDKROOT $args" fi # Debug Flags if test "$CONFIGURATION" = "Debug"; then optim="-g" else optim="" fi # 64 bits switches for arch in $ARCHS; do this_args="$args" # where to install this_args="--prefix=${VLC_BUILD_DIR}/$arch/vlc_install_dir $this_args" input="$VLC_SRC_DIR/configure" output="$arch/Makefile" if test -e ${output} && test ${output} -nt ${input}; then echo "No need to re-run configure for $arch" continue; fi # Construct the vlc_build_dir/$arch mkdir -p $arch cd $arch if test $arch = "x86_64"; then export CFLAGS="-m64 -arch x86_64 $optim" export CXXFLAGS="-m64 -arch x86_64 $optim" export OBJCFLAGS="-m64 -arch x86_64 $optim" export CPPFLAGS="-m64 -arch x86_64 $optim" this_args="--build=x86_64-apple-darwin10 --with-contrib=$VLC_SRC_DIR/contrib/x86_64-apple-darwin10 $this_args" export PATH=$VLC_SRC_DIR/extras/tools/build/bin:$VLC_SRC_DIR/contrib/x86_64-apple-darwin10/bin:$PATH export PKG_CONFIG_PATH=$VLC_SRC_DIR/contrib/x86_64-apple-darwin10/lib/pkgconfig fi if test $arch = "i386"; then export CFLAGS="-m32 -arch i386 $optim" export CXXFLAGS="-m32 -arch i386 $optim" export OBJCFLAGS="-m32 -arch i386 $optim" export CPPFLAGS="-m32 -arch i386 $optim" this_args="--build=i686-apple-darwin9 --with-contrib=$VLC_SRC_DIR/contrib/i686-apple-darwin9 $this_args" fi echo "Running [$arch] configure $this_args" $VLC_SRC_DIR/configure $this_args err=$? if test $err != 0; then exit $err fi cd .. done Examples_OSX/000077500000000000000000000000001250240207200133575ustar00rootroot00000000000000Examples_OSX/BasicPlayerWithPlaylist/000077500000000000000000000000001250240207200201335ustar00rootroot00000000000000Examples_OSX/BasicPlayerWithPlaylist/BasicPlayerWithPlaylist.xcodeproj/000077500000000000000000000000001250240207200267035ustar00rootroot00000000000000Examples_OSX/BasicPlayerWithPlaylist/BasicPlayerWithPlaylist.xcodeproj/project.pbxproj000066400000000000000000000320621250240207200317620ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 6333027B0BD24CDB00193D7D /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 633302790BD24CDB00193D7D /* Controller.m */; }; 7D7AF4E4183A813A003CF2E3 /* VLCKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CC786BB31715AAB50024EDC0 /* VLCKit.framework */; }; 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; CC786BB41715AAB50024EDC0 /* VLCKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC786BB31715AAB50024EDC0 /* VLCKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 7D7AF4E3183A8132003CF2E3 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 7D7AF4E4183A813A003CF2E3 /* VLCKit.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* test_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = test_Prefix.pch; sourceTree = ""; }; 633302780BD24CDB00193D7D /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 633302790BD24CDB00193D7D /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* BasicPlayerWithPlaylist.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BasicPlayerWithPlaylist.app; sourceTree = BUILT_PRODUCTS_DIR; }; CC786BB31715AAB50024EDC0 /* VLCKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VLCKit.framework; path = ../../build/Debug/VLCKit.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, CC786BB41715AAB50024EDC0 /* VLCKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( 633302780BD24CDB00193D7D /* Controller.h */, 633302790BD24CDB00193D7D /* Controller.m */, ); name = Classes; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( CC786BB31715AAB50024EDC0 /* VLCKit.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* BasicPlayerWithPlaylist.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* test */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = test; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 32CA4F630368D1EE00C91783 /* test_Prefix.pch */, 29B97316FDCFA39411CA2CEA /* main.m */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 8D1107310486CEB800E47090 /* Info.plist */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D1107260486CEB800E47090 /* BasicPlayerWithPlaylist */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "BasicPlayerWithPlaylist" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, 7D7AF4E3183A8132003CF2E3 /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = BasicPlayerWithPlaylist; productInstallPath = "$(HOME)/Applications"; productName = test; productReference = 8D1107320486CEB800E47090 /* BasicPlayerWithPlaylist.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BasicPlayerWithPlaylist" */; compatibilityVersion = "Xcode 2.4"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, ); mainGroup = 29B97314FDCFA39411CA2CEA /* test */; projectDirPath = ""; projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* BasicPlayerWithPlaylist */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072D0486CEB800E47090 /* main.m in Sources */, 6333027B0BD24CDB00193D7D /* Controller.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C165DFE840E0CC02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( 29B97319FDCFA39411CA2CEA /* English */, ); name = MainMenu.nib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../build/Debug\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_FLAGS_LIBINTL = "-dylib_file @loader_path/../lib/vlc_libintl.dylib:$(VLC_FRAMEWORK)/lib/vlc_libintl.dylib"; LD_FLAGS_LIBVLC = "-dylib_file @loader_path/lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib"; LD_FLAGS_LIBVLC_CONTROL = "-dylib_file @loader_path/lib/libvlc-control.dylib:$(VLC_FRAMEWORK)/lib/libvlc-control.dylib"; OTHER_LDFLAGS = ( "$(LD_FLAGS_LIBINTL)", "$(LD_FLAGS_LIBVLC)", "$(LD_FLAGS_LIBVLC_CONTROL)", ); PRODUCT_NAME = BasicPlayerWithPlaylist; SYMROOT = ../../build; VLC_FRAMEWORK = "$(TARGET_BUILD_DIR)/VLC.framework"; WRAPPER_EXTENSION = app; ZERO_LINK = YES; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../build/Debug\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_FLAGS_LIBINTL = "-dylib_file @loader_path/../lib/vlc_libintl.dylib:$(VLC_FRAMEWORK)/lib/vlc_libintl.dylib"; LD_FLAGS_LIBVLC = "-dylib_file @loader_path/lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib"; LD_FLAGS_LIBVLC_CONTROL = "-dylib_file @loader_path/lib/libvlc-control.dylib:$(VLC_FRAMEWORK)/lib/libvlc-control.dylib"; OTHER_LDFLAGS = ( "$(LD_FLAGS_LIBINTL)", "$(LD_FLAGS_LIBVLC)", "$(LD_FLAGS_LIBVLC_CONTROL)", ); PRODUCT_NAME = BasicPlayerWithPlaylist; SYMROOT = ../../build; VLC_FRAMEWORK = "$(TARGET_BUILD_DIR)/VLC.framework"; WRAPPER_EXTENSION = app; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH)"; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "BasicPlayerWithPlaylist" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BasicPlayerWithPlaylist" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } Examples_OSX/BasicPlayerWithPlaylist/Controller.h000066400000000000000000000030171250240207200224300ustar00rootroot00000000000000/***************************************************************************** * test: Controller ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import @interface Controller : NSObject { IBOutlet id window; IBOutlet id playlistOutline; IBOutlet id videoHolderView; IBOutlet id spuPopup; VLCVideoView * videoView; VLCMediaList *playlist; VLCMediaPlayer *player; int mediaIndex; } - (void)awakeFromNib; - (void)setMediaIndex:(int)value; - (void)play:(id)sender; - (void)pause:(id)sender; - (IBAction)setSPU:(id)sender; @end Examples_OSX/BasicPlayerWithPlaylist/Controller.m000066400000000000000000000124331250240207200224370ustar00rootroot00000000000000/***************************************************************************** * test: Controller.m ***************************************************************************** * Copyright (C) 2007-2013 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "Controller.h" @implementation Controller - (void)awakeFromNib { [NSApp setDelegate:self]; // Allocate a VLCVideoView instance and tell it what area to occupy. NSRect rect = NSMakeRect(0, 0, 0, 0); rect.size = [videoHolderView frame].size; videoView = [[VLCVideoView alloc] initWithFrame:rect]; [videoHolderView addSubview:videoView]; [videoView setAutoresizingMask: NSViewHeightSizable|NSViewWidthSizable]; videoView.fillScreen = YES; [VLCLibrary sharedLibrary]; playlist = [[VLCMediaList alloc] init]; [playlist addObserver:self forKeyPath:@"media" options:NSKeyValueObservingOptionNew context:nil]; player = [[VLCMediaPlayer alloc] initWithVideoView:videoView]; player.delegate = self; mediaIndex = -1; [playlistOutline registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSURLPboardType, nil]]; [playlistOutline setDoubleAction:@selector(changeAndPlay:)]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { } - (void)applicationWillTerminate:(NSNotification *)aNotification { [playlist removeObserver:self forKeyPath:@"media"]; [player pause]; [player setMedia:nil]; [player release]; [playlist release]; [videoView release]; } - (void)changeAndPlay:(id)sender { if ([playlistOutline selectedRow] != mediaIndex) { [self setMediaIndex:[playlistOutline selectedRow]]; if (![player isPlaying]) [player play]; } } - (void)setMediaIndex:(int)value { if ([playlist count] <= 0) return; if (value < 0) value = 0; if (value > [playlist count] - 1) value = [playlist count] - 1; mediaIndex = value; [player setMedia:[playlist mediaAtIndex:mediaIndex]]; } - (void)play:(id)sender { [self setMediaIndex:mediaIndex+1]; if (![player isPlaying] && [playlist count] > 0) { NSLog(@"%@ length = %@", [playlist mediaAtIndex:mediaIndex], [[playlist mediaAtIndex:mediaIndex] lengthWaitUntilDate:[NSDate dateWithTimeIntervalSinceNow:60]]); [player play]; } } - (void)pause:(id)sender { NSLog(@"Sending pause message to media player..."); [player pause]; } - (void)mediaPlayerStateChanged:(NSNotification *)aNotification { if (player.media) { NSArray *spuTracks = [player videoSubTitlesNames]; NSArray *spuTrackIndexes = [player videoSubTitlesIndexes]; NSUInteger count = [spuTracks count]; [spuPopup removeAllItems]; if (count <= 1) return; for (NSUInteger x = 0; x < count; x++) { [spuPopup addItemWithTitle:spuTracks[x]]; [[spuPopup lastItem] setTag:spuTrackIndexes[x]]; } } } - (void)setSPU:(id)sender { if (player.media) player.currentVideoSubTitleIndex = [[spuPopup selectedItem] tag]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"media"] && object == playlist) [playlistOutline reloadData]; } // NSTableView Implementation - (int)numberOfRowsInTableView:(NSTableView *)tableView { return [playlist count]; } - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row { NSString *title = [(VLCMedia *)[playlist mediaAtIndex:row].metaDictionary valueForKey:VLCMetaInformationTitle]; return title ? title : [playlist mediaAtIndex:row].url.lastPathComponent; } - (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op { return NSDragOperationEvery; /* This is for now */ } - (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)operation { NSArray *droppedItems = [[info draggingPasteboard] propertyListForType:NSFilenamesPboardType]; for (int i = 0; i < [droppedItems count]; i++) { NSString * filename = [droppedItems objectAtIndex:i]; VLCMedia * media = [VLCMedia mediaWithPath:filename]; [playlist addMedia:media]; } return YES; } @end Examples_OSX/BasicPlayerWithPlaylist/English.lproj/000077500000000000000000000000001250240207200226515ustar00rootroot00000000000000Examples_OSX/BasicPlayerWithPlaylist/English.lproj/InfoPlist.strings000066400000000000000000000003121250240207200261670ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = " __MyCompanyName__, 2007";Examples_OSX/BasicPlayerWithPlaylist/English.lproj/MainMenu.nib/000077500000000000000000000000001250240207200251315ustar00rootroot00000000000000Examples_OSX/BasicPlayerWithPlaylist/English.lproj/MainMenu.nib/designable.nib000066400000000000000000002650471250240207200277360ustar00rootroot00000000000000 1090 12F45 4514 1187.40 626.00 com.apple.InterfaceBuilder.CocoaPlugin 4514 NSButton NSButtonCell NSCustomObject NSCustomView NSMenu NSMenuItem NSPopUpButton NSPopUpButtonCell NSScrollView NSScroller NSTableColumn NSTableHeaderView NSTableView NSTextFieldCell NSView NSWindowTemplate com.apple.InterfaceBuilder.CocoaPlugin PluginDependencyRecalculationVersion NSApplication FirstResponder NSApplication 15 2 {{300, 293}, {779, 429}} 1886912512 VLCMovieView Example NSWindow View 256 274 {{194, 46}, {585, 383}} NSView NSResponder 256 {{683, 6}, {82, 32}} YES 67108864 134217728 Pause LucidaGrande 13 1044 -2038284288 1 200 25 NO 256 {{610, 6}, {82, 32}} YES 67108864 134217728 Play -2038284288 1 200 25 NO 256 2322 4352 {193, 365} YES NO YES 256 {193, 17} 256 {{183, 0}, {12, 17}} 179 40 1000 75497536 2048 LucidaGrande 11 3100 3 MC4zMzMzMzI5OQA 6 System headerTextColor 3 MAA 337641536 2048 6 System controlBackgroundColor 3 MC42NjY2NjY2NjY3AA 6 System controlTextColor 3 2 3 MQA 6 System gridColor 3 MC41AA 17 -702545920 4 15 0 YES 0 1 {{1, 17}, {193, 365}} 4 256 {{180, 17}, {14, 365}} NO 256 _doScroller: 0.95789474248886108 256 {{1, 368}, {193, 14}} NO 257 _doScroller: 0.99047619104385376 2304 {{1, 0}, {193, 17}} 4 {{0, 46}, {195, 383}} 133170 QSAAAEEgAABBmAAAQZgAAA 0.25 4 1 268 {{459, 10}, {152, 26}} YES -2076180416 2048 109199360 129 400 75 Item 1 1048576 2147483647 1 NSImage NSMenuCheckmark NSImage NSMenuMixedState _popUpItemAction: YES OtherViews Item 2 1048576 2147483647 _popUpItemAction: Item 3 1048576 2147483647 _popUpItemAction: 1 YES YES 2 NO {779, 429} {{0, 0}, {1280, 778}} {10000000000000, 10000000000000} YES MainMenu NewApplication 1048576 2147483647 submenuAction: NewApplication About NewApplication 2147483647 YES YES 1048576 2147483647 Preferences… , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services _NSServicesMenu YES YES 1048576 2147483647 Hide NewApplication h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit NewApplication q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File New n 1048576 2147483647 Open... o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 Save As… S 1048576 2147483647 Revert 2147483647 YES YES 1048576 2147483647 Page Setup… P 1048576 2147483647 Print… p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit Undo z 1048576 2147483647 Redo Z 1048576 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Paste and Match Style V 1572864 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find Find… f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1048576 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling 1048576 2147483647 submenuAction: Spelling Spelling… : 1048576 2147483647 Check Spelling ; 1048576 2147483647 Check Spelling as You Type 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 1048576 2147483647 submenuAction: Help NewApplication Help ? 1048576 2147483647 _NSMainMenu Controller terminate: 139 orderFrontStandardAboutPanel: 142 hideOtherApplications: 146 hide: 152 unhideAllApplications: 153 performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 showHelp: 122 clearRecentDocuments: 127 cut: 175 paste: 176 redo: 178 selectAll: 179 undo: 180 copy: 181 showGuessPanel: 188 checkSpelling: 190 toggleContinuousSpellChecking: 192 performClose: 193 delete: 195 performZoom: 198 performFindPanelAction: 199 performFindPanelAction: 200 performFindPanelAction: 201 performFindPanelAction: 202 centerSelectionInVisibleArea: 203 pasteAsPlainText: 205 window 207 videoHolderView 224 play: 254 pause: 255 playlistOutline 264 setSPU: 278 spuPopup 279 dataSource 261 0 -2 File's Owner -1 First Responder 21 Window 2 217 251 252 256 257 258 29 MainMenu 19 24 5 23 92 197 56 57 58 129 131 130 134 136 143 144 145 149 150 196 83 81 72 73 74 75 77 78 79 80 82 112 124 125 126 103 106 111 163 169 156 157 158 160 164 168 159 154 155 161 162 167 171 172 173 174 184 185 187 189 191 204 206 Controller 266 267 268 269 270 271 -3 Application 272 273 274 275 276 277 com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin 279 Controller NSObject setSPU: id setSPU: setSPU: id id id id id playlistOutline id spuPopup id videoHolderView id window id IBProjectSource ./Classes/Controller.h NSDocument id id id id id id id id id id id id id id browseDocumentVersions: id duplicateDocument: id lockDocument: id moveDocument: id moveDocumentToUbiquityContainer: id printDocument: id renameDocument: id revertDocumentToSaved: id runPageLayout: id saveDocument: id saveDocumentAs: id saveDocumentTo: id saveDocumentToPDF: id unlockDocument: id IBProjectSource ./Classes/NSDocument.h 0 IBCocoaFramework YES com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES 3 {11, 11} {10, 3} Examples_OSX/BasicPlayerWithPlaylist/English.lproj/MainMenu.nib/keyedobjects.nib000066400000000000000000000454171250240207200303110ustar00rootroot00000000000000bplist00)*X$versionX$objectsY$archiverT$top#'.16PQRSVdlwx{| 78@KLPTUY]jsx~&-.3458<=>ABHQRS\]^agjkmnorv  ")*+,07;<=>BINOPU\]^_dklmns{|} !()*+/6789=DHIJKOVWXY]defjqrsw~ ")*+4=>?DGJKT]^ghilz!*+,/6?@IJKOPR(      #&U$null VNSRoot]NSConnections\NSOidsValues_NSObjectsValues]NSObjectsKeys_NSAccessibilityOidsValues_NSVisibleWindows_NSAccessibilityOidsKeys_NSAccessibilityConnectorsV$classZNSOidsKeyswmkl !"[NSClassName$%&YNS.string]NSApplication()*+Z$classnameX$classes_NSMutableString*,-XNSStringXNSObject()/0^NSCustomObject/-235ZNS.objects4v789:;<=>?@ABCDEFGHIJKLMNO\NSWindowRect_NSUserInterfaceItemIdentifierYNSMaxSize]NSWindowTitle\NSWindowView_NSWindowIsRestorable\NSScreenRect_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMaskt supx _{{300, 293}, {779, 429}}_VLCMovieView ExampleXNSWindow$%UTViewWXYZ[\]^__abcZNSSubviews_NSNextResponder[NSSuperviewXNSvFlagsXNSWindow[NSFrameSizer q2ekfghij %XEmn XYZ[opqrGGub[NSExtensionWNSFrame _{{194, 46}, {585, 383}}$%zVNSView[NSResponder()}~\NSCustomView}{-VNSViewnXYZ[GGabHVNSCell_NSAllowsLogicalLayoutDirectionYNSEnabled  _{{683, 6}, {82, 32}}g_NSPeriodicInterval[NSCellFlags]NSButtonFlags_NSAlternateContents_NSKeyEquivalent\NSCellFlags2_NSAlternateImage]NSControlViewZNSContentsYNSSupport_NSPeriodicDelay^NSButtonFlags2@UPauseVNSSizeXNSfFlagsVNSName#@*\LucidaGrande()VNSFont-P$%P()\NSButtonCell-\NSActionCellVNSCell()XNSButton{-YNSControlnXYZ[GGabH"!  _{{610, 6}, {82, 32}}h$ #TPlay$%րPnYXZ[WGGab_NSMagnification]NSNextKeyViewXNSsFlags]NSContentView[NSVScroller_NSHeaderClipView\NSScrollAmts[NSHScroller_NSMinMagnification_NSMaxMagnification#?'2V'WN, OA A AA&R#?#@2k'NR,EnWXY[ZiibYNScvFlagsYNSDocViewYNSBGColorML(%%) )>2 k)E\Z X[Y H"%&&'()*b,-O.(0H245H_ NSControlAllowsExpansionToolTips_NSColumnAutoresizingStyle_NSBackgroundColor_NSDraggingSourceMaskForNonLocal_#NSTableViewDraggingDestinationStyleZNSDelegate\NSHeaderView_NSIntercellSpacingHeight[NSRowHeightYNSTvFlags_NSDraggingSourceMaskForLocal\NSCornerView\NSDataSource[NSGridColor_NSIntercellSpacingWidth^NSTableColumns_NSTableViewGroupRowStyle_NSAllowsTypeSelect* 'FKJ+#@#@1 /JG #@'2 Z{193, 365}XYZ[\9:ab>[NSTableView.,,-)nWXY[ZBCii)bH)MUT%%+ +>Y{193, 17}()MN_NSTableHeaderViewO{-_NSTableHeaderViewXnZDRSa10_{{183, 0}, {12, 17}}()VW]_NSCornerViewX{-]_NSCornerView2Zk[3E^_`ab9cdefghZNSDataCell\NSHeaderCellZNSMaxWidthWNSWidthZNSMinWidthD=4#@@#@f`#@D)klmnopr[NSTextColor@<568tu#@& yz{|}WNSWhite\NSColorSpaceK0.333332997()WNSColor-z}[NSColorName]NSCatalogNameWNSColor7:9;VSystem_headerTextColoryz|}B07()_NSTableHeaderCell-_NSTableHeaderCell_NSTextFieldCell\NSActionCellVNSCellkr @)C>Az}7?9@_controlBackgroundColoryz|}M0.66666666677z}7B9;_controlTextColor()-\NSActionCellVNSCell()]NSTableColumn-()^NSMutableArray-WNSArrayyz|}B17z}7H9IYgridColoryz|}D0.57()[NSTableView{-[NSTableView_{{1, 17}, {193, 365}}()ZNSClipView{-nXYZ[aiiabiXNSTargetXNSActionYNSPercentQO%%%P#?_{{180, 17}, {14, 365}}\_doScroller:()ZNSScroller{-nXYZ[iiabiQS%%%P#? _{{1, 368}, {193, 14}}2k)+E_{{1, 0}, {193, 17}}_{{0, 46}, {195, 383}}()\NSScrollView{-nXYZ[GGbHZYp   _{{459, 10}, {152, 26}}5 rj HHHK_NSPreferredEdgeZNSMenuItemVNSMenu_NSMenuItemRespectAlignment_NSUsesItemFromMenu]NSAltersState_NSArrowPositionK@@[@X\  o  !$5%]NSMnemonicLoc_NSKeyEquivModMaskYNSOnImageZNSKeyEquivWNSTitleWNSState\NSMixedImage\d^eZ]b'()*+[NSMenuItemsZNSMenuFontngfVItem 1 /012^NSResourceName_a`WNSImage_NSMenuCheckmark()67_NSCustomResource6- /01;_ac_NSMenuMixedState__popUpItemAction:()?@ZNSMenuItem?-ZOtherViews2CkEF[hkE ! NO%\e^ZijbVItem 2__popUpItemAction: ! YZ%\e^ZlmbVItem 3__popUpItemAction:()_`VNSMenu_-()bc_NSPopUpButtonCellbdef-^NSMenuItemCell\NSActionCellVNSCell()hi]NSPopUpButtonh{-Z{779, 429}()l{-_{{0, 0}, {1280, 778}}_ {10000000000000, 10000000000000}()pq_NSWindowTemplatep-()st\NSMutableSetsu-UNSSet2wk%xyz{|}~x}€Ȁ̀Ӏ؀݀ EXNSSource]NSDestinationWNSLabely){| "zZController_playlistOutline()_NSNibOutletConnector-^NSNibConnectorjyX~|XspuPopupfy|_videoHolderView4y|Vwindow)y|ZdataSourceʀ! %e^b')րnbad_Bring All to Front_arrangeInFront:()_NSNibControlConnector-^NSNibConnectorʀ! %e^bXMinimizeQm_performMiniaturize:ʀ! %e^b')n#!2_About NewApplication_orderFrontStandardAboutPanel:ʀ! %e^b'  )67nUCloseQw]performClose:ʀ! %e^bkPage Setup &QP^runPageLayout: ʀ! &'%e^bfPrint &QpVprint:-.ʀ1! 45%e^b'89)fhn_NewApplication HelpQ?YshowHelp:?@ʀC! G%e^b')KLMnBACZClear Menu_clearRecentDocuments:QSʀ! YZ%e^b_Hide NewApplicationQhUhide:`bʀ! hi%e^b_Quit NewApplicationQqZterminate:oqʀu! Yy%e^b[Hide Others_hideOtherApplications:~ʀ! %e^bXShow All_unhideAllApplications:ʀÀǀ! 5%UNSTagĀe^ƀŀb')XYneFind &Qf_performFindPanelAction:ʀɀ̀! %Āe^ˀʀb_Jump to SelectionQj_centerSelectionInVisibleArea:ʀ΀Ҁ! %πe^рЀb')QRnTCopyQcUcopy:ʀԀ׀! %πe^րՀbTUndoQzUundo:ʀـ܀! %πe^ۀڀbSCutQxTcut:ʀހǀ! %Āe^߀b_Use Selection for FindQeʀǀ! |%Āe^b]Find PreviousQGʀ耊! %πe^bVDeleteWdelete:ʀǀ!  K %Āe^bYFind NextQgʀ! %πe^bUPasteQvVpaste:ʀ! %&%πe^bZSelect AllQaZselectAll:,-ʀ! 34%πe^bTRedoQZUredo::;ʀ>! AB%e^b'EF)[]niSpelling &Q:_showGuessPanel:LMʁ>! ST%e^b^Check SpellingQ;^checkSpelling:Z[ʁ >! b%e^ b_Check Spelling as You Type_toggleContinuousSpellChecking:ghʁ ! o%e^ bTZoom\performZoom:tuʁu! {|%πe^b_Paste and Match StyleQV_pasteAsPlainText:gʀyVpause:hʀ yUplay:jʀXyWsetSPU:2U4Gfghi[d)j EFgQ`o~C?1-,>:LZt  "%)3=R+NXZ\[hk^c  %),(01$3;MEDH8K>eNρS΀ԀـUĀÀɀހTZyj "]NSApplication')niXMainMenu2k΁ 3N^eE! %YNSSubmenue^!"b^NewApplication^submenuAction:2 kQo~`$%()01E!H H%]NSIsSeparator\NSIsDisablede ^ b! &'%e^'&blPreferences &Q,!H H%e ^ b! :;%e^,*+bXServices^submenuAction:')ABCn.-/$%FXServices2HkE__NSServicesMenu!H H%e ^ b!H H%e ^ b\_NSAppleMenu! de%e^45bTFile^submenuAction:$%kTFile2mk8;>DEHKME! ~%e^:9bSNewQn! %e^=E%πe^[\bXSpelling^submenuAction:2k:LZE! '(%e^_`bVWindow^submenuAction:$%.VWindow20kgȀ cE!H H%e ^ b^_NSWindowsMenu! 18G%e^fgbTHelp^submenuAction:2Lk-E[_NSMainMenu()Q-2SU4GGgGhGi[iiiGj   C1>>>  %)3%%% XZ\\\^ )3>eNπππππρUĀĀĀĀĀππππρZπj2{4Gfghi[d)j EFgQ`o~C?1-,>:LZtxyz{|}~  "%)3=R+NXZ\[hk^c  %),(01$3;MEDH8K>eNρS΀ԀـUĀÀɀހTZyx}€Ȁ̀Ӏ؀݀ j2){*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~nopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁j !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~2!kE2$ꠁj()'(^NSIBObjectData'-_NSKeyedArchiver+,]IB.objectdata"+5:?!NUcp  "%.:<>GQSaju~#CM[h $-68=Zew   09;BNWdmt % : F T j |      % . 5 > A C E R [ b g h q s t }   M O Q S U W Y [ ` i k l  " 7 L U W \ ^ ` b d f h j l           ! # )4A\hr!#%.09BDFHIRTVXYd 0246MVdm{*/13579<MVY[]jr .9M_ls   "+4AHQ_dm|%09fox '?HKMOe}6HSZw !+6>FSXZ_acegikm~';DOT_hoqsuw (/4=Q^mz%29?H )+-8JSjq "$EGIKMOQbdgjm  ,=?ACEbdfhjln,9;=?`bdfhjl "$&(*7:=?UWanprt    " $ & < > D U W Y [ ] ~ !!!.!0!2!4!6!W!Y![!]!_!a!c!l!!!!!!!!!!!!!!!!!!!" """""?"A"C"E"G"I"K"_"a"""""""""""""""""""""""######!###(#*#0#=#?#A#C#d#f#h#j#l#n#p#t#v#{##################$$$$$$$ $.$0$=$?$A$C$d$f$h$j$l$n$p$w$$$$$$$$$$$$$$$$$$%%%% % % %%%%%+%-%/%1%R%T%V%X%Z%\%^%i%k%v%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&-&/&A&N&Q&T&V&w&y&{&}&&&&&&&&&&&&&&&&&''&'3'6'9';'\'^'`'b'd'g'i'n'{'''''''''''''''(((((((!(#(&(((.(?(A(C(F(H(P(Y)) ) ) ))))))))))!)#)%)')))+)-)/)1)4)7)9);)=)@)C)F)H)J)M)P)S)U)W)Z)])_)b)d)g)j)l)o)q)t)w)y){)~))))))))))))))))))))))))))))))))))))))))**** ***'***-*0*3*6*8*a*k*n*p*r*t*v*y*|*~****************++++ +"+#+%+'+(+*+,+M+O+Q+S+V+Y+[+t+v+++++++++++++++++++,,,,,,,&,(,1,:,;,=,O,x,z,|,},,,,,,,,,,,,,,,,,,,,,---- --#-%-*-3-J-M-P-S-V-X-[-^-a-d-f-h-j------------------..... . .......7.9.E.N.Q.S.U.n....................///// ///://@/B/E/G/N/w/y/{/|/~///////////////////00 0 000000000!0$0&0O0Q0S0T0V0X0Y0[0]00000000000000000000000011 1 1 1111<1>1@1B1D1F1I1L1N1W1f1o1v1x1{1~11111111111111111111222+2-2/2022242527292H2q2t2v2x2z2|22222222222223x3z3|3~3333333333333333333333333333333333333333333333333333333333444444 4 4444444444!4#4&4(4*4,4.40434<55575:5<5>5@5B5D5F5H5J5L5N5P5R5T5V5X5Z5\5^5`5b5e5h5j5l5n5q5t5w5y5{5~5555555555555555555555555555555555555555555555555555666666 6 6666666666 6"6$6&6(6*6,6.60626466686:6<6?6B6E6H6K6N6Q6T6]7V7Y7\7_7b7e7h7k7n7q7t7w7z7}77777777777777777777777777777777777777777778888 8 8888888"8%8(8+8.8184878:8=8@8C8F8I8L8O8R8U8X8[8^8a8d8g8j8m8p8s8v8y8|88888888888888888888888888888888888888888889999 9 9999999!9$9'9*9-909396999<9?9B9E9H9K9N9Q9T9W9Z9]9`9c9f9i9l9o9r9u9x9{9~9999999999999999999999999999999999999999999:::: ::::::: :#:&:):,:/:2:5:8:A:B:D:M:N:Q:Z:i:n:::-:Examples_OSX/BasicPlayerWithPlaylist/Info.plist000066400000000000000000000015121250240207200221020ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile CFBundleIdentifier com.yourcompany.test CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 1.0 NSMainNibFile MainMenu NSPrincipalClass NSApplication Examples_OSX/BasicPlayerWithPlaylist/main.m000066400000000000000000000023231250240207200212350ustar00rootroot00000000000000/***************************************************************************** * test: Controller.m ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #include int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } Examples_OSX/BasicPlayerWithPlaylist/test_Prefix.pch000066400000000000000000000002131250240207200231170ustar00rootroot00000000000000// // Prefix header for all source files of the 'test' target in the 'test' project // #ifdef __OBJC__ #import #endif Examples_OSX/FlashVideoDownloader/000077500000000000000000000000001250240207200174225ustar00rootroot00000000000000Examples_OSX/FlashVideoDownloader/Controller.h000066400000000000000000000040111250240207200217120ustar00rootroot00000000000000/***************************************************************************** * FlashVideoDownloader: Controller.m ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import @interface Controller : NSObject { IBOutlet NSView * remoteURLView; IBOutlet NSView * workingView; IBOutlet NSWindow * window; IBOutlet NSButton * openConvertedFileButton; NSNumber * selectedStreamOutput; NSString * remoteURLAsString; VLCMedia * media; VLCStreamSession * streamSession; NSString * outputFilePath; NSString * outputFolderPath; } - (void)awakeFromNib; @property (retain) VLCMedia * media; @property (retain) VLCStreamSession * streamSession; @property (assign) NSNumber * selectedStreamOutput; @property (retain,readonly) NSString * outputFilePath; @property (retain,readonly) NSString * outputFolderPath; @property (retain) NSString * remoteURLAsString; - (IBAction)convert:(id)sender; - (IBAction)openConvertedFile:(id)sender; - (IBAction)openConvertedEnclosingFolder:(id)sender; - (IBAction)pickOutputFolderPath:(id)sender; @end Examples_OSX/FlashVideoDownloader/Controller.m000066400000000000000000000217411250240207200217300ustar00rootroot00000000000000/***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "Controller.h" /********************************************************** * First off, some value transformer to easily play with * bindings */ @interface VLCFloat10000FoldTransformer : NSObject @end @implementation VLCFloat10000FoldTransformer + (Class)transformedValueClass { return [NSNumber class]; } + (BOOL)allowsReverseTransformation { return YES; } - (id)transformedValue:(id)value { if( !value ) return nil; if(![value respondsToSelector: @selector(floatValue)]) { [NSException raise: NSInternalInconsistencyException format: @"Value (%@) does not respond to -floatValue.", [value class]]; return nil; } return [NSNumber numberWithFloat: [value floatValue]*10000.]; } - (id)reverseTransformedValue:(id)value { if( !value ) return nil; if(![value respondsToSelector: @selector(floatValue)]) { [NSException raise: NSInternalInconsistencyException format: @"Value (%@) does not respond to -floatValue.", [value class]]; return nil; } return [NSNumber numberWithFloat: [value floatValue]/10000.]; } @end /********************************************************** * @implementation Controller */ @interface Controller () @property (retain,readwrite) NSString * outputFolderPath; @end @implementation Controller - (id)init { if(self = [super init]) { [self bind:@"outputFolderPath" toObject:[NSUserDefaultsController sharedUserDefaultsController] withKeyPath:@"values.outputFolderPath" options:nil]; [[[NSUserDefaultsController sharedUserDefaultsController] values] bind:@"outputFolderPath" toObject:self withKeyPath:@"outputFolderPath" options:nil]; VLCFloat10000FoldTransformer *float100fold; float100fold = [[[VLCFloat10000FoldTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer:(id)float100fold forName:@"Float10000FoldTransformer"]; self.media = nil; self.streamSession = nil; selectedStreamOutput = [[NSNumber alloc] initWithInt:0]; self.remoteURLAsString = @"http://youtube.com/watch?v=IXpx2OEWBdA&feature=bz303"; outputFilePath = nil; if( !self.outputFolderPath || [self.outputFolderPath isKindOfClass:[NSNull class]]) self.outputFolderPath = [@"~/Movies/Flash Video Converted" stringByExpandingTildeInPath]; } return self; } - (void)dealloc { [outputFilePath release]; [remoteURLAsString release]; [streamSession release]; [media release]; [super dealloc]; } @synthesize streamSession; @synthesize selectedStreamOutput; @synthesize media; @synthesize outputFolderPath; - (void)awakeFromNib { [window setShowsResizeIndicator:NO]; [NSApp setDelegate: self]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [VLCLibrary sharedLibrary]; } - (NSString *)remoteURLAsString { return remoteURLAsString; } - (void)setRemoteURLAsString:(NSString *)newURLAsString { [remoteURLAsString release]; remoteURLAsString = [[newURLAsString copy] retain]; media = [[newURLAsString copy] retain]; [self setMedia:[VLCMedia mediaWithPath:newURLAsString]]; } + (NSSet *)keyPathsForValuesAffectingOutputFilePath { return [NSSet setWithObjects:@"media.metaDictionary.title", nil]; } - (void)freezeOutputFilePath { [outputFilePath release]; outputFilePath = nil; outputFilePath = [self outputFilePath]; [outputFilePath retain]; } - (NSString *)outputFilePath { if(outputFilePath) return [outputFilePath copy]; VLCMedia * aMedia = self.streamSession ? self.streamSession.media ? self.streamSession.media : self.media : self.media; NSString * name = [[[aMedia metaDictionary] objectForKey:@"title"] lastPathComponent]; NSString * extension = [selectedStreamOutput intValue] == 2 ? @"mpeg" : @"mp4"; NSString * path = [NSString stringWithFormat:@"%@/%@.%@", self.outputFolderPath, name, extension ]; int i; for( i = 0; [[NSFileManager defaultManager] fileExistsAtPath:path]; i ++) { path = [NSString stringWithFormat:@"%@/%@ %d.%@", self.outputFolderPath, name, i, extension ]; if( i > 256 ) { /* Don't got too far */ /* FIXME: Be nicer with the user and give him a choice for the new name */ NSRunAlertPanelRelativeToWindow(@"File already exists", [NSString stringWithFormat: @"File '%@', already exists. The old one will be deleted when the OK button will be pressed", path], @"OK", nil, nil, window); break; } } return path; } - (IBAction)convert:(id)sender { VLCStreamOutput * streamOutput; [self.streamSession removeObserver:self forKeyPath:@"isComplete"]; self.streamSession = [VLCStreamSession streamSession]; [self freezeOutputFilePath]; if([selectedStreamOutput intValue] == 2) { streamOutput = [VLCStreamOutput mpeg2StreamOutputWithFilePath:[self outputFilePath]]; } else if([selectedStreamOutput intValue] == 1) { streamOutput = [VLCStreamOutput mpeg4StreamOutputWithFilePath:[self outputFilePath]]; } else streamOutput = [VLCStreamOutput ipodStreamOutputWithFilePath:[self outputFilePath]]; /* Make sure we are exporting to a well known directory */ [[NSFileManager defaultManager] createDirectoryAtPath:self.outputFolderPath attributes:nil]; [self.streamSession setStreamOutput:streamOutput]; [self.streamSession setMedia:self.media]; [self.streamSession startStreaming]; [self.streamSession addObserver:self forKeyPath:@"isComplete" options:NSKeyValueObservingOptionNew context:nil]; /* Show the new view */ [[window contentView] addSubview:workingView]; NSRect frame = [workingView frame]; frame.origin.y -= NSHeight([window contentRectForFrameRect:[window frame]]) + 20.f; [workingView setFrame:frame]; [[window animator] setFrame:NSMakeRect([window frame].origin.x, [window frame].origin.y-NSHeight([workingView frame]), NSWidth([window frame]), NSHeight([window frame])+NSHeight([workingView frame])) display:YES]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"isComplete"]) { if([self.streamSession isComplete]) { /* Notify the user */ [[NSSound soundNamed:@"Glass"] play]; /* Set the icon */ [openConvertedFileButton setImage:[[NSWorkspace sharedWorkspace] iconForFile:[self outputFilePath]]]; /* Rename the link with a nicer name */ NSString * oldPath = [self outputFilePath]; [self freezeOutputFilePath]; [[NSFileManager defaultManager] moveItemAtPath:oldPath toPath:[self outputFilePath] error:NULL]; } return; } [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } - (IBAction)openConvertedFile:(id)sender { [[NSWorkspace sharedWorkspace] openFile:[self outputFilePath]]; } - (IBAction)pickOutputFolderPath:(id)sender; { NSOpenPanel * panel = [NSOpenPanel openPanel]; [panel setCanChooseFiles:NO]; [panel setCanChooseDirectories:YES]; [panel setAllowsMultipleSelection:NO]; [panel beginSheetForDirectory:self.outputFolderPath file:nil types:nil modalForWindow:[sender window] modalDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:nil]; } - (void)openPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo { if(returnCode != NSOKButton || ![[panel filenames] count]) return; self.outputFolderPath = [[panel filenames] objectAtIndex:0]; } - (IBAction)openConvertedEnclosingFolder:(id)sender { [[NSWorkspace sharedWorkspace] selectFile:[self outputFilePath] inFileViewerRootedAtPath:[[self outputFilePath] stringByDeletingLastPathComponent]]; } - (IBAction)cancel:(id)sender { [self.streamSession stop]; } @end Examples_OSX/FlashVideoDownloader/English.lproj/000077500000000000000000000000001250240207200221405ustar00rootroot00000000000000Examples_OSX/FlashVideoDownloader/English.lproj/InfoPlist.strings000066400000000000000000000003121250240207200254560ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = " __MyCompanyName__, 2007";Examples_OSX/FlashVideoDownloader/English.lproj/MainMenu.nib/000077500000000000000000000000001250240207200244205ustar00rootroot00000000000000Examples_OSX/FlashVideoDownloader/English.lproj/MainMenu.nib/classes.nib000066400000000000000000000026021250240207200265470ustar00rootroot00000000000000 IBClasses CLASS GradientBackgroundView LANGUAGE ObjC SUPERCLASS NSImageView CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject ACTIONS convert id openConvertedEnclosingFolder id openConvertedFile id pickOutputFolderPath id CLASS Controller LANGUAGE ObjC OUTLETS openConvertedFileButton NSButton remoteURLView NSView titleView NSView window NSWindow workingView NSView SUPERCLASS NSObject IBVersion 1 Examples_OSX/FlashVideoDownloader/English.lproj/MainMenu.nib/info.nib000066400000000000000000000012041250240207200260420ustar00rootroot00000000000000 IBFramework Version 629 IBLastKnownRelativeProjectPath ../../FlashVideoDownloader.xcodeproj IBOldestOS 5 IBOpenObjects 21 169 940 704 IBSystem Version 9B18 targetFramework IBCocoaFramework Examples_OSX/FlashVideoDownloader/English.lproj/MainMenu.nib/keyedobjects.nib000066400000000000000000045250761250240207200276100ustar00rootroot00000000000000bplist00 X$versionT$topY$archiverX$objects]IB.objectdata_NSKeyedArchiver 159@CDIabcdg tx  !@TYZ_`adhijlms|i}i  '/ 0:;<?CJOPQRWX\cghijnuvw|  ()128=>BCGINQRWZ[^`dehpq1v}   "*+,126=ABCDHOPQRWX\cdejw~     &'-/ 015<=>?CJKLMQXYZ^efglmqxyz~$%,-.678>?IJKLZ[\]^_`gnopwxyzZ[\]5GLMU_`ny_____#,_-3<_=?FOPY_Z^_8b  o p q r s t u v w x y z { | } ~  Y                           ! " # $ % & ' (] ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r u x {U$null  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValuesρg^fhˁi234[NSClassName678YNS.string]NSApplication:;<=X$classesZ$classname=>?_NSMutableStringXNSStringXNSObject:;ABB?^NSCustomObject_IBCocoaFrameworkEFGZNS.objects]HJKLMNOPQRSTUVWXYZ[\]^_`\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass \Y px [Z _{{227, 540}, {446, 117}}_Flash Video DownloaderXNSWindow67fTViewhijkclmnopqms_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize[NSSuperviewXVWEuvHwhijkc2lUz{|}mU U ST EuH$.2Lhjclw|mwWNSFrameVNSCellYNSEnabled# _{{112, 78}, {314, 22}}[NSCellFlags_NSBackgroundColorZNSContentsYNSSupport]NSControlView\NSCellFlags2_NSDrawsBackground_NSPlaceholderString[NSTextColorqA" @ PVNSSizeVNSNameXNSfFlags#@*\LucidaGrande:;?VNSFont_*Paste the youtube/dailymotion/... url hereWNSColor\NSColorSpace[NSColorName]NSCatalogNameVSystem_textBackgroundColorWNSWhiteB1:;?! YtextColorҀB0:;դ?_NSTextFieldCell\NSActionCell:;٥?[NSTextFieldYNSControlVNSView[NSResponderhjclw|mw#%& _{{17, 63}, {340, 11}}@")'($D,_5Can be a YouTube, dailymotion, googlevideo, etc. url.#@"+*\controlColorK0.66666669!-_controlTextColorhjclw mw#/0 _{{17, 80}, {85, 17}}")1.@,[Remote URL:hjclwmwK34" _{{17, 16}, {314, 26}}"#$%&'()*+,-./0]34585<=>?5_NSMenuItemRespectAlignment_NSArrowPosition_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSKeyEquivalentZNSMenuItem_NSPreferredEdge_NSUsesItemFromMenu]NSAltersState_NSPeriodicDelayVNSMenu]NSButtonFlags_NSSelectedIndexA@ KJ52 6@ABCDEFG-HIKLMOPQ>S5XNSTargetWNSTitle_NSKeyEquivModMaskZNSKeyEquiv]NSMnemonicLocYNSOnImage\NSMixedImageXNSActionWNSState4?78<6>BUVWX[NSMenuItemsI@A_Download and Convert to MPEG42[\]^^NSResourceName;9:WNSImage_NSMenuCheckmark:;bcc?_NSCustomResource2[\]g;9=_NSMenuMixedState__popUpItemAction::;k((?ZOtherViewsEuoHp8rB5EABCDEFG-HKvMOPQ>{4?C8<6D_)Download and Convert to iPod/iPhone MovieABCDEFG-HKMOPQ>4?F8<6G_Download and Convert to MPEG2:;?^NSMutableArrayWNSArray:;--?:;?_NSPopUpButtonCell^NSMenuItemCell\NSButtonCell:;?]NSPopUpButtonXNSButtonhjclwmwRMN! _{{336, 12}, {96, 32}}$%&',.QPOL@VDo it!Q :;?:;?Z{446, 120}:;?\NSCustomViewZ{446, 117}:;ۣ?_{{0, 0}, {1280, 778}}Z{213, 129}_{3.40282e+38, 3.40282e+38}:;?_NSWindowTemplate:;£?\NSMutableSetUNSSetEuƀH6_fqwy HMRVZ\`eiklqsx|~ÁȁXNSSourceWNSLabele`dBCDEFG-KMOPQ ?bc8>?_NSNibOutletConnectorABervBCDEFG-KEMFOPQI?tu8>?OƩ֚֌ֱֱ֖֧֧֧֧֧֧֧֧֧֥֥֤֤֤֣֣֛֛֖֖֖֭֭֭֚֚֮֮֮֮֨֯֯֯֯֯֬֬֬֬֬֬֬֬֩֨֨֨֨֡֡֠֠֠֠֟֟֟֞֟֞֞֝֝֜֜֘֘֗֗֕֕֕֔֓֐֎֋և{{~hhmrrvֆևqquCCEa,,-K..7668vvx==?iDDFCCHaaiZZ] yy!!,JJN PPS..8YY_$??J<><552,,/552667NNKOOU]]W++1xxyNNTPC../jjinnn44411/...CCC>>>""!LLLNNMQQQPPP..,VVS>>>___KKKwwu@@D!!"c$$%P559gggJJJsstcccuuuvvv ***NNNxxx < EEGiilDDITTZ999LLLDDD<<>@llsddjssxG4**-ttyaahoos||TGuu~``d!!#h$$&T^^b((*t//1h @@D224 889tttuFFI;;=  EEI//4FFI PPS##%$$(NNR__b((+ $ZZ] + jjl..0cch6+xx|CCMqqsH8CCD ww~XKTT] !!$l$$&Wbbi vv{))+{//1lccd ^^a336 99ttxkkq%%*DDH QQT//5uuwrr{BBC YY^OOQ - [[_ddh::>cci;;>**...2VVY 8 -iilCCFJJN]]cdde..7 ::?__dI8ssw55>```[[aiirPPWaacVV[ssxhhlXJ---hhr||||;;Cddj``i]]cppthZ**2hhijjobbe__ewwz##$z ''(l//6kkmeenPPS}}--/ --/zxx99:``b``a##,EEI336::=AAEQQYTTZ///UU[>>@CCFJJSXXYOOV22;hhmDDG&PPTXX^[[_VVWAAByyNNR 4&ZZ^nntcclyyZZ^LLPVVY = 4hhlwwxyyuu{``h^^e__cP=rrwvv}iikvv|ffj]Pnnqllso `~~rrx##& '')tzz}--/--/~~335::><<@%BBECCF,%PPTMMQ ;,ZZ\SSX F  ;ffk]]`Y  Fpptbbfe Y}}}}iioy imms##%'')|ttz--/..0xx~225#  ::<}}<>BYY`}}jjo##%  &&( "||~@@F " 66:qqv--/"  ..0''-++4TT[FFUVVZvv|qq{{{lluKKUMMU::E ddkssx336) ";;<&&,ss{yyww||vvyyww~{{xx~~FFN::Bvvxww}<<@2*BBDCCE>>Ixx44:vvZZaddh}}||AAF =1QQU}}MMR G *eeh{{~~{{}}xxxx}}wwwwww{{vvvv|yyvv|qq~tt~uu{ssxtt|rrwnnxqqwrrvllyqqvqqvlltooukkvnnqjjtjjqmmtiinhhrhhshhmiiqcclhhmccmgglgglbbleekaajddj``j``j``j``j``kaae__ibbh[[b``i__dZZh]]`ZZekku||SSV = #>>?nqqv..0, !;335ttyccj)),G&  4|$$+&++677HAARDDM??PBBPFFVJJXOO]GGT*" '(""* ,%%1%%1''/((7))6**6++:,,:--<00=00>22>33@44@55F66F;;G77HXXeTTaUUaTTaVTcRS_UUaYYfYYfbdp''-:9@edt ,,9ddq((-77?rr~&&+76>ss%%+66=uu$%*65>NDDQHHXPP^XXf??PFFN66=<& 1m%%)FFPQQ]ZZd__i^^j^^ihhphhwmmvjjxooyKKV >>EEEM88@@@JEEJDDPFFOKKRIISNNXLLYNNVNN\SS\SS]TT^UU_VV`WW^XXdYYdZZe[[f\\dZZi__i\\g\\iZZh^^h\\ebbmaalaalaallkx--2"<Dus--2"==Dtt--2">=Drt--2">=Drt--2"==Dss--2"==Dhht`^j_`j__j__j__j]]hmmvddrddseeseeoggoggsggvggqjjrffueesccq[[g[[e\\hddpiirqq{qq|[[eQQ]88> 6# .c""'IIQPPZ^^iaakaakccmeermmtjjuooyllzSS\EEMEEO;;CCCKFFNHHQJJRLLULLWOOYPPZPP[UU]SS^UU_VV`WWaXXaYYfZZd[[f\\g]]h^^h^^mcck``mbblbbpaambbnccnccnccnccnnpz116""&??E88@ QQ\..3""&AAHvv116""&AAHxx116""&AAHxv116""&AAHvu116""&AAHxw116""&AAHmmxdcoddoddoddodbobblrrllwoowkkwllxkkzllvnnvjjykkujjukkxffpbbk^^jeemggsmm{uuuuaalUUa448 ~3  )U"AAITT^ZZe__l^^kbbmeeqhhviiwjjyppzRR_003HHR;;BCCKEEMGGPIIVKKTPPVNNXOOYPPYRR\SS]TT^UU_VV`WW`XXcYYdZZe[[f\\g]]h^^h__k``laalaakaamddmccnccnccnccnnnz//4""'==C88?RR[,,1""'??Fvv//4""'??Fvv//4""'??Fvv//4""'??Fvx//4""'??Fvx//4""'??Fkmydbmddoddoddoddobbmnnzkkwjjwkkzkkunnuiivjjyhhuiithhwiiqddp]]i^^i``okkwkkwwwoo~^^iRRZ//4l. &MAAIRR]XXd__j__ibbmeeqkkwggsmmull~WW_++5VV^77?CCKEEMGGPIIUKKTMMVNNXOOYOO^RR\SS]TT^UU_VV`WWeXXcYYdZZe[[f\\g]]h^^i__k``oddlaalaap``lddnccnccnccnnnz//4""'==D88?RR[,,1""'@?Fvx//4""'?@Fxv//4""'??Fxx//4""'??Fxx//4""'?@Fxv//4""'??Fmmyddpddoddoddoddobbmoo}kkunnviiujjvjjxlluhhullthhrggshhuccn``i^^ieeoggtooxrrqqyYYgSS\((.a+  #D;;FUU[YYb``j__jccmeetkkshhsiitqq{UUd,,2OOV;;DDDMGGLGGPIIUKKSMMVNNXOOYTT[RR\SS]TT^UU_VV`WWbXXcYYdZZe[[f\\g]]h^^i__n``j__lddlaakaaoddnccnccnccnnnz//4""'>>D77?SS\--1""'@@Fvv//4""'@@Fvx//4""'@@Fvv//4""'@@Fxx//4""'@@Fvx//4""'@@Fmkyddmddoddoddoddobbmmmyjjyjjxkkxlktiiwkksggwhhrggvffrggsbbn\\k^^hccpkkxnnxvv~ll{\\eLLV$$(U'  ;::DRR^XXb^^m__i^^mhhoggvggsffuqq{YYa&&,//5;;CHHLHHTHHQLLTJJWMMVNNXOOYQQ[RR\SS]TT^UU_VV`WWbXXcYYdZZe[[f\\g]]h^^i__j``k``o__lddl``kddoccnccnccnnnz//4##%<>Ewv//4##%>>Ewv//4##%>>Dxy//4##%>>Dxv//4##%>>Eyv//4##%>>Dmmyddmddoddoddoddoccmmmyhgohf}^bVZXUkjtiiriirffrddqffraam]]g^^mhhohhwoowrrhhvZZcGGS $L% 799?QQ]TTb__iaaj``mggpjjrggriipnn}ZZf++0..3&&,33=DDKMMYNNVLLYNNUMMXOOYQQ[RR\SS]TT^UU_VV_WWbXXcYYdZZe[[f\\g]]h^^i__jcck``j``l__laalddoccnccnccnnnz//5##%<RR[--2##%>>Ewy//5##%>>Evw//4##%>>Exv//5##%>>Exv//4##%>>Evx//5##%>>EmmyddoddoddoddmddoccnhgvkkO[zz7PWjgpddseeqhhpccq]]l``h]]jddtmmukkzuuiitXXdEELG# 288>SS]WW^]]l]]jaamddpffuffneetoo|ZZd,,144:..1))+((099=FFQSSZVV_RR_PPYRR\QQ[SS]TT^UU_VVdWWbXXcYYdZZe[[f]]g]]h^^i__j^^k``k``o``lcclccoccnccnccnnn{..3!!&==C::>RR]~~,,0!!&??Eww..3!!&>?Eyw-.2!!&?>Evy.-3!!&>>Exy--2!!&?>Ewx.-2!!&>>Emmyddoddoddoddoddoccoqo{%3L5<Q[kioccrddnffn``i[[haajhhqllukkztt~ddrYYb>>I?"155>F; /33:QQZVV_ZZi^^jaapffnddtffmccsqqy]]j007++5//3..1..5,,6++,%%.&&*''*66;CCJOOZZZg]]h\\fWWeXXcYYdXXc\\eXXfZZf__g``i]]i__m^^j``k``j__nddnccnccnccnoo{,,1!<=Dz|--4>=Dz|--4=>D{y--4>=Dy{--4=>D{z--4>=Dnp|ggrggregrggpggrffqkkvokxN\{+7O.9E/Ebmtjgoddqffuffqeeqaai[[jaaljjsggvllxqq{]]hRR_66=5, s**/YYa[[gbbmggqjjukk{pp{jjyhhspp~XXe66>;;B88?;;C;;>;;?;;?;;?;;?;;B88?==D;;B88@33:117//544=::@==EGGPMMUSS[WWaUU_]]i__maajaan``naao[[g\\h\\g[[g[[gbbo88>%%)::@xxQQ[$$+WWctt55<%%(<$$(<##'<##'==Cbbo[[g[[f\[g\\h[[g[[gZZfccncalfduhfvb_p_^f``kbbmccqccmccm``nbbmjjumm|ss{sswwddmYYd338 3 +U33:JJRRR`ZZgZZb]]hZZcPPXBBNCCH@@GBBKGGNGGNFFMFFPFFPFFPFFPFFMFFQGGQFFNDDOHHOHHPIIPFFPFFMCCHAAE??F<>F??CCCKDDIAAIAAIAAIAAIBBJBBG@@LDDKCCKFFMGGRFFMJJSDDJGGOGGNGGKEEMFFKHHQLLTEEKDDKKKRMMXCCFBBIMMWKKSAAKDDHMMVMMU<>CEEPSSYGGQ;;AAAGEEM@@I99?DDHAAI??H==A<>D??E??E==FFFNOOTVV`^^f[[haak__jPP\99?!i/ )>q$$(--0//4//4//4..4--4..3..3..5..5..5//5//5//5//5//5//5//5//5//5//500500500500500500500700722722833933933933933944944944944944:44:55:55:55:55:55;55;66;66;66;66;66=77=77=77=77=77>99>99>99>99?99?99?99?99?99@99@::@::@::A::A;;A;;A;;A;;B==B==B==B==C==C>>C>>C>>C>>C>>C>>C>>C>>C>>C??C??D@@D@@G@@FBBFBBGBBICCIBBHBBIDDI@@G..1 E, %7Lg                                  nS=)  !1DUdpw{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}|xqgYI5% )9IU_fjklllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllkkhaWL=-   -:DLRUVWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVSMG=1# !*29=@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@>:4,#  "&*,,------------------------------------------------------------------------------------------------,*(#      RS:;DEEF?_NSBitmapImageRepZNSImageRep:;H?E9K;M?@POMM*ttwMMPFFIKKN<Rllk>>=RRS<<:RRPDDBNNN^^^bbf'++,i \\[xxzTTY ;;;=XX]TQQTWW\ !jkkn]]`,,.cch==? pptPPTww|zzcch+UUZLLQjjqyy} @gglIIOzzX-(()onnr C88:nnsVV]]]a[MMOffj[[`rccgvv|~~))+||88:IIL#ZZ^ 8llpN{{&h"")}}hhl++3<))*{yy|cci O Nhhn/.--5QQ^TTb +..8..:33@::E>>KCCQRRa+.3 &))4$!!( *!!)??HSSZMNuHGrST]??Nhhx((.!88?rr--1,,0OO[]]eaamddoffsggryyPPXBBJNMVACHDDKDDKEEL86>G??HsqmLLU**0#)),++0""$!!& % $**1339   RS]D0 0:;___?  +c_file://localhost//:;fgg?_NSPathComponentCell_ kmn&ƀȀ؀ɀ,\Applications*+,s.t0ÀʀˀEuxHyz{|̀πҀE9;?@OMM*:=9Mn~Ʉ˂ʁʄʁʂʄʄɆȃȄȃȅȄȂȄȅȇȅȅȅȆȅȄȄȆȅȃȆȅȅɂdoq (dqr=A=WHNLn'($6 yޑgw|+~%(&: =B@a bszb(*%:'Udgbsy\}?EC` Xcctn~ponooonppoonnom~mnmm~m~m~m~omm~m~nk|k|l~hzgzk}i|k}i|gzi{hzgzgzgzgzgzgzfyfycwbweydxdxbv\r|bx^t}^s|]q{NY[&""-߂|y~}~wyz{|xry|{yvs162Qrɇzz|{qvxj -1.I{~~p}{}|yuw}zurp~qp{nwvwuxzx|wuy~oAMN{HSSv}~|z~vywsopmknqjllkikfgffjgjjeifjgehhjfjffjmedeiiegjfjlgifffjiiiigiihhehhgjgdeeagc]U```\``ab\\TL`a__`e`efbiiklkSlw)+)5#%#/\pxy}zxvvvqnlmnieed`c^a]e]\`[]`a][_b\\]__]]]_[\__[[ab^^_[^^Y^^]^][_`\]\\\\]X^Z]ZYYXU\WUXVVUQSPQRQQUTRVWXXWZ]abbcgjg`$&$6$'%5  jwzfw~Ӫy$ gw{lcx 154L4;:ZGTXzjDU_IV]}FYbAGBd@KLr484P7=9_(+(>y-20M-ܯxak}"%$:}̭qowv)  spyop iz~dwxnh} _mqzp_qxR^_~p}hUeiIQQtxxctLY[>EDcrsl@KLs6:8Tuyl8@?b*.,Ds~l{/43R!$"5n|}h&+)C'd`b^vsr!3ejxzrio~}l& oj}uj}yvg |zxu{ykp~nz }ץ]emnmapywc|z vʣrowtkutsq}unXuojy~|qijyzfmfzfp~}i|wihyo~zrfd}_qwdyy~p^kz}~{gxavXfjnju{~yh|ov~}ua]ouP\^viw{}tb||l~flyeTdiGRS{`uqo{{sbnq}saKY\=HHn\ilhkj{g{x}ypdFQS}8@@ackspfktbZou{vdt=HIp298Uzdqu{vfbxgv|}zq`~6?@c-1/Jdpz|}{zn^mepy}yuaq287X&*(?sev|{}wp^~oryz|n[+0/M # 5^pxzy{ztgwdpvwzudl'+)C,iduwyzurqhwfn|zvnYp}!$!9$\e{yy|xqdcnzvytdf~/jlljpmgkmkli}feqv{yyshgimnjhkkiighcipxbrnw{mWijigihgihgfhgv&  풹pQxW}S{U|V~V~T{[~\l|s]|upcMtVU~U~WV~V~ZWMx_qttvubkUjSVUYVUN|m }瑸zZ_X~ae`[bcdmutkwphql[aa_``f]_Q|pvcussri[yZea[``Su| x⓹x\b_i|fc[`y]mssswsk^VU|dfthcbh|ef\`]kposnaoi`j|eacjzXvw r܏twvZe~imdkf{WYeqvrstrdtiZddmmdfylgmkbk``wenuqg`Upl_lmlfzhen^ws oԍ}\ilnopmo`at_kooorpe[[ekjosqnmknorkkgeh\{bfmhc\}^dmnnkhnjn_zpľ{Zlpmnonh[Ygprnrqlav_bklpnlqqnpptqVtkejX_Y^`yW~]jouqnqvr^z~lfĊ`inllolbim]lqoorpd_xYfpoojmsnnnmlRisrtma\qfqlS~Qzt]flooons_c{hb|v[gklnngZU~cimoonh\[bgmmmlnmnornkoqmkhnphVkV]b^bwckjnhrsRY~sud_vzZdlmkh^sb\hjlllibaoYfhmqmkllimljljjnrjmlh]f[R~]hkeX}Zjllhlli]~}c}Yo{\ckih`YU}fillkjdT}U|amjjkkjikjigjijlkqjljgbR~wWajlf\^kdefqlmk\~y_yYlsW|[`b_Xv]\fjlkkh_ifS~^e]_ibbbcbbbbbcbc_cddc`XZwZgkj`ZV\^ddc\Xo|\s}SfmX|NuW~XU{UyyU{bcfmjidS|JpR{WWQwLqV~T}XXXXXZXYX\XXWWXXWS~Iq{V_hifX`_QXYYXR}Yx|z|VmxPaf}Vz\gkhjib\l~zVffbXP{|xuzUjrL]b~X{~hS|bghfig`U|bXYXi~~vl|~|}~zPemGW\zp}zqNs[defefcYs~|{}||~{~~~~~Hq^fW~~~~~}}|~~~|yL_fCRVz~}}~||~~_^Pz^dddfc_X}~uu~~~}~}}~~~~sqqq~~}qT~N|Jtjh~yx~}}|}|zws{}~~~~}y}~~}}HZa>LP}xz}~~~~{~~~~{yW|R{]acde_S{{}~~~}}}~x~}}}~{yz}}}}~]MxY^^Ls]~{x}{|}~~~kwx}|~~}}}}~~|w~~|wEV[=ILvw~|}~{z~~||}~~}}~}~}rnT}Z_bbXZ{}~}~|{x{}|{|}|{|{qy{|~~{|{{yO{]dbU]~{{{{||zy|{{{||x}||tz}}}}~}|~{~vBQU8EHpu}|~}}z}}|{~}|t}|{}|~}~}|}x|xNqMq`V}ZUNu}|z{{x|z|{z{|w{|{|t{z{z{{z{{|{z{z~U[ee^Nwm|{zvy|psy{v|{z||{{ynz{~z|||xw~t>MS7ABkt|}{|{{|vyz|{{{}y{|||zw{{z~MoOtQvp~ZKr`~u{{{~{{yzy{{{|}yyyz{zzzzy~{v{{|lVbec\Oxz{{{{{zz}zzy{|w||{zz{zzvzyv||{zr?KMz6>>fmzzvv{{zxzzyuvvupzuv|{zzz{gKoWYUzSwx{}npyxsyxxyyz~yzvzyu{xrzzxzzxcwyyyy~Mz]cc`Oz[|zy~zzy~xwy}zzzvzzzyz{zy~zyxzz}q=HHu3<=bpyty|yxxyyyyy}}xxwwyxxzzzzz{|||nJp[[\S|KqBgy|uxnvvuxx}xxzzxxx~}{zwxwvxyy|x|ovzxxyy{\X_eb[Kvo}}}w|xxxwwwx}}yz}zxxyyx{zxxtz~q8DGp088]p}wvwxvvwsxywxxxwzxwxywwwtyyzy{lMu[^\S|Iprvxx{|~kmxy|xxywywwpv|x{xvvywwugvzovxvwwywT_cd`VQxpvwrvyyxxxswywxxxytxxwyyxsxww{k7ABk.53Xozvutzruzuvxqxvswkuwvwxuwvxtyw{bOyX^T~Ms|y{wwltvu{wvsw{xrvu`p}wtwxx{wuwxzztv~uwww{S~Yadf^P{Vvvuzwvvwwzyzu{wxwww{xyvqrwxvwn4==f+33UmwzuquvuuttvzuuwytvvqtuvqvwwwuX|QyVQzQw{wuzvsmovwwpvvwrwvtuwwvutxwvruyvuwvtrvuvuushS`bdaUP|yujvruvwuvrXwvqupvurwxwvux}u{o0:>?????????????????????????????????????????????????????????????????????????????????????????????????????>>>>>>=90'   RSE9;?@OMM* !"*130BIMIaPWUnNTQlMRPlPUSlPUSlNURlQWUlNTRlOURlQVTlMSPlMSPlLSPlMSQlPUSlPUTlLRPlMSPlQVUlPUSlOURlOUSlLSPlHPLlMTQlNTRlOURlQWUlPUSlPVSlMSPlQWUlPUSkRVTiNSOiMQNhQURiPURhOUQiMROhMROiLQNhNSPhKQMiLRNiNSQhLQNiKQNhGMIiEKGhIOLiNSPhMROiQURhKQMhNSPiQURiNSOiLRNhNSPhPUQiNSOhQUSiLQMhMROhOSPiKQMhJPLhOTRiOTPhNSPiNSPiQVTiQURiMROhNSPiPTQhMRPhRVTiNROhLRNhOSOiPURiNSQhQURiOTQhMROiPUQiNSPhPUQiQVSiMTPiMSOiPUShPURiNSPhPUSiNSPiNSOhOTQiMQNiMTPiOTPiQVRhPTPiOTQiJOLhOTQiPURiPURhOTQhQVSiOTQiOTQiMSOhMQNiNTPiNROhNSPiQUShOTPhMSPiNROhMROhOTPiPUQiNSOiOTPhOTPhLQOiMROhOTQiNSOi=AD?gwxoSekv{k}}!!-''!5lwHyv9>8YLWWnhCJxT`ahrJCi-/(Dx~>~Lz|w!"/]r{rhvx|wQ\]!!/wwi ]otr]GRO&'#6l{g_'`{rqA}Zj[Qu BGCcsxg?|Azovocv~q逬tkt@|@}pvdv d}tz>}Fl#$ 0R[Zo|{|W^[}@D>_|~ttwsyzzw{v~ys|{ztryvyzxx|vyvvyvuwruz{xxyyuy{{yvqsyy{wuwvzvrtxtwvtxs|tvtwwsuy|xstywsvtxvqtytvvsvwv|wwsowyrtzwvttswusstqlvqsvmutqqvnv]s}Xpzsxroqtsnrqqrwstvrtoipqpqjksnqqh~ntqmkkqf}qsosnqqsssskquoomonrtmmpknjif~ji~jonlrnmpnljjhmrmg}i]wie}klllopi=ZiC^ktriVmxWgnT\YAJLj7:8N"45/Gix{}|}{|zy{}vy|ywz|{zy}}zvy~{ty~tz~ywz}u|~|w|wzxxouutnt{}yqx}v|tyulSWp|skvwywTHtz~zosowrS\Y&796JtȀ|~{~}}{yz{yz~~v|z}}qRd|}vqvu~x|xuUfj mz~zz}~xz}~~un`jw{svuw~~qt|lg?EBc$z͋|~}}z|t~{~t|~{wy~}{{yw{~}|xzrsjsP\^ ݃m{z}|yzw{z~z}|x~}vwz{~zz~~twt~zxp^P`c u͈kq}{y|{}}z~t~z}t~~}ux}yszvz|u}uy~}~~~|wvzcCNNz^mp|~pdv|}}|~z~zw~qrx~}~}v|}txz}{|}~vod)+&?582Opq{szp~y|~}|wc\}xw}z}wr~}ywq}yuxy~{z|~|xuu~xuvsxs~tz}zwz{tc^ gyhpfxzz|{{||}}xz|z}|zs}Vw}|lrxzxt|u}zoy|w{}y|{ssuxz{vyxz~wz~pS^~{zwWd{z|}rxz~||upTAJKv9AB^s}nofr~{~}~}|{|a{{~}~sz}~~zy~}yquvuzhy|}|||wus|u~vvtww|wt}uqw|y}t|y||t}{yt^S_~{{qvzw{~|{~owwudP~ esykf~rs}}~~|Ux~~{}}~~}}}z}}z}{z~z|~m~x}zw~{x{y|x|w||upwpvy{|xvytzvtx{~rwx}tnz|}x~}}tztx|x{qvy|}mrs|{}pq|yvrv|}tvpx~ywxopJ8?;g#$5fov{|~~y|y{~z~~}|~~|~|xx|n)aq}}zv|y}~}{v|x~}{z}|~zy~~z|}~}}}~~}~{xyy|~v~||xxz}|~}}tz{|u{tvqpsv|y|vyz}wrq|yusiutYgosuz}|szs{{z|x}}qp}sl_mvsv{vyowzpz|nimpzwwqzxv{~ww}t|{ntfnyt~xww~nt]QqGSTk{z|p~{}~|}}}~}u~x|v|{uw}~x~x||~}~~zr~z||{zw~|{Qxy~~|{y~vx}}xz}xfz{z|y~|x{{~{|}z~x~w|~{r~~~~zy~~~{wszzz|wz|{tuz~z}xxy|y~xxwpzz|}tonw}wvrtqzpmxsmrptvvvzxijrrwsstuQavlrr~wqtyvmh{zzsnqvzhHNvzriqwrioqzovpu|lm{zuu{|{yxxtzvzr}|lvqfluw{q|wr||xxjZ&^zoxt}~~o|}}}}~~~}z}zt~|{~~~|~}p~y{~v~|}}}~}vu~|zwyx||~x|~zsy~z|zz|wz{|~}~}|z{uyuqtyw{}~\Pq|~uyxv~|}{s{~zt{t{{}zy|w{yw~}|y}{{zzwx~}{{|~|{v~}|~|~sy~~|{{{xwzz~|wx{{t|{vy|~z{vuxwxx|t{~}vuwqxuv}|tt}{y}zsusutx}xtrrqmlttsqumstuppojrymqlwtppkomxujqfiwnmpmqtnz`D~IQhsmmqivlbmmuvlpcnvgmwl{xkqsnkowyuwqurtyotwrkvpw|wyxvmzs~||zq^6:5\hq~~~z~z|Xp{}x}{{|{}|}uz~xsxu~ry}yxr}z{z|v}~~xwxs}yvw|xx~|{||s}xx~uxvr|xz~quvxzwts{}u{{}zsutxxvsyt}v{uxrx~vv|{ruvvtvzz{z~~{|wzsZp|xr{q{xy}}xw{zmw{w{txu}|rv{xz{zz{vuw|yqyssuq{|s}vz{|ztry~z}qu|yrz|uqy}qt{~xvkxzy~qyxwxsszwqr{pupyunrw}x|||wx~zrzyw{wp|uyntvvu{ysvwwxuysyprtqrvxy}ukzrnrftnnenlknkkovmfpwqoptylhrsljtnouhkkkhkqnlKEB{@zavlrnulnsypolfcomnhppnqoniojjprvogsuuwukpxuil|xmotvtsrnyvoxvyxXFZ`&'!;g|zvu|{{zwnq|vvrx{wx~yxqw|zs}{s{|uuzwwtoyuwqutwuxruvvtykouy|urrstxzxzvt|wrtuvyvvtu}vtrusy{ttuyx}s{~tvurzytutonwsntwwwtpuutryyup{wwosvzzusuvxvzusuwsvhrsrtwqturtsssrwrvuwswtvsnsoxss~ytuwuntuv|uss{ywnr|yumpwtzxxzzpttsumolztvsvvyrrops}wxywtwwwtzuuu{njukuwtuxymkovtz|pszwqtgqnquphrprusqqpttoprhtkrrpjqWC|^oosginpikjnnjjljgorsolmhlikhmtsrsgeebnlgcmmwdOSSdgrmejnagxqepkennlmjoojptti{mpqkriltomngkngstvspuptxtqqousisusr\Kl:@;aiv~|z{}||yxuyzzt{|y}yvvwxsqyvuxtpuysqzrlrrrvpvssrrqrtrslqtvqoorrlutqlkkmuqjkorrqhsqvoquvqpprtonlohqrpnnmlorrrrighclunprpnnhpropsxokrqptsrpnpopopuupmqqjvvowllnoujklorjnoulhwlnjmojnvppyvoqspoltppqpjqzrhvqttoty_]mnpnqoklrtrqlnosppsnosirkpmvqomontsqhmylqnksnlxwfhtmnqjmlsorpfhqnjhsrgrpoppiplohgllnndjklldfjhbhdiqS>xIghhmehjmdgrjnejkmdffdfjgeifjfkhhjj`]abfa]iggjlmo\^e]hd_cknk^iibgng^afmejjfknogmjdkiibioe`jluogeiqstrmlmrrzrtzyuZQ} ISRdv~}~|x}{wv|zuw}{{z|vnu{vvq|tttsnuuzswwx{{rjpqnnktwtnsojnkoijnmqomnlmqpkkhooorlkegiggosiflbphbjlkkjihogfihmkgpokfhebgnkbaihikigfphejddjcejjnffmhqkokjljingilfjeffenkljflnkipoogchhlngcijjkksrjmnkijkiijclnmclijmkljnhonghd_hmjokkqjhimfjihikjmbjjiiifpolnkjkkmbnjklhiieilkninnigdhjlkljqhdhihjkjl_giknmjlhfedgccjgbk^eg^d_E~cmniicccb]cc\]cggcZea[][hkdb_X_a`a\^]gaa^[aa_[_a`b]_b^TZ\T\ZWbd]a_ZaYb_ad^aebcf`dbaeddjdae_W_ed]^mj_j`imanmlmqbalrknqojrtvljpg[MHTTdy}~w||~u{|zwvyyqpxzyroruzwulonnhktpipqromqokohohdikepmgnmggfnljlihmhglkgicehehhlffb[bgdbeidd\fk`_gfbeihmfeecgiead]fkbXdbhffje`kgcdggeh`khdbcghedfeeacdibg]dlfekdhebaceiecfncdomc[a`hkba\gdehffigefgjdhhd\iglcd_cbgfibgeegc]`_Yfeambfhc_gj_bghccdgcgcb^aiigfeefbcdcddefd_[bldacdhaccgdfc_[gb^ccchcff`\dieaf^Yafb]cd\e_\^[_^^[`\^abd]\[]`[X[e^[\_]Xc]\]Za]]SQY_\U\XY\^VZXUYYVYYV]ZWYWWQ[SQ^VO\\YTR`W\[]^\XZ\_^T[]_^ZZcg]^]]\haZcfgbdfejgohifiZkknijmxksrtqmpcO%@MMKsxzy|nx|zzwy}|rx}t|htypr~rskpquqdfgroncjpmeegjf_meiglhd`feaa_c_^``cc^\Y[Zda]^Y]Z[]fd][e`XU]]^c`Z^Z]_V]Z\b_[`_`b_`bV[^Z^\X`bacbbg\YaY\WYW^____^[`[ZY[_\[]^Z[_`Wac\Z][caZWS[[]V[\__^`ZY_Y^ZZ\Vb``^[^\b^WYZ^XbaV_b][XY^a`b[[aa]XX^YWW]_]]_Y^YSaW]_WV^^Z\^ZYXY\YX`^[`]X_][ZZ[a[]]\^]X^`^W\X]^a]`\`Z]]ZZ_\X\^^]][[[\]Z^TZ]SY^]W\[XUM\VZ[V[WSWUNRQQZURTPVXUWYZWUTRQNSVUUOPQOQTTONPMRWUVOQQTNQQWUQUWMMVNRTNUWSYZTUQMW_UTU[ZOOZ\WWd\SYYaff```acadYaa[\fbaebh_emmielnhpkL%;JI/tYv}xzxvwxokvyqllfotjqkjojrwjijdfligkefec`gbdfd\baYXX_Z[ZV_]\Y\Y]YTVWYXUSUWMWVRJLUPVRPUXTPPNLHRROXSMMSQPNRRQNPKQTOVNKRRRLOPLLNWPVQROQMRVNKTVRKUVPUTPOJQRRSQRQXRTQNURLPOMRTQLNOQQTVURQMVPTQPQOPQPV[XJTTPQOOQQTUWLSSUUWOTPPWTVNQTNVRGMVXVVRSPUOPWPUYTPRVTVXTYROSSVVPVLRQNORTWRSSVVLLQRVSNOPPTZPOLRPNOVORTNKQRMRLLMNPOKQRPNMRPPGOLORLNTPPMSLJKLIKMHLNPHKOHDLKHHGFFJKGFIKIIDHHFIFB}FKHFB~CE@zFFB~DEJHCHKFIKCCJHPKJMFNNFOOLLURXJJLNLQRQMMQS^[SVWW^Y[^SZVV`b_V^a\YWeeZhbbcXTL)685EY_[wjrqyŠɊȊǍǍǒƌ摷~x~xyq`jjSZXx030E AD=Ty횽l=?:U >B?V֕w:?=Vhz`u02,Cݔ|}r,.*CHPOpEHq|CLKpM]eu~|zDW_YbatvO[[>C?c{}~p6=:d%xrd%cv~YLsy~^qx$'#9~oYWt"$ 9XjpoJStQch x퐶Uod 385Or.42OO_e|IZ_gwa{wޔc"#1{wL|t1++$?yDHo*+$?+34M|IUs'03M)15JGNz(03J,.(@yv)*$@&(%9|u`n"%"9%s薺~h%uږtk  n͑hX` g~}\vbsv{\ntYhk}P`dNYWFRSDLIny@FAoC>g7=;Xpkq398X-.)Bwsq(*$B$$5}o##5*|{~nu~jn*xl~sn{~zvzh t䕹rZTsljszzwl oڎSaq|}{owqkiˎ}~{d{bi~wo}_wew|v~mYlrWho}w{K_gRZXtvuISPHOJu~d`{xzzxCKFt7ABdvURp}o}pv4?Ac03.L~Q~juv-1-K+,%={swgs((!=" 1w~v{lIv 1!zlustoxp  xꕹw~}kj~lk   rጳ|kn~pf mԌyzj~t{ciŅy{|g^zi~uwx}vYq{]qyttdq~|NhsWfk}u~{ovO_cT_]uqwtJUUMSPx|}R}~j}xDMIw=]u{{zzz{zhqpqnq~}~y~xb~v6=<\04/Ku~v||~}{zofn{yy{sxzq*.*J*+$>v|j~~~~rihx}|{{zls''!=%&!7zgz|~{~|xrduc}y|yzpli!"5+z~o|~yz~|rnvw}~r}zjj+tZivsy{~mozz|xirkz{shu{~}zmi o숰f{|yz~~||lfmj~|wc~~yrviz|}z}|puuh  r䌳y~zofkicj}}bl~}~|}v~z}~ct}d nٍcIwv~~ww}}duz{}vz~{|z}~|}goxx^iΌmKstq}|~~l~~{~{}l}~}~}~w~|~}}z{bz~{diątpv|{|{~|}}~~~xihz|}}}}~odb|_vrvz{z}rt~~~~z}|i^|v~tw}}wk[sWjqr~|}w~}dvz}~~z}yur|rbmy~zwzzqczSjsYilmvy{f}~{s~z~|yz{|~zkoty}|~y~|}ksqQbfN^b~kv||}~~{}{~|~{y{~|~}ovjt}}||~~{r}~g}qKZ_KUTxk{~ty~{z~~}{|}|~r}|ut}~}}}~}~y}zvtjwKTQ~EKGtxlfz~{}{~}~yz}rcr~}yyzu}{}}yte|wokBIEr=D@hxtyz|zwzuwy}y|z{~r}zz~}{tz}oeyyqr@~Hnz@}\o*-(I*,&Bwnpup}~}~y~{~|y~nXvnrt}z}vt~}xkmWOm)*$A!$ 4{L7zhieb{qsiq~{z~}|~~z}uX|{z}~{}yy~zjh3+q\kfupidnU{s~}vv{{v~~mt~z~}yyv}~|mf{d)!o~fo~yxngtoy}}}}{~s{wqih}}~}~{z{u~}||~~npgqzdq~udvkz}{z}~{|uqh}y|w{}zz}}|}}}v}zzv\q}{h eh~jj|ywkkhw~w~zz~zi|{z{uwz{vs||w}~yu{vvwfl{` Wf{}o~{{{~~~}wddtsw~yw}xw}}}|v{w~wt}{y}}u|wtva` _pet~}ky~tv}sgeujj|y{|{{xns|~}zu|~}y}|}|~pl|xwce~toz{~}~y}vujYznup{{~yy~xdt~}us||}v~s~ys}gbaxhu~~~}}}qie~jouy}|zqevnjvw~v~lW}}y}|yz}}y|{zqoey]v`u|njx~zwz~z{wk`hllv|yzrxtdX_{vwzyw}z~{|y}~~nh|{uYowRjt_w{|sy~{}{}z|{si\~njwtwnxUlzzyy||v~||u~|~yvYwzwvKbnShrohqr|~|w^d~~{~y~u}uuude~fkdsvsvt{vzy}|z}zvzz{|u~}vjNvkz|vI`jP^_x~jr{~y{zdkv|}|z}{szu^j|vs`b}szw}w}{ryt}{}{or|}}{yk_urmrsKXYLXVxfk}{ry}y~z}s}|u~yyejyxro[kh{{}u{{vz}yy{zv}|swplyorqplmISRCMNvzly~y|~|{~~~~~~}}z{{~{{~tnZzmvsr{u||v||z~|}}y}{_hzk;GHu9DEj|byy}|~~}~zv{}~}zw{{y}}yszwicdgsmy{y{|uwyy|v~~~vq|v{b__6vuqlt3@Dh:=8^rlo}}z~}~z|~{sty|~u{{zu~szw}wons[~p|}vquz~z~}}{s}qcz`ym6:5\188Ujd|s~~ywzqw{t||{ty{{}yz~yyck}ny}}v~yzy{yywywu~zqun`p-43S,.(Epvqz~~|v|}|uz||ut|||||{|y|zjDLkw|tv~}ryysy}|usszr{s{zha{l*,&C()#is{ntoliuplgjqqjnsoottvqoqgmrpmjiosshohpnhponktmmoonh{}bvwttqvvmtqtvywuw{vzy|ysvw~zyuvv}zonuprokmmmhjnllhlnqnmlggkkkpqnnmogklifoidklhmldlehjnW}awpjkrqumkmkwvns~wyurqrjkz|{|z{y|{w|ttamlfkpkhpedlkkbhliekpcjqhiijoiijhlnpjjnoqikddejkmjndpkfmuh9?:f3<=_rmbi^fcihhj`ec[]ace`fhdejgbZaeaegbmfd\g_`habcedbacbQyl_xmntv~{qynqtmzzwvymyzy{qyvtrjyruyyttetffd_^beigfccbldf`^`]ieemjdlfa^agaekc\dfca[_aebbc]gcdgcZb[delujkuvy{vjlmuy{tr|yssrwvzuoi`P{bcc^dgadj[a[^ZZ_^ebbda_hecagcdejedY_aeZ`dd_ggfb^eeb]Zszslk3;9]075Towlbyyqvnrs^_kljpmhuvwqhihonrolqojjjklnrrpyvkppdcjrltbtuvus|tu~zvzrwzqzzrvyz}|y{wkru}sqrstuzakhe^jspvvnoptdddnusnponwxggpmvrngkupm^ledosvrqkqjjdclvpqk`fnwkuyvyjwujty{vjury~vqysurst]wngovpjnq`ehvudeqpqgg`esmptqmqruhbeckomqprnedlglpwrpqpfuy~~j~j+10Q+-&Cu]}zjvvqtvoesrrllwjatvrsjshjvytvrvjeldipu~vlkqtswow{yqoy~qsy}{szsz{outnustmlhfkwpyy|y{pyrpwkkkuqwtwvuzsfndy}rrqzrdpupnfqgxsn{ut{t{ttkzsyq~yyyq~zyuuwqk`gu}~faxvvlqwymkkysumjszttrxxzkhsoklu|xlyq|tg~k()"A()#@o;{d}eruu~|dcqtqmoolhrumqyzffyuvv{|_V\lvwt~ystywwrwstungzyz{rrnunywrrwv{wwdzy[boplvy~wzqvppoqmuvt|ivwwvvvlip|y~vqoisvrkecvjivvu{rvt{ytuurvywvy~vrlwjm_|ylurqg~kw}wvyi~krruuqrpuoostnuwosoqrtlkhzrun}j&& =#"6vfurtvrg{`jr{rtmjguzy|{zhctrl{yq[Xcitu|uwz}vvzyw}wAn-_Xuro{}tryuy|}|zwgelkmrns}tnmbiksuqy|~t|jlvqzwri~ckvnttk[o|zrrgogksrq{s{sqwqn~tryrv~js||rrlsxl^bwlm`xgwsw|vpfwltitwpojgqzzqzjokwwr{xg{l 4-h{fvswzvhs`pwmslphy`zvusouciprnolqas\osuovwrzur|~|oy{vIv'ZY~zntmuvvorw~wvwsnv_wqdrlmw}qjcecn}uukojyghvsuvmfugs{~qosfgoot|xj[ht{vw}vr{umuytwntuvtyyw{}|zml_{stlduls|u|ujfrehivynjknvr{t}hhinqru~uk{e+$lcrvouuf{agw~olfwetwzvzmdbtrturq`akr{zoqvwmyvtouylw|_myr{|tsotyztusuywpeqrmiimww|kyilmr|z|qnctkusoqygvfptqvoua^tqvrpq[kqzvrvvwwsmwrs{yyqlq~rvwz{onpfaayr\rgmktqjjnqhrqlsumhglzvlojqefrmjquk~|tg"!o}bxytsqbwaXlz|tlksgrtrrztbyasswwor_panv|qrnonwtwnz|tvtmvyvyvyusvswzljlsrvbwbvyojuj{{nyurnigtnmqwjmesouuvuf}\qrj{rt`|^trmmmv_|ktvtkn{~yv|wrrrsorwunwy|vmjzrt]uqnsdxgssnjroisrvkitjklgkss}mspvgusulq|l}k i퇱cstlmrlrcV\rwqtfwhwuzyvtg{_ttuuytfbhuztkwvjkqysotusvttqnq~}yutoo~wtvsqzws\huxnkpjwvyrmnlbOzhtqjnjrmkvwzzuhy`oyjmrn\yaiit{ss[_rvrmoz{uonqmhvsrt{rqgjqir~psib\xlpht{omukllpwo{{kmiaeu}tjigydlrqlmhh~vzb  e~ftn{`rvqmrooefZqrtxiwfrwquqvg|\nwsmuucmgsr~wkunluqyoqrqowzwokqytmutqtsyytykdkcivqmklq|mvsrlkWzXqs|voktcnnnq{xiw_sqomum]fqiivhvdjfzmosrq}rstro{wolrsmqrjuruupn_nlet_r~tmemnakou|yuihmcs}sit_n^euwyodo|tc  gヮbmvvvjbnamTdtwzjwikrlusph}\p|soou``u|wvqutrwykosstmqrsuswrunmr{vsossqv{iyZgpttshrs|vnnmmlz\gsuuvoiugnlmsvylybpkv{txi]ttltrsdgrnrurky}wms|tmrvoo}vwrt|nkxuefjnyju~rrsrmjjtuiuzkigctynjrfuhvyrjvxl~}rg  e~bvrrwqgdcpirqsteouppUznvuzunfy_m|swoojjcbnzuuvsuunwtuyzjlwmlsqyyyosqvjsunjswvd^_kqtte]qlsqssziitQyR|gwts{vkftggtvvqsloxlobonkrnnf|\ljv{kisvfxtdmqnr|ytrnrrrlrvomoqysvqwtrl[Zlolwmluuut|rejgmrorqfiqfo`q}uywrcy_ytjrollzt^^vclmsslmdap|zrlsjigbdemvztyqerYxzsoqokrz\miuuywwvyzvtzsnljmrityuq{ruuqnssssrnh~\vxoljM{IopjutywomqaNu_muvrjruhmNs`wrnsvinjaaopysnosfdqrtuzjng\\g`myorssttuqkfrusrysrywuuz|onxbdsg[X^hr|}tlrqjbkqokjunjca_gozvlythx^honsqjp|x]^~sdxvrrtrkcltyuyuyrvposmmoq}r`uYnutuorl^ntjustlouzztssuowzstu{wjmtyvssssn|tomcgbq|wn{k^qbxytwu{wxmsqtzmjrsiqPwfrwtywklkpsmlstoordYrwqkjqyqno^|zkyotstruvjswrqrmrtlqtvrnu{qke`crkgstsuvnjmc`ktkwmrtoislpswwtkti|atszynai~}|x]{_|psnqdrummrmkdhmuyusosh_losolims_yckrvvq_uayrqkvnqtsyrrossqwysq{qnwqo}u}yvuosvjew^nsvtuiidtcquluqwutlkmszvjopgrctqytyntjrus{wutrsmcesu{rskortr_c`hryqyrvrrluzow{{srytimqnrjmjfvev|jrwjurqqjjhmv{tovkkndttllqsviw^vz}uzlrs_z[us{aiomH\^jnnmsqenklwqlvru\Q}fzss|fonau^vtvyiiX}dmnusujuwnyvsqrqqqoyowstyzlqsswyutzoue^gxshqtpog}rmkllrjvru{vqorvjokln~ybluu|{kuqntmnrvqjuh^t}}jsuquqwwtvut[zphmosuyvkqhnwsuwrrullhkhqytmti[yhvqnihkniqnm}hflslwrujumnyyhls|pjn{z^lqyjsgt~~|u\u~\qxnhyrzzs0spbooqjuyhY[_dixtnlzyw\Ymwuvuqrugf`Z\_mttsbt\klr}|rjqt{zlylmtjourvwnsw||{ssns{ostaihlpnfllsjh`[[ahmtojuvnluslloijvroa_U}Zhkqkwvvjsrinmrvnmrlf`\\bqkrrtty{mhlycbXpuyvwtswqrrstrnhjvssrhrtmrsv]YmsoqkjgjtlecW]litrqvvurukoo{ruysmb^Y`dqzttsv_s}~mTluVkpn~fxs^kjtmrvrqnmiglt{stuvtusrrlizmrvprplmuudln\flrrszzuonyytvqruqjvmrrjjntqt|qjotkfjm]qlfkthtwroomskkttuilvrq}ksl[X`{tsksnjhjvwniunngotmmzztghrqsnhrknsto{ukmrlqV}|fqrmwtmrtr|yqyohjlollzyomnt|_rimovtuootxghmefnooriqokquniltlojnjccguxssvmygw|kRgnQflu{bnmrruutprtqinvtwwu{wntnosijkr{tntnqzsjWnilkqulmrrkiusukosytiittytrssrmjqhojqjahdvtvjsrv}lsnrklovrswrgsw{somgyvumoepxyuzvtznssrotrnomtonjomjhxywsnutoilotqsnbcnrltysrtr}urqnthkquvkqojklfhaloijqutmnnqsqtqlqrlnstuokknjzujujkjsvwuouzmy~{nNbhMajy_jqromimvsmrvqmvttqkyrmkosmtovsssqlookdq}Ymovtqkoukrooonjktojlssrsorrqtsjsvlvqi~W~hrvjmrujenkrrroomsrsswyovqszzysqnqrqntrtrnqvsosznttshhymvjjyrns}ssw{zrtvfrvo\m_xwvrzrvukssnnvhwortmooqf]{~drqmnu|urrtnrsvvto}tgnlqyqnmlrssoroqqsrvrn|eu|}~x}|{ypI^eO]^uq^ywz{wtikttjmomvussmqstunhntqysjnu{sqooytqnom^`htis{knkrmlnvjhqqomrqlzomrmiqlnhlzqtm\]_snwrlqwnnkouyujlsvttvuvvjqrnotjzvnjoqvqonnjqwwmntnsstsqttnltroksktwzqihtmmrfe[ivtkngotrmmqvrrrnjtvrqd`g{l|jjtwltllyuomjmqjnlnkrvmmqlk|wjomounrrkryfo~}~~~kHWXFSTohnq}ds{gmqiimmmkytssoysroounlnjknjssn~snjokmomkex{Tzgxztuwwqkjvqqjimylimijzwnnuymqsksltkcz\musurqnonllwlrnluwjsmrurmomhossr|zoqrnnjm|kqu{qlhnowrqrmvosotsjmfS_joljno}vojp^kjqlygjnlsrrvlhmqrwwpba_smjloglqlumihuvrsqrhnrqoowwtut|unkvutkgwr`pzfFRRHRPktcieysjefmmrulwsqnyomjmjiltjjhjrlnusnqtuuojcbchuvsvuoinyystqfjvokrhsvwuqqzsrsunjngc^holsqnjkqmrklvqyvqsrqumlkjvskutjnoqtnttqqorvtjmosnmrswrGrGtwmtlqrjm_JzIySetokwednimj\}cdoitiovkojznmovmpi]}YP{itmjcmmuqylnnfiwt{vqtlmwstjhjrqqtztuouuvlqkcz~{|qAKI~9FHqukkalmruzqonqloojmqnmslmllooorqlnmynvqcyYhptlkjokklytkoivsjolttrumtjhtsrzookg`rYtpoulnowunrnjlhnrrrrqumqjtmjvvovtitoonjqnstsljssms{tql^+\Zyrgkqhlmnre`knrqkQP~hjiibl^gqtoqknjknuhyleanqX]dXhjmrqnrrunsrqtismjqtk|vnjjqrsswqsy|tyzhjkiz{{}}}~v8DGo:bg}iuhhrhllttlomonrrsqnjsjyyfsolojgoqyojZnXtjjojstwysnwymsymioqkqnsqmsunskoqlrxbe[iqsuyllisutklutsnismrkelmnov{hryllnimihtrmtrmrnlhnruz}rBqfvkbnyrqigrjqvsrogmnhvjijsf_djz~qsukqsl^e_W~fnkpo^Xbpoowjjrojmlmuwuvjmtjojktwummoykwsloqrzke{}{ll~}eb|e7<7_/8:[rrrjhkmmnrrtuoninrokrmlolslrovrlqomkmgnU{fhnwomjlnuywsmryqnhlyvttlsu{roomiqesmrzMs_jlllmrqkmsurtwotjrtmjYiqkbkoknquslqklrssonmjvijqnsiowwBm1ajsrkumlzzninqzrtjj_Y[lmtopoYufponqrlc\hmW}WiipqsunT}{ijmnvihiqqsouqrwllnnnowikskrovzmyqqlkv{}g{~~||}{ua*45Y,/+Kq{kmonktrjtntuigqqlskotlvkisundioynn]ibqhqrnnuuuwqttjtujqglvsrtdjsssoimhgrx`e^gmtknswtrkumumfqokmismjmcmqsmokovnrnsutmqmjjnnmtnsvi]?k1a@lZuulijgv}tqtlyjjrtqcTftrmnnghYkhilnr^coY[cjprkvlrpZ`akjssqhljmmlyqtinynnjqwnijjjjlmmyrfiss|\~o~||{i*-)H+-(Gfmiwrmtjjmjnugjjijgcjiiwlosmtolrwkft~Xhoqtokrtjyjojdjukujssurirqqtugouqifkhz~ZdfowollommsqqqklfotslukmkfqwnnsnqtteknryonrjqqimlnstqEr+[M{|{qohrqhmlmumovkmzvntbhhkgrken]eecl]quT}U~egihjsrlhmpcU}ccknootjogrmknhhrrkrtoqujfgvvvturgsrjmib|~zyux~f(*%C(*%Cc~p_muuolijmnlotjdjnddqjlkrsttqdsnjb_]pirjhrvijnnonnrljmmnmsss}qmsvsiqjrnc^[[jityololffvmmsrnnoqjtuojqmhvllnoonlalrnlmrjjnlljugYezjdumqtssomlkruiilnjsquskjrqhiklgtmY\{oXY^apkhtjljjmjgjYy~b{oruyqhnwgljtqootvvrqjiqojo{ntZP~YdmznZ~}~}z{tc)+%A $7n{n_tusiiklmnqlckotouvnorukkqwjikie{V~kljmlnqsouhksoorjlmmnqihlqrrmqrstslrhq\gmlkunjeklt{nfgmljvllnoojmsksqntmksjimjknjnhloigjlikijrotkjhogksodkugajrluqkkjgnrormmnmqhZz[Rzbfhleimkohmsloqi\[svlsvsi}rglgjmmjjiotrfiqttwsnhGzXTYrlsd~~}~e{|vGl"$6!3i{nys^mjkjmsnilnjemmmnmmnoonqojsotne]^`hjjjolkfrnijinummmoomvrisrsurstumjsmg\hhkmivunghlfjlqsforlflqnlutoksojfdis|ooqowlvvlkrjnvuoqfmoovrijsvjqjkgennggmrnjouqwyqst}rlm`lq\W~Xgfjlrnntimmutsousamzm_kllsjouootirtmqkirvonsrlnovvda^SP^ul\z}~~cgz}~~R>z|~}i1,jgpyvt^kkijljiehjlliloolqrqnkqlgijsjbyvWiphimlmofjkkkmmtoqrkrrrnnuskf\euqfenZnbqjrtmniinjniklftjjkhjjjglo\jnoionlirosvuutotunuqlowshfjlrkvkjlrjitlnhuzkdhlotssvosrfuvqllac[|mZY\gfltlenqvrenqulnqnibU~WWqtontmqymmlutlovujok]uyqoirqmnjZO~gli\~~{~}xbk{yul~d))q{u}hfl_{t[jslimjnijjolrkrmkjotoqkjluwtmbWz`ilotuqklkjjlelvsonnsrvwogjnrnkkjlrgeiRxfjkotnkhkgkrkikmmumqlnroqiiWfmonhmrilsmmmjjtokwsujiotegtqglr^Ztnjggtqsrnkechmjhmrqijnrqjrlgl_Sz|dT|Y^gifilmqlkqksogtmknjmqel_qsrkookvoqlgsirqqntkjUXtwrsowkrrub^rjf\}~~}~{Z_uou}~~~b&h~~~{v\xs^jkjtqmukghjnvmoecormmnqojqsmbmZditjflqjklilrgjnokeijqsookfoomtmolhbYgZcktjjselkjnilqvsqsonnqruroonjrorninlhrijlmnuikqjgrunjmtlejoqZWvqnrrlfjjjlgdrohjqjqlmnrksgkjljXrT}dhhiljndjmqkijvnusmlrrstqtabdimokzvfilldlgqlkq\Tjonrfrllnooljekka~y}||~{|xyn~{bp|~~}uzk by~wYjmmuihunnmjntlodhnmlflokgojoeUzbbjkkjbmkkoorjilswsslhmmoggvmsrjofln^qWbhjuqiljngfjsmqmmqirshofhsmhklqnnjhhkhlifkqjnjj{jdkrejrjnqkdkohllrrjmtjkuqhmllnhijklqijlvjkjrjUndfoljjqdkrkioutjjqhjhhuqiuhZ}}abkvliotoojgjmnmf^gzsmhilmnghujkmths^}|y|{}~}|||~xz}{}~|z}xd  au}~{z]grrfX[rjsuqjhmiiwqhldjkdkll[f\gjhjqjnvloqnhjllttmjijkhkdfnfrnemmjq\[cjfalmlkqijanoioklunemrqcejmjegljokflinhbfomjujoogihgjnojvwncfnolljllrroqnsmtnnmjtumikljllhqrwm]Z^jmdkkdjghljesrmkkqtujjiirqdZblroqjstooyntmriavrnlijjdkkdnrjotmlX||~zz~Zr~z{~zub cuvajjjb`ljjrnggkdijeosmjjmjiojlV|^grindiqmiriddnjbgrhdshmoejjhlsllomkb{vV|hmirgjlgzljjmjigfmmomqnnmmljjkkksmjmunkddjnljlnhjfgggnfehgljjejhinmnjjnrrmidenqdrrrijfnnhhmknnmi]tYpmmnicgqmljijglikjqoillkh_Szx^ejrtonnmkvqmlakqqelorjjksgmsmlfhmmg{}~y}~}{x}~` ^t~}{bjkmkdnqjinjkojjhmng_nnggdi_~b^ityoijojnekhjjljdgoimojltskkslnitklbaOu_lklolovnrimdgjokjklssmmnrnonfkmiskkjodqmjldrqdjihjiitneolfjhnnlmnjnlqjvuvojhdjlrrjjigmhksikunjikgU|{wn~bfntleksngknmusrlhjcdluuijg]a{}`lknnjhlldkkfltrlionmkirrnrokmjlmm`uyqx|w}{|}~~}~~}~~~~|\ [z~`lhiijqmsjorkdjkojdemnjjnkdurQwdimnlkqsjkhirkisremmrggjlilrhgjladlk]q^nelkkjlnnmhgjjkjjoeqmrocrmmolmngcjeklmomhkhdgdfrfjnlnkmnulnojmlnrsnmmhiorwsoijgmulqdgohjnkkiooteipZd~`\kroerumrefklojshksimrhnsihW]lfhssmjmjggfzkhnnsosqnmmliu}smqqvY|ei|}~|||wz|}{zz||z~vfXuy~}v\fcousjlokajmjdoomjildmkjg]X~^gdjjhojmdbfdlsokmkojhmimsfgkdiihWP}\c`z\cqecfimrnflkrfjfofekkmnhelfnehnjhmnhjdkolhnrkgkehggnsiikqlfifgqlmofqmijnkhhqhkdijsmthjjrjjgdnqnjhcf^Rz~dxmXgikhddknssdnqehklnomjjjch_es`jnlurovljuqoqjrnqljjrnmnowzoitjodvtxty~|~~~}y}~uYZ|p~{^mXfjlkmjkofjhgihjjfadlknhraw~sZjfjkffmlqjfljmgnootmddkstoknkijhntlnaf]immljvikmilsklojloikomdhnonhhdnnmjlhnjilqinklekqrngkjjqlmumghhqulbdrstedqlriiqlgliinoknidfnkejnnliehcciZ|afrjjddnqgmqqfijejqkdihki_[[imoslvoY]\Whtqfojllilgqqmlmjjmmgdyzfy~~~{q~uau}}~z~x|pYz^|x~}zr|~~~|Yikkgjclgjngmjelodhkhoifm]W|gpmjcedolrjjljqrossmsnmjmonlhkkjmtonbmU|dgqcboemjhvjkmqjlklqqnscnljnemkhndffinwlqskkinofhsggihfghgegmiggqjfljkmijjckrqlrjrfloohkkolks`kighkmee]mv}_lqddhnlmmkkfowkigdjqhlkanjeijonvk[SK{Qhsijfcjunillmcfiisklf_u}v~~|z|~y|ll|{}{{{|}wz~}q]x|y~u[x[xk}|{~Yhmjihdiohdlgfddlihjmerk]n]mkijkqogdfkenlinqgmhkoejhkojdjqtligb]d\higjffohermjjnjkljdjqqqnnrnwgieghmhjijlnnjgijltjhogogjkjdjiijgmrihjhdjlujen`giglmrtqilmokqlqrkdhmjoqhhXS{w^jnihgirriksiolnrkmgdktrhd{[y\lklsrnlZhztojgjklonlqqmkkjlrsl^a|~y~|}}}ht{w{~{dy~|{|~~zp~{z}}pUqYs~r~}}~{~hV}amljjkjjhjmiqojjmldjlseb}qWzakikgemlkjcgknrljjfjjiqejrfjjkgmulji\s~RxfhkiihijhqukhcejnejsmijffiellkfflknfjlfajjdgidklmigmjgdgnsjoomrkdnnghfhwqhjhfqqjfinnikhonkqlnnsklqhhumkfXfYfojbqllqkomljicjqrjfmsjkgWpkgmijonjoqthklnlokflmlojnijnikjcay}}{|{~||{|~~sywUv~|z}{hXozZovp~}~{yh}zT}cknofcoldodimjjmiilhln[hTyddkh`ijfhjejlhomjilfkkkgjmnhkurjefjj[]ckfmjkijksrqhokhf]SM{\rjhlsolhhnrijjjfldkmshhdkelggdjkjjijjnoqjjejjnrejlhoknkimoicnrnmjihjthhmfosuloioqkqp`Qwz}l_mqomiokdhkjdidnlflkcensi^^Zjrnfnijkhhiohsmfnonkojgjjjgmjea|w|~z}wyynNfz}z~qUlvUins~QxnreidjhkjjljjjgikgghjfhW|\hhbmaig`jsYdjdmsigijsnnejskaeoiblkhY|sYhhihnnigkknekhfniDtGvSKz[ssnnfrmZO}jkhsjinhijmjljnliiilnjlfglkhkjilmirjrujgmgnhieicghfjdhedhjrdijjhjomjkljglgpb]|y^imnjqojj^jjknirjdmjhcij`aY{_cgghntljfkkoclqojjhjoikljjgjsecwx~|~yw}}|}Ztw|~~}{z~vRgnSgmm}{|{z}~Tyinmjahahdboiorojgfjce[YU|gcdoohhlggdMzgjdeoohmgijjhgjlnklmeeibdX~cjaloofigoliggfdjfUUZQUec`iiqfGuK{eonmdknkmhjjmkqtjdgijklnngjjjkbillrnjrkmjjjljickhhejbhjlikfqhenjdlsjjdggf_efQ|rq_lqqkdirkrjqkjjdkknfkiienfg~yz}glnmjkqljehlokjrjjdjnmjljknjkee}|{~~|~uq}}~o{}~z{|}|~~y}}zoPcgKajo~~y|}}{[ccdfddabc`^`ceec^d]d]k|Qu^bejqgiiiflbbkjejnkldmgeclkgjnlkqffkYh[^Y_akgdedld^d`_`gnfhfgl^JvGt`_hg^diebc^clahdbddhgdggehbfneg_bkedageg][klfe[e_\fdgfcedibbid`gddc``f^\`acgikc`gb^R{Xfhljhfjommdmjfijhmqdkili_T|}[dekld`^[`delk`cddgenn^cddmde__zyz}~iTt}z|~}{{}z|}z{vu{~{y~}}yeI^fGY_ry~~}|w~~}{fnnkssgloijnqipmojnpob_]bikojcfkrlhgkklgjeifjnohiomqnijlnjddh}c`qkggiopjimmmldkmohlqmioki[imikpnllkglkiekjjlkhnjjmkjnqhjqmgkmssmmm_ajrmsmlmnlrkmiklmjinmjkmmnmmpqoehqimollnsmV~r|]qkdhlkksn^ijgqihijjigghh^c}xdnklkmletopmmimqnlonqkmkeoljjs{~|}xxijhx~{yy|}x{x|~|}z{v}t~dFX\IVWi{xzr~}|qT|fcjdhjihmeejjjkfcnlmkmmiej_efjolkmeh[ilmggfrklmbsnhqgdmfikf^kugU{z{{{~z|~~z|~zyyzz}|s}y~z|q|}zzfERQETXg{|~|}~}~~z||zv~~uW{_hhjjgehieii_dkkbedijjeheieeikdghcmsflrzuts}}|S~emdesrinjknilidjihje^mumWr~y|}yzz~|~}~~|}}z}z||~y|yx~{}~~~x}{w~lDQSDOOi|z~z~~||}z}|xw}|}zvtnoSy_hiedjdeohiogjkgedhjhijidkikhjdhfbdhbcd^pkhW\{z}X_daqqfmkflfijiifdfmmkjl^y}||}w~|~{}z{{}||~~xy~|u~{{anvR{}~~~xwvx~y~~{{}{xgEON}AIEvn~{}}}~{x}{}|}Swhcfjdemfkekigiljgheghijjjnlihlbcleml`z~{_Vw}~{y~|}z|{~~}w~|]w|xy~zpUn~}~~yxuwy|Ycihmdijnjdhojdoqgllmhat~{x{z~z}vz{~}|y{~wu{~z~~~~|~xoMf{f`{x}{{{~w|zyyk>GGr@JHxj}uR>yY|y}z~y~~}~zz{||{}}xe[ccjkcjmodihjqhenhljjghmmejeidefgdfld\~~ei~z~~y|~y~{~~|zz}r}}|w{}x|wx{|jfqfmkgiolcjhdcidrmid]{~w~~}~{m}xyzx~~z{x|~x|}}[pu}}wxwr~{}}w{||z}z||~yy{f>EBs>FCna|~{U2j:r>yt~}}~{|}||z~~~{~~}~~}}y}~{~}z}vUzfbchkhjidgjijjiiekmdgmdhkeicjgcfdeliWz~}|x{|~y~}}}~y}w~v{|wrz|}{{{{~~{{~x~~}kchkjhjhjigjajmhjrfWl{w}{{z~~y{~r~}yv|{yt~~uy|~~y|{\~|{{}~qzv|~vz}|~zws}~~~}|}zuu{}|{e9bgxy|zzvw{~z|~|y{|{}}}~~~yz|}~yySwabg^\fijc`fgccdd`lh\cdlhhhgklmllnmlg[}}ywx}|~{~{~}~{}{z}|~~rn|r}pOt{}}{yu|wy~|qz}mfjcblh_dhehdf]Z~du~wv{|}|~{}|}v}|}|vxuxz~}v{xu{}}~}xc`Xo|~}xuy}}y{|}x}}{~y}zxx~sk393^497Zewwx}ko~{|{}|z~|~~~~|{|~~}~~z~t}yvxx{Y~\cfjheijmhfjdejjfqaeffgfegghdijkdfmea`|{|~yz~~v~~zy~x~}|v|y||fbzz{tz}{v~~xx||x~}wuxvy}x~}tx{}`gdhleeimeg_[~{VKvY{}|uv|x~xu}uyw}}}{zz~yz{{~|zyrg}w|}z|~|ttx|z{~xuyz~y|wxy{~~{~~~xuuzti041V.78Xj~wzz|yXQt~|{}y~~}{{|{~}~~{~~}}z~}~~z~z~{_{|}|t}yuwLq`ddifbdjf`ff`ijafjee^d`_lgdeifdhiijfR{}zy}}{}|tv{zx~}~~z{|{{|ry~~~~v|}xuw~y~}y}|ys~|}|~vv~y|~~}{w]ngfifcd^\{^R}Y]Wd~{zr{}v~~}}~~z{{||xyy~{yw}v{}yx|~z{}~ty{||}~}zux}xt}wx|~}{x{a*32T),(Jdzvxz}}yu`cyw|{~w{|z~~~|~z}~}zzy||x~~v|{\ZZ}X}[bchecddghkeejefeddebcjfcfjgi__lelnlat~w~|ux}yvy||s}x|w{{{{}|w~}~~zw|s{xu}|~}x}~x|~u}x~z~}~~vw|zy}vw|`e`fc[TWyyqRxT~be`_Ktjw}{v}{~vou}z}~}|~}~{yyyx}quvyzx{}~|~y||}}x~~z~~~~}}uy~wyw~~{~z}x||v||vwd),'G(*%Ecrw~~{udw{s|xy}{|v~~|}}{~|~}}}~}~{y~yz~st~z~}}{z{s}}tU{e_ddbjdcjaj`ddbdgjdedfjkjh`ldgnbglidXy{~~wvy{z~}|z}|}z|xx|zvyy}~|{{{t}z|z{x~{|}}~~|w{v~|zwu{y~~|yy|vzv~R~`^Za||zWJp[hgikdZS{|~}v}}}~}v~{yxx~~|xtx~y|{}ww~|x||{zz~}z}~x~z}v}|y}z~zzy|z~xy{|xq`%& @(+&Fh{{}y~{~x{{~|}y|}|}{zyxy{{w~}ibry~}r~{~|xv{w|~Tw\jidabbjdngbei_fd_ehdif`e_bcgdhle`g^U||}}~|uyaf}{xx|}~|~}{~t|x}u~}}rw{~z}|z}~{vzvt~~y{zy{}uw}|}z~~{~}zztl|~z~y{s_eqYOxW`chcjf^`R|[}qN{~|vz~|~}px|}{}}|}}{}vyv|{}s|x}y{}t}r}z~{}z||}yz||{y~w~}z{|~zx~}xv{yy{wb&'!B $!9c}|}}|zw{}w}~y~|~yw||~~}}yux\[ZTn|}xy|zy~~|zhIpddfjemdckleecbecdbdb_ijfdhgdlmglmgk_[}vuzzXTw~}xt|{zz}us}{z{zzs{|z{~z~z}z}z{}z}}s{yXg~v{u~tqy~wu}{|~|~w~~{|{w~|n_NuXccebbfhjbh\Lury^?x}v|v~yzxux|u|w~||x}xt{xt}v|{wzuz~~|tWo}|}~~u}|{}yxz~zv~w~~}{{wy~~{}{~|t{yz~}}z}|xt}vqf!"6 6b~z~xz{z{|~w~|x|z|~~}{~{}v~wyx}iWahtz||}}|ww|z~xz~|}y}~V{\beceecd\dbgdjefdegfdfehhj_dbcffdkhcU~xqvssliz|t}|{wz~w{yyx|w}|}}x{t}~{x}x{}|v}}t{{}A{3lgzv|aSRw~xv~t||}~x~|zxwT~MtUWfhdfj`^fnggi]Wzw}|}|{|xuwyyxwzuzx||z{vyy}{z~|~dn~u}xjxz{wyxz|}~~}~{}y}~{xv~}s{y}z~}{{~y}|t}}|xwzh!4 1hnszx{wx}}{z{q~{z~v~}v{~~u~z~~{urRd}x{y{{|}z|y|{yz|z{|}w~||v{~{~}~_Xeah_hcdj]`ai^jg^dd_^dfkgfebicjccgld\a~y}|{{v~{{}~}~~uzzxqx}~~ytz{}{z}zzu}~y|}|~~y|zy|{uwy~s`~t{{z{SJz{~vzyx~|~~{|y|~}~|nVOxS}_`[jjmggadfdljmgV`vsi|qyz~~~u|o[v~x{}{}zw{yw{s{}}|yxo|o}wx|zxD{;s{~}~~twzx~y}~vt|vw~~|t{v}x~|v~~w}}u|v}}}{~}|}y{zwc-,^ry{{~Ug~}~yxWz~~{zyt~~|w}|||~{~qux|||~~}|v~z}}z~ow~~xy}z~wzy~z~~uT|bedhegadjfic^deedd_cl`e`ebiilkejeidcW~~uz~|{|{~v~~}z|w~xx~~~wx}~}}x{y|}|~r}w{zt{~v{yv{wy~uwz{vz}}{v{|z}}y~}rl|~yuy|x~|y{|x{}y|}y}wxhLu^e[bf^`aiefifedhlccdSzeE}5h>u{{z}~~u{xhg~yt|{{v~~{y{y|zuy{}|sy}xwx~|t3i2h]~vz~y~|uw~wvrw|{||}z{y|~}x|||u~z}wuv{{zwulux~vxx~~xe`)(Ys~}~vsvu|y~y~}y|||~t|x{{}z||zwz}wt~}|}}{y~~~w~~~~|{yx}wzz~|}~|vy{~~|w{tu{t{yRzcfgifhedae]ddcgbgadfa^gfcigddbddhhd]f~}wxyv|{~~~|~|}}v}~wvx}w|yqvz~xyzzz{zz}{t~~tt~~yv}}{}rv~{~t||x}~}z|~}rz{~z|x{~wuz{z}z{wz{u~~Uhheidblj_jbjhjoiehhcYVK~8m]~}}}z~~|}|~}tyuxu|z~{|}~~z}{NY{}}swywt|}xw}xw}xw{z~vrwy~w}{~|zw{||}~{~}~x~|u|jk]&]qt|}y}|~xz{~w{~{zxy~|~y~~z~~~q}~u~~vz|{x~zu{~y~~zyt}~{vr|y~V|cdehbdfcedjcc`ed`gfdaflfjj\iaaj_d`Oxzt~~}vu|~~~yzz~~zvzx||wv||w|{ty|{z~~sos{{|}|yvz~z|sx|w~~{u{uxt~x|{wv{|z}{}~z~|z{x|||s|xxe[_djdcnok^^difjliljdaR{`p}x{xpuyyv|q}yuvwzsw~vr{v}wyx~zv~}~}~}|v~~|zuz}y}zswz}x}}zwzz|xu{sz|xv|~~yy}{{}|to[ bps~{}{~{z}vyy~y~||y|~{}}xzpv~~x~|~zv|zzys{y~yu}~yy}w}wz~w}~{utz}[Z`dngllg^hb^cdgabiiffebffcch`cehYn}z~~}}y|~zz}|x|w|t~}~~r~z~|{zx||}y|~}xy}y{}|}~yt}||}u||{x{||z}ztz}y||{zx|}|||wz}ytzwzvu|x|z~|zvyy}zQ}cljd`nh`ddcjhijj`fbg_S}r{~~{}yzrwz{w~y{zs{~z}~|}t}yv|{w}|w{zw{wu}}tvw{{x}}}y{vxyy{qt|}|{z|~u|z~~|}}z|z|{xyut|~xy{|uyzw|~~xn^ Zq~~y}}v{ywxsy~|}l~wy{zwwu}zuwyw{}|z|s{yw~wyx|{~|}}{}{uyvv~|}~|~{}~tvy}~|aVeg`ied`b_\cijedbib`ddied`]cch`V}uw{|~}}y}yz}|yy}vy~x{||v~z}{xxxy}y}|v{|wzzy}w~{z~|zxzzu|{z|rkv}|xuyz~z~~|}|tu}}~[Zkcjdckd^hjdfehnhgda]XW{{z~tw|zz~z|yz|x{xu{|}{x{zy}||wzz~x|~}zuu||yxsxrv{~}yyz}uz|}{}~xu|uyzwy|y~u}~y|zy~~r{y~sld  Zuxu}~z{{zq|{{u}x|yvyw~||}{y|}|y~~zw~{~}}yw~xv{y}~~x|{yxy|}xu~}wu~w~}z}}~ox\^g_jciegf]dc^dh`]cadc_hehddbb`k[wy}{xt~ut||~{~}y{w~{wz~ww|z{{{}z}}|uuw{xt{vzu|zzzu{y~{{}uz}~}yabw{{~z}y{}{y|x|}tz{wt{ww}y{xuZdieblc^dbbk`^jjdkiffbR|f{w~zm}{z{|zt{zzyyu}y|}||y{~~~}x|}xsvv~yzxx~x}wy{{||zxz~y|pv}{~}}x|u{x|{y~}y}~~}~}x|x{~~x{x|keV  Zqzy|}y{|w}zx}{s||w{~{{|z|~}s~~yy|pz}zzy~{~wv{ys{~|x|~}}~}}~~~|tv}{y~}w}xxu}{MrCfZxY^]d`dcjd__d`dcd_dcde`jjddbd`~}~xtvz}}~yx}~z}zu}~}syyvuv}vvv{{w|xzwz{||~{{~|tt|wvyyw{wu}|}yNWu~z{vsxvxvt|~{y|vzzqqwv~vut{}Ucc^dbh_gfcjkedddjfddcaPysyu}zrzu|x}s|yv}{v}zztsu{~v~|yv~w~vuysvyvvxz{|{y{zz}yz~w|xyx|v~|w{zxpxy~}{{{{{{}~}zyxy}}|~{{{s{}~{tlfU _ks||x~z{tz|v|z{{~}xut~|~~sy{t}}|}||y}tv}{xx{|wu}xz|v}}~xsx|ztut}}~{y|}~W|ZRv[xwiT|[cfdebcfahjdif_ddhddibch\}|~~~{||x~{w~ytz~yutvswx}|irz~}w{|vvxpx{vwvzvs~}|~ztws~w{{su|r{}}|{znxz{v}yz~w}z|t{{yx}xsv}wyv{}x~||z}|xw}uxw}{xv~}|y{}zyt~gda^ddcedegigdk]jeccgcgR{U}~{zvv{zy}y{|{zzw}{{{zun|}z}}yxhXn{~zqtrz{{r~~{tz}t{{}xvzu{{t{{yyzv{~|zsZkz|}xx~xywyy||||{v||xzx|~sv|}}z{|nj[  Zsy~w|x|x~{}y|v}~zsz~}~{~{y{~u|~~v}sw|}~zxvqs{{tzy|uvy|}u{zwx|}}s{x|w}|{{w{|}{|y~Tx\^ZKpOt]X`bdgfacdegfdecfddie\_c^{vw|oz{z}~~qz{vvy~}zwx{r~xx}y|wvusurx{yzq|}vvxr{}~tzzwutvum{z||srzt~yvvqwx}{t{x{wzs{{~{}~{}{z}{wxxvytry~uv~{zry~Xbljjcdffjjaekhjfcgj__\T}hy~y}t~}}t~upuzwubhzzvy}]vcO`xvqwu}zww{|xy~s~{z{w~|s{xsx~yrz~}{pvzwzv~u_Vj{~ww~{zsvt~|{{}wtxywry~z{~uqu}y}r~y|{}pgX Wlzxvyxv|rv}~|x~}w}~x|s}{~xu~w~xs}w{|w|z~}~z}zvy~jf~}s|}w}y{p{~}||}}}ysp~{}zz|x|x}{|~u|w{}vz|Ryc\[PvHjmuX^a`g`fk`hf^a_`aYjlb]Utvxyz}xvwwtv|{wwu{|yz|yuzzzvx{zv}zyz|~}~}qnvzyx|}zyv}{{||xzvsWuuxxvzxzy~{muz}xyv}}{v|y}w}y{}{}vwz}~x|}xuu|xyzq}[hidjiabhlhf_dmdaijjlgf`Tz|zsy}~xz{w{{|zzxhkxzzuwyt|~Ydtrxnrwzyozzxjy}xw~{x~||y|vz}vz|{|t}|ynslNq}zru~vu~{w~xvzw{wuz}z}|ztwvuyyv~}rgWX}qv|y|~yz|y{t{|~|zxx~{w{|suw|y~~}xvvutuxz}y}x~}}y`tw{|s{}tt~}~{zz}wz}}}tx}}~xz~}~|uwt{}rtut{tLt``bYV~LpZvzMrZ]^degk^bdb^bdba`Zl{vzy{vvu|}}qw|zxv}zt}{t{~|wzyt|y}z{y~zs|}~wzz|tzy~puzy~x~uzWgv~z{{x~{y{zzyy}}}~snz}uwz~y}w{yw{vsuu|sr~qtt}{vtV]hj^ddgghibhjfekdgle^_WY~wsv{}{}rntoxx~ywt|xz{y{qblr|tzys{swwwtw}~s}|t{}y}||vw{{x}~y{}r~s{~ztv~{||vys}wu{}vz~}w|~wpwvx{x|v|{ubY}Yvstyyv}}yz{yv|yv|{y|ztz{zz}}}||t}}{}xwvxx}x{xwu{qz{}|w~ty}~z|tz|x~}~}{u{uw~yvsw}lxt|y|t|jNxcea_ZWSxNsd}cOxW__d_^h_Wdg^YcdZ|w}x|}{~}{|~xpw~wx}||}tux|wxy}x{{}~{uv~z|y{twuy}t{x|}o{|wvz||z|w}yyxsvz{|||x~zx{|~|~u|zpv|zxzqzu~{zpw{{xv{{xxz}vzzuq|wR}_`eehfdicj_cgjf^fb_dj_YOzi~y|v|s}{|xys|zy|{{~z~ztz~z|zyuxv~s}xrx{|x|}w||rtzxvtzzz}~z}{tw{yx|zyr|yw~wzzyvz}}w{{pw~wywvq|v}nh\W|kosu{yus|{}zzx{z|xt{~{~y~zy~sty~x{}~|y}yz{qqxr{{tzwzx{x||vzx{{~t{zx{~zsw{xs{|{uvy~{zy{rwx~{tZXac[b`_aYPtLonxZ~S}^edicfhcY_ijau|w|~|ym~x{}{}}wyxxzuy}|~|}{rzwxuqpysyy{{{~xuzuptqs||y~~}x}{}|tyvtqx~w}v~{y{z~t~z}z~yx~zxuz|{|zt}x|xzz}wq||{yw|ysz|}t~y{{{y{vz[^acddbehcf_egbbdkh\dne\]Kq||svxz~x~|wyv{tzvuyzyy|{s~zzx}|yz{vz|zvy}u|x|xvxrw||x~}||}{{x}rwwxz{w|~|yvs}sv|~|~tpw|w~xvxy||}y|~ww~}{w{zrznnTxYxhww|tzz|tx|w{w|y|ut{}ux}y{y~}vywws~uv{|~x{zz}}wtxy{{vt|{wuxy{s{~~{}qy{x~xw{}y}{yr~{vtqo{y{}}{zwx~vvyzxyxvyZ~_d_efdda]YU}RwPuqTyXddddjbcddZY{s|{zxu}}wzv|zztm|xtyrz|{}|~~}uyxy}{{u||rrz{|z}yx{||w}yzznuuttqxvvvztsy|ww{{vuz}}y{{|}zz{vwxy~zoyztzv|v~syuxuyvryzz{|y{xy^dfdgdgki_ijgh^_fjjafhadV\~~twzsx{sy|yy|zyy}uw~y{{yyzxt{tpzwzzxz}pn{sxw|xwrx}{wz{||zzy}yrzzwxtss{{vuuywutww{xsp{y|~z|z|~z|ywx|yzncWvWuxxvv{{}~{}}yxy|sy{ztvu~zx|}uxs{psy}uyszvs{|v|y~{zsv|w{}~wysyqzxtzrz|y~vs|vyw{|yuz||vyx}}vt{tv~y{SwUb`aiddbY^`_V|LoX~r|xQwVcd`cgicW|~|yxv{yyw~~su~}|{}xqzyz{}~z~zwr~{}z{~w{z}~}uvyxx|zrxytszw}vw~~x~}~tv~yxwys|wyyy||vw}}xtszsy~vyzwxxyyy}~{|~wumt~||z}zzuxx|}|UefedebcgdigeidifellkhjgaP{i}pt}v|rjv{zz~{z{z~u{xuty{w}~zs{}yuyxzzyuu}xuutuxq|w~xyvy}{syvzyz~zz|vzu{{uuwxs{{zot~q|~vuu~}wwttstyz}uyvvw~zxu{tszxu`YwXvmqrq|~t|w|s}|y~y|yw~vz}ysurwzzxrwyvy||~~uv{{|}zus}u~v|zu{}yx{~v|}xm|{~x}y}wv~wow|z}yz~{r{{y{y||yvitvPt_ecfdeaaddcbcaTxEjb{yoY~U|X`]caZ~vv}t{|{w{~{z~xw~{zy|ux}~t{}rz|tyvyywzvy}xxzvyyz~{uvqvxuys}}x{|sv}yw{swwzWmrv}wx}|wsyzqt~|w~xwxpry~sy{zuvyytu~v~zy|{v}zyx|}yz~zu~{{w~x}~xfikjdigfiedfdfedjdjjoj^ag[S{|{{{ysyz}rvtwyzy{z|zsuqw~qvyz||}uszzyuyvxuv~{}|{yw}zvv}ytwy}|q{vt~z|wz{{~zytx|pszupxq~xuxxsxt|yxv|vss}{v{z}pcXsTo|qqsz||}~rw~s|yxrzq|~yqrxywz|twzyw}yioxz~vtt{{smr~|tzrz|u}|pst~}{}{{tzzxu~v}xt}}y}wx{~zzw{y~~zxw|mOqtQw`edbbb^cj_cecb`T|MrKpl|z_WUS}{w}|~wvvyw}xv{wv|szz}uz{vxrxy{vxyuuy{hy{vpqryvvvxqxzurx~|{w}usz{~~zvlwy}sqz|wuw{u{wyxrx~{sx~~|z{y}~|uut|}wwuwnopy~yyvwvzstywttyvs{yzvVcdddjkgdbaddchicmejd]bceRbuvtvzwzz|{|y~~sy|somuxzx}{t~tu~}uvy{}~z{yxyx|x|swtuyp{xzzyz{}yvysz~{~zx|rx{w~|uz|wuzsv|txvpu{}szxrtu{z~zvpeRmyPjulip~vzzt|zu~uqxq||q{zuxw|z}xuuywqwwuv{qvss{spy|}txv|xzzww~[^z{qs|ywxwxxrzyz|{t|{wo|y|{wtyv~x}x~}xzebhV^^^cdb[`dh_^_a^`^XFiNtszn~|r~quzr{u~ww}qrvzzz~rq|zmzunwstz}zyywwvyyws}qwu|xxryy|szusswzswvy}yt|wzr~|{{{rtqwwzwu}u|yr|qqxr~~xtwr|}{y{iaysqrtzqxwyxzqyzm}}yx~{zz|{zZZb^[ahedaj^ejd\_ofk^`f]W\T~p~{~vz}}ztu}}u~x{yz~~yuyx|t~prsxzzy}~{zyw~vzvpu}{wrwz|zv{y|uzuwz}sqxsuyxoyztsuw{rx{~usyvwu|txzzw{t~yv|tuzv{wm_RktUmxafev{~uyr~{z}{yyzzy}ttuuz|w~ry}|~yqt|xzurwt{wuowtzwpqrqw|z|zyYVo~r|vp}to~pvyx~}xyrzxuuw|}tz}|tu}u{ww{z{~~rxr^aPwbZ_ec[_dbbdadfaf\[^RzIoTyx}|}~|rzwy}vyxy|vz{tjpwt{z~xul{w|t{{xxv{}}vlzvz|{|zwu}x~yyzx{uy||||ytux|woxz{zy{ytsumwxz}stxlnzx~{{~zyzrwuzzxnwy{yszmTXezvwltpyxwux|ls{txzy~|~yuYeec`jcbdibhij\[cdjeedc^dXV~yty{z}}zxuvqqtyt}w{}vy~{|zzrvw|rr{zquyz~y}r~xvv{{~{rxwrowzvz}vrvzywvxtqusxt~||xx|z|}rnxu|uyu{z}}w{sz|z~vtqwjcSjsNgpims|{v|vs}xzz{rwtqz{swqzw|}ysz~{}}my{|v~z{{rwzvpw}vyu}vvyu{}}{yqK[}y}wty}mv{nsso{y~}xzutszu}tuxn}{r}zvy{v~{vp{oXPu[da`db`^deed_hdajd^`_WPxOsRvcr~z{{~wrrq{tx}yx{qteRPuwxutw{vo}ym~xwswuurvyyz|urvw}z{}}|uz|~{|y}vrz|swqnyr{xw{vkquytxzqtzrytlvwxz{z|xnx}yrz{vsxwpwkURq~zx|v|{rzy~upyvhv}~||{xzvyS`_d]^`Z^``hbae\ejedgafe^`R|d{xuttq}xrt}yytwoq~|{xpy{x~~xwuz}xvujky}}{{wx|sxvwwytpl{zyx~{styywyvr~{uy~~wzxym}}~vzyu~{vv{u{wtx|y}r{z~tu}{qogXmsJdqhp{yxywyyzont|t{yz||qvtp|{xs~|ynz{z}q}x{}|{sy{vvtu}~|z{ts|s|xpyxehry|qtu|ps{xztywxw|}yxz|{s{|tu}}s}|y}ztr~UAcX^hc^^c_[[g_bejgaZbb]b]YU}QxKnNsU{qzv|wzswvv}oxw}}{supTUTav{{}}ys~qx~yyrxy}yruw|{zyz~w{}{ww~w~yrwxuv|{ur|vz}z{vruy{vtw{w|tss{{pkv{wzw||t~vxw{{{~z{tvz{rypYezww~ux{~}tx}|quy~|yv}t~{xz_]_cca`abeccebd^cc^iadfb`e]Rzy{txry~{txz|~|zxpt{yuw~tpxusotwswt~vr{yzu{t|ywsz~zrxvyyv{wxv||vuvxz}zzw}~|xvz{npzw|}|zww~qt{{vvs~|r|p|xz~xkgLerLdmhpq{pywkz}vnw||y|~~vvxz}z~w|||}z}}xx{{ztzyv|vuzu}}|}|rt{t{{yww{~yv{zsruxywwuxxy{{y|xtxuxzvusx}}nx|}s{}||yumu{Lp\X]\_d`aa^`\^fdg^_Y_dad]WYUU~Ou=`s{{xx}z|tvsv~uuzqy~r^uty~x||rzsvuxwrl|{vryqzyrupy|u}wxz~~ywxs{vvwtwz{vyy|ry}|x}vuvvxszxwxzurxr{~wzyxu~}~zrw}u|n}pxurru}sqx}z}tyut}wv|u{w|~yrvV_mdb^be\\dkeim_heibhXbgg]Z^zsyz~|vsw|r~z~xwx{x}tu|u}wgt|zntr{uxwzssxyzpwx{zx~{||{zwyv}yvz{zy|zzxnp{}xqxws{sx}{wuxy~{~|{vwps~|rtpvtvvrv|vy~{{obKblRdh^hvxzzvuv|ru~xv{{x~y}yxwmpvrowt~{ss}vpvuz~uq|voxyz~~x{xpyz{px}x}wuuy{rztu|}uyywxyxuvxy{|xx}vmzzz|us}wz~{qww{zrrrMt]ZYdgb[dc`^`^ca^_^]fdch]^^_ZOvp~{}|q|yu|ytzplsxy}~zv}utv{qv}|uxuwyytvxz}x{nzwwqxzzxrz{lsxwlwvywwvr~{yuz{~w~z~spvzt~zvuuo{{xxnww}zzy{rxzzs~zo{u}{}|vy|xzwvxvrymrvxuswvyzyyy{y{{xusu}vx~VZhggaeh_^eiddmif^deb\ih^f_S~nt||zy~{ysv{{q~q||xuzwwyy|}x~vwzyquyusvywon{oywz~{x|}}{qu}xyr}{t~~wv|{z|usxwyuwyuwsqyxrw{{vyxzutouxvzutwx}nsvruuu~vwzkZP`dG^hdpy|{z~ysvxtskurzyr|xu|z|y~ousvpuor{x~wo~wxx}wwwt~yvpz}~w{||xvv~wxs}u~~rw{twwr||tsp{xyuxoows{pv}tvpwty|xzyyyvuxv{lLr_aU_gbaa^]d`^[dc\\a_]ba[_^^[xn}tptz||trqv~~yrqyz|~wnxwXuzqtysw|{v|ty~wuwxsxtw|uv|twovx}znqsw{xy|x{t}|sw}vx~}xvwwxstwtvqqzul{w{vx{sruvy}y|qwzyyssw~yrr{{stryvyq{pswz{wrszorrzprqrt~y|r[dficji^b\didcjcghdd`_idc`XS|~nq|s}}yywuwsruxyyuvzsq|xyyzzpv|xpowvxw|trz~{z|vy}rowwvxvtw~q~w}{~xtxxt|{xwvxzy{xtz|rwz}yqmzv{pwxzvxvuv}znzwy|ud\H\dF[dbinw{}xs||y{vr|zywvxytux}tw~~szu{xwqrvq{xyy|oy|zxtt}wz}}wsxshwpq~v{{xyvw{|vwx|zmv~wvw~yq}utx}u{{}yy{}p{v~~m~wq|}tzcR{Z`__dh[^_\Za]_fZ[b]W[_]XSPz_~ysxpw{z{xyvpsv~xvw|s{{u}qq\G^oysu{uz{||{}vv{zop{{w~wxty|qwzuuyt~stuvwxtuprxqsv{uz{qzwpwywy{uwrusxst~}wlus}uxoqzxxywrob]zzrvtstsxqnyzz{x{~{xpvvpqrpy|nzwl~pyyurXceeaeigibjjiddYchgd_jjeh^bYWk|wwtyy}~uxyzrrrnr|mlv|xvptzz~xus|}}{sxrsolxq{{uqyxv}v~ppzytzqyyoq}vwytoyov{vnmz{y|xpyzzzuwz~ywu}}urw{szpmwwou{zy}~zxrqgZGZbJXYekpp|}qx}|tysww{zuwpzyxqnnwywuyw|sw~zwy|r~|{zwq{|xxxx~yvwyywwtutvy|}q|y{uux}xrvs{ysu|v|zqvqwwypwy|ywt|qxs{ux}wwty{_T|_X_^^`a]d^Yd___]^_d^]ff[Pzittvuvwzx~}yyxyx{rwx|uusw{nbJjyyxmnvt|yny{}sxvtx|xuv{{uwsp|xxxvyrvuw{w~{zxru}y}zx}z~srwy}utrrzxyr|tvrz|tw}ticVIayzsurxttv|srrzryuvx|vy|tt~tzwxxw{|rx{}a^ideffd`^dcgbgafagahfmdbe`XJuc{vy{{wuwsrzvysqwtoyuuy~}yvzu{}twxy{}~zwuyxpqqx}|xr}ypsw{t}{ss{vvz~{zxyzuwzxzstzuq~v{zy~}rx|u|y~qzvoxys|t}xnvvny~suxteeKYYCTYckw{zu|xuwsu~xvmpskz|qzv|xwvyyvwypxw}urx}x|u|{}uwzpswivxowsty}xx}u~stxrxqxzis{xyvitxvysz~mQyy~vtjvppxspovsywu{xx|rxvwx{t}SvS|c_Zde`__dfc`c^ad_^]dacfWr|{qpxsmxrm}pww|zxxwysuysv{yy{rz|br}y|trquxttzw{rv}zw|yzuuzzxwo{|~y{~s{wzp{{ow~wt}y{w}{y{xyux{qrxovwp|shxsx}ygy|{rxzz{vnwtwtkx|swvxxzwXosmvxzuxwzzosyv|~vw{~{yrvwzuwR_fd^daj`]idjfhdd^^ebedejc_\S|qqypcwztqrozvuxmxuwvv~{|~~twy{wysuop|wwowuxxssy|q}rpvrx}v}xx{wzw{zzxzw}orpxytqxttvjw{{t~|~ytxuy|sjstsv{x|{uzqv}xsyutvqtqedHVYDUZ^lz{vu}utlszuwslsw|wvvvrwxmuzyrzvulpkpvvpz~u}t}urvzx|wsyw~zouwxxsqusuqwx}vhmtwu|vowuz||ycxx}|||kt{zvqw}tytszt|}x{vqxprznu}Nsd]cad[^^_^cfZZchd_Tac__Mv{pytwtttvqovp{quwxxwsyzsnv~vzoxr~wvvpv~wvs{zqsyyqt|u}w{yvuvv|xsrxyxrn|zjslW[t|x{y|tqos{~x|w|~wswpwzojvx{u|pnnunvunxxq{uvtwyox|{wwRkxszvvyxyzsn|wrtxqooxx{xzyw{wV]c`djihbehhd_caidaed[jdbhc`ThzqKN|{w}wzolsxw{ssz{yvqtxwwpuv|vxwypus}psyvwyxu{xqxpv{|}qt|wpxv~uqtupu}{y}|~{yzzx}svylw~||tzyoy|rsmmz|wxvxpu||ou{svyxxh[DSW@JIbvwt|yuxxxpsrztkwvw}pvutnvtspqlyqz|xutzkxwx~ypwytqqy|xxuswpqtttyjuty{~|wo}yuyutxy|}z}uqsu}}sqtmvwttyy~qupuytv}xqwvqxntzKp[_fd[U_]^]bdY^e_`bW^XYPv~w|tfltzv|wzxxqhsut{wxxx|{vrtzxosuu{xtw{ruz|{vvtzxvywsxx{ur|}y|jovuqu}{syqtvtykQRM\sv{zz|~wvv{rvxsouzxvvy{sy{sw~{xvuxtqqwvouow{w|wsy}rwwuyxq{vsq}|rsz{us{x|tv}tzzvqzwxzs|qX_^jicc^_d^fd`dlehdhhddeecb^FoZ\`s|vvtnv}ykuqvxu}|r|y{yw}vrwxtswzrtz~~yt~rl{{x{vwrsrvl{xqvuuwqwwzxps{u{|yws{{}zsvpxty}twuuljzwxtsmxzxsqypz}vwwvsuvgR?IF|?JI`pwrvz~snqtryv|sxuuvusuq~y~yvw|~znvyrsxpuzwuvuouttuvw~}tzrr}uluuytmwuxqpu|tx{pswzt~xwy~y{wl}wzprzvswywt}{nu~s|xy}zs|yyvsuRy[^f_]T^__ac`_Zdbca[ZWZ~vx|{ztyw|tp{z{|sr~yytxxv{sxy|ruxzznz||u|v{wpvzsvnmz{xszrnnwzuytrqlwzmuxknoWXchfrwzyrvzrqworvtvsts~yu}}y}zvx|zmyuw{uv{rs{}zur}yxzwyqzqr|{|wzpuuwwzsvtspusvwwrwwxzto{~Ybchbdaghd^fddkeffeddf^dddda6^?nk|tv|trw~{oqzq}}}{{rsx~wntquzvvxx{swxxu{wyqx{wwtrzwvw{}syruoswwlxw{wvwv{vvzz{}puvw~vuw|rutsluvuxrx|ypw~ruvrz{wx{vq_QAJGy=IH\mvvqy~rpuws{vqprsmp{w|y|xjRy{swryy}rqxp{s{wy{|rqootzxxx{zkqxtqvvwns{TLvvix~|wq}vrswrvptwnsuyo{xxvs}zovvx}nrypv{u~xuru|uoxkQy]b]_`Wa[[ca_]bbY[^aU^xy{rt|xw{q~~vovy{on{w}}na}}z{uwpkostzx}wwx{umtww{lsysvnwyuwzxwrqzos|}lyvuu|qXPt|ytyx{sz{oovwtwwuqxywxz~vwx{xvznq{vr{xxswysz{|||~||zopuqytrqxwtvszuu~vrotu{{uzutpr{y{h^ccbea[c_cg`^gdjhjdaccajjbdM{Jpnw|vltuyrwvuqtyt{rv|tn}zrxyx|vtvn}ytroot~{rvv~yvutuz}wyzw}}m{{{y|x~~sozwtugvnxyz{{uyu}{u{qpsv{tryxqn~uzort~wunorszw{{}e\BKI{9EGsclssvsx{vs{}xvqonprtz}vo~{rkmx{zot|mu~nuqs{wtxzxrrvsrvwy}wvyxnrxwxxJb|zuruvwzvtwt|ylopqvrluztqzpxxsysv||xxturx|{pywlurssz~cU~TdY__Z]]d_^_Y_`^[\S}lu~r|wwzzwvqyz|ywxzry}{kommsyJ.a`quwr{WV}qn{pyrxpp~wpynowwwwv~{vww|{ox{qtujqzr}rrvfu{sy}|rxxqx|zsq~rzwwxyx~w{{rttututvzyskvv{ynrxuov{lrvnyv{yysp}x{{uwss|uryq}{s}vryrqsppu~s~{S`bbdbd^cdcbhg^`aeida`cgf^ff\Wszrvqr{wt{|uumuuxsqsosppmvsjrzyrzu{}ruxxuyqyy|spmwnn~utxulmzxuzq~yuqo}zzwx}}xyzxxyw|rxyt}ukwukvotuox}zywt|}zxr}ztrvzuwscU8BBp4CGq`pstvqsw|xy}vzvksqtqsnu~}tvtwyw|w{{v}synlxwnxyxxtnz}qvyuv{{rz|ssytywxsvutrmyzuvpstyqtu{ruvmmxpjnotu{{x}xtxsvwky}yustrzx{xyW}U~X^^_bcbZX^]bbd_ccPxp|ptrz~wuspyrzr}{zwst~x~lv{utZNUhsiunvii}|lmuzy}oowt}wy}t{omwmtvv}{{p|tq{tvwxwjxrtwzvuo{wvwx{w}|kmv|yt~vqw{puuwquttuovsvxmn~z|wsmvyrzsyusuxqrroiyw|xumpwmvr{zywruqvysjzuw|kZUcaY^_]fhcc_edd`cejeg`bh_fhcP{kwr~vtvho~vpy}qz|portosyztpxwvro}tw||yvowpznuxsr}nu{v~ytrou|wuxsplvtzmy~ztmuzjmw|xyt}z{tvusvqlsyroxop{rxvwwzzzyuswvudc/?Fn@FAsXgu{xnw}yr}xttzussszwxmurrwtqxv{mouxstwqvuyuvz}w}wuwxotsqrvvmusvxzxvvvuwuv{v{unvztvltu{vvwvu{vspvmjqsqyrpzxsx~u|z|umxtz{yvvRvYW]_[^[\_^]c_cc_YT~{uojrrswxtxyuxqz~}tx{zvx{jowvp}|zsqyxxvz|z{yst{ovrxk}ur}ww|rwvo{slrtuvvuvvosypu|xux{rtxwyqwntyxqtynuwjzwwvv~{uupqvvt{qntsww}vyvu|{xuurzyx}ztvwkovtw}yryrwxjmsnxzwyrtwyp}vitzwvzxVYa[iifejc_Ybdjd]eghc[beddhdZWyyx{uoujvZS{|y|soupvtmvzyuu}uwzvs}wqwz}vomrt]Uewzuytrujlsyuqssswkkvrrzyzsrsjgiv|wq{yvvtrywnzzzvypkstzw}qyx~zro{kw{}{}sjZ>C=m7@?j\dr|rtvumpqp{ws{lspxukxzzqvwtmmxrut{{li{upxyvvtuorxxw{u|wmsvvv{|z~rmuowzvvqs{pvrjytusvxplustzsuswslp}szwuvx{x|qvjnrtwq|srpLqa_^Z`]]WZ_\Y`XXYMuqqsvukprstuwmprmpvyyymysootquurrtrupsu|}yx|opusrnuqzvqqpyywtwzvrsqixtp}torjpqrtvostvrvuqmoo{uo|wrllrwsvwrrrwq|usmqy{snu{p{vozyvuuqzyws{yqwttwvttvxrvlnxyz~y}pnw~vtrxt}xzwtqxs{|W^fcbcagabhddba^_eehfb]^b^fheQ|g{qxvkyxwG}Wuq}~ryxurtt{{tlxvqx{rrywwsqsutu{aQQL`{s|z}wupnttow|pqlottuwtoxywwvlwv~~vsjy~y{s{vx{v{yu|swy}yxzrotssz{|vtgW5=;f*HGzN_hrplroriqspimrgniownhvonhmptlhpominppxuulpspoqqvvll|rqwnlknstwqijmpplkqtppvmlwmolsxspopqpvovyvvoqjfkmpnjujrtruutxtwulvtpvqollqtorunpwuutvtouypsnmlpusxnrntstmzsyzuzvrqtpttuzszzvywpvvzsqxutotxwvvtqvusruxtvtuqsqxtvxwoqnvyvvyuupuryq|yvruvzwtuoqqotuwvqtwtymsxvruuwyuwyvsy|wtvuxswuurtpqwwxvrqsvww}qqyyrlmyuusrntxtwplvsnuvvvprplbpvqnssovrrtsslkpmrzujpxttrlutsrrtxderywsrruzslisopuuvrmpjpnnqpkqntlrrwruqvvptlqxnmknsilqxqsqnvunvqghltwxolrsprjsij[_tnnovmozrvsjnlxuqtqwpmlqsphrpnnfpllqpkgJ8B?u0;r:rmrstlpuonorvtutqwrqs{zsrpnrktonqnoyzrlpszunpoivmmtpipjrvmilutqonpllkiqxsmkpsopohsjpswltsqhrpwtgrpqqkmjowkqsmlrikpnimrYJ$$C1I[fjhqqolmspppuqpusnhellvzpqpltpoojgosvqovkintlmxpttrsjjnoquqqrwpqntlktpoonojoljytqqllrrtvnmusourpuuqpnstwuysrxyvsqkpirztwwqvrtwusuvuuvussqqqoxvx{~tntsuvpotwxtrttuwurqxzsrxqtuvqwpvpuvzssyzunspuwowuuotrwwsswyvtpuqqtssvvvrrzrvvtpvuy|ssuus|wvvxxvvuoysrwvv{xszuoxz{wuuuqxsqywzwtsyuusox}rpptuxtvrrsyvzylmrtwtpprvsslxolqoyruqtrtys_mqsqrzuvyuutxxuvkprrmqm`ktqvxwswN@xCy`vvrkqxoosltznsusneqsvouorruupngplprsnlqvvrntonqmqurkrlmwprrkqfisrrquoqtnrolnglgdtruqinonolssmhgnnkormfpnmmaimklhophfn_M- PXljoltrkqprtlnlaotopphu}pmrgoqjprhnqkottnhkrqrsonqvrpnmnlkunqkpqsttityrlqwtqqsrsmvvnpnpwsipqsooslpxtotuuozvzwusupunlprtsnuvsztotwouqtzuqrwrxtsuzxsspvzuxssrw{{vuuvswvnvvywxosusotuyxzvwz}wyqlsqpsuwyuvzuuxzvsxyqxvyvzuqvwwsvxsx{wntt||qtvvv{ywxvxv{zw}zzwyutxww{svtxusyyqsqwxutyulszxprxtxqx}uqyxwvwzzx|povopxxojrttrplaZmtoxxwqksvprrtrnswwtsvtur{rouxrqjWEW{{vyswyuqsxqxymovhisnyuztrqwnlrqkssvtssilqujjlppotnhlsntsmunwqlltpikkkpljkrmrsrhnvrmmosqjkfilfmgeulnvsrpcgqneqermcunegutbqshklmk`E{  Pz\hmiuggnokqnjognommmmvumhherprtplvqgngnijcojmuigopqjlpwptuspokmtrwsjruwpqtotymjxnsvsypkwnjqqosvvstutq{uuutuoxspsrrjovuyxtyxy{tuw~qpqyxw|uw|uluswwrpsvvyruzwyxvozvwuyqu|vvuuspusqmqwwwyv{rsrtvx|vuwuqyuvwwvxsxvwxtvovwszpxx|{{s{ywxv}{}|stysxwuv{spywxpvxx}yyuxt{ztsxxrs{wryrstmtyotwuwtsutusuwuwz|x~swwtspwtuw{ytrytzoniZwqjxqprouyutvstorsorwqwuqssrrmrprjVgxtuyorqryrtwuttpmhosusiwtvqqrlnxqnvtu{wnpstqvrqqkpkchoprqppqwpkossplkpfhegqtnlplmnotqmqposdpsmmlkormqiqklmgsqmeelrqrniloiqsjnkig^Is EewUblslgiuirnnpmorkniekqnwlokpoqwrhtxoljrwtlqnpntvjpruthjrqwxowpnqxxtqrlrqwttrlynquqsstzwuvump|rpyrssuysv~xuzou{tuxsyrpwqtyt{}zy|wuyvtt{qxxuvnrarxrusutvysv{vx{vvwt}zvuuutxvtqtuz|sywqvmuwuwwvwsvuywuusuvzq{xvwvwsuusxy{vy{{xtyyxttyy}z{wzxuvtvwrux|{xxx{y|yvw|wp{yu|~wxzx{qvwnssr|ywsusmszzxxvt|wswvwwutssttuyvyvzuzvrwvvrzuuuqwpvtvvtpwuomnovusptupy}wwnoxrtsxwupqlttxuotokv}rwmquvroqpajtysnvvstpvrvwtsvrnzxrznuiotqxupvronerwntphttprqpsnnmkjlwvlosuiijopqzppjhjiwquntltmppwpprrnrhfmknrjlWCbr;KORclvtmmssphlusyqnooqmslqepsowskkorroonnqomprowpnnoqrpiijnzrtrquvosxtsttppqwvqutpunryqqxxuorolrpsrqosvtvwvyzquwx{szuptupo|ytwz|uz{wvy{xtyvytuziutuyuqwrxxsyvuwwtsvxvqytvx|xvx~xxwxyy|vswxxw~rrzttuwvzvx{xtxxvtrswwx{|wuwrqst{{xxvx{sx}vlurqxqrxvtvyux|snsz|yy}yzvw||wsszyz|yx|xqyyvwvyqtuux}{{zttrtpvxsptutyunpsrsyuqpzxzszzru|uqwmtwrsqywsqsrottxosqtqusop{prsvy|xts{rtstwsposmlnopouxkuxoxnmuzkqpqtipxrqsukkrppuxoolouthorkiloqwnosnoqrtrpomlegvonookktmip{svumnfhiltvjrtkniuvmlnnlmrqprxrifJ7GK  +.)[Qdnopxigurqouszulhqunnfodmsqokjlnqsqnolferpproqnmglolokopunsssquqrvssysxtqoruvpprxlqxttprttzqtrsonzsttuuuqz{rvvv{xzupu{tvvsw{t}vvutw{wxpwzx}}vywuwvw{wrxutqqszvtqryyyzy~}{vuzsvv{{xs{wvqzqzyosyzsuvuzw{vruwv~x{wxw{wzrttxwwtvzvvsstosyxvvtuxruv}wv|zor|ywyyyyussw{vuvvw|yvwuqxqpt{wtspxurnxsotrjtvtpuyuuu|vsu{rsxpmyy{vsxvyzsuswwmpsustuproyzyxrrqttpuzuv{xturv{nrnowl|zkxqjwomrqs}wutvzrhpqrlnwignpsgfvttsisqrmopoknjmiomohisjtrudipyvtrrqoqnnsgrlomnptutqrsvmstmsumomqtssvvsokllekemjvmc]G%($W  /IYmtuoifiiiqhknlpogorpqpkltntommjm{vkhrloufgtnoqukoqtirqwmqsvwnqumspkpstsopnqqkhwrkuvrytquql|xnrxtsrstutwsssstuvz{votvxuvuv~tvz{vqqtrzwwwyouyv{utqqz{v{}vrvxxyvwtz{ssz|yz}xvrtuuvuqsusutxwyyzrrpvyuv{w~y|ustw~wtvw{tzwvwxvzrrzvxywruwrqw{zvtvvuuuwvuszvyzvrwwvzuroz{ytrovv{vtxqsmmtwwuutturusprsqwwzvtv}qxsuszxxyytvwyxyzvzyrvzyrurswtwsqpjvtqnzytotuntzyontwvuvropktttjxoxqjwtmutputxwrotutvmqrunmqmnkemhnmsnqoqpwttnlnqpgtsolqrkbloysmkgswqnkgmrnjpjdlmtqsmvknihnmrshokbnshtpkqmnskknghsrcWN ,B_nJhphirqpwknriplprjhmqkrdeypqhmuqlyrsunmtsqoghmhmqhrwpoqlvsquximqrrosmrpwrxvontvsoptlkpulsolwyrnzxutmqxuqrvropszprxvxzrnsyv{spvvwsoytmxxtyurwq{tvtmyxsvvtvostuuzyz}xqxvu~vw|zqvyxvsxt{uxxw|yspszpw}uu|pntsquoz~zuuz{vustzot{z{}nxxvou{wvvzqusvyyxnxzttsxxqtsxyvyxuqswwsstsywszzoxt{uprsyxwwvtu|yszzx|woqlpurnuwtrqrtzoq~smqtwyZT`zzsvswpuulgnrxtppqnxqlosrmqptrrosuonrrknolxppunoynqtqqppnopvnrqskmtuuelukqrkhqrnojsrmpmivwmogmokqnilnnqotntrnslmgjepnhqimmmmmrjkkpqurmbqpuqnupsshfmgnkfjgLC^k  "#UDSjlgonggs`dtehjilkernrolwpkimnhtuukrkamunlbmhlqmvmpogjjkorlttjghkloimkqrqlohojojrsolqrlnnlqslmqstlpokirrnvhlprpluonuoutxvspvussmvspnuspwsqpswoqvsxqrprsststuuttquqnsulqyvwsqstsryttrvuwyvvssyxqxppqojjnwssvvjosssxwwxwonorkttzurtsvrwsqptpuyywsvrptvwtsppttnuzvxmpsrzztrvokvvwvr|ttvrvqittvtsuxytttwvtltppnmglrntplxjsutlktrurRNbnmouprstsskrpksloutpslrmhnkrrphntmcnsifeqnprnimnonkjttkqilmnqneiglijultrijpkihrnjiiflnhqoknfmlnkhllkmroieinrdpkmqhhjlimjnhkpjjgejlbghajfehmihdjpoecnjgjg[HS #:KOHWd^hjffidajfeha_fbe]eb]fhbhegiiejdfd_]jci`_fmeledggfiie\b_hj]^Yihmgbjhghehlgbj`ilemicbfggjmjgggimi`kdffc_bif`fkideifnljojchskahmohmbeimeghlenolpjpkagpjjohmiighmiphfhqjgjgdlgqonpjmnglhqjolnnmfpmkhfejkjpigehhmqikoligkolknnlliokhhdojmllillfnpnljljlklnmikmmikkllnngjgcldfohckrji`jjhanqihonipljcfgdehafpk]gdniihi`jh\`ceikXI]okehhgb`dbdddd^gacfiffelileggfechkc^jia_d]deb`^igdcfbjeYeedYfegkaaiigecdbcd`][]f_]agZbjbhebb`[`gY[hj^`cjg`h\jcbifbfe_hahbb`_ai_YbcWZ`hidZ^dgejbZfcafbgjYZG;LO&  '1;Q[GMLUURSWLLVYVYZRPPRRXQQRUWTMUXUSNSRRKSOKYYSQRWVOSUQWSRYSN\RQQRNXVWVUWUWSZUYVPWSRZVV\VTVXRVXSVWRU]WSMPUQSTOSQSXYMMYWXYU\UVTXWZYUU]U`QVLOSTXWVZTW[U[YWW]\U[XXVQXWS\[TTXYZZY[TU]WWWVXYWZZU_^WVWSXUVV[QWXUQZXNPUXVT\VW\YWVUXVWZS\]WSOUVUQWWRUWSUUSTWVSWRVYSXWRPVTTPPYTVXYOVNRSWUW[ZVSWTTKNXSWSPTORTNRTMORRXWLQURQVTRQVQLLQTBIVRUVOUPUTROSQQQNVVWNMXLPOTUYZVQWVSQIPQWSNPQRRSRSOKMTOUURVWTMPHTVRMPYSLMRUTQUXXKQQQOQTXSWWXZN]VXXUPWMLTQTUTSOR[WQSLWYXTWS[SJXUJYZNSJYXWTTPQU\X[TPOPYXQNOPWXTNWKH=PX3)"  "*2:.31.Nd/Nd0Od.Nc-Ma1Qg3Ri-Lb.Mb1Rg/Mb/Nc1Od0Na/La.Mb2Pd/Nb0Ma3Rg1Oe0Nb0Nc4Sg1Nd3Rf2Rf3Sg3Sg/L_.L^.J\0Nc0M`0M`/M_1Ob0M`.K]0M_1N`0M`/M`0Nb1N`/M`.L]3Pd4Pd2M_3N`/J\1L^0K^3Oa4Pb5Rc2M_4Pc2N_1M_2Ob2M_1K]5Qc4Qc4Pa3O`4N_3N_1M_3O_/JZ3N_2O_2M_2M_1K\/J[2M^2M^3O_5Qa3N_3N_0JZ2M^1KZ2LZ4N]2LZ3N]2LZ2M[1IX0IX1IY2L\2LZ2KY2KZ3N]2LZ3LZ1KZ1JY3LZ2JV4MY2KY1HV2KX2JW2KY5MZ2JX1JX3KZ3KY3MZ3MZ5NZ3KY6N[5NZ4MZ5LW8MY5KX5MW5LW4KW2IU5KW6MY3JU4JV3JU3JV5LW3JV4LW5KW6MX3KW2HR4IR4IS3GQ7LU4JT2GP0EO5JT6JT2HR3HR3GP7LV6JT3HQ5JT8LV4IS4HP7JS7JS7IR5HQ6IR7KS5HO4GO7IR6IQ2EM4HO2FM4FM7IR7JS4FO5HP6HP3CH6GN4DJ5FM6GN5FL4EJ6FN4DJ3DJ4FK4FL4FM4FL4DI4EJ6GN4FM5FM5FL4DI4DI6FL6FL4CI6FK4DI3CH4DH2BG3CH5EJ2AF4DJ3CI6FK7GN5EK4CG5CH4CG6DI5CH2AE3CF4CG5CH2BE4CG2BE6EI3CH2?C4CG3CH4CG2?C3CF4CG4CF8EK4CF3AE2BF4EJ4EJ3CH5EJ2AF4DI2AG4EK3CH3BG5EJ5FL2AG3BF5EK3CH4EJ5EJ5EK5FM5FK4DJ3DJ3CI3CH5FM4EK4FM3CI3CI4CI2CI2BH4DJ2BG1BG4DJ1@F3FM6IR1DK4GP5HP4GO3EM5HP0CK2EM5IR5HQ2DK6IR6IR4FO1CJ3FO5HP5HQ3IS2IS4IS5IR4IS4HR6JT4JT4HR6JT5JT4IR4JT3HR5IT3IS1FO4IS3GR0FR5LW2IU1GR3JV6MX5KW3IT3JU0GS1IV5LX4JV5LW6MW6MX5KW2GS5LW1GS0GS3KY1GU3KZ2KY6N\5N\2JX1HV6O\5MZ2JX2LY6N\3LY2KX2JX2KY0HV1IX4N\2LZ2LZ2KZ2N]3LZ0KY5O^2KZ1JY0HX0IX0IX2LZ2KZ2LZ/FU0JW2M_2M_2N_/J\/IY2M^2L]2M_3N_1M^1L]1M]1L]3O_2L\4O_4P`1L]3N_6Rc2Oa3N`3N_3Oa1M_3Na3Pa1K^1M_1M_3N_2N_4P`6Sd/J[0K]5Rd0K]4Pc2Pc/L^0Nb/M`0Na3Qd4Qd.L_1Na4Qd3Qd0Na1M`1L_2Pb1N`1Pa1N`1N`3Qe-L_1Oc3Rg/Ma2Qe.K_1Oc2Qe1Nc3Qf2Pe1Ma3Re2Qd/L`1Ob2Qe/Ma-Ka.Mb.Nc/Nc.Nc.Nc.Mb0Pe/Of/Mc-3.:3,$  "*28@GNU]djryyrkd]VNGA:3+$  "(/6=BIPW^djqw~~wqjd^XQJC=70*#  !'-39>EKRX^cjpv|{vojc^WRLF>:3.'"  &*06:AFLRW\bhnsy~~xrmgb\VRLFA;61+&   "(-26<BFKQVZ`ejotz~~ysnid_ZVPKFB<62.)#   %*.27<AEJNSX\aejnrvz|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}||||{{zxurnid`\WRNIE@<72.*&"  "&*.26:>BGKNSW[_cgjmnooopppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppoooooooooooooonnnnnnnnnnmkifb^ZVRNJFB>:62.*&"  "&).158;?BFJNQTW[^_aaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaa`````___^\ZWSPMJFB>;741-*&"  !$'*.136:=@CEIKNPRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRQQQQPOMJHEB?<9620-*'$"  "$&),.1368:=@BCDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDDDDDDDDDDDDCCCCBBBA?<:7621.+)&#"  !#%')+-.02456666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666655544320.,*)&%#    ""$&&&&'''(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((('''''''''&&&&&%$"!      @RS  E9;?@OMM*6CM\z|{{{{{|y/9BOlby ꔹ}               i{{{{{{{{{{{{{|h%.KbrzzzzzzzzzzzzzzzzzzzzzzzzzzzzMev!&0}ʨśʩwo|zhz^lrlXipS]_eO\_IQPypfGOO}^h|b17 ljEF]89:;<_Apple PDF pasteboard type_Apple PNG pasteboard type_1NeXT Encapsulated PostScript v1.2 pasteboard type_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{368, 50}, {67, 72}}5==WNSStyleWNSAlignWNSScaleZNSAnimates?:;?[NSImageCell:;?[NSImageViewhjcl ] !|%= j1CBl-j_{{435, 96}, {11, 5}}=,"/D݀Z{446, 145}YtitleView34eILBCDEFG-K7%8OPQ ?JK8 wbZpor U"#n&\+ZAz3Ou7lFH<=AoA43|Ёˁ+g s܁25ׁA'ց.jfmӀa6`{zB"Eity2 ߁W$rLS6 ؀N]ۀ􀖁IaBUVIJKIс XMainMenuEuOH +ӁVBCDEFG-HKXMOPQ^YNSSubmenu? 8<Ё^submenuAction:EubH="z &րׁ؁߀BCoDpEFG-KMOPQ]NSIsSeparator\NSIsDisabled?  8<BCoDpEFG-KMOPQ?  8<VBCDEFG-HKAMOPQ?ہـ8<XServicesBUVI܁ށ67EuH__NSServicesMenuBCoDpEFG-KMOPQ?  8<BCoDpEFG-KMOPQ?  8<\_NSAppleMenuVBCDEFG-HK<?MOPQ?8<ЁXDownloadEuH3 74BCDEFG-KMOPQ   w Ib<U+  Ib> >  w H    bwIw < w<I  = <  jaӀj6jjjЀas{Ё񀅁2 asЀ{6j6j逖ЀaajaaЀ{sjjsa a؀aaaE9WsIt8mvp    w b>Zpor U"#n&\+ZAz3uO7FlH<=AoA34|Ёˁ+g s܁2׀5A'.րjfmӀa`{6zB"Eit2 y߀W$rL6S ؁N]ۀ􀖁IaE9 W I      ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a6 c d e f g h i j k l m nсh !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde_Panel (Preferences)_Shared User Defaults Controller_Horizontal Line_(Menu Item (About Flash Video Downloader)[Application_Push Button (Change...)_Menu Item (Find)]Menu (Window)_Menu (Flash Video Downloader)_!Static Text (Download movies to:)_Horizontal Line-1[Separator-2_)Menu Item (Download and Convert to MPEG4)_Gradient Background View-1_Horizontal Line-2_Static Text (Working on it...)_Menu Item (Edit)YSeparator_Static Text (Remote URL:)[Separator-3_Gradient Background View_Menu Item (Zoom)_Menu Item (Check Spelling)_"Menu Item (Flash Video Downloader)[Menu (Edit)_Menu Item (Quit NewApplication)[Menu (Help)_Menu Item (Copy)_Menu Item (Hide Others)[Custom View_Menu Item (Open Recent)[Separator-6_Menu Item (Window)_Menu (Spelling)_Menu (OtherViews)oMenu Item (Spelling &)_5Menu Item (Download and Convert to iPod/iPhone Movie)_Horizontal Progress Indicator_)Menu Item (Download and Convert to MPEG2)_'Square (Open my newly downloaded Movie)_Menu Item (Jump to Selection)_Menu Item (Spelling)_Menu (Open Recent)_Menu Item (Download)_,Popup Button (Download and Convert to MPEG4)\Content View_"Menu Item (Use Selection for Find)[Separator-4_4Path Control Widget (file://localhost/Applications/)[Separator-1_Static Text (Label)[Separator-5_Menu Item (Undo)_Menu Item (Delete)_Menu Item (Show All)_Menu Item (Find Previous)_Menu Item (Help)_&Menu Item (Check Spelling as You Type)_CStatic Text (Can be a YouTube, dailymotion, googlevideo, etc. url.)_Menu Item (Minimize)_Menu Item (Hide NewApplication)^Content View-1_Push Button (Do it!)_Square (Round Textured)_Menu Item (New)ZImage Well\File's Owner_Menu Item (Find Next)ZText Field[Separator-7_Menu Item (Paste)_Menu Item (Bring All to Front)_Menu (Download)oMenu Item (Preferences &)_Menu Item (Services)_Menu Item (Select All)_Menu Item (NewApplication Help)oMenu Item (Find &)_Menu (Services)_Menu Item (Cut)[Menu (Find)_!Menu Item (Paste and Match Style)_Menu Item (Close)_Menu Item (Redo)E9 ŀE9 ȀE9 ˀsIt8mvp    > wbZpor U"#n&\+ZAz3Ou7lFH<=AoA43|iZЁˁ+g s܁2 5ׁA'ց.jfmӀa6`{zqȀBÁ"Eity2 ߁f\kReʁ~_wW|V$qrLsyS6 M؀Nl]ۀ`xHIaE9 [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  jklmnopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁l:9`5zq8'|_j\%1a}[SI;umg-Zz|,\RLOQoiIEu tHE9 wE9 z:; | } }?^NSIBObjectData"'1:?DRTf`f !/:Hdr%'5>GRYkt}   ! + 9 F P b v  # . 7 C O Q S U X Z \ ^ g i l n     I U i t ~    " % 2 ; @ G t   " $ & 0 = ? B K T f s |  "$&+-evx "$'(*,Cdfhjlnsu6H^s !#%'(),/16clt"/>@BDL^gl!#Oxz|~#,9GPqsuwy|} )2;HS\c{acegikmoqsuwy{} 9;=?ACERTWZ_agpw  ,.0368:=U8:<>@BDUWZ]`ik$1357XZ\^`bdy >@BDFHJWY\_uw"(*,.024ACFIWYs    "<ai2Jo!#&39;`ikprt        ! * A C E!!!!(!3!<!A!J!L!Q!S!U!^!`!b2 2)2+2022242=2?2A67 7777!7.7072747I7R7]7s777777777777777777777777788 8 8 8888888889999::: : :JJJJJJJJJOOOOOOOOOPPPP?PAPCPEPGPHPJPLPdPPPPPPPPPPPPPPPPPQQ!Q#Q%Q'Q)Q+Q5Q?QJQUQmQzQ|Q~QQQQQQQQQQQQQQQQQQQQQQQRR;RHRJRLRNRoRqRsRuRwRyR{RRRRRRRRRRRRRRRRRSS(S1S3S5S7S9S;S=S?SASJSYSfShSjSlSSSSSSSSSSSSSSSTTT/T1T3T5T8T?TLTNTQTTTuTwTzT}TTTTTTTTTTTTTTTTTTTTTTTUUUUUUU4UAUCUFUIUjUlUoUqUsUuUwUUUUUUUUUUUUUUUUVVVV V(V*V,V/V1V4V6VNVgVVVVVVVVVVVVVVVVVVVVWW W WWW!WJWUW`WjWwWyW|WWWWWWWWWWWWWWWWWX X"X$X'X*X+X-X/XGXhXjXlXoXqXtXvXXXXXXXYY Y YYYYYYY0Y7YTYVYXY[Y]Y`YdYqYsYYYYYYYYYYYYYYZZZZZZZ*Z,ZUZ`ZbZeZhZiZlZoZrZsZuZwZZZZZZZZZZZ[ [-[J[b[[[[[[[[[[[[[[[\\ \#\&\)\*\,\/\1\H\e\g\i\l\n\q\~\\\\\\\\\\\\\\\\]]]]]]=]?]B]E]G]I]K]V]X]c]p]r]u]w]]]]]]]]]]]]]]]]]]]]^^^^^^^"^+^8^:^=^?^d^f^i^l^n^p^r^}^^^^^^^^^^^^^^^^^^^___ _ _____%_6_8_:_<_?_T_e_g_i_k_n_{_}__________________``` ` `.`0`3`6`8`:`<`P`R`r``````````````````aaaaaa!aBaDaGaIaKaMaOaXaqaaaaaaaaaabb b5b>bEb]bzb}bbbbbbbc ccccc"c$c'c*cMcTcoc|ccccccccccccccdddd dd.dGdTdWdZd]d`dcddddddddddddeeee e ee,e4eAeDeGeJeMePe[eeeeeeeeeeeeeeeeeefffffffff!f5fRfmfffffffffffffffffgg7gTgWgYg\g_gagdggggggggggggh h hhhhh9h<h>hAhDhFhIhLhYh\h_hbhehhhhhhhhhhhhhhhhhhhhhhhiiii i i+i,iQiTiViYi\i_ibieihiiiiiiiiiiiiiijjjj j j.j1j3j6j9j;j>jAjNjQjTjWjZj]jzj}jjjjjjjjjjjjjkkk'k)kkkkkkkkkkkkkkkkllll l llllllll l#l%l(l*l,l.l0l3l6l8l:l=l?lAlDlGlJlLlOlRlTlWlZl\l_lbldlgljlllolrltlvlxlzl|l~llllllllllllllllllllllllllllllllllm&m0m2m4m6m8m:m<m?mBmQmZm\msmumxmzm}mmmmmmmmmmmmmmmmmmn n nnnnnnnnBnDnGnJnLnNnPnRnUn^nonqntnwnznnnnnnnnnnnnnnnooooo o o ooooGoIoLoOoQoSoUoXo[odomoooxo{o~ooooooooooooooooooooppppppp(p*p3p5p6pOpxpzp|p}pppppppppppppppppppppppqqqq q qqqqqAqCqEqFqHqIqKqMqOqxqzq|q}qqqqqqqqqqqqqqqqqqqqqqqqqrr r"r%r'r)r+r-r0r9rBrDrKrMrPrSr|r~rrrrrrrrrrrrrrrrrrrrrrrrrrss.s0s2s5s7s9s;s>sAsFsOsQsTsVsbsksmspsys{t*t,t.t0t2t4t6t8t:t<t?tBtDtFtHtJtLtNtPtRtUtWtYt[t]t_tbtetgtjtltntptstutxtzt}tttttttttttttttttttttttttttttttttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvv v v vvvvvvv v#v%v(v+v.v0v3v6v8v;v>v@vBvDvFvHvJvMvPvRvUvWvZv]v_vavdvfvivlvnvqvtvvvxv{v~vvvw=w@wCwFwIwLwNwQwTwWwZw]w`wcwfwiwlwowrwuwxw{w~wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxx xxxxxxx x#x&x)x,x/x2x5x8x;x>xAxWxyxxxxxxyyAyUyayyyyyyzz$z?zRzozzzzzz{{!{-{B{T{h{{{||C|c|z||||}}}J}V}l}x}}}}}~~U~l~~~~~~~';\n*<Hl   "%(+.02479<>@BDGJLNPSVX[^acehknqsvy{~   #&(*-0358;>@CLNknqtwz}  "%(+.147:=@CFILORUX[^adgjmpsvy|  "%')2479;>ADFIKMPSVY[]`behjlnprtvy{~ !#&),.02468:<?ACEGIKMORTVXZ\^aclnoxz{ ~Examples_OSX/FlashVideoDownloader/FlashVideoDownloader.xcodeproj/000077500000000000000000000000001250240207200254615ustar00rootroot00000000000000Examples_OSX/FlashVideoDownloader/FlashVideoDownloader.xcodeproj/project.pbxproj000066400000000000000000000337261250240207200305500ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 6333027B0BD24CDB00193D7D /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 633302790BD24CDB00193D7D /* Controller.m */; }; 7D32D667183E36A000EA4C8B /* GradientBackgroundView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D32D666183E36A000EA4C8B /* GradientBackgroundView.m */; }; 7D7AF4E4183A813A003CF2E3 /* VLCKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CC786BB31715AAB50024EDC0 /* VLCKit.framework */; }; 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; CC786BB41715AAB50024EDC0 /* VLCKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC786BB31715AAB50024EDC0 /* VLCKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 7D7AF4E3183A8132003CF2E3 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 7D7AF4E4183A813A003CF2E3 /* VLCKit.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* FlashVideoDownloader_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlashVideoDownloader_Prefix.pch; sourceTree = ""; }; 633302780BD24CDB00193D7D /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 633302790BD24CDB00193D7D /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 7D32D665183E36A000EA4C8B /* GradientBackgroundView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GradientBackgroundView.h; sourceTree = ""; }; 7D32D666183E36A000EA4C8B /* GradientBackgroundView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GradientBackgroundView.m; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* FlashVideoDownloader.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FlashVideoDownloader.app; sourceTree = BUILT_PRODUCTS_DIR; }; CC786BB31715AAB50024EDC0 /* VLCKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VLCKit.framework; path = ../../build/Debug/VLCKit.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, CC786BB41715AAB50024EDC0 /* VLCKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( 7D32D665183E36A000EA4C8B /* GradientBackgroundView.h */, 7D32D666183E36A000EA4C8B /* GradientBackgroundView.m */, 633302780BD24CDB00193D7D /* Controller.h */, 633302790BD24CDB00193D7D /* Controller.m */, ); name = Classes; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( CC786BB31715AAB50024EDC0 /* VLCKit.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* FlashVideoDownloader.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* test */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = test; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 32CA4F630368D1EE00C91783 /* FlashVideoDownloader_Prefix.pch */, 29B97316FDCFA39411CA2CEA /* main.m */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 8D1107310486CEB800E47090 /* Info.plist */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D1107260486CEB800E47090 /* FlashVideoDownloader */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "FlashVideoDownloader" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, 7D7AF4E3183A8132003CF2E3 /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = FlashVideoDownloader; productInstallPath = "$(HOME)/Applications"; productName = test; productReference = 8D1107320486CEB800E47090 /* FlashVideoDownloader.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "FlashVideoDownloader" */; compatibilityVersion = "Xcode 2.4"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, ); mainGroup = 29B97314FDCFA39411CA2CEA /* test */; projectDirPath = ""; projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* FlashVideoDownloader */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072D0486CEB800E47090 /* main.m in Sources */, 7D32D667183E36A000EA4C8B /* GradientBackgroundView.m in Sources */, 6333027B0BD24CDB00193D7D /* Controller.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C165DFE840E0CC02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( 29B97319FDCFA39411CA2CEA /* English */, ); name = MainMenu.nib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../build/Debug\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_FLAGS_LIBINTL = "-dylib_file @loader_path/../lib/vlc_libintl.dylib:$(VLC_FRAMEWORK)/lib/vlc_libintl.dylib"; LD_FLAGS_LIBVLC = "-dylib_file @loader_path/lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib"; LD_FLAGS_LIBVLC_CONTROL = "-dylib_file @loader_path/lib/libvlc-control.dylib:$(VLC_FRAMEWORK)/lib/libvlc-control.dylib"; OTHER_LDFLAGS = ( "$(LD_FLAGS_LIBINTL)", "$(LD_FLAGS_LIBVLC)", "$(LD_FLAGS_LIBVLC_CONTROL)", ); PRODUCT_NAME = FlashVideoDownloader; SDKROOT = ""; SYMROOT = ../../build; VLC_FRAMEWORK = "$(TARGET_BUILD_DIR)/VLC.framework"; WRAPPER_EXTENSION = app; ZERO_LINK = YES; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../build/Debug\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_FLAGS_LIBINTL = "-dylib_file @loader_path/../lib/vlc_libintl.dylib:$(VLC_FRAMEWORK)/lib/vlc_libintl.dylib"; LD_FLAGS_LIBVLC = "-dylib_file @loader_path/lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib"; LD_FLAGS_LIBVLC_CONTROL = "-dylib_file @loader_path/lib/libvlc-control.dylib:$(VLC_FRAMEWORK)/lib/libvlc-control.dylib"; OTHER_LDFLAGS = ( "$(LD_FLAGS_LIBINTL)", "$(LD_FLAGS_LIBVLC)", "$(LD_FLAGS_LIBVLC_CONTROL)", ); PRODUCT_NAME = FlashVideoDownloader; SDKROOT = ""; SYMROOT = ../../build; VLC_FRAMEWORK = "$(TARGET_BUILD_DIR)/VLC.framework"; WRAPPER_EXTENSION = app; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH)"; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "FlashVideoDownloader" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "FlashVideoDownloader" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } Examples_OSX/FlashVideoDownloader/FlashVideoDownloader_Prefix.pch000066400000000000000000000002131250240207200254720ustar00rootroot00000000000000// // Prefix header for all source files of the 'test' target in the 'test' project // #ifdef __OBJC__ #import #endif Examples_OSX/FlashVideoDownloader/GradientBackgroundView.h000066400000000000000000000022671250240207200241720ustar00rootroot00000000000000/***************************************************************************** * FlashVideoDownloader: GradientBackgroundView ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @interface GradientBackgroundView : NSImageView { } @end Examples_OSX/FlashVideoDownloader/GradientBackgroundView.m000066400000000000000000000037301250240207200241730ustar00rootroot00000000000000/***************************************************************************** * FlashVideoDownloader: GradientBackgroundView.m ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "GradientBackgroundView.h" /********************************************************** * Why not drawing something nice? */ @implementation GradientBackgroundView - (void)awakeFromNib { /* Buggy nib files... Force us to be on the back of the view hierarchy */ NSView * superView; [self retain]; superView = [self superview]; [self removeFromSuperview]; [superView addSubview:self positioned: NSWindowBelow relativeTo:nil]; } - (void)drawRect:(NSRect)rect { NSColor * topGradient = [NSColor colorWithCalibratedWhite:.12f alpha:1.0]; NSColor * bottomGradient = [NSColor colorWithCalibratedWhite:0.55f alpha:0.9]; NSGradient * gradient = [[NSGradient alloc] initWithColorsAndLocations:bottomGradient, 0.f, bottomGradient, 0.1f, topGradient, 1.f, nil]; [gradient drawInRect:self.bounds angle:90.0]; [super drawRect:rect]; } @end Examples_OSX/FlashVideoDownloader/Info.plist000066400000000000000000000015311250240207200213720ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable Flash Video Downloader CFBundleIconFile CFBundleIdentifier org.videolan.flashvideodownloader CFBundleInfoDictionaryVersion 6.0 CFBundleName Flash Video Downloader CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 1.0 NSMainNibFile MainMenu NSPrincipalClass NSApplication Examples_OSX/FlashVideoDownloader/main.m000066400000000000000000000023721250240207200205300ustar00rootroot00000000000000/***************************************************************************** * FlashVideoDownloader: main file ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import #include int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } Examples_OSX/iPodConverter/000077500000000000000000000000001250240207200161425ustar00rootroot00000000000000Examples_OSX/iPodConverter/Controller.h000066400000000000000000000034051250240207200204400ustar00rootroot00000000000000/***************************************************************************** * iPodConverter: Controller ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import #import @interface Controller : NSObject { IBOutlet NSView * conversionView; IBOutlet NSWindow * window; IBOutlet NSButton * openConvertedFileButton; NSNumber * selectedStreamOutput; VLCMedia * media; VLCStreamSession * streamSession; } - (void)awakeFromNib; @property (retain) VLCMedia * media; @property (retain) VLCStreamSession * streamSession; @property (assign) NSNumber * selectedStreamOutput; @property (retain,readonly) NSString * outputFilePath; - (IBAction)convert:(id)sender; - (IBAction)openConvertedFile:(id)sender; - (IBAction)openConvertedEnclosingFolder:(id)sender; @end Examples_OSX/iPodConverter/Controller.m000066400000000000000000000124401250240207200204440ustar00rootroot00000000000000/***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "Controller.h" /********************************************************** * First off, some value transformer to easily play with * bindings */ @interface VLCFloat10000FoldTransformer : NSObject @end @implementation VLCFloat10000FoldTransformer + (Class)transformedValueClass { return [NSNumber class]; } + (BOOL)allowsReverseTransformation { return YES; } - (id)transformedValue:(id)value { if( !value ) return nil; if(![value respondsToSelector: @selector(floatValue)]) { [NSException raise: NSInternalInconsistencyException format: @"Value (%@) does not respond to -floatValue.", [value class]]; return nil; } return [NSNumber numberWithFloat: [value floatValue]*10000.]; } - (id)reverseTransformedValue:(id)value { if( !value ) return nil; if(![value respondsToSelector: @selector(floatValue)]) { [NSException raise: NSInternalInconsistencyException format: @"Value (%@) does not respond to -floatValue.", [value class]]; return nil; } return [NSNumber numberWithFloat: [value floatValue]/10000.]; } @end /********************************************************** * @implementation Controller */ @implementation Controller - (id)init { if(self = [super init]) { VLCFloat10000FoldTransformer *float100fold; float100fold = [[[VLCFloat10000FoldTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer:(id)float100fold forName:@"Float10000FoldTransformer"]; self.media = nil; self.streamSession = nil; selectedStreamOutput = [[NSNumber alloc] initWithInt:0]; } return self; } @synthesize streamSession; @synthesize selectedStreamOutput; - (void)awakeFromNib { [window setShowsResizeIndicator:NO]; [NSApp setDelegate: self]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [VLCLibrary sharedLibrary]; } - (VLCMedia *)media { return media; } - (void)setMedia:(VLCMedia *)newMedia { [media release]; media = [newMedia retain]; NSRect newFrame = [window frameRectForContentRect:[conversionView frame]]; [[window animator] setFrame:NSMakeRect([window frame].origin.x, [window frame].origin.y+NSHeight([window frame])-NSHeight(newFrame), NSWidth(newFrame), NSHeight(newFrame)) display:YES]; [[window animator] setContentView:conversionView]; [window setMinSize:newFrame.size]; [window setMaxSize:NSMakeSize(10000., NSHeight(newFrame))]; [window setShowsResizeIndicator:YES]; } + (NSSet *)keyPathsForValuesAffectingOutputFilePath { return [NSSet setWithObjects:@"media.metaDictionary.title", nil]; } - (NSString *)outputFilePath { return [NSString stringWithFormat:[@"~/Movies/%@.mp4" stringByExpandingTildeInPath], [[[self.media metaDictionary] objectForKey:@"title"] stringByDeletingPathExtension]]; } - (IBAction)convert:(id)sender { self.streamSession = [VLCStreamSession streamSession]; if([selectedStreamOutput intValue] == 0) { [self.streamSession setStreamOutput: [VLCStreamOutput ipodStreamOutputWithFilePath: [self outputFilePath] ]]; } else { /* This doesn't really is useful for the iPod/iPhone... * But one day we'll figure that out */ NSRunAlertPanelRelativeToWindow(@"Warning", @"We can't really stream to the iPod/iPhone for now...\n\nSo we're just streaming using the RTP protocol, and annoucing it via SAP.\n\n(Launch the SAP VLC service discovery module to see it).", @"OK", nil, nil, window); [self.streamSession setStreamOutput: [VLCStreamOutput rtpBroadcastStreamOutput]]; } NSLog(@"Using %@", self.streamSession.streamOutput ); [self.streamSession setMedia:self.media]; [self.streamSession startStreaming]; [openConvertedFileButton setImage:[[NSWorkspace sharedWorkspace] iconForFile:[self outputFilePath]]]; } - (IBAction)openConvertedFile:(id)sender { [[NSWorkspace sharedWorkspace] openFile:[self outputFilePath]]; } - (IBAction)openConvertedEnclosingFolder:(id)sender { [[NSWorkspace sharedWorkspace] openFile:[[self outputFilePath] stringByDeletingLastPathComponent]]; } @end Examples_OSX/iPodConverter/English.lproj/000077500000000000000000000000001250240207200206605ustar00rootroot00000000000000Examples_OSX/iPodConverter/English.lproj/InfoPlist.strings000066400000000000000000000003121250240207200241760ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ NSHumanReadableCopyright = " __MyCompanyName__, 2007";Examples_OSX/iPodConverter/English.lproj/MainMenu.nib/000077500000000000000000000000001250240207200231405ustar00rootroot00000000000000Examples_OSX/iPodConverter/English.lproj/MainMenu.nib/classes.nib000066400000000000000000000027551250240207200253000ustar00rootroot00000000000000 IBClasses CLASS GradientBackgroundView LANGUAGE ObjC SUPERCLASS NSImageView CLASS FirstResponder LANGUAGE ObjC SUPERCLASS NSObject ACTIONS convert id openConvertedEnclosingFolder id openConvertedFile id CLASS Controller LANGUAGE ObjC OUTLETS conversionView NSView openConvertedFileButton NSButton window NSWindow SUPERCLASS NSObject CLASS MovieReceiver LANGUAGE ObjC OUTLETS controller Controller SUPERCLASS NSView IBVersion 1 Examples_OSX/iPodConverter/English.lproj/MainMenu.nib/info.nib000066400000000000000000000010631250240207200245650ustar00rootroot00000000000000 IBFramework Version 629 IBLastKnownRelativeProjectPath ../../iPodConverter.xcodeproj IBOldestOS 5 IBOpenObjects 317 IBSystem Version 9B18 targetFramework IBCocoaFramework Examples_OSX/iPodConverter/English.lproj/MainMenu.nib/keyedobjects.nib000066400000000000000000000617651250240207200263240ustar00rootroot00000000000000bplist00 X$versionT$topY$archiverX$objects]IB.objectdata_NSKeyedArchiver 159@CDIabcdgqv-2349:;>BCFGKOV[\]ahijkov{|}  #$%&'()*58;CDETVYZ]efmnsw $%./2;<BDLMYZ^_ghqr stw{ "#$(/015<=>BIJKLPWXYZ_`dklmnsty '/0128?GPXY1cmnop~ ()/678ADS\enoqyz C ")2348<8?ANOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 3  S                            !] " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A D G JU$null  !"#$%&'()*+,-./0VNSRootV$class]NSObjectsKeys_NSClassesValues_NSAccessibilityOidsValues]NSConnections[NSNamesKeys[NSFramework]NSClassesKeysZNSOidsKeys]NSNamesValues_NSAccessibilityConnectors]NSFontManager_NSVisibleWindows_NSObjectsValues_NSAccessibilityOidsKeysYNSNextOid\NSOidsValuesh,B234[NSClassName678YNS.string]NSApplication:;<=X$classesZ$classname=>?_NSMutableStringXNSStringXNSObject:;ABB?^NSCustomObject_IBCocoaFrameworkEFGZNS.objects+HJKLMNOPQRSTUVWXYZ[\]^_`\NSWindowView\NSScreenRect]NSWindowTitleYNSWTFlags]NSWindowClass\NSWindowRectYNSMaxSize_NSWindowBacking_NSWindowStyleMaskYNSMinSize[NSViewClass *' px )( _{{227, 551}, {446, 106}}_Movie ConverterXNSWindow67fTViewhijk+mnop_NSNextResponderZNSSubviewsXNSvFlags[NSFrameSize&%Ers$tuhwj2xUz{|}UWNSFrame[NSSuperview ! _{{7, 8}, {433, 92}}]MovieReceiver:;?\NSCustomViewVNSView[NSResponderhwjxUUVNSCellYNSEnabled # _{{117, 46}, {192, 17}}u[NSCellFlags_NSBackgroundColorZNSContentsYNSSupport]NSControlView\NSCellFlags2[NSTextColor@"@_Drag a movie to convert here.VNSSizeVNSNameXNSfFlags#@*\LucidaGrande:;?VNSFontWNSColor\NSColorSpace[NSColorName]NSCatalogNameVSystem\controlColorWNSWhiteK0.66666669:;?! _controlTextColorɀB0:;̤?_NSTextFieldCell\NSActionCell:;Х?[NSTextFieldYNSControl:;ԣ?^NSMutableArrayWNSArrayZ{446, 106}:;?_{{0, 0}, {1280, 778}}Z{213, 129}_{3.40282e+38, 3.40282e+38}:;ޢ?_NSWindowTemplate:;?\NSMutableSetUNSSetEr$1     -;@EJOUZ`dinʀπӀـހ "$&,18DILNRWX[_dXNSSourceWNSLabel:.9 !"#$%&'()*+,WNSTitle_NSKeyEquivModMaskZNSKeyEquiv]NSMnemonicLocYNSOnImage\NSMixedImageVNSMenu80126/./01[NSMenuItemsVDeleteP25678^NSResourceName534WNSImage_NSMenuCheckmark:;<==?_NSCustomResource2567A537_NSMenuMixedState:;DEE?ZNSMenuItemWdelete::;HIIJ?_NSNibControlConnector^NSNibConnectorMN:126=./XYZZClear Menu_clearRecentDocuments:_`:AD !"#$%c'd)*+,8BC26/TCopyQcUcopy:mn:FI !"#$%q'()*+u8H126G./xyz_Bring All to Front_arrangeInFront::KN !"#$%')*+,8LM26/ZSelect AllQaZselectAll:]NSDestination:PT !"#$%')*+8RS26Q./_Hide NewApplicationQhUhide::VY !"#$%')*+8WX26Q_Quit NewApplicationQqZterminate::[_ !"#$%')*+8]^26\./z|^Check SpellingQ;^checkSpelling:ŀ:ac !"#$%)*+8bS26Q[Hide Others_hideOtherApplications:Ӏ:eh !"#$%')*+,8fg26/SCutQxTcut::jm !"#$%')*+,8kl26/UPasteQvVpaste:ɀqo23pZControllerhijkc2xzrsŀrǀEr$    thwjcxZNSEditable[NSDragTypesq| }u rqEF+ !"vwxyz{_Apple PDF pasteboard type_Apple PNG pasteboard type_NSFilenamesPboardType_1NeXT Encapsulated PostScript v1.2 pasteboard type_NeXT TIFF v4.0 pasteboard type_Apple PICT pasteboard type_{{17, 17}, {158, 157}}+,-./0123WNSStyleWNSAlignWNSScaleZNSAnimates~ :;677?[NSImageCell:;9::?[NSImageViewhwjc2xz>?Aq rq_{{0, 142}, {528, 44}}_GradientBackgroundViewhwFGjcHxIKLMNOQSZNSMaxValueZNSMinValueYNSpiFlags\NSDrawMatrixq#@È#@4 r@qU:;WXX?ZNSPSMatrix_{{207, 16}, {283, 20}}:;[\\?_NSProgressIndicatorhwjcx`a?q# rq_{{197, 151}, {301, 27}}hijh"[Media Titlepr#@6t1vUNSRGBF1 1 1hwjcxz{?q# rq_{{206, 57}, {285, 17}}"]Converting...hwjcx]2YNSBoxType[NSTitleCell]NSTransparent\NSBorderTypeYNSOffsets_NSTitlePositionqrq_{{173, 140}, {355, 5}}V{0, 0}2"SBox_textBackgroundColorB1M0 0.80000001:;?UNSBoxhwjcxq rq_{{402, 81}, {96, 32}}(_NSAlternateContents_NSPeriodicInterval^NSButtonFlags2_NSKeyEquivalent_NSPeriodicDelay]NSButtonFlags1@VDo it!Q :;Ϥ?\NSButtonCell:;ҥ?XNSButtonhwjcxq rq_{{206, 84}, {190, 26}}E$](1(1_NSMenuItemRespectAlignment_NSArrowPosition_NSPreferredEdge_NSUsesItemFromMenu]NSAltersStateA@ 1K1 @ !"#$%'()*+1XNSTargetXNSActionWNSState8126./_Convert to iPod Movie__popUpItemAction:ZOtherViewsEr$ !"#$% '()*+8126^Stream to iPod:;$$?:;?_NSPopUpButtonCell^NSMenuItemCell:;?]NSPopUpButtonhwjcx q# rq_{{55, 92}, {76, 17}}&) -_NSDrawsBackground" ZNo Artworkt11O!0.48913044 0.48913044 0.48913044hwjcx]562qrq_{{0, 140}, {18, 5}}2A"hwjcxGHq rq_{{456, 19}, {32, 25}}NO(RS(U X]NSNormalImage11@^Round Textured2567]53_NSRevealFreestandingTemplatehwjcxbcq€ rq_{{209, 19}, {248, 25}}(k(m p1b1Ā@_Open my newly converted MovieZ{528, 186}^conversionView:;uvvJ?_NSNibOutletConnectoryz:ˀ !"#$%}~)*+,8̀̀26/_Paste and Match StyleQV_pasteAsPlainText::Ѐ !"#$%'()*+u8р126GTZoom\performZoom::Ԁ !"#$%')*+UNSTag8ր׀26./]Find PreviousQG_performFindPanelAction::ڀ !"#$%')*+,8ۀ܀26/TRedoQZUredo::߀ !"#$%')*+u826GXMinimizeQm_performMiniaturize:tŀɀoZcontrollerˀ:oXconvert:: !"#$%')*+؀826_Use Selection for FindQeހ: !"#$%')*+826./逯kPage Setup &QP^runPageLayout:: !"#$%')*+826fPrint &QpVprint:: !"#$%')*+826_Jump to SelectionQj_centerSelectionInVisibleArea:  : !"#$%()*+8126Q_About NewApplication_orderFrontStandardAboutPanel:: !"#$%'()*+8126\_Check Spelling as You Type_toggleContinuousSpellChecking:&: !"#$%*'+)*+1826eFind &Qf3: !"#$%7'8)*+]8  26YFind NextQg@A:  !"#$%D'E)*+8 26UCloseQw]performClose:NO: !"#$%R'S)*+,826/TUndoQzUundo:H^ɀoVwindowbc: !"#$%f'g)*+826\iSpelling &Q:_showGuessPanel: r:o_openConvertedEnclosingFolder:wx:! !"#$%{'()*+8 126QXShow All_unhideAllApplications: :o#_openConvertedFile: ɀo%_openConvertedFileButton:'+ !"#$%')*+8)*26(./oq_NewApplication HelpQ?YshowHelp:]YNSKeyPathYNSBinding_NSNibBindingConnectorVersion0o/.t-_#value: media.metaDictionary.artworkUvalue_media.metaDictionary.artwork:;J?_NSNibBindingConnector]YNSOptions0o3.24_value: streamSession.position_streamSession.positionEWNS.keys756_NSValueTransformerName_Float10000FoldTransformer:;Ƣ?\NSDictionary ]0o/:9;_$hidden: media.metaDictionary.artworkVhiddenEځ7ف<=5>?@ہABCAAA_NSNullPlaceholder_NSRaisesForNotApplicableKeys_NSNotApplicablePlaceholder_NSNoSelectionPlaceholder_NSMultipleValuesPlaceholder WNSIsNil ]0oF:EG_ hidden: streamSession.isComplete_streamSession.isCompleteE75H_NSNegateBoolean]0oK.J_ value: streamSession.description_streamSession.description  ]0oF:EME 75Hu]0oP.OQ_!value: media.metaDictionary.title_media.metaDictionary.titleE"7ف<>?@*+-.]0oUTSV_enabled: streamSessionWenabled]streamSessionE4675݁C]0oP.O*+-F]0oUTSYEIL7=5M݁ZC*VW]0oU:\]_hidden: streamSessionE[_7=<5Ma݁Z^Cdghkl]_NSPreviousConnector0oba[`c_ hidden2: streamSession.isPlayingWhidden2_streamSession.isPlayingErx7ف<5>?@ہAHAAA]0ogfe_#selectedIndex: selectedStreamOutput]selectedIndex_selectedStreamOutputEVHu& b,M mU U tuy@3N w_ijPm߀ځerЁyq}/:;@բ?ECVUu,,u,U,uu,,,,HU,,,,Q QՀQnG/\/QG/qQ\=QQ/qqqGՀG/q(\nQq//q/q mՀ/Qqnnq/ՁyQr/qQՁnq퀣/EWHu b,&M mU U tuy@ N3w_iqjm߀PڀrЀey}/?@ABCDEFGHIJKLMÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁p     [Separator-1\File's Owner[Custom View_+Static Text (Drag a movie to convert here.)oMenu Item (Preferences &)_Menu Item (Help)_Menu Item (Minimize)_Menu Item (Hide NewApplication)_Menu Item (Redo)oMenu Item (Page Setup &)_Menu Item (Services)_Menu Item (Zoom)_&Square (Open my newly converted Movie)_Menu Item (Cut)_Menu Item (Spelling)_Menu Item (Save)_&Menu Item (Check Spelling as You Type)[Separator-2oMenu Item (Spelling &)[Menu (Edit)oMenu Item (Find &)_Menu Item (Clear Menu)_ Menu Item (About NewApplication)_Menu Item (Quit NewApplication)_Menu Item (Find)_Static Text (Media Title)_$Popup Button (Convert to iPod Movie)_Horizontal Line_Menu Item (Bring All to Front)[Separator-5YSeparator_"Menu Item (Use Selection for Find)_Static Text (Converting...)_!Menu Item (Convert to iPod Movie)_Menu Item (NewApplication Help)_Menu (Open Recent)_Menu Item (Window)_Horizontal Progress Indicator_Square (Round Textured)_Menu Item (Hide Others)_Menu Item (Paste)[Separator-6_Menu Item (Check Spelling)_Menu Item (Select All)_Menu Item (Open Recent)\Content View_Static Text (No Artwork)[Menu (Find)_Menu Item (Open...)[Menu (Help)^Movie Receiver]Menu (Window)_Menu (NewApplication)_!Menu Item (Paste and Match Style)_Menu Item (New)_Menu Item (Jump to Selection)[Separator-7_Gradient Background View[Separator-3_Shared User Defaults Controller_Menu Item (Edit)_Menu Item (NewApplication)_Menu Item (Close)oMenu Item (Save As &)ZImage Well_Menu Item (Delete)[Application[Separator-8_Menu (Spelling)[Menu (File)_Menu Item (Stream to iPod)_Horizontal Line-1[Separator-4oMenu Item (Print &)_Menu Item (Undo)_Menu (Services)_Menu Item (Find Next)_Push Button (Do it!)_Menu Item (Show All)_Menu Item (File)_Menu Item (Find Previous)_Menu Item (Revert)_Menu (OtherViews)_Menu Item (Copy)EEEH&  b,M   tu @3N w_u  mU Uy ijڀqE&yЀ@/O`<RdjՀDGo[1Z; ʀX\-uԀAWPm߀Ӏer8}J",dVNnFn$'=[aށK LIQ(ˁ_tπ.iف񀜀UE 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~A='z4~:WpQ?AH=qIN@3wgM?Xa_\d>o}2%|<W9jRuOP8>JQVfSpcEr C$E FE I:; K L L?^NSIBObjectData"'1:?DRTf -IWco} !$&)+.1479;>ADGP\^`isuGTaoy  " + 4 6 ; P b m v    % 1 N U _ a c e g j k m        9 J Q X a c l n q ~    # ( = ? A C E X e g j s |   * G P U h q x    !#%')+-0369<?BEHKNQTWZ]`cfiloru !#0<>ADKLYhjlnv'468:[]_acegxz}')+-/13DFILOdv "358;>TV\moqsu)+:KMOQStvx})+-/135;=DUWY[]fhju #%')*,.1246?ANPRTVXZv5RZbjuz|~HS^huwy{!#$&(Bcegikmo{!#%')+9jt  +-/13IVX[hjx2ASesuwy{}j"+4<>@BDFHJLY[]_w *9BO]~&WY[]_`bdf| - ; D F H J L N P R T ] l y { }  !!!!!! !"!$!-!M!X!g!p!w!!!!!!!!!!!!!!!" " " ""0"2"4"6"8":"<"A"N"["]"_"a"""""""""""""""""""# # ########$#1#3#5#7#X#Z#\#^#`#b#d#m#o#################$$$$ $ $ $$$*$,$9$;$=$?$`$b$d$f$h$j$l$y${$~$$$$$$$$$$$$$$$$$$% %%%%3%5%7%9%;%=%?%S%U%u%%%%%%%%%%%%%%%%&&&$&&&)&+&-&/&1&N&o&|&~&&&&&&&&&&&&&&&&&''''' '''#'%'('+'L'N'Q'T'V'X'Z'`'b'p'}'''''''''''''''''''''''(((( ("($(&(9(;(M(^(`(b(d(g((((((((((((((()))) ) )!)2)4)6)8);)U)b)d)g)j))))))))))))))))**!*$*&*)*,*.*1*W*]*|************+++(+0+3+6+9+<+?+X+t+}+++++++++++++,,,,,,,, ,-,0,3,6,9,<,?,S,r,,,,,,,,----- --1-L-Y-\-_-b-e-h-z---------.. . ......'.*.-.0.3.6.W.Z.\._.b.d.g.j..............//// / ////./6/D/Q/T/W/Z/]/`/}///////////////////////0 0 000000040A0D0K0N0Q0T0[0^0a0d000000000000011 11111!1$1/1215181;1>1[1^1`1c1f1h1k111112q2t2v2x2{2~22222222222222222222222222222222222222222222222222222233333 33333333 3"3%3'3*3-3/313436393;3>3@3B3k3y333333333333333333444444444"4%46484;4>4A4F4U4^4`4c4f4444444444444444444445555 5"5$5&5(5+545=5?5F5I5K5N5o5q5t5w5y5{5}5555555555555555555555556666 6 6567696:6<6=6?6A6C6l6n6p6q6s6t6v6x6z6666666666666666666666677 7 7777>7@7B7E7G7I7K7N7Q7`7i7k7777777777777777777777888888 8 8 88C8E8G8J8L8N8P8S8V8[8d8f8o8q888888888888888888888889999 9 999>9@9B9E9G9I9K9M9P9\9e9g9p9r9u9w99999999999999999:: :&:(:+:-:/:1:3:::c:e:g:h:j:k:m:o:q:::::::::::::::::::::;;;;;;;;A;C;E;F;H;I;K;M;O;^;j;s;;;;;;;;;;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===== = ========= =#=&=(=*=,=.=0=2=5=8=:=<=?=A=C=E=G=I=L=N=P=R=T=]=`>>>>>>>>">$>&>(>*>->/>1>3>6>9><>?>B>D>G>I>K>M>P>R>T>W>Y>[>^>a>c>e>g>j>l>o>q>s>u>w>z>|>~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>????????????????????????????????@@@@ @ @@@@@@@"@%@(@+@.@1@4@7@:@=@@@C@F@H@K@N@Q@T@W@Z@]@`@c@f@i@l@o@r@u@x@{@~@@@@@@@@@@@@@@@@@A+A>AUAwAAAABB B7BJBsBBBBBCC;CNCjCCCCCCDDADcDxDDDDDEEE7EQE^EyEEEEEEFFF2F>FYFeFFFFFGGG"G.G@GLGiG}GGGGGHHH.HJH_HsHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJ J JJJJJJJJ J#J%J'J)J+J.J0J2J5J8J;J=J?JAJDJFJIJLJNJQJSJUJXJ[J]J`JbJeJgJiJlJnJpJsJvJyJ|J~JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKKKK K KKL+L.L1L4L7L:L=L@LCLFLILLLOLRLULXL[L^LaLdLgLjLmLpLsLvLyL|LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMM M MMMMMMM!M$M'M*M-M0M3M6M9M @interface GradientBackgroundView : NSImageView { } @end Examples_OSX/iPodConverter/GradientBackgroundView.m000066400000000000000000000035271250240207200227170ustar00rootroot00000000000000/***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "GradientBackgroundView.h" /********************************************************** * Why not drawing something nice? */ @implementation GradientBackgroundView - (void)awakeFromNib { /* Buggy nib files... Force us to be on the back of the view hierarchy */ NSView * superView; [self retain]; superView = [self superview]; [self removeFromSuperview]; [superView addSubview:self positioned: NSWindowBelow relativeTo:nil]; } - (void)drawRect:(NSRect)rect { NSColor * topGradient = [NSColor colorWithCalibratedWhite:.12f alpha:1.0]; NSColor * bottomGradient = [NSColor colorWithCalibratedWhite:0.55f alpha:0.9]; NSGradient * gradient = [[NSGradient alloc] initWithColorsAndLocations:bottomGradient, 0.f, bottomGradient, 0.1f, topGradient, 1.f, nil]; [gradient drawInRect:self.bounds angle:90.0]; [super drawRect:rect]; } @end Examples_OSX/iPodConverter/Info.plist000066400000000000000000000015021250240207200201100ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable iPodConverter CFBundleIconFile CFBundleIdentifier org.videolan.ipodconverter CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 1.0 NSMainNibFile MainMenu NSPrincipalClass NSApplication Examples_OSX/iPodConverter/MovieReceiver.h000066400000000000000000000023241250240207200210600ustar00rootroot00000000000000/***************************************************************************** * iPodConverter: MovieReceiver ***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "Controller.h" @interface MovieReceiver : NSView { IBOutlet Controller * controller; } @end Examples_OSX/iPodConverter/MovieReceiver.m000066400000000000000000000036301250240207200210660ustar00rootroot00000000000000/***************************************************************************** * iPodConverter: MovieReceiver.m ***************************************************************************** * Copyright (C) 2007-2013 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "MovieReceiver.h" /********************************************************** * This handles drag-and-drop in the main window */ @implementation MovieReceiver - (void)awakeFromNib { [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSURLPboardType, nil]]; } - (NSDragOperation)draggingEntered:(id )sender { return NSDragOperationGeneric; } - (BOOL)performDragOperation:(id )sender { NSPasteboard *pboard = [sender draggingPasteboard]; if ( [[pboard types] containsObject:NSFilenamesPboardType] ) { NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; for( NSString * filename in files ) { [controller setMedia:[VLCMedia mediaWithPath:filename]]; } } return YES; } @end Examples_OSX/iPodConverter/iPodConverter.xcodeproj/000077500000000000000000000000001250240207200227215ustar00rootroot00000000000000Examples_OSX/iPodConverter/iPodConverter.xcodeproj/project.pbxproj000066400000000000000000000345611250240207200260060ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 6333027B0BD24CDB00193D7D /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = 633302790BD24CDB00193D7D /* Controller.m */; }; 7DAE7546183A7DCC00ED6F89 /* VLCKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CC786BB31715AAB50024EDC0 /* VLCKit.framework */; }; 7DD54F38183A749F004149F5 /* GradientBackgroundView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DD54F36183A749F004149F5 /* GradientBackgroundView.m */; }; 7DD54F39183A749F004149F5 /* MovieReceiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DD54F37183A749F004149F5 /* MovieReceiver.m */; }; 7DD54F3D183A74E9004149F5 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 7DD54F3B183A74E9004149F5 /* MainMenu.nib */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; CC786BB41715AAB50024EDC0 /* VLCKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC786BB31715AAB50024EDC0 /* VLCKit.framework */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 7DAE7545183A7DC200ED6F89 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 7DAE7546183A7DCC00ED6F89 /* VLCKit.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 633302780BD24CDB00193D7D /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; 633302790BD24CDB00193D7D /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Controller.m; sourceTree = ""; }; 7DD54F34183A749F004149F5 /* GradientBackgroundView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GradientBackgroundView.h; sourceTree = ""; }; 7DD54F35183A749F004149F5 /* MovieReceiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MovieReceiver.h; sourceTree = ""; }; 7DD54F36183A749F004149F5 /* GradientBackgroundView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GradientBackgroundView.m; sourceTree = ""; }; 7DD54F37183A749F004149F5 /* MovieReceiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MovieReceiver.m; sourceTree = ""; }; 7DD54F3A183A74A9004149F5 /* iPodConverter_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPodConverter_Prefix.pch; sourceTree = ""; }; 7DD54F3C183A74E9004149F5 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* iPodConverter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iPodConverter.app; sourceTree = BUILT_PRODUCTS_DIR; }; CC786BB31715AAB50024EDC0 /* VLCKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VLCKit.framework; path = ../../build/Debug/VLCKit.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, CC786BB41715AAB50024EDC0 /* VLCKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( 633302780BD24CDB00193D7D /* Controller.h */, 633302790BD24CDB00193D7D /* Controller.m */, 7DD54F35183A749F004149F5 /* MovieReceiver.h */, 7DD54F37183A749F004149F5 /* MovieReceiver.m */, 7DD54F34183A749F004149F5 /* GradientBackgroundView.h */, 7DD54F36183A749F004149F5 /* GradientBackgroundView.m */, ); name = Classes; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( CC786BB31715AAB50024EDC0 /* VLCKit.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* iPodConverter.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* test */ = { isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = test; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 7DD54F3A183A74A9004149F5 /* iPodConverter_Prefix.pch */, 29B97316FDCFA39411CA2CEA /* main.m */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 7DD54F3B183A74E9004149F5 /* MainMenu.nib */, 8D1107310486CEB800E47090 /* Info.plist */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D1107260486CEB800E47090 /* iPodConverter */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "iPodConverter" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, 7DAE7545183A7DC200ED6F89 /* CopyFiles */, ); buildRules = ( ); dependencies = ( ); name = iPodConverter; productInstallPath = "$(HOME)/Applications"; productName = test; productReference = 8D1107320486CEB800E47090 /* iPodConverter.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "iPodConverter" */; compatibilityVersion = "Xcode 2.4"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, English, ); mainGroup = 29B97314FDCFA39411CA2CEA /* test */; projectDirPath = ""; projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* iPodConverter */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 7DD54F3D183A74E9004149F5 /* MainMenu.nib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072D0486CEB800E47090 /* main.m in Sources */, 6333027B0BD24CDB00193D7D /* Controller.m in Sources */, 7DD54F38183A749F004149F5 /* GradientBackgroundView.m in Sources */, 7DD54F39183A749F004149F5 /* MovieReceiver.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C165DFE840E0CC02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; 7DD54F3B183A74E9004149F5 /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( 7DD54F3C183A74E9004149F5 /* English */, ); name = MainMenu.nib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../build/Debug\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_FLAGS_LIBINTL = "-dylib_file @loader_path/../lib/vlc_libintl.dylib:$(VLC_FRAMEWORK)/lib/vlc_libintl.dylib"; LD_FLAGS_LIBVLC = "-dylib_file @loader_path/lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib"; LD_FLAGS_LIBVLC_CONTROL = "-dylib_file @loader_path/lib/libvlc-control.dylib:$(VLC_FRAMEWORK)/lib/libvlc-control.dylib"; OTHER_LDFLAGS = ( "$(LD_FLAGS_LIBINTL)", "$(LD_FLAGS_LIBVLC)", "$(LD_FLAGS_LIBVLC_CONTROL)", ); PRODUCT_NAME = iPodConverter; SYMROOT = ../../build; VLC_FRAMEWORK = "$(TARGET_BUILD_DIR)/VLC.framework"; WRAPPER_EXTENSION = app; ZERO_LINK = YES; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH_ACTUAL)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)/../../build/Debug\""; GCC_C_LANGUAGE_STANDARD = c99; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LD_FLAGS_LIBINTL = "-dylib_file @loader_path/../lib/vlc_libintl.dylib:$(VLC_FRAMEWORK)/lib/vlc_libintl.dylib"; LD_FLAGS_LIBVLC = "-dylib_file @loader_path/lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(VLC_FRAMEWORK)/lib/libvlc.dylib"; LD_FLAGS_LIBVLC_CONTROL = "-dylib_file @loader_path/lib/libvlc-control.dylib:$(VLC_FRAMEWORK)/lib/libvlc-control.dylib"; OTHER_LDFLAGS = ( "$(LD_FLAGS_LIBINTL)", "$(LD_FLAGS_LIBVLC)", "$(LD_FLAGS_LIBVLC_CONTROL)", ); PRODUCT_NAME = iPodConverter; SYMROOT = ../../build; VLC_FRAMEWORK = "$(TARGET_BUILD_DIR)/VLC.framework"; WRAPPER_EXTENSION = app; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH)"; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; PREBINDING = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "iPodConverter" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "iPodConverter" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } Examples_OSX/iPodConverter/iPodConverter_Prefix.pch000066400000000000000000000002131250240207200227320ustar00rootroot00000000000000// // Prefix header for all source files of the 'test' target in the 'test' project // #ifdef __OBJC__ #import #endif Examples_OSX/iPodConverter/main.m000066400000000000000000000022101250240207200172370ustar00rootroot00000000000000/***************************************************************************** * Copyright (C) 2007-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import #include int main(int argc, char *argv[]) { return NSApplicationMain(argc, (const char **) argv); } Examples_iOS/000077500000000000000000000000001250240207200134005ustar00rootroot00000000000000Examples_iOS/DropIn-Player/000077500000000000000000000000001250240207200160255ustar00rootroot00000000000000Examples_iOS/DropIn-Player/Dropin-Player.xcodeproj/000077500000000000000000000000001250240207200225065ustar00rootroot00000000000000Examples_iOS/DropIn-Player/Dropin-Player.xcodeproj/project.pbxproj000066400000000000000000000534131250240207200255700ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 7D11B36A183BA71600FF0D25 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D11B369183BA71600FF0D25 /* UIKit.framework */; }; 7D11B36C183BA71600FF0D25 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D11B36B183BA71600FF0D25 /* Foundation.framework */; }; 7D8745B5183BA8F900FD09E0 /* libMobileVLCKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745B4183BA8F900FD09E0 /* libMobileVLCKit.a */; }; 7D8745B8183BABE800FD09E0 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745B6183BABE800FD09E0 /* AudioToolbox.framework */; }; 7D8745BB183BABEE00FD09E0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745BA183BABEE00FD09E0 /* OpenGLES.framework */; }; 7D8745BD183BAC0D00FD09E0 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745BC183BAC0D00FD09E0 /* CFNetwork.framework */; }; 7D8745BF183BAC1200FD09E0 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745BE183BAC1200FD09E0 /* CoreText.framework */; }; 7D8745C1183BAC2300FD09E0 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C0183BAC2300FD09E0 /* libbz2.dylib */; }; 7D8745C3183BAC2700FD09E0 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C2183BAC2700FD09E0 /* libiconv.dylib */; }; 7D8745C5183BAC3100FD09E0 /* libstdc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C4183BAC3100FD09E0 /* libstdc++.dylib */; }; 7D8745C7183BACAE00FD09E0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C6183BACAE00FD09E0 /* QuartzCore.framework */; }; 7D8745C8183BACBF00FD09E0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D11B36D183BA71600FF0D25 /* CoreGraphics.framework */; }; 7DEBFE68183BEA9E00BC53D5 /* VDLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DEBFE65183BEA9E00BC53D5 /* VDLAppDelegate.m */; }; 7DEBFE69183BEA9E00BC53D5 /* VDLPlaybackViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DEBFE67183BEA9E00BC53D5 /* VDLPlaybackViewController.m */; }; 7DEBFE6D183BEAB500BC53D5 /* VDLPlaybackViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7DEBFE6B183BEAB500BC53D5 /* VDLPlaybackViewController.xib */; }; 7DEBFE70183BEAC300BC53D5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7DEBFE6E183BEAC300BC53D5 /* InfoPlist.strings */; }; 7DEBFE77183BEAD500BC53D5 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DEBFE71183BEAD500BC53D5 /* Default-568h@2x.png */; }; 7DEBFE78183BEAD500BC53D5 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DEBFE72183BEAD500BC53D5 /* Default.png */; }; 7DEBFE79183BEAD500BC53D5 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7DEBFE73183BEAD500BC53D5 /* Default@2x.png */; }; 7DEBFE7B183BEAD500BC53D5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DEBFE76183BEAD500BC53D5 /* main.m */; }; 7DEBFE7F183BEE7500BC53D5 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DEBFE7E183BEE7500BC53D5 /* MediaPlayer.framework */; }; 7DEBFE81183BF0AA00BC53D5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DEBFE80183BF0AA00BC53D5 /* AVFoundation.framework */; }; 7DEBFE85183BFC6300BC53D5 /* VDLMainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DEBFE83183BFC6300BC53D5 /* VDLMainViewController.m */; }; 7DEBFE86183BFC6300BC53D5 /* VDLMainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7DEBFE84183BFC6300BC53D5 /* VDLMainViewController.xib */; }; D4771D93189848E70087441B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4771D92189848E70087441B /* Security.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 7D11B366183BA71600FF0D25 /* Dropin-Player.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Dropin-Player.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 7D11B369183BA71600FF0D25 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 7D11B36B183BA71600FF0D25 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 7D11B36D183BA71600FF0D25 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 7D8745B4183BA8F900FD09E0 /* libMobileVLCKit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libMobileVLCKit.a; path = "../../build/Release-iphonesimulator/libMobileVLCKit.a"; sourceTree = ""; }; 7D8745B6183BABE800FD09E0 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 7D8745B7183BABE800FD09E0 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 7D8745BA183BABEE00FD09E0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 7D8745BC183BAC0D00FD09E0 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 7D8745BE183BAC1200FD09E0 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 7D8745C0183BAC2300FD09E0 /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; }; 7D8745C2183BAC2700FD09E0 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; 7D8745C4183BAC3100FD09E0 /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; }; 7D8745C6183BACAE00FD09E0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 7DEBFE64183BEA9E00BC53D5 /* VDLAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VDLAppDelegate.h; path = "Dropin-Player/VDLAppDelegate.h"; sourceTree = SOURCE_ROOT; }; 7DEBFE65183BEA9E00BC53D5 /* VDLAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VDLAppDelegate.m; path = "Dropin-Player/VDLAppDelegate.m"; sourceTree = SOURCE_ROOT; }; 7DEBFE66183BEA9E00BC53D5 /* VDLPlaybackViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VDLPlaybackViewController.h; path = "Dropin-Player/VDLPlaybackViewController.h"; sourceTree = SOURCE_ROOT; }; 7DEBFE67183BEA9E00BC53D5 /* VDLPlaybackViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VDLPlaybackViewController.m; path = "Dropin-Player/VDLPlaybackViewController.m"; sourceTree = SOURCE_ROOT; }; 7DEBFE6C183BEAB500BC53D5 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = "Dropin-Player/en.lproj/VDLPlaybackViewController.xib"; sourceTree = SOURCE_ROOT; }; 7DEBFE6F183BEAC300BC53D5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = "Dropin-Player/en.lproj/InfoPlist.strings"; sourceTree = SOURCE_ROOT; }; 7DEBFE71183BEAD500BC53D5 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "Dropin-Player/Default-568h@2x.png"; sourceTree = SOURCE_ROOT; }; 7DEBFE72183BEAD500BC53D5 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = "Dropin-Player/Default.png"; sourceTree = SOURCE_ROOT; }; 7DEBFE73183BEAD500BC53D5 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Dropin-Player/Default@2x.png"; sourceTree = SOURCE_ROOT; }; 7DEBFE75183BEAD500BC53D5 /* Dropin-Player-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "Dropin-Player-Prefix.pch"; path = "Dropin-Player/Dropin-Player-Prefix.pch"; sourceTree = SOURCE_ROOT; }; 7DEBFE76183BEAD500BC53D5 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = "Dropin-Player/main.m"; sourceTree = SOURCE_ROOT; }; 7DEBFE7C183BECDE00BC53D5 /* Dropin-Player-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Dropin-Player-Info.plist"; path = "Dropin-Player/Dropin-Player-Info.plist"; sourceTree = SOURCE_ROOT; }; 7DEBFE7E183BEE7500BC53D5 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; 7DEBFE80183BF0AA00BC53D5 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 7DEBFE82183BFC6300BC53D5 /* VDLMainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VDLMainViewController.h; sourceTree = SOURCE_ROOT; }; 7DEBFE83183BFC6300BC53D5 /* VDLMainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VDLMainViewController.m; sourceTree = SOURCE_ROOT; }; 7DEBFE84183BFC6300BC53D5 /* VDLMainViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VDLMainViewController.xib; sourceTree = SOURCE_ROOT; }; D4771D92189848E70087441B /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 7D11B363183BA71600FF0D25 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D4771D93189848E70087441B /* Security.framework in Frameworks */, 7DEBFE81183BF0AA00BC53D5 /* AVFoundation.framework in Frameworks */, 7DEBFE7F183BEE7500BC53D5 /* MediaPlayer.framework in Frameworks */, 7D8745C8183BACBF00FD09E0 /* CoreGraphics.framework in Frameworks */, 7D8745C7183BACAE00FD09E0 /* QuartzCore.framework in Frameworks */, 7D8745C5183BAC3100FD09E0 /* libstdc++.dylib in Frameworks */, 7D8745C3183BAC2700FD09E0 /* libiconv.dylib in Frameworks */, 7D8745C1183BAC2300FD09E0 /* libbz2.dylib in Frameworks */, 7D8745BF183BAC1200FD09E0 /* CoreText.framework in Frameworks */, 7D8745BD183BAC0D00FD09E0 /* CFNetwork.framework in Frameworks */, 7D8745BB183BABEE00FD09E0 /* OpenGLES.framework in Frameworks */, 7D8745B8183BABE800FD09E0 /* AudioToolbox.framework in Frameworks */, 7D11B36A183BA71600FF0D25 /* UIKit.framework in Frameworks */, 7D11B36C183BA71600FF0D25 /* Foundation.framework in Frameworks */, 7D8745B5183BA8F900FD09E0 /* libMobileVLCKit.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 7D11B35D183BA71600FF0D25 = { isa = PBXGroup; children = ( 7D11B36F183BA71600FF0D25 /* Dropin-Player */, 7D11B368183BA71600FF0D25 /* Frameworks */, 7D11B367183BA71600FF0D25 /* Products */, ); sourceTree = ""; }; 7D11B367183BA71600FF0D25 /* Products */ = { isa = PBXGroup; children = ( 7D11B366183BA71600FF0D25 /* Dropin-Player.app */, ); name = Products; sourceTree = ""; }; 7D11B368183BA71600FF0D25 /* Frameworks */ = { isa = PBXGroup; children = ( D4771D92189848E70087441B /* Security.framework */, 7DEBFE80183BF0AA00BC53D5 /* AVFoundation.framework */, 7DEBFE7E183BEE7500BC53D5 /* MediaPlayer.framework */, 7D8745B4183BA8F900FD09E0 /* libMobileVLCKit.a */, 7D8745C6183BACAE00FD09E0 /* QuartzCore.framework */, 7D8745C4183BAC3100FD09E0 /* libstdc++.dylib */, 7D8745C2183BAC2700FD09E0 /* libiconv.dylib */, 7D8745C0183BAC2300FD09E0 /* libbz2.dylib */, 7D8745BE183BAC1200FD09E0 /* CoreText.framework */, 7D8745BC183BAC0D00FD09E0 /* CFNetwork.framework */, 7D8745BA183BABEE00FD09E0 /* OpenGLES.framework */, 7D8745B6183BABE800FD09E0 /* AudioToolbox.framework */, 7D8745B7183BABE800FD09E0 /* AudioUnit.framework */, 7D11B369183BA71600FF0D25 /* UIKit.framework */, 7D11B36B183BA71600FF0D25 /* Foundation.framework */, 7D11B36D183BA71600FF0D25 /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; 7D11B36F183BA71600FF0D25 /* Dropin-Player */ = { isa = PBXGroup; children = ( 7DEBFE64183BEA9E00BC53D5 /* VDLAppDelegate.h */, 7DEBFE65183BEA9E00BC53D5 /* VDLAppDelegate.m */, 7DEBFE82183BFC6300BC53D5 /* VDLMainViewController.h */, 7DEBFE83183BFC6300BC53D5 /* VDLMainViewController.m */, 7DEBFE84183BFC6300BC53D5 /* VDLMainViewController.xib */, 7DEBFE66183BEA9E00BC53D5 /* VDLPlaybackViewController.h */, 7DEBFE67183BEA9E00BC53D5 /* VDLPlaybackViewController.m */, 7DEBFE6B183BEAB500BC53D5 /* VDLPlaybackViewController.xib */, 7D11B370183BA71600FF0D25 /* Supporting Files */, ); name = "Dropin-Player"; path = SimplePlayback; sourceTree = ""; }; 7D11B370183BA71600FF0D25 /* Supporting Files */ = { isa = PBXGroup; children = ( 7DEBFE7C183BECDE00BC53D5 /* Dropin-Player-Info.plist */, 7DEBFE71183BEAD500BC53D5 /* Default-568h@2x.png */, 7DEBFE72183BEAD500BC53D5 /* Default.png */, 7DEBFE73183BEAD500BC53D5 /* Default@2x.png */, 7DEBFE75183BEAD500BC53D5 /* Dropin-Player-Prefix.pch */, 7DEBFE76183BEAD500BC53D5 /* main.m */, 7DEBFE6E183BEAC300BC53D5 /* InfoPlist.strings */, ); name = "Supporting Files"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 7D11B365183BA71600FF0D25 /* Dropin-Player */ = { isa = PBXNativeTarget; buildConfigurationList = 7D11B389183BA71600FF0D25 /* Build configuration list for PBXNativeTarget "Dropin-Player" */; buildPhases = ( 7D11B362183BA71600FF0D25 /* Sources */, 7D11B363183BA71600FF0D25 /* Frameworks */, 7D11B364183BA71600FF0D25 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = "Dropin-Player"; productName = SimplePlayback; productReference = 7D11B366183BA71600FF0D25 /* Dropin-Player.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 7D11B35E183BA71600FF0D25 /* Project object */ = { isa = PBXProject; attributes = { CLASSPREFIX = VDL; LastUpgradeCheck = 0500; ORGANIZATIONNAME = VideoLAN; }; buildConfigurationList = 7D11B361183BA71600FF0D25 /* Build configuration list for PBXProject "Dropin-Player" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 7D11B35D183BA71600FF0D25; productRefGroup = 7D11B367183BA71600FF0D25 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 7D11B365183BA71600FF0D25 /* Dropin-Player */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 7D11B364183BA71600FF0D25 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 7DEBFE70183BEAC300BC53D5 /* InfoPlist.strings in Resources */, 7DEBFE86183BFC6300BC53D5 /* VDLMainViewController.xib in Resources */, 7DEBFE6D183BEAB500BC53D5 /* VDLPlaybackViewController.xib in Resources */, 7DEBFE79183BEAD500BC53D5 /* Default@2x.png in Resources */, 7DEBFE77183BEAD500BC53D5 /* Default-568h@2x.png in Resources */, 7DEBFE78183BEAD500BC53D5 /* Default.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 7D11B362183BA71600FF0D25 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7DEBFE85183BFC6300BC53D5 /* VDLMainViewController.m in Sources */, 7DEBFE68183BEA9E00BC53D5 /* VDLAppDelegate.m in Sources */, 7DEBFE7B183BEAD500BC53D5 /* main.m in Sources */, 7DEBFE69183BEA9E00BC53D5 /* VDLPlaybackViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 7DEBFE6B183BEAB500BC53D5 /* VDLPlaybackViewController.xib */ = { isa = PBXVariantGroup; children = ( 7DEBFE6C183BEAB500BC53D5 /* en */, ); name = VDLPlaybackViewController.xib; sourceTree = ""; }; 7DEBFE6E183BEAC300BC53D5 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 7DEBFE6F183BEAC300BC53D5 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 7D11B387183BA71600FF0D25 /* 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; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; 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; IPHONEOS_DEPLOYMENT_TARGET = 6.1; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 7D11B388183BA71600FF0D25 /* 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; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; 7D11B38A183BA71600FF0D25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Dropin-Player/Dropin-Player-Prefix.pch"; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator/include\"", "\"$(SRCROOT)/../../build/Release-iphoneos/include\"", ); INFOPLIST_FILE = "Dropin-Player/Dropin-Player-Info.plist"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator\"", "\"$(SRCROOT)/../../build/Release-iphoneos\"", ); PRODUCT_NAME = "Dropin-Player"; WRAPPER_EXTENSION = app; }; name = Debug; }; 7D11B38B183BA71600FF0D25 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Dropin-Player/Dropin-Player-Prefix.pch"; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator/include\"", "\"$(SRCROOT)/../../build/Release-iphoneos/include\"", ); INFOPLIST_FILE = "Dropin-Player/Dropin-Player-Info.plist"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator\"", "\"$(SRCROOT)/../../build/Release-iphoneos\"", ); PRODUCT_NAME = "Dropin-Player"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 7D11B361183BA71600FF0D25 /* Build configuration list for PBXProject "Dropin-Player" */ = { isa = XCConfigurationList; buildConfigurations = ( 7D11B387183BA71600FF0D25 /* Debug */, 7D11B388183BA71600FF0D25 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7D11B389183BA71600FF0D25 /* Build configuration list for PBXNativeTarget "Dropin-Player" */ = { isa = XCConfigurationList; buildConfigurations = ( 7D11B38A183BA71600FF0D25 /* Debug */, 7D11B38B183BA71600FF0D25 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 7D11B35E183BA71600FF0D25 /* Project object */; } Examples_iOS/DropIn-Player/Dropin-Player/000077500000000000000000000000001250240207200205125ustar00rootroot00000000000000Examples_iOS/DropIn-Player/Dropin-Player/Default-568h@2x.png000066400000000000000000000442421250240207200236540ustar00rootroot00000000000000PNG  IHDRpz$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 640 1 1136 2012-07-27T15:07:06 Pixelmator 2.0.5 )q?7IDATx=eQqÙ87;;' RBR(JWw^8w<漏7 @^~:;;>9O @F{}w~|}}ޣ#@~<=9G p;*O_8>^#@ ƻZjLZ9:\oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 320 1 480 2012-07-27T15:07:80 Pixelmator 2.0.5 X="IDATxICQDDKIq/L {nov}y>(oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 640 1 960 2012-07-27T15:07:37 Pixelmator 2.0.5 PF5IDATx1e HH܎;qoV..Vb&a^p s3;i^;ޟy!@ <>_{x}~\_Wg @܆vW=̻o]yoλ͇ @vU>yO7ן}* p|W}w}5蛿CaW] @>FmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@W>0  @nVjLJޞy @ܞxޝ<x| @7$pߧ:yOߜ' @~y7O/> @!p[_4lIENDB`Examples_iOS/DropIn-Player/Dropin-Player/Dropin-Player-Info.plist000066400000000000000000000023201250240207200251420ustar00rootroot00000000000000 CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier org.videolan.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance Examples_iOS/DropIn-Player/Dropin-Player/Dropin-Player-Prefix.pch000066400000000000000000000027171250240207200251350ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import #import #import Examples_iOS/DropIn-Player/Dropin-Player/VDLAppDelegate.h000066400000000000000000000032141250240207200234040ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import @class VDLMainViewController; @interface VDLAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) VDLMainViewController *viewController; - (void)playStreamFromURL:(NSURL *)url; @end Examples_iOS/DropIn-Player/Dropin-Player/VDLAppDelegate.m000066400000000000000000000102171250240207200234120ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import "VDLAppDelegate.h" #import "VDLMainViewController.h" #import "VDLPlaybackViewController.h" @interface VDLAppDelegate () { VDLPlaybackViewController *_playbackViewController; } @end @implementation VDLAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.viewController = [[VDLMainViewController alloc] initWithNibName:nil bundle:nil]; self.window.rootViewController = self.viewController; /* load the playback VC we will inevitably need later */ _playbackViewController = [[VDLPlaybackViewController alloc] initWithNibName:nil bundle:nil]; [self.window makeKeyAndVisible]; 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:. } - (void)playStreamFromURL:(NSURL *)url { UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:_playbackViewController]; navCon.modalPresentationStyle = UIModalPresentationFullScreen; [self.window.rootViewController presentViewController:navCon animated:YES completion:nil]; [_playbackViewController playMediaFromURL:url]; } @end Examples_iOS/DropIn-Player/Dropin-Player/VDLPlaybackViewController.h000066400000000000000000000046631250240207200256670ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import #import @interface VDLPlaybackViewController : UIViewController @property (nonatomic, strong) IBOutlet UIView *movieView; @property (nonatomic, strong) IBOutlet UISlider *positionSlider; @property (nonatomic, strong) IBOutlet UIButton *timeDisplay; @property (nonatomic, strong) IBOutlet UIButton *playPauseButton; @property (nonatomic, strong) IBOutlet UIButton *subtitleSwitcherButton; @property (nonatomic, strong) IBOutlet UIButton *audioSwitcherButton; @property (nonatomic, strong) IBOutlet UINavigationBar *toolbar; @property (nonatomic, strong) IBOutlet UIView *controllerPanel; @property (nonatomic, strong) IBOutlet MPVolumeView *volumeView; - (void)playMediaFromURL:(NSURL*)theURL; - (IBAction)closePlayback:(id)sender; - (IBAction)positionSliderDrag:(id)sender; - (IBAction)positionSliderAction:(id)sender; - (IBAction)toggleTimeDisplay:(id)sender; - (IBAction)playandPause:(id)sender; - (IBAction)switchAudioTrack:(id)sender; - (IBAction)switchSubtitleTrack:(id)sender; - (IBAction)switchVideoDimensions:(id)sender; @end Examples_iOS/DropIn-Player/Dropin-Player/VDLPlaybackViewController.m000066400000000000000000000306001250240207200256620ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import "VDLPlaybackViewController.h" #import @interface VDLPlaybackViewController () { VLCMediaPlayer *_mediaplayer; BOOL _setPosition; BOOL _displayRemainingTime; int _currentAspectRatioMask; NSArray *_aspectRatios; UIActionSheet *_audiotrackActionSheet; UIActionSheet *_subtitleActionSheet; NSURL *_url; NSTimer *_idleTimer; } @end @implementation VDLPlaybackViewController - (void)viewDidLoad { [super viewDidLoad]; /* fix-up UI */ self.wantsFullScreenLayout = YES; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; /* we want to influence the system volume */ [[AVAudioSession sharedInstance] setDelegate:self]; /* populate array of supported aspect ratios (there are more!) */ _aspectRatios = @[@"DEFAULT", @"FILL_TO_SCREEN", @"4:3", @"16:9", @"16:10", @"2.21:1"]; /* fix-up the UI */ CGRect rect = self.toolbar.frame; rect.size.height += 20.; self.toolbar.frame = rect; [self.timeDisplay setTitle:@"" forState:UIControlStateNormal]; /* this looks a bit weird, but let's try to support iOS 5 */ UISlider *volumeSlider = nil; for (id aView in self.volumeView.subviews){ if ([[[aView class] description] isEqualToString:@"MPVolumeSlider"]){ volumeSlider = (UISlider *)aView; break; } } [volumeSlider addTarget:self action:@selector(volumeSliderAction:) forControlEvents:UIControlEventValueChanged]; /* setup gesture recognizer to toggle controls' visibility */ _movieView.userInteractionEnabled = NO; UITapGestureRecognizer *tapOnVideoRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleControlsVisible)]; tapOnVideoRecognizer.delegate = self; [self.view addGestureRecognizer:tapOnVideoRecognizer]; } - (void)playMediaFromURL:(NSURL*)theURL { _url = theURL; } - (IBAction)playandPause:(id)sender { if (_mediaplayer.isPlaying) [_mediaplayer pause]; [_mediaplayer play]; } - (IBAction)closePlayback:(id)sender { [self.navigationController dismissViewControllerAnimated:YES completion:nil]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:YES]; /* setup the media player instance, give it a delegate and something to draw into */ _mediaplayer = [[VLCMediaPlayer alloc] init]; _mediaplayer.delegate = self; _mediaplayer.drawable = self.movieView; /* listen for notifications from the player */ [_mediaplayer addObserver:self forKeyPath:@"time" options:0 context:nil]; [_mediaplayer addObserver:self forKeyPath:@"remainingTime" options:0 context:nil]; /* create a media object and give it to the player */ _mediaplayer.media = [VLCMedia mediaWithURL:_url]; [_mediaplayer play]; if (self.controllerPanel.hidden) [self toggleControlsVisible]; [self _resetIdleTimer]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (_mediaplayer) { @try { [_mediaplayer removeObserver:self forKeyPath:@"time"]; [_mediaplayer removeObserver:self forKeyPath:@"remainingTime"]; } @catch (NSException *exception) { NSLog(@"we weren't an observer yet"); } if (_mediaplayer.media) [_mediaplayer stop]; if (_mediaplayer) _mediaplayer = nil; } if (_idleTimer) { [_idleTimer invalidate]; _idleTimer = nil; } [self.navigationController setNavigationBarHidden:NO animated:YES]; [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; } - (UIResponder *)nextResponder { [self _resetIdleTimer]; return [super nextResponder]; } - (IBAction)positionSliderAction:(UISlider *)sender { [self _resetIdleTimer]; /* we need to limit the number of events sent by the slider, since otherwise, the user * wouldn't see the I-frames when seeking on current mobile devices. This isn't a problem * within the Simulator, but especially on older ARMv7 devices, it's clearly noticeable. */ [self performSelector:@selector(_setPositionForReal) withObject:nil afterDelay:0.3]; _setPosition = NO; } - (void)_setPositionForReal { if (!_setPosition) { _mediaplayer.position = _positionSlider.value; _setPosition = YES; } } - (IBAction)positionSliderDrag:(id)sender { [self _resetIdleTimer]; } - (IBAction)volumeSliderAction:(id)sender { [self _resetIdleTimer]; } - (void)mediaPlayerStateChanged:(NSNotification *)aNotification { VLCMediaPlayerState currentState = _mediaplayer.state; /* distruct view controller on error */ if (currentState == VLCMediaPlayerStateError) [self performSelector:@selector(closePlayback:) withObject:nil afterDelay:2.]; /* or if playback ended */ if (currentState == VLCMediaPlayerStateEnded || currentState == VLCMediaPlayerStateStopped) [self performSelector:@selector(closePlayback:) withObject:nil afterDelay:2.]; [self.playPauseButton setTitle:[_mediaplayer isPlaying]? @"Pause" : @"Play" forState:UIControlStateNormal]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { self.positionSlider.value = [_mediaplayer position]; if (_displayRemainingTime) [self.timeDisplay setTitle:[[_mediaplayer remainingTime] stringValue] forState:UIControlStateNormal]; else [self.timeDisplay setTitle:[[_mediaplayer time] stringValue] forState:UIControlStateNormal]; } - (IBAction)toggleTimeDisplay:(id)sender { [self _resetIdleTimer]; _displayRemainingTime = !_displayRemainingTime; } - (void)toggleControlsVisible { BOOL controlsHidden = !self.controllerPanel.hidden; self.controllerPanel.hidden = controlsHidden; self.toolbar.hidden = controlsHidden; [[UIApplication sharedApplication] setStatusBarHidden:controlsHidden withAnimation:UIStatusBarAnimationFade]; } - (void)_resetIdleTimer { if (!_idleTimer) _idleTimer = [NSTimer scheduledTimerWithTimeInterval:5. target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO]; else { if (fabs([_idleTimer.fireDate timeIntervalSinceNow]) < 5.) [_idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:5.]]; } } - (void)idleTimerExceeded { _idleTimer = nil; if (!self.controllerPanel.hidden) [self toggleControlsVisible]; } - (IBAction)switchVideoDimensions:(id)sender { [self _resetIdleTimer]; NSUInteger count = [_aspectRatios count]; if (_currentAspectRatioMask + 1 > count - 1) { _mediaplayer.videoAspectRatio = NULL; _mediaplayer.videoCropGeometry = NULL; _currentAspectRatioMask = 0; NSLog(@"crop disabled"); } else { _currentAspectRatioMask++; if ([_aspectRatios[_currentAspectRatioMask] isEqualToString:@"FILL_TO_SCREEN"]) { UIScreen *screen = [UIScreen mainScreen]; float f_ar = screen.bounds.size.width / screen.bounds.size.height; if (f_ar == (float)(640./1136.)) // iPhone 5 aka 16:9.01 _mediaplayer.videoCropGeometry = "16:9"; else if (f_ar == (float)(2./3.)) // all other iPhones _mediaplayer.videoCropGeometry = "16:10"; // libvlc doesn't support 2:3 crop else if (f_ar == .75) // all iPads _mediaplayer.videoCropGeometry = "4:3"; else if (f_ar == .5625) // AirPlay _mediaplayer.videoCropGeometry = "16:9"; else NSLog(@"unknown screen format %f, can't crop", f_ar); NSLog(@"FILL_TO_SCREEN"); return; } _mediaplayer.videoCropGeometry = NULL; _mediaplayer.videoAspectRatio = (char *)[_aspectRatios[_currentAspectRatioMask] UTF8String]; NSLog(@"crop switched to %@", _aspectRatios[_currentAspectRatioMask]); } } - (IBAction)switchAudioTrack:(id)sender { _audiotrackActionSheet = [[UIActionSheet alloc] initWithTitle:@"audio track selector" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: nil]; NSArray *audioTracks = [_mediaplayer audioTrackNames]; NSArray *audioTrackIndexes = [_mediaplayer audioTrackIndexes]; NSUInteger count = [audioTracks count]; for (NSUInteger i = 0; i < count; i++) { NSString *indexIndicator = ([audioTrackIndexes[i] intValue] == [_mediaplayer currentAudioTrackIndex])? @"\u2713": @""; NSString *buttonTitle = [NSString stringWithFormat:@"%@ %@", indexIndicator, audioTracks[i]]; [_audiotrackActionSheet addButtonWithTitle:buttonTitle]; } [_audiotrackActionSheet addButtonWithTitle:@"Cancel"]; [_audiotrackActionSheet setCancelButtonIndex:[_audiotrackActionSheet numberOfButtons] - 1]; [_audiotrackActionSheet showInView:self.audioSwitcherButton]; } - (IBAction)switchSubtitleTrack:(id)sender { NSArray *spuTracks = [_mediaplayer videoSubTitlesNames]; NSArray *spuTrackIndexes = [_mediaplayer videoSubTitlesIndexes]; NSUInteger count = [spuTracks count]; if (count <= 1) return; _subtitleActionSheet = [[UIActionSheet alloc] initWithTitle:@"subtitle track selector" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: nil]; for (NSUInteger i = 0; i < count; i++) { NSString *indexIndicator = ([spuTrackIndexes[i] intValue] == [_mediaplayer currentVideoSubTitleIndex])? @"\u2713": @""; NSString *buttonTitle = [NSString stringWithFormat:@"%@ %@", indexIndicator, spuTracks[i]]; [_subtitleActionSheet addButtonWithTitle:buttonTitle]; } [_subtitleActionSheet addButtonWithTitle:@"Cancel"]; [_subtitleActionSheet setCancelButtonIndex:[_subtitleActionSheet numberOfButtons] - 1]; [_subtitleActionSheet showInView: self.subtitleSwitcherButton]; } - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == [actionSheet cancelButtonIndex]) return; NSArray *indexArray; if (actionSheet == _subtitleActionSheet) { indexArray = _mediaplayer.videoSubTitlesIndexes; if (buttonIndex <= indexArray.count) { _mediaplayer.currentVideoSubTitleIndex = [indexArray[buttonIndex] intValue]; } } else if (actionSheet == _audiotrackActionSheet) { indexArray = _mediaplayer.audioTrackIndexes; if (buttonIndex <= indexArray.count) { _mediaplayer.currentAudioTrackIndex = [indexArray[buttonIndex] intValue]; } } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end Examples_iOS/DropIn-Player/Dropin-Player/en.lproj/000077500000000000000000000000001250240207200222415ustar00rootroot00000000000000Examples_iOS/DropIn-Player/Dropin-Player/en.lproj/InfoPlist.strings000066400000000000000000000000551250240207200255630ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ Examples_iOS/DropIn-Player/Dropin-Player/en.lproj/VDLPlaybackViewController.xib000066400000000000000000001023341250240207200277430ustar00rootroot00000000000000 1552 12F45 4514 1187.40 626.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 3747 IBProxyObject IBUIBarButtonItem IBUIButton IBUINavigationBar IBUINavigationItem IBUISlider IBUIView com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework 274 274 {320, 550} _NS:9 3 MAA IBCocoaTouchFramework 290 {320, 44} _NS:9 IBCocoaTouchFramework 2 Title IBCocoaTouchFramework 269 292 {{139, 13}, {44, 26}} _NS:9 3 MCAwAA NO IBCocoaTouchFramework 0 0 4 4 0.0 0.0 3 MQA Pause 3 MC41AA 2 15 HelveticaNeue-Bold 15 16 292 {{20, 13}, {41, 26}} _NS:9 NO IBCocoaTouchFramework 0 0 4 4 0.0 0.0 Audio 292 {{238, 13}, {62, 26}} _NS:9 NO IBCocoaTouchFramework 0 0 4 4 0.0 0.0 Subtitles 292 {{20, 47}, {284, 22}} _NS:9 IBCocoaTouchFramework {{0, 408}, {320, 82}} _NS:10 3 MC42NjY2NjY2NjY3AA IBCocoaTouchFramework {{0, 20}, {320, 548}} NO IBUIScreenMetrics YES {320, 568} {568, 320} IBCocoaTouchFramework Retina 4-inch Full Screen 2 IBCocoaTouchFramework 290 290 {{5, 10}, {188, 23}} _NS:9 {250, 250} NO IBCocoaTouchFramework 0 0 0.5 289 {{241, 6}, {59, 29}} _NS:9 NO IBCocoaTouchFramework 0 0 VidDi 289 {{193, 11}, {50, 20}} _NS:9 NO IBCocoaTouchFramework 0 0 --:-- 2 13 HelveticaNeue-Bold 13 16 {300, 40} _NS:9 IBCocoaTouchFramework IBCocoaTouchFramework 1 0 view 7 movieView 29 positionSlider 179 timeDisplay 181 volumeView 182 controllerPanel 183 toolbar 184 audioSwitcherButton 190 subtitleSwitcherButton 191 playPauseButton 192 toggleTimeDisplay: 7 180 switchVideoDimensions: 7 177 positionSliderAction: 13 178 positionSliderDrag: 3 193 positionSliderDrag: 4 194 switchSubtitleTrack: 7 176 playandPause: 7 174 switchAudioTrack: 7 175 titleView 186 leftBarButtonItem 188 closePlayback: 189 0 -1 File's Owner -2 6 14 30 Time view 31 32 33 Position Slider 45 59 47 Controls panel 56 52 50 48 187 VDLPlaybackViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin MPVolumeView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 194 MPVolumeView UIView IBProjectSource ./Classes/MPVolumeView.h VDLPlaybackViewController UIViewController id id UISlider id id id id id id closePlayback: id playandPause: id positionSliderAction: UISlider positionSliderDrag: id switchAudioTrack: id switchSubtitleTrack: id switchVideoDimensions: id toggleTimeDisplay: id volumeSliderAction: id UIButton UIView UIView UIButton UISlider UIButton UIButton UINavigationBar MPVolumeView audioSwitcherButton UIButton controllerPanel UIView movieView UIView playPauseButton UIButton positionSlider UISlider subtitleSwitcherButton UIButton timeDisplay UIButton toolbar UINavigationBar volumeView MPVolumeView IBProjectSource ./Classes/VDLPlaybackViewController.h 0 IBCocoaTouchFramework YES com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 YES 3 3747 Examples_iOS/DropIn-Player/Dropin-Player/main.m000066400000000000000000000031031250240207200216110ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import #import "VDLAppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([VDLAppDelegate class])); } } Examples_iOS/DropIn-Player/VDLMainViewController.h000066400000000000000000000004261250240207200223310ustar00rootroot00000000000000// // VDLMainViewController.h // Dropin-Player // // Created by Felix Paul Kühne on 19.11.13. // Copyright (c) 2013 VideoLAN. All rights reserved. // #import @interface VDLMainViewController : UIViewController - (IBAction)startPlayback:(id)sender; @end Examples_iOS/DropIn-Player/VDLMainViewController.m000066400000000000000000000020261250240207200223340ustar00rootroot00000000000000// // VDLMainViewController.m // Dropin-Player // // Created by Felix Paul Kühne on 19.11.13. // Copyright (c) 2013 VideoLAN. All rights reserved. // #import "VDLMainViewController.h" #import "VDLAppDelegate.h" @interface VDLMainViewController () @end @implementation VDLMainViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } - (IBAction)startPlayback:(id)sender { VDLAppDelegate *appDelegate = (VDLAppDelegate *)[UIApplication sharedApplication].delegate; [appDelegate playStreamFromURL:[NSURL URLWithString:@"http://streams.videolan.org/streams/mp4/Mr_MrsSmith-h264_aac.mp4"]]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end Examples_iOS/DropIn-Player/VDLMainViewController.xib000066400000000000000000000043401250240207200226630ustar00rootroot00000000000000 Examples_iOS/SimplePlayback/000077500000000000000000000000001250240207200163005ustar00rootroot00000000000000Examples_iOS/SimplePlayback/SimplePlayback.xcodeproj/000077500000000000000000000000001250240207200231745ustar00rootroot00000000000000Examples_iOS/SimplePlayback/SimplePlayback.xcodeproj/project.pbxproj000066400000000000000000000454441250240207200262630ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 7D11B36A183BA71600FF0D25 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D11B369183BA71600FF0D25 /* UIKit.framework */; }; 7D11B36C183BA71600FF0D25 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D11B36B183BA71600FF0D25 /* Foundation.framework */; }; 7D11B374183BA71600FF0D25 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7D11B372183BA71600FF0D25 /* InfoPlist.strings */; }; 7D11B376183BA71600FF0D25 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D11B375183BA71600FF0D25 /* main.m */; }; 7D11B37A183BA71600FF0D25 /* VDLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D11B379183BA71600FF0D25 /* VDLAppDelegate.m */; }; 7D11B37C183BA71600FF0D25 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 7D11B37B183BA71600FF0D25 /* Default.png */; }; 7D11B37E183BA71600FF0D25 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7D11B37D183BA71600FF0D25 /* Default@2x.png */; }; 7D11B380183BA71600FF0D25 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7D11B37F183BA71600FF0D25 /* Default-568h@2x.png */; }; 7D11B383183BA71600FF0D25 /* VDLViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D11B382183BA71600FF0D25 /* VDLViewController.m */; }; 7D11B386183BA71600FF0D25 /* VDLViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D11B384183BA71600FF0D25 /* VDLViewController.xib */; }; 7D8745B5183BA8F900FD09E0 /* libMobileVLCKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745B4183BA8F900FD09E0 /* libMobileVLCKit.a */; }; 7D8745B8183BABE800FD09E0 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745B6183BABE800FD09E0 /* AudioToolbox.framework */; }; 7D8745BB183BABEE00FD09E0 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745BA183BABEE00FD09E0 /* OpenGLES.framework */; }; 7D8745BD183BAC0D00FD09E0 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745BC183BAC0D00FD09E0 /* CFNetwork.framework */; }; 7D8745BF183BAC1200FD09E0 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745BE183BAC1200FD09E0 /* CoreText.framework */; }; 7D8745C1183BAC2300FD09E0 /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C0183BAC2300FD09E0 /* libbz2.dylib */; }; 7D8745C3183BAC2700FD09E0 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C2183BAC2700FD09E0 /* libiconv.dylib */; }; 7D8745C5183BAC3100FD09E0 /* libstdc++.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C4183BAC3100FD09E0 /* libstdc++.dylib */; }; 7D8745C7183BACAE00FD09E0 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D8745C6183BACAE00FD09E0 /* QuartzCore.framework */; }; 7D8745C8183BACBF00FD09E0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D11B36D183BA71600FF0D25 /* CoreGraphics.framework */; }; D4771D95189849C80087441B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4771D94189849C80087441B /* Security.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 7D11B366183BA71600FF0D25 /* SimplePlayback.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimplePlayback.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7D11B369183BA71600FF0D25 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 7D11B36B183BA71600FF0D25 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 7D11B36D183BA71600FF0D25 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 7D11B371183BA71600FF0D25 /* SimplePlayback-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "SimplePlayback-Info.plist"; sourceTree = ""; }; 7D11B373183BA71600FF0D25 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 7D11B375183BA71600FF0D25 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 7D11B377183BA71600FF0D25 /* SimplePlayback-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SimplePlayback-Prefix.pch"; sourceTree = ""; }; 7D11B378183BA71600FF0D25 /* VDLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VDLAppDelegate.h; sourceTree = ""; }; 7D11B379183BA71600FF0D25 /* VDLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VDLAppDelegate.m; sourceTree = ""; }; 7D11B37B183BA71600FF0D25 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 7D11B37D183BA71600FF0D25 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 7D11B37F183BA71600FF0D25 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 7D11B381183BA71600FF0D25 /* VDLViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VDLViewController.h; sourceTree = ""; }; 7D11B382183BA71600FF0D25 /* VDLViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VDLViewController.m; sourceTree = ""; }; 7D11B385183BA71600FF0D25 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/VDLViewController.xib; sourceTree = ""; }; 7D8745B4183BA8F900FD09E0 /* libMobileVLCKit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libMobileVLCKit.a; path = "../../build/Release-iphonesimulator/libMobileVLCKit.a"; sourceTree = ""; }; 7D8745B6183BABE800FD09E0 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 7D8745B7183BABE800FD09E0 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 7D8745BA183BABEE00FD09E0 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 7D8745BC183BAC0D00FD09E0 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 7D8745BE183BAC1200FD09E0 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 7D8745C0183BAC2300FD09E0 /* libbz2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libbz2.dylib; path = usr/lib/libbz2.dylib; sourceTree = SDKROOT; }; 7D8745C2183BAC2700FD09E0 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; 7D8745C4183BAC3100FD09E0 /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; }; 7D8745C6183BACAE00FD09E0 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; D4771D94189849C80087441B /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 7D11B363183BA71600FF0D25 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D4771D95189849C80087441B /* Security.framework in Frameworks */, 7D8745C8183BACBF00FD09E0 /* CoreGraphics.framework in Frameworks */, 7D8745C7183BACAE00FD09E0 /* QuartzCore.framework in Frameworks */, 7D8745C5183BAC3100FD09E0 /* libstdc++.dylib in Frameworks */, 7D8745C3183BAC2700FD09E0 /* libiconv.dylib in Frameworks */, 7D8745C1183BAC2300FD09E0 /* libbz2.dylib in Frameworks */, 7D8745BF183BAC1200FD09E0 /* CoreText.framework in Frameworks */, 7D8745BD183BAC0D00FD09E0 /* CFNetwork.framework in Frameworks */, 7D8745BB183BABEE00FD09E0 /* OpenGLES.framework in Frameworks */, 7D8745B8183BABE800FD09E0 /* AudioToolbox.framework in Frameworks */, 7D11B36A183BA71600FF0D25 /* UIKit.framework in Frameworks */, 7D11B36C183BA71600FF0D25 /* Foundation.framework in Frameworks */, 7D8745B5183BA8F900FD09E0 /* libMobileVLCKit.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 7D11B35D183BA71600FF0D25 = { isa = PBXGroup; children = ( 7D11B36F183BA71600FF0D25 /* SimplePlayback */, 7D11B368183BA71600FF0D25 /* Frameworks */, 7D11B367183BA71600FF0D25 /* Products */, ); sourceTree = ""; }; 7D11B367183BA71600FF0D25 /* Products */ = { isa = PBXGroup; children = ( 7D11B366183BA71600FF0D25 /* SimplePlayback.app */, ); name = Products; sourceTree = ""; }; 7D11B368183BA71600FF0D25 /* Frameworks */ = { isa = PBXGroup; children = ( D4771D94189849C80087441B /* Security.framework */, 7D8745B4183BA8F900FD09E0 /* libMobileVLCKit.a */, 7D8745C6183BACAE00FD09E0 /* QuartzCore.framework */, 7D8745C4183BAC3100FD09E0 /* libstdc++.dylib */, 7D8745C2183BAC2700FD09E0 /* libiconv.dylib */, 7D8745C0183BAC2300FD09E0 /* libbz2.dylib */, 7D8745BE183BAC1200FD09E0 /* CoreText.framework */, 7D8745BC183BAC0D00FD09E0 /* CFNetwork.framework */, 7D8745BA183BABEE00FD09E0 /* OpenGLES.framework */, 7D8745B6183BABE800FD09E0 /* AudioToolbox.framework */, 7D8745B7183BABE800FD09E0 /* AudioUnit.framework */, 7D11B369183BA71600FF0D25 /* UIKit.framework */, 7D11B36B183BA71600FF0D25 /* Foundation.framework */, 7D11B36D183BA71600FF0D25 /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; 7D11B36F183BA71600FF0D25 /* SimplePlayback */ = { isa = PBXGroup; children = ( 7D11B378183BA71600FF0D25 /* VDLAppDelegate.h */, 7D11B379183BA71600FF0D25 /* VDLAppDelegate.m */, 7D11B381183BA71600FF0D25 /* VDLViewController.h */, 7D11B382183BA71600FF0D25 /* VDLViewController.m */, 7D11B384183BA71600FF0D25 /* VDLViewController.xib */, 7D11B370183BA71600FF0D25 /* Supporting Files */, ); path = SimplePlayback; sourceTree = ""; }; 7D11B370183BA71600FF0D25 /* Supporting Files */ = { isa = PBXGroup; children = ( 7D11B371183BA71600FF0D25 /* SimplePlayback-Info.plist */, 7D11B372183BA71600FF0D25 /* InfoPlist.strings */, 7D11B375183BA71600FF0D25 /* main.m */, 7D11B377183BA71600FF0D25 /* SimplePlayback-Prefix.pch */, 7D11B37B183BA71600FF0D25 /* Default.png */, 7D11B37D183BA71600FF0D25 /* Default@2x.png */, 7D11B37F183BA71600FF0D25 /* Default-568h@2x.png */, ); name = "Supporting Files"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 7D11B365183BA71600FF0D25 /* SimplePlayback */ = { isa = PBXNativeTarget; buildConfigurationList = 7D11B389183BA71600FF0D25 /* Build configuration list for PBXNativeTarget "SimplePlayback" */; buildPhases = ( 7D11B362183BA71600FF0D25 /* Sources */, 7D11B363183BA71600FF0D25 /* Frameworks */, 7D11B364183BA71600FF0D25 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = SimplePlayback; productName = SimplePlayback; productReference = 7D11B366183BA71600FF0D25 /* SimplePlayback.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 7D11B35E183BA71600FF0D25 /* Project object */ = { isa = PBXProject; attributes = { CLASSPREFIX = VDL; LastUpgradeCheck = 0460; ORGANIZATIONNAME = VideoLAN; }; buildConfigurationList = 7D11B361183BA71600FF0D25 /* Build configuration list for PBXProject "SimplePlayback" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 7D11B35D183BA71600FF0D25; productRefGroup = 7D11B367183BA71600FF0D25 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 7D11B365183BA71600FF0D25 /* SimplePlayback */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 7D11B364183BA71600FF0D25 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 7D11B374183BA71600FF0D25 /* InfoPlist.strings in Resources */, 7D11B37C183BA71600FF0D25 /* Default.png in Resources */, 7D11B37E183BA71600FF0D25 /* Default@2x.png in Resources */, 7D11B380183BA71600FF0D25 /* Default-568h@2x.png in Resources */, 7D11B386183BA71600FF0D25 /* VDLViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 7D11B362183BA71600FF0D25 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7D11B376183BA71600FF0D25 /* main.m in Sources */, 7D11B37A183BA71600FF0D25 /* VDLAppDelegate.m in Sources */, 7D11B383183BA71600FF0D25 /* VDLViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 7D11B372183BA71600FF0D25 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 7D11B373183BA71600FF0D25 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; 7D11B384183BA71600FF0D25 /* VDLViewController.xib */ = { isa = PBXVariantGroup; children = ( 7D11B385183BA71600FF0D25 /* en */, ); name = VDLViewController.xib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 7D11B387183BA71600FF0D25 /* 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; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; 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; IPHONEOS_DEPLOYMENT_TARGET = 6.1; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 7D11B388183BA71600FF0D25 /* 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; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 6.1; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; 7D11B38A183BA71600FF0D25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SimplePlayback/SimplePlayback-Prefix.pch"; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator/include\"", "\"$(SRCROOT)/../../build/Release-iphoneos/include\"", ); INFOPLIST_FILE = "SimplePlayback/SimplePlayback-Info.plist"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator\"", "\"$(SRCROOT)/../../build/Release-iphoneos\"", ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Debug; }; 7D11B38B183BA71600FF0D25 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "SimplePlayback/SimplePlayback-Prefix.pch"; HEADER_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator/include\"", "\"$(SRCROOT)/../../build/Release-iphoneos/include\"", ); INFOPLIST_FILE = "SimplePlayback/SimplePlayback-Info.plist"; LIBRARY_SEARCH_PATHS = ( "\"$(SRCROOT)/../../build/Release-iphonesimulator\"", "\"$(SRCROOT)/../../build/Release-iphoneos\"", ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 7D11B361183BA71600FF0D25 /* Build configuration list for PBXProject "SimplePlayback" */ = { isa = XCConfigurationList; buildConfigurations = ( 7D11B387183BA71600FF0D25 /* Debug */, 7D11B388183BA71600FF0D25 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7D11B389183BA71600FF0D25 /* Build configuration list for PBXNativeTarget "SimplePlayback" */ = { isa = XCConfigurationList; buildConfigurations = ( 7D11B38A183BA71600FF0D25 /* Debug */, 7D11B38B183BA71600FF0D25 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 7D11B35E183BA71600FF0D25 /* Project object */; } Examples_iOS/SimplePlayback/SimplePlayback/000077500000000000000000000000001250240207200212005ustar00rootroot00000000000000Examples_iOS/SimplePlayback/SimplePlayback/Default-568h@2x.png000066400000000000000000000442421250240207200243420ustar00rootroot00000000000000PNG  IHDRpz$iCCPICC Profile8UoT>oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 640 1 1136 2012-07-27T15:07:06 Pixelmator 2.0.5 )q?7IDATx=eQqÙ87;;' RBR(JWw^8w<漏7 @^~:;;>9O @F{}w~|}}ޣ#@~<=9G p;*O_8>^#@ ƻZjLZ9:\oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 320 1 480 2012-07-27T15:07:80 Pixelmator 2.0.5 X="IDATxICQDDKIq/L {nov}y>(oR? XGůUS[IJ*$:7鶪O{7@Hkk?<kktq݋m6nƶد-mR;`zv x#=\% oYRڱ#&?>ҹЪn_;j;$}*}+(}'}/LtY"$].9⦅%{_a݊]hk5'SN{<_ t jM{-4%TńtY۟R6#v\喊x:'HO3^&0::m,L%3:qVE t]~Iv6Wٯ) |ʸ2]G4(6w‹$"AEv m[D;Vh[}چN|3HS:KtxU'D;77;_"e?Yqxl+ pHYs  iTXtXML:com.adobe.xmp 1 5 72 1 72 640 1 960 2012-07-27T15:07:37 Pixelmator 2.0.5 PF5IDATx1e HH܎;qoV..Vb&a^p s3;i^;ޟy!@ <>_{x}~\_Wg @܆vW=̻o]yoλ͇ @vU>yO7ן}* p|W}w}5蛿CaW] @>FmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@0  0" GmM @@W>0  @nVjLJޞy @ܞxޝ<x| @7$pߧ:yOߜ' @~y7O/> @!p[_4lIENDB`Examples_iOS/SimplePlayback/SimplePlayback/SimplePlayback-Info.plist000066400000000000000000000022211250240207200260430ustar00rootroot00000000000000 CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier org.videolan.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight Examples_iOS/SimplePlayback/SimplePlayback/SimplePlayback-Prefix.pch000066400000000000000000000027171250240207200260360ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import #import #import Examples_iOS/SimplePlayback/SimplePlayback/VDLAppDelegate.h000066400000000000000000000031331250240207200240720ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import @class VDLViewController; @interface VDLAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) VDLViewController *viewController; @end Examples_iOS/SimplePlayback/SimplePlayback/VDLAppDelegate.m000066400000000000000000000067641250240207200241140ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import "VDLAppDelegate.h" #import "VDLViewController.h" @implementation VDLAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.viewController = [[VDLViewController alloc] initWithNibName:@"VDLViewController" bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; 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 Examples_iOS/SimplePlayback/SimplePlayback/VDLViewController.h000066400000000000000000000030361250240207200246770ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import @interface VDLViewController : UIViewController @property (nonatomic, strong) IBOutlet UIView *movieView; - (IBAction)playandPause:(id)sender; @end Examples_iOS/SimplePlayback/SimplePlayback/VDLViewController.m000066400000000000000000000043631250240207200247100ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import "VDLViewController.h" @interface VDLViewController () { VLCMediaPlayer *_mediaplayer; } @end @implementation VDLViewController - (void)viewDidLoad { [super viewDidLoad]; /* setup the media player instance, give it a delegate and something to draw into */ _mediaplayer = [[VLCMediaPlayer alloc] init]; _mediaplayer.delegate = self; _mediaplayer.drawable = self.movieView; /* create a media object and give it to the player */ _mediaplayer.media = [VLCMedia mediaWithURL:[NSURL URLWithString:@"http://streams.videolan.org/streams/mp4/Mr_MrsSmith-h264_aac.mp4"]]; } - (IBAction)playandPause:(id)sender { if (_mediaplayer.isPlaying) [_mediaplayer pause]; [_mediaplayer play]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end Examples_iOS/SimplePlayback/SimplePlayback/en.lproj/000077500000000000000000000000001250240207200227275ustar00rootroot00000000000000Examples_iOS/SimplePlayback/SimplePlayback/en.lproj/InfoPlist.strings000066400000000000000000000000551250240207200262510ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ Examples_iOS/SimplePlayback/SimplePlayback/en.lproj/VDLViewController.xib000066400000000000000000000416451250240207200267710ustar00rootroot00000000000000 1552 12F45 3084 1187.40 626.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 2083 IBNSLayoutConstraint IBProxyObject IBUIButton IBUIView com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework 274 292 {{0, -20}, {320, 568}} _NS:9 3 MQA 2 IBCocoaTouchFramework 292 {{133, 419}, {55, 44}} _NS:9 NO IBCocoaTouchFramework 0 0 1 Play 3 MQA 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 3 MC41AA 2 15 Helvetica-Bold 15 16 {{0, 20}, {320, 548}} 3 MC43NQA NO IBUIScreenMetrics YES {320, 568} {568, 320} IBCocoaTouchFramework Retina 4 Full Screen 2 IBCocoaTouchFramework view 7 movieView 29 playandPause: 7 12 0 -1 File's Owner -2 6 9 0 9 1 0.0 1000 6 24 2 4 0 4 1 86 1000 3 9 3 4 0 4 1 0.0 1000 8 29 3 6 0 6 1 0.0 1000 8 29 3 5 0 5 1 0.0 1000 8 29 3 3 0 3 1 -20 1000 3 9 3 8 14 20 21 23 25 26 28 VDLViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 29 NSLayoutConstraint NSObject IBProjectSource ./Classes/NSLayoutConstraint.h VDLViewController UIViewController playandPause: id playandPause: playandPause: id movieView UIView movieView movieView UIView IBProjectSource ./Classes/VDLViewController.h 0 IBCocoaTouchFramework YES 3 YES 2083 Examples_iOS/SimplePlayback/SimplePlayback/main.m000066400000000000000000000031031250240207200222770ustar00rootroot00000000000000/* Copyright (c) 2013, Felix Paul Kühne and VideoLAN * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. 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. * * 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. */ #import #import "VDLAppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([VDLAppDelegate class])); } } Headers/000077500000000000000000000000001250240207200124235ustar00rootroot00000000000000Headers/Internal/000077500000000000000000000000001250240207200141775ustar00rootroot00000000000000Headers/Internal/VLCEventManager.h000066400000000000000000000072321250240207200172750ustar00rootroot00000000000000/***************************************************************************** * VLCEventManager.h: VLCKit.framework VLCEventManager header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import /** * The VLCEventManager class provides a safe way for inter-thread communications. */ @interface VLCEventManager : NSObject /* Factories */ /** * Returns the shared VLCEventManager. There should only be one instance of this class. * \return Shared event manager. */ + (id)sharedManager; /* Operations */ /** * Sends a message to the target's delegate on the main thread. * \discussion The main thread is the one in which the main run loop is run, which usually * means the one in which the NSApplication object receives events. The method is performed * when the main thread runs the run loop in one of the common run loop modes (as specified * in the CFRunLoop documentation). * * The receiver is retained until the call is finished. * \param aTarget The target object who's delegate should receive the specified message. * \param aSelector A selector that identifies the method to invoke. The method should not * have a significant return value and should take a single argument of type NSNotification, * or no arguments. * * See ‚ÄúSelectors‚Äù for a description of the SEL type. * \param aNotificiationName The name of the notification that should be sent to the * distributed notification center. */ - (void)callOnMainThreadDelegateOfObject:(id)aTarget withDelegateMethod:(SEL)aSelector withNotificationName:(NSString *)aNotificationName; /** * Sends a message to the target on the main thread. * \discussion The main thread is the one in which the main run loop is run, which usually * means the one in which the NSApplication object receives events. The method is performed * when the main thread runs the run loop in one of the common run loop modes (as specified * in the CFRunLoop documentation). * * The receiver and arg are retained until the call is finished. * \param aTarget The target object who should receive the specified message. * \param aSelector A selector that identifies the method to invoke. The method should not * have a significant return value and should take a single argument of type id, * or no arguments. * * See ‚ÄúSelectors‚Äù for a description of the SEL type. * \param arg The argument to pass in the message. Pass nil if the method does not take an * argument. * distributed notification center. */ - (void)callOnMainThreadObject:(id)aTarget withMethod:(SEL)aSelector withArgumentAsObject:(id)arg; - (void)cancelCallToObject:(id)target; @end Headers/Internal/VLCLibVLCBridging.h000066400000000000000000000113521250240207200174400ustar00rootroot00000000000000/***************************************************************************** * VLCLibVLCbridging.h: VLCKit.framework VLCLibVLCBridging (Private) header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCLibrary.h" #if !TARGET_OS_IPHONE #import "VLCStreamOutput.h" #endif #import "VLCMediaPlayer.h" /** * Bridges functionality between libvlc and VLCMediaList implementation. */ @interface VLCMediaList (LibVLCBridging) /* Factories */ /** * Manufactures new object wrapped around specified media list. * \param p_new_mlist LibVLC media list pointer. * \return Newly create media list instance using specified media list * pointer. */ + (id)mediaListWithLibVLCMediaList:(void *)p_new_mlist; /* Initializers */ /** * Initializes new object wrapped around specified media list. * \param p_new_mlist LibVLC media list pointer. * \return Newly create media list instance using specified media list * pointer. */ - (id)initWithLibVLCMediaList:(void *)p_new_mlist; /* Properties */ @property (readonly) void * libVLCMediaList; //< LibVLC media list pointer. @end /** * Bridges functionality between libvlc and VLCMedia implementation. */ @interface VLCMedia (LibVLCBridging) /* Factories */ /** * Manufactures new object wrapped around specified media descriptor. * \param md LibVLC media descriptor pointer. * \return Newly created media instance using specified descriptor. */ + (id)mediaWithLibVLCMediaDescriptor:(void *)md; /* Initializers */ /** * Initializes new object wrapped around specified media descriptor. * \param md LibVLC media descriptor pointer. * \return Newly created media instance using specified descriptor. */ - (id)initWithLibVLCMediaDescriptor:(void *)md; + (id)mediaWithMedia:(VLCMedia *)media andLibVLCOptions:(NSDictionary *)options; /** * Returns the receiver's internal media descriptor pointer. * \return The receiver's internal media descriptor pointer. */ @property (readonly) void * libVLCMediaDescriptor; @end /** * Bridges functionality between VLCMedia and VLCMediaPlayer */ @interface VLCMediaPlayer (LibVLCBridging) /* Properties */ @property (readonly) void * libVLCMediaPlayer; //< LibVLC media list pointer. @end /** * Bridges functionality between VLCMediaPlayer and LibVLC core */ @interface VLCMedia (VLCMediaPlayerBridging) /** * Set's the length of the media object. This value becomes available once the * media object is being played. * \param value */ - (void)setLength:(VLCTime *)value; @end /** * Bridges functionality between VLCLibrary and LibVLC core. */ @interface VLCLibrary (VLCLibVLCBridging) /** * Shared singleton instance of libvlc library instance. * \return libvlc pointer of library instance. */ + (void *)sharedInstance; /** * Instance of libvlc library instance. * \return libvlc pointer of library instance. */ @property (readonly) void * instance; @end /** * Bridges functionality between VLCLibrary and VLCAudio. */ @interface VLCLibrary (VLCAudioBridging) /** * Called by VLCAudio, each library has a singleton VLCaudio instance. VLCAudio * calls this function to let the VLCLibrary instance know how to get in touch * with the VLCAudio instance. TODO: Each media player instance should have it's * own audio instance...not each library instance. */ - (void)setAudio:(VLCAudio *)value; @end /** * Bridges functionality between VLCAudio and VLCLibrary. */ @interface VLCAudio (VLCAudioBridging) /* Initializers */ /** * Initializes a new object using the specified mediaPlayer instance. * \return Newly created audio object using specified VLCMediaPlayer instance. */ - (id)initWithMediaPlayer:(VLCMediaPlayer *)mediaPlayer; @end /** * TODO: Documentation */ #if !TARGET_OS_IPHONE @interface VLCStreamOutput (LibVLCBridge) - (NSString *)representedLibVLCOptions; @end #endif Headers/Internal/VLCVideoCommon.h000066400000000000000000000026741250240207200171450ustar00rootroot00000000000000/***************************************************************************** * VLCVideoCommon.h: VLCKit.framework VLCVideoCommon header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import /** * TODO: Documentation */ @interface VLCVideoLayoutManager : NSObject /* Factories */ + (id)layoutManager; /* Properties */ @property (nonatomic) BOOL fillScreenEntirely; @property (nonatomic) CGSize originalVideoSize; @end Headers/Public/000077500000000000000000000000001250240207200136415ustar00rootroot00000000000000Headers/Public/MobileVLCKit.h000066400000000000000000000032741250240207200162440ustar00rootroot00000000000000/***************************************************************************** * VLCKit: MobileVLCKit ***************************************************************************** * Copyright (C) 2010-2013 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * Felix Paul Kühne #import #import #import #import #import #import #import #import @class VLCMedia; @class VLCMediaLibrary; @class VLCMediaList; @class VLCTime; @class VLCVideoView; @class VLCAudio; @class VLCMediaThumbnailer; @class VLCMediaListPlayer; @class VLCMediaPlayer; Headers/Public/VLCAudio.h000066400000000000000000000031561250240207200154250ustar00rootroot00000000000000/***************************************************************************** * VLCAudio.h: VLCKit.framework VLCAudio header ***************************************************************************** * Copyright (C) 2007 Faustino E. Osuna * Copyright (C) 2007, 2014 VLC authors and VideoLAN * $Id$ * * Authors: Faustino E. Osuna * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import /* Notification Messages */ /** * Standard notification messages that are emitted by VLCAudio object. */ extern NSString *const VLCMediaPlayerVolumeChanged; @class VLCMediaPlayer; /** * TODO: Documentation VLCAudio */ @interface VLCAudio : NSObject /* Properties */ - (void)setMute:(BOOL)value; @property (setter=setMute:) BOOL isMuted; @property (assign) int volume; - (void)volumeDown; - (void)volumeUp; @end Headers/Public/VLCExtension.h000066400000000000000000000027611250240207200163410ustar00rootroot00000000000000/***************************************************************************** * VLCKit: VLCExtensions ***************************************************************************** * Copyright (C) 2010-2014 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @interface VLCExtension : NSObject - (instancetype)initWithInstance:(struct extension_t *)instance NS_DESIGNATED_INITIALIZER; // FIXME: Should be internal @property (NS_NONATOMIC_IOSONLY, readonly) struct extension_t *instance; // FIXME: Should be internal @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *name; @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *title; @end Headers/Public/VLCExtensionsManager.h000066400000000000000000000026451250240207200200200ustar00rootroot00000000000000/***************************************************************************** * VLCKit: VLCExtensionsManager ***************************************************************************** * Copyright (C) 2010-2014 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @class VLCExtension; @class VLCMediaPlayer; @interface VLCExtensionsManager : NSObject + (VLCExtensionsManager *)sharedManager; @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *extensions; - (void)runExtension:(VLCExtension *)extension; @property (readwrite, strong) VLCMediaPlayer *mediaPlayer; @end Headers/Public/VLCKit.h000066400000000000000000000034121250240207200151060ustar00rootroot00000000000000/***************************************************************************** * VLCKit.h: VLCKit.framework main header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007, 2013-2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import #import #import #import #import #import #import #import #import #import #import #import #import #import @class VLCMedia; @class VLCMediaLibrary; @class VLCMediaList; @class VLCTime; @class VLCVideoView; Headers/Public/VLCLibrary.h000066400000000000000000000067221250240207200157720ustar00rootroot00000000000000/***************************************************************************** * VLCLibrary.h: VLCKit.framework VLCLibrary header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "VLCAudio.h" #import "VLCMediaList.h" #import "VLCMedia.h" @class VLCAudio; /** * The VLCLibrary is the base library of the VLCKit.framework. This object provides a shared instance that exposes the * internal functionalities of libvlc and libvlc-control. The VLCLibrary object is instantiated automatically when * VLCKit.framework is loaded into memory. Also, it is automatically destroyed when the VLCKit.framework is unloaded * from memory. * * Currently, the framework does not support multiple instances of VLCLibrary. Furthermore, you cannot destroy any * instiantiation of VLCLibrary, as previously noted, this is done automatically by the dynamic link loader. */ @interface VLCLibrary : NSObject /* Factories */ /** * Returns the library's shared instance. * \return The library's shared instance. */ + (VLCLibrary *)sharedLibrary; /** * returns an individual instance which can be customized with options * \param a NSArray with NSString instance containing the options * \return the individual library instance */ - (instancetype)initWithOptions:(NSArray*)options; /** * Returns the library's version * \return The library version example "0.9.0-git Grishenko". */ @property (readonly, copy) NSString * version; /** * Returns the compiler used to build the libvlc binary * \return The compiler version string. */ @property (readonly, copy) NSString * compiler; /** * Returns the library's changeset * \return The library version example "adfee99". */ @property (readonly, copy) NSString * changeset; /** * sets the application name and HTTP User Agend * libvlc will pass it to servers when required by protocol * \param readableName human-readable application name, e.g. "FooBar player 1.2.3" * \param userAgent HTTP User Agent, e.g. "FooBar/1.2.3 Python/2.6.0" */ - (void)setHumanReadableName:(NSString *)readableName withHTTPUserAgent:(NSString *)userAgent; /** * Sets some meta-information about the application. * * \param identifier Java-style application identifier, e.g. "com.acme.foobar" * \param version application version numbers, e.g. "1.2.3" * \param icon application icon name, e.g. "foobar" */ - (void)setApplicationIdentifier:(NSString *)identifier withVersion:(NSString *)version andApplicationIconName:(NSString *)icon; @end Headers/Public/VLCMedia.h000066400000000000000000000421671250240207200154100ustar00rootroot00000000000000/***************************************************************************** * VLCMedia.h: VLCKit.framework VLCMedia header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2013 Felix Paul K√ºhne * Copyright (C) 2007-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul K√ºhne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "VLCMediaList.h" #import "VLCTime.h" /* Meta Dictionary Keys */ /** * Standard dictionary keys for retreiving meta data. */ extern NSString *const VLCMetaInformationTitle; /* NSString */ extern NSString *const VLCMetaInformationArtist; /* NSString */ extern NSString *const VLCMetaInformationGenre; /* NSString */ extern NSString *const VLCMetaInformationCopyright; /* NSString */ extern NSString *const VLCMetaInformationAlbum; /* NSString */ extern NSString *const VLCMetaInformationTrackNumber; /* NSString */ extern NSString *const VLCMetaInformationDescription; /* NSString */ extern NSString *const VLCMetaInformationRating; /* NSString */ extern NSString *const VLCMetaInformationDate; /* NSString */ extern NSString *const VLCMetaInformationSetting; /* NSString */ extern NSString *const VLCMetaInformationURL; /* NSString */ extern NSString *const VLCMetaInformationLanguage; /* NSString */ extern NSString *const VLCMetaInformationNowPlaying; /* NSString */ extern NSString *const VLCMetaInformationPublisher; /* NSString */ extern NSString *const VLCMetaInformationEncodedBy; /* NSString */ extern NSString *const VLCMetaInformationArtworkURL; /* NSString */ extern NSString *const VLCMetaInformationArtwork; /* NSImage */ extern NSString *const VLCMetaInformationTrackID; /* NSString */ /* Notification Messages */ /** * Available notification messages. */ extern NSString *const VLCMediaMetaChanged; //< Notification message for when the media's meta data has changed // Forward declarations, supresses compiler error messages @class VLCMediaList; @class VLCMedia; typedef NS_ENUM(NSInteger, VLCMediaState) { VLCMediaStateNothingSpecial, //< Nothing VLCMediaStateBuffering, //< Stream is buffering VLCMediaStatePlaying, //< Stream is playing VLCMediaStateError, //< Can't be played because an error occurred }; /** * Informal protocol declaration for VLCMedia delegates. Allows data changes to be * trapped. */ @protocol VLCMediaDelegate // TODO: SubItemAdded/SubItemRemoved implementation. Not sure if we really want to implement this. ///** // * Delegate method called whenever a sub item has been added to the specified VLCMedia. // * \param aMedia The media resource that has received the new sub item. // * \param childMedia The new sub item added. // * \param index Location of the new subitem in the aMedia's sublist. // */ // - (void)media:(VLCMedia *)media addedSubItem:(VLCMedia *)childMedia atIndex:(int)index; ///** // * Delegate method called whenever a sub item has been removed from the specified VLCMedia. // * \param aMedia The media resource that has had a sub item removed from. // * \param childMedia The sub item removed. // * \param index The previous location of the recently removed sub item. // */ // - (void)media:(VLCMedia *)aMedia removedSubItem:(VLCMedia *)childMedia atIndex:(int)index; @optional /** * Delegate method called whenever the meta has changed for the receiver. * \param aMedia The media resource whose meta data has been changed. * \param oldValue The old meta data value. * \param key The key of the value that was changed. */ - (void)media:(VLCMedia *)aMedia metaValueChangedFrom:(id)oldValue forKey:(NSString *)key __attribute__((deprecated)); /** * Delegate method called whenever the media's meta data was changed for whatever reason * \note this is called more often than mediaDidFinishParsing, so it may be less efficient * \param aMedia The media resource whose meta data has been changed. */ - (void)mediaMetaDataDidChange:(VLCMedia *)aMedia; /** * Delegate method called whenever the media was parsed. * \param aMedia The media resource whose meta data has been changed. */ - (void)mediaDidFinishParsing:(VLCMedia *)aMedia; @end /** * Defines files and streams as a managed object. Each media object can be * administered seperately. VLCMediaPlayer or VLCMediaList must be used * to execute the appropriate playback functions. * \see VLCMediaPlayer * \see VLCMediaList */ @interface VLCMedia : NSObject /* Factories */ /** * Manufactures a new VLCMedia object using the URL specified. * \param anURL URL to media to be accessed. * \return A new VLCMedia object, only if there were no errors. This object will be automatically released. * \see initWithMediaURL */ + (instancetype)mediaWithURL:(NSURL *)anURL; /** * Manufactures a new VLCMedia object using the path specified. * \param aPath Path to the media to be accessed. * \return A new VLCMedia object, only if there were no errors. This object will be automatically released. * \see initWithPath */ + (instancetype)mediaWithPath:(NSString *)aPath; /** * TODO * \param aName TODO * \return a new VLCMedia object, only if there were no errors. This object * will be automatically released. * \see initAsNodeWithName */ + (instancetype)mediaAsNodeWithName:(NSString *)aName; /* Initializers */ /** * Initializes a new VLCMedia object to use the specified URL. * \param aPath Path to media to be accessed. * \return A new VLCMedia object, only if there were no errors. */ - (instancetype)initWithURL:(NSURL *)anURL; /** * Initializes a new VLCMedia object to use the specified path. * \param aPath Path to media to be accessed. * \return A new VLCMedia object, only if there were no errors. */ - (instancetype)initWithPath:(NSString *)aPath; /** * TODO * \param aName TODO * \return A new VLCMedia object, only if there were no errors. */ - (instancetype)initAsNodeWithName:(NSString *)aName; /** * Returns an NSComparisonResult value that indicates the lexical ordering of * the receiver and a given meda. * \param media The media with which to compare with the receiver. * \return NSOrderedAscending if the URL of the receiver precedes media in * lexical ordering, NSOrderedSame if the URL of the receiver and media are * equivalent in lexical value, and NSOrderedDescending if the URL of the * receiver follows media. If media is nil, returns NSOrderedDescending. */ - (NSComparisonResult)compare:(VLCMedia *)media; /* Properties */ /** * Receiver's delegate. */ @property (nonatomic, weak) id delegate; /** * A VLCTime object describing the length of the media resource, only if it is * available. Use lengthWaitUntilDate: to wait for a specified length of time. * \see lengthWaitUntilDate */ @property (nonatomic, readwrite, strong) VLCTime * length; /** * Returns a VLCTime object describing the length of the media resource, * however, this is a blocking operation and will wait until the preparsing is * completed before returning anything. * \param aDate Time for operation to wait until, if there are no results * before specified date then nil is returned. * \return The length of the media resource, nil if it couldn't wait for it. */ - (VLCTime *)lengthWaitUntilDate:(NSDate *)aDate; /** * Determines if the media has already been preparsed. */ @property (nonatomic, readonly) BOOL isParsed; /** * The URL for the receiver's media resource. */ @property (nonatomic, readonly, strong) NSURL * url; /** * The receiver's sub list. */ @property (nonatomic, readonly, strong) VLCMediaList * subitems; /** * get meta property for key * \note for performance reasons, fetching the metaDictionary will be faster! * \see metaDictionary * \see dictionary keys above */ - (NSString *)metadataForKey:(NSString *)key; /** * set meta property for key * \param metadata to set as NSString * \param metadata key * \see dictionary keys above */ - (void)setMetadata:(NSString *)data forKey:(NSString *)key; /** * Save the previously changed metadata * \return true if saving was successful */ @property (NS_NONATOMIC_IOSONLY, readonly) BOOL saveMetadata; /** * The receiver's meta data as a NSDictionary object. */ @property (nonatomic, readonly, copy) NSDictionary * metaDictionary; /** * The receiver's state, such as Playing, Error, NothingSpecial, Buffering. */ @property (nonatomic, readonly) VLCMediaState state; /** * returns a bool whether is the media is expected to play fluently on this * device or not. It always returns YES on a Mac.*/ @property (NS_NONATOMIC_IOSONLY, getter=isMediaSizeSuitableForDevice, readonly) BOOL mediaSizeSuitableForDevice; /** * Tracks information NSDictionary Possible Keys */ /** * \returns a NSNumber */ extern NSString *const VLCMediaTracksInformationCodec; /** * \returns a NSNumber */ extern NSString *const VLCMediaTracksInformationId; /** * \returns a NSString * \see VLCMediaTracksInformationTypeAudio * \see VLCMediaTracksInformationTypeVideo * \see VLCMediaTracksInformationTypeText * \see VLCMediaTracksInformationTypeUnknown */ extern NSString *const VLCMediaTracksInformationType; /** * \returns a NSNumber */ extern NSString *const VLCMediaTracksInformationCodecProfile; /** * \returns a NSNumber */ extern NSString *const VLCMediaTracksInformationCodecLevel; /** * \returns the bitrate as NSNumber */ extern NSString *const VLCMediaTracksInformationBitrate; /** * \returns the language as NSString */ extern NSString *const VLCMediaTracksInformationLanguage; /** * \returns the description as NSString */ extern NSString *const VLCMediaTracksInformationDescription; /** * \returns the audio channel number as NSNumber */ extern NSString *const VLCMediaTracksInformationAudioChannelsNumber; /** * \returns the audio rate as NSNumber */ extern NSString *const VLCMediaTracksInformationAudioRate; /** * \returns the height as NSNumber */ extern NSString *const VLCMediaTracksInformationVideoHeight; /** * \returns the width as NSNumber */ extern NSString *const VLCMediaTracksInformationVideoWidth; /** * \returns the source aspect ratio as NSNumber */ extern NSString *const VLCMediaTracksInformationSourceAspectRatio; /** * \returns the source aspect ratio denominator as NSNumber */ extern NSString *const VLCMediaTracksInformationSourceAspectRatioDenominator; /** * \returns the frame rate as NSNumber */ extern NSString *const VLCMediaTracksInformationFrameRate; /** * \returns the frame rate denominator as NSNumber */ extern NSString *const VLCMediaTracksInformationFrameRateDenominator; /** * \returns the text encoding as NSString */ extern NSString *const VLCMediaTracksInformationTextEncoding; /** * Tracks information NSDictionary values for * VLCMediaTracksInformationType */ extern NSString *const VLCMediaTracksInformationTypeAudio; extern NSString *const VLCMediaTracksInformationTypeVideo; extern NSString *const VLCMediaTracksInformationTypeText; extern NSString *const VLCMediaTracksInformationTypeUnknown; /** * Returns the tracks information. * * This is an array of NSDictionary representing each track. * It can contain the following keys: * * \see VLCMediaTracksInformationCodec * \see VLCMediaTracksInformationId * \see VLCMediaTracksInformationType * * \see VLCMediaTracksInformationCodecProfile * \see VLCMediaTracksInformationCodecLevel * * \see VLCMediaTracksInformationBitrate * \see VLCMediaTracksInformationLanguage * \see VLCMediaTracksInformationDescription * * \see VLCMediaTracksInformationAudioChannelsNumber * \see VLCMediaTracksInformationAudioRate * * \see VLCMediaTracksInformationVideoHeight * \see VLCMediaTracksInformationVideoWidth * * \see VLCMediaTracksInformationSourceAspectRatio * \see VLCMediaTracksInformationSourceAspectDenominator * * \see VLCMediaTracksInformationFrameRate * \see VLCMediaTracksInformationFrameRateDenominator * * \see VLCMediaTracksInformationTextEncoding */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *tracksInformation; /** * Start asynchronously to parse the media. * This will attempt to fetch the meta data and tracks information. * * This is automatically done when an accessor requiring parsing * is called. * * \see -[VLCMediaDelegate mediaDidFinishParsing:] */ - (void)parse; /** * Trigger a synchronous parsing of the media * the selector won't return until parsing finished */ - (void)synchronousParse; /** * Add options to the media, that will be used to determine how * VLCMediaPlayer will read the media. This allow to use VLC advanced * reading/streaming options in a per-media basis * * The options are detailed in vlc --long-help, for instance "--sout-all" * And on the web: http://wiki.videolan.org/VLC_command-line_help */ - (void) addOptions:(NSDictionary*) options; /** * Getter for statistics information * Returns a NSDictionary with NSNumbers for values. * */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSDictionary *stats; #pragma mark - individual stats /** * returns the number of bytes read by the current input module * \return a NSInteger with the raw number of bytes */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfReadBytesOnInput; /** * returns the current input bitrate. may be 0 if the buffer is full * \return a float of the current input bitrate */ @property (NS_NONATOMIC_IOSONLY, readonly) float inputBitrate; /** * returns the number of bytes read by the current demux module * \return a NSInteger with the raw number of bytes */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfReadBytesOnDemux; /** * returns the current demux bitrate. may be 0 if the buffer is empty * \return a float of the current demux bitrate */ @property (NS_NONATOMIC_IOSONLY, readonly) float demuxBitrate; /** * returns the total number of decoded video blocks in the current media session * \return a NSInteger with the total number of decoded blocks */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfDecodedVideoBlocks; /** * returns the total number of decoded audio blocks in the current media session * \return a NSInteger with the total number of decoded blocks */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfDecodedAudioBlocks; /** * returns the total number of displayed pictures during the current media session * \return a NSInteger with the total number of displayed pictures */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfDisplayedPictures; /** * returns the total number of pictures lost during the current media session * \return a NSInteger with the total number of lost pictures */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfLostPictures; /** * returns the total number of played audio buffers during the current media session * \return a NSInteger with the total number of played audio buffers */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfPlayedAudioBuffers; /** * returns the total number of audio buffers lost during the current media session * \return a NSInteger with the total number of displayed pictures */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfLostAudioBuffers; /** * returns the total number of packets sent during the current media session * \return a NSInteger with the total number of sent packets */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfSentPackets; /** * returns the total number of raw bytes sent during the current media session * \return a NSInteger with the total number of sent bytes */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfSentBytes; /** * returns the current bitrate of sent bytes * \return a float of the current bitrate of sent bits */ @property (NS_NONATOMIC_IOSONLY, readonly) float streamOutputBitrate; /** * returns the total number of corrupted data packets during current sout session * \note value is 0 on non-stream-output operations * \return a NSInteger with the total number of corrupted data packets */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfCorruptedDataPackets; /** * returns the total number of discontinuties during current sout session * \note value is 0 on non-stream-output operations * \return a NSInteger with the total number of discontinuties */ @property (NS_NONATOMIC_IOSONLY, readonly) NSInteger numberOfDiscontinuties; @end Headers/Public/VLCMediaDiscoverer.h000066400000000000000000000042301250240207200174230ustar00rootroot00000000000000/***************************************************************************** * VLCMediaDiscoverer.h: VLCKit.framework VLCMediaDiscoverer header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007, 2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "VLCMediaList.h" @class VLCMediaList; /** * TODO: Documentation VLCMediaDiscoverer */ @interface VLCMediaDiscoverer : NSObject /** * Maintains a list of available media discoverers. This list is populated as new media * discoverers are created. * \return A list of available media discoverers. */ + (NSArray *)availableMediaDiscoverer; /* Initializers */ /** * Initializes new object with specified name. * \param aSerchName Name of the service for this VLCMediaDiscoverer object. * \returns Newly created media discoverer. */ - (instancetype)initWithName:(NSString *)aServiceName; /** * TODO: Documentation VLCMediaDiscoverer.discoveredMedia */ @property (weak, readonly) VLCMediaList * discoveredMedia; /** * TODO: Documentation VLCMediaDiscoverer.localizedName */ @property (readonly, copy) NSString * localizedName; /** * TODO: Documentation VLCMediaDiscoverer.isRunning */ @property (readonly) BOOL isRunning; @end Headers/Public/VLCMediaLibrary.h000066400000000000000000000027021250240207200167240ustar00rootroot00000000000000/***************************************************************************** * VLCMediaLibrary.h: VLCKit.framework VLCMediaDiscoverer header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007, 2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCMediaList.h" @class VLCMediaList; /** * TODO: Documentation */ @interface VLCMediaLibrary : NSObject /* Factories */ + (VLCMediaLibrary*)sharedMediaLibrary; /* Properties */ @property (nonatomic, readonly, strong) VLCMediaList * allMedia; @end Headers/Public/VLCMediaList.h000066400000000000000000000057011250240207200162350ustar00rootroot00000000000000/***************************************************************************** * VLCMediaList.h: VLCKit.framework VLCMediaList header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "VLCMedia.h" /* Notification Messages */ extern NSString *const VLCMediaListItemAdded; extern NSString *const VLCMediaListItemDeleted; @class VLCMedia; @class VLCMediaList; /** * TODO: Documentation VLCMediaListDelegate */ @protocol VLCMediaListDelegate @optional /** * TODO: Documentation - [VLCMediaListDelegate mediaList:mediaAdded:atIndex:] */ - (void)mediaList:(VLCMediaList *)aMediaList mediaAdded:(VLCMedia *)media atIndex:(NSInteger)index; /** * TODO: Documentation - [VLCMediaListDelegate mediaList:mediaRemovedAtIndex:] */ - (void)mediaList:(VLCMediaList *)aMediaList mediaRemovedAtIndex:(NSInteger)index; @end /** * TODO: Documentation VLCMediaList */ @interface VLCMediaList : NSObject - (instancetype)initWithArray:(NSArray *)array; /* Operations */ /** * TODO: Documentation - [VLCMediaList lock] */ - (void)lock; /** * TODO: Documentation - [VLCMediaList unlock] */ - (void)unlock; /** * TODO: Documentation - [VLCMediaList addMedia:] */ - (NSInteger)addMedia:(VLCMedia *)media; /** * TODO: Documentation - [VLCMediaList insertMedia:atIndex:] */ - (void)insertMedia:(VLCMedia *)media atIndex:(NSInteger)index; /** * TODO: Documentation - [VLCMediaList removeMediaAtIndex:] */ - (void)removeMediaAtIndex:(NSInteger)index; /** * TODO: Documentation - [VLCMediaList mediaAtIndex:] */ - (VLCMedia *)mediaAtIndex:(NSInteger)index; /** * TODO: Documentation - [VLCMediaList indexOfMedia:] */ - (NSInteger)indexOfMedia:(VLCMedia *)media; /* Properties */ /** * TODO: Documentation VLCMediaList.count */ @property (readonly) NSInteger count; /** * TODO: Documentation VLCMediaList.delegate */ @property (weak) id delegate; /** * TODO: Documentation VLCMediaList.isReadOnly */ @property (readonly) BOOL isReadOnly; @end Headers/Public/VLCMediaListPlayer.h000066400000000000000000000050231250240207200174070ustar00rootroot00000000000000/***************************************************************************** * VLCMediaListPlayer.h: VLCKit.framework VLCMediaListPlayer implementation ***************************************************************************** * Copyright (C) 2009 Pierre d'Herbemont * Partial Copyright (C) 2009-2013 Felix Paul Kühne * Copyright (C) 2009-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #if TARGET_OS_IPHONE # import #endif #import "VLCMedia.h" #import "VLCTime.h" #import "VLCAudio.h" #if !TARGET_OS_IPHONE @class VLCVideoView; @class VLCVideoLayer; #endif @class VLCLibrary; /* Notification Messages */ extern NSString *const VLCMediaPlayerTimeChanged; extern NSString *const VLCMediaPlayerStateChanged; /** * VLCMediaPlayerState describes the state of the media player. */ typedef NS_ENUM(NSInteger, VLCMediaPlayerState) { VLCMediaPlayerStateStopped, //< Player has stopped VLCMediaPlayerStateOpening, //< Stream is opening VLCMediaPlayerStateBuffering, //< Stream is buffering VLCMediaPlayerStateEnded, //< Stream has ended VLCMediaPlayerStateError, //< Player has generated an error VLCMediaPlayerStatePlaying, //< Stream is playing VLCMediaPlayerStatePaused //< Stream is paused }; /** * Returns the name of the player state as a string. * \param state The player state. * \return A string containing the name of state. If state is not a valid state, returns nil. */ extern NSString * VLCMediaPlayerStateToString(VLCMediaPlayerState state); /** * Formal protocol declaration for playback delegates. Allows playback messages * to be trapped by delegated objects. */ @protocol VLCMediaPlayerDelegate @optional /** * Sent by the default notification center whenever the player's state has changed. * \details Discussion The value of aNotification is always an VLCMediaPlayerStateChanged notification. You can retrieve * the VLCMediaPlayer object in question by sending object to aNotification. */ - (void)mediaPlayerStateChanged:(NSNotification *)aNotification; /** * Sent by the default notification center whenever the player's time has changed. * \details Discussion The value of aNotification is always an VLCMediaPlayerTimeChanged notification. You can retrieve * the VLCMediaPlayer object in question by sending object to aNotification. */ - (void)mediaPlayerTimeChanged:(NSNotification *)aNotification; @end // TODO: Should we use medialist_player or our own flavor of media player? @interface VLCMediaPlayer : NSObject @property (nonatomic, readonly) VLCLibrary *libraryInstance; @property (weak) id delegate; #if !TARGET_OS_IPHONE /* Initializers */ - (instancetype)initWithVideoView:(VLCVideoView *)aVideoView; - (instancetype)initWithVideoLayer:(VLCVideoLayer *)aVideoLayer; #endif - (instancetype)initWithOptions:(NSArray *)options; /* Video View Options */ // TODO: Should be it's own object? #pragma mark - #pragma mark video functionality #if !TARGET_OS_IPHONE - (void)setVideoView:(VLCVideoView *)aVideoView; - (void)setVideoLayer:(VLCVideoLayer *)aVideoLayer; #endif @property (strong) id drawable; /* The videoView or videoLayer */ /** * Set/Get current video aspect ratio. * * \param psz_aspect new video aspect-ratio or NULL to reset to default * \note Invalid aspect ratios are ignored. * \return the video aspect ratio or NULL if unspecified * (the result must be released with free()). */ @property (NS_NONATOMIC_IOSONLY) char *videoAspectRatio; /** * Set/Get current crop filter geometry. * * \param psz_geometry new crop filter geometry (NULL to unset) * \return the crop filter geometry or NULL if unset */ @property (NS_NONATOMIC_IOSONLY) char *videoCropGeometry; /** * Set/Get the current video scaling factor. * That is the ratio of the number of pixels on * screen to the number of pixels in the original decoded video in each * dimension. Zero is a special value; it will adjust the video to the output * window/drawable (in windowed mode) or the entire screen. * * \param relative scale factor as float */ @property (nonatomic) float scaleFactor; /** * Take a snapshot of the current video. * * If width AND height is 0, original size is used. * If width OR height is 0, original aspect-ratio is preserved. * * \param path the path where to save the screenshot to * \param width the snapshot's width * \param height the snapshot's height */ - (void)saveVideoSnapshotAt: (NSString *)path withWidth:(int)width andHeight:(int)height; /** * Enable or disable deinterlace filter * * \param name of deinterlace filter to use (availability depends on underlying VLC version), NULL to disable. */ - (void)setDeinterlaceFilter: (NSString *)name; /** * Enable or disable adjust video filter (contrast, brightness, hue, saturation, gamma) * * \param bool value */ @property (nonatomic) BOOL adjustFilterEnabled; /** * Set/Get the adjust filter's contrast value * * \param float value (range: 0-2, default: 1.0) */ @property (nonatomic) float contrast; /** * Set/Get the adjust filter's brightness value * * \param float value (range: 0-2, default: 1.0) */ @property (nonatomic) float brightness; /** * Set/Get the adjust filter's hue value * * \param integer value (range: 0-360, default: 0) */ @property (nonatomic) int hue; /** * Set/Get the adjust filter's saturation value * * \param float value (range: 0-3, default: 1.0) */ @property (nonatomic) float saturation; /** * Set/Get the adjust filter's gamma value * * \param float value (range: 0-10, default: 1.0) */ @property (nonatomic) float gamma; /** * Get the requested movie play rate. * @warning Depending on the underlying media, the requested rate may be * different from the real playback rate. Due to limitations of some protocols * this option may not be taken into account at all, if set. * \param rate movie play rate to set * * \return movie play rate */ @property (nonatomic) float rate; @property (nonatomic, readonly, weak) VLCAudio * audio; /* Video Information */ /** * Get the current video size * \return video size as CGSize */ @property (NS_NONATOMIC_IOSONLY, readonly) CGSize videoSize; /** * Does the current media have a video output? * \note a false return value doesn't mean that the video doesn't have any video * \note tracks. Those might just be disabled. * \return current video output status */ @property (NS_NONATOMIC_IOSONLY, readonly) BOOL hasVideoOut; /** * Frames per second * \return current media's frames per second value */ @property (NS_NONATOMIC_IOSONLY, readonly) float framesPerSecond; #pragma mark - #pragma mark time /** * Sets the current position (or time) of the feed. * \param value New time to set the current position to. If time is [VLCTime nullTime], 0 is assumed. */ /** * Returns the current position (or time) of the feed. * \return VLCTIme object with current time. */ @property (NS_NONATOMIC_IOSONLY, strong) VLCTime *time; @property (nonatomic, readonly, weak) VLCTime *remainingTime; /** * Frames per second * \note this property is deprecated. use (float)fps instead. * \return current media's frames per second value */ @property (readonly) NSUInteger fps __attribute__((deprecated)); #pragma mark - #pragma mark ES track handling /** * Return the current video track index * Note that the handled values do not match the videoTracks array indexes * but refer to videoSubTitlesIndexes. * \return 0 if none is set. * * Pass -1 to disable. */ @property (readwrite) NSUInteger currentVideoTrackIndex; /** * Returns the video track names, usually a language name or a description * It includes the "Disabled" fake track at index 0. */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *videoTrackNames; /** * Returns the video track IDs * those are needed to set the video index */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *videoTrackIndexes; /** * Return the video tracks * * It includes the disabled fake track at index 0. */ - (NSArray *)videoTracks __attribute__((deprecated)); /** * Return the current video subtitle index * Note that the handled values do not match the videoSubTitles array indexes * but refer to videoSubTitlesIndexes * \return 0 if none is set. * * Pass -1 to disable. */ @property (readwrite) NSUInteger currentVideoSubTitleIndex; /** * Returns the video subtitle track names, usually a language name or a description * It includes the "Disabled" fake track at index 0. */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *videoSubTitlesNames; /** * Returns the video subtitle track IDs * those are needed to set the video subtitle index */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *videoSubTitlesIndexes; /** * Return the video subtitle tracks * \note this property is deprecated. use (NSArray *)videoSubtitleNames instead. * It includes the disabled fake track at index 0. */ - (NSArray *)videoSubTitles __attribute__((deprecated)); /** * Load and set a specific video subtitle, from a file. * \param path to a file * \return if the call succeed.. */ - (BOOL)openVideoSubTitlesFromFile:(NSString *)path; /** * Get the current subtitle delay. Positive values means subtitles are being * displayed later, negative values earlier. * * \return time (in microseconds) the display of subtitles is being delayed */ @property (readwrite) NSInteger currentVideoSubTitleDelay; /** * Chapter selection and enumeration, it is bound * to a title option. */ /** * Return the current video subtitle index, or * \return NSNotFound if none is set. * * To disable subtitle pass NSNotFound. */ @property (readwrite) int currentChapterIndex; - (void)previousChapter; - (void)nextChapter; - (NSArray *)chaptersForTitleIndex:(int)titleIndex; /** * Title selection and enumeration * \return NSNotFound if none is set. */ @property (readwrite) int currentTitleIndex; @property (readonly) NSUInteger countOfTitles; @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *titles; /* Audio Options */ /** * Return the current audio track index * Note that the handled values do not match the audioTracks array indexes * but refer to audioTrackIndexes. * \return 0 if none is set. * * Pass -1 to disable. */ @property (readwrite) NSUInteger currentAudioTrackIndex; /** * Returns the audio track names, usually a language name or a description * It includes the "Disabled" fake track at index 0. */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *audioTrackNames; /** * Returns the audio track IDs * those are needed to set the video index */ @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *audioTrackIndexes; /** * Return the audio tracks * * It includes the "Disable" fake track at index 0. */ - (NSArray *)audioTracks __attribute__((deprecated)); #pragma mark - #pragma mark audio functionality @property (NS_NONATOMIC_IOSONLY) int audioChannel; /** * Get the current audio delay. Positive values means audio is delayed further, * negative values less. * * \return time (in microseconds) the audio playback is being delayed */ @property (readwrite) NSInteger currentAudioPlaybackDelay; #pragma mark - #pragma mark equalizer /** * Get a list of available equalizer profiles * \Note Current versions do not allow the addition of further profiles * so you need to handle this in your app. * * \return array of equalizer profiles */ @property (weak, readonly) NSArray *equalizerProfiles; /** * Re-set the equalizer to a profile retrieved from the list * \Note This doesn't enable the Equalizer automagically */ - (void)resetEqualizerFromProfile:(unsigned)profile; /** * Toggle equalizer state * \param bool value to enable/disable the equalizer * \return current state */ @property (readwrite) BOOL equalizerEnabled; /** * Set amplification level * \param The supplied amplification value will be clamped to the -20.0 to +20.0 range. * \note this will create and enabled an Equalizer instance if not present * \return current amplification level */ @property (readwrite) CGFloat preAmplification; /** * Number of equalizer bands * \return the number of equalizer bands available in the current release */ @property (readonly) unsigned numberOfBands; /** * frequency of equalizer band * \return frequency of the requested equalizer band */ - (CGFloat)frequencyOfBandAtIndex:(unsigned)index; /** * set amplification for band * \param amplification value (clamped to the -20.0 to +20.0 range) * \param index of the respective band */ - (void)setAmplification:(CGFloat)amplification forBand:(unsigned)index; /** * amplification of band * \param index of the band * \return current amplification value (clamped to the -20.0 to +20.0 range) */ - (CGFloat)amplificationOfBand:(unsigned)index; #pragma mark - #pragma mark media handling /* Media Options */ @property (NS_NONATOMIC_IOSONLY, strong) VLCMedia *media; #pragma mark - #pragma mark playback operations /** * Plays a media resource using the currently selected media controller (or * default controller. If feed was paused then the feed resumes at the position * it was paused in. * \return A Boolean determining whether the stream was played or not. */ -(BOOL)play; /** * Toggle's the pause state of the feed. */ - (void)pause; /** * Stop the playing. */ - (void)stop; /** * Advance one frame. */ - (void)gotoNextFrame; /** * Fast forwards through the feed at the standard 1x rate. */ - (void)fastForward; /** * Fast forwards through the feed at the rate specified. * \param rate Rate at which the feed should be fast forwarded. */ - (void)fastForwardAtRate:(float)rate; /** * Rewinds through the feed at the standard 1x rate. */ - (void)rewind; /** * Rewinds through the feed at the rate specified. * \param rate Rate at which the feed should be fast rewound. */ - (void)rewindAtRate:(float)rate; /** * Jumps shortly backward in current stream if seeking is supported. * \param interval to skip, in sec. */ - (void)jumpBackward:(int)interval; /** * Jumps shortly forward in current stream if seeking is supported. * \param interval to skip, in sec. */ - (void)jumpForward:(int)interval; /** * Jumps shortly backward in current stream if seeking is supported. */ - (void)extraShortJumpBackward; /** * Jumps shortly forward in current stream if seeking is supported. */ - (void)extraShortJumpForward; /** * Jumps shortly backward in current stream if seeking is supported. */ - (void)shortJumpBackward; /** * Jumps shortly forward in current stream if seeking is supported. */ - (void)shortJumpForward; /** * Jumps shortly backward in current stream if seeking is supported. */ - (void)mediumJumpBackward; /** * Jumps shortly forward in current stream if seeking is supported. */ - (void)mediumJumpForward; /** * Jumps shortly backward in current stream if seeking is supported. */ - (void)longJumpBackward; /** * Jumps shortly forward in current stream if seeking is supported. */ - (void)longJumpForward; #pragma mark - #pragma mark playback information /** * Playback state flag identifying that the stream is currently playing. * \return TRUE if the feed is playing, FALSE if otherwise. */ @property (NS_NONATOMIC_IOSONLY, getter=isPlaying, readonly) BOOL playing; /** * Playback state flag identifying wheather the stream will play. * \return TRUE if the feed is ready for playback, FALSE if otherwise. */ @property (NS_NONATOMIC_IOSONLY, readonly) BOOL willPlay; /** * Playback's current state. * \see VLCMediaState */ @property (NS_NONATOMIC_IOSONLY, readonly) VLCMediaPlayerState state; /** * Returns the receiver's position in the reading. * \return movie position as percentage between 0.0 and 1.0. */ @property (NS_NONATOMIC_IOSONLY) float position; /** * Set movie position. This has no effect if playback is not enabled. * \param movie position as percentage between 0.0 and 1.0. */ @property (NS_NONATOMIC_IOSONLY, getter=isSeekable, readonly) BOOL seekable; @property (NS_NONATOMIC_IOSONLY, readonly) BOOL canPause; @end Headers/Public/VLCMediaThumbnailer.h000066400000000000000000000051641250240207200175770ustar00rootroot00000000000000/***************************************************************************** * VLCKit: VLCMediaThumbnailer ***************************************************************************** * Copyright (C) 2010-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #if TARGET_OS_IPHONE # import #endif @class VLCMedia; @class VLCLibrary; @protocol VLCMediaThumbnailerDelegate; @interface VLCMediaThumbnailer : NSObject + (VLCMediaThumbnailer *)thumbnailerWithMedia:(VLCMedia *)media andDelegate:(id)delegate; + (VLCMediaThumbnailer *)thumbnailerWithMedia:(VLCMedia *)media delegate:(id)delegate andVLCLibrary:(VLCLibrary *)library; - (void)fetchThumbnail; @property (readwrite, weak) id delegate; @property (readwrite) VLCMedia *media; @property (readwrite, assign) CGImageRef thumbnail; @property (readwrite) void * libVLCinstance; /** * Thumbnail Height * You shouldn't change this after -fetchThumbnail * has been called. * @return thumbnail height. Default value 240. */ @property (readwrite, assign) CGFloat thumbnailHeight; /** * Thumbnail Width * You shouldn't change this after -fetchThumbnail * has been called. * @return thumbnail height. Default value 320 */ @property (readwrite, assign) CGFloat thumbnailWidth; /** * Snapshot Position * You shouldn't change this after -fetchThumbnail * has been called. * @return snapshot position. Default value 0.5 */ @property (readwrite, assign) float snapshotPosition; @end @protocol VLCMediaThumbnailerDelegate @required - (void)mediaThumbnailerDidTimeOut:(VLCMediaThumbnailer *)mediaThumbnailer; - (void)mediaThumbnailer:(VLCMediaThumbnailer *)mediaThumbnailer didFinishThumbnail:(CGImageRef)thumbnail; @end Headers/Public/VLCPlaylistDataSource.h000066400000000000000000000054261250240207200201420ustar00rootroot00000000000000/***************************************************************************** * VLCPlaylistDataSource.h: VLC.framework VLCPlaylistDataSource header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import /* This class can be used as a data source for an NSOutlineView * it will display the playlist content. If provided the videoView * will automatically be associated to the given playlist, and actions * in the outlineView will trigger the videoView, visual feedback of the * current item in the videoview will be displayed in the outlineview */ @interface VLCPlaylistDataSource : NSObject { VLCPlaylist * playlist; VLCVideoView * videoView; NSOutlineView *outlineView; } - (id)initWithPlaylist:(VLCPlaylist *)aPlaylist; - (id)initWithPlaylist:(VLCPlaylist *)aPlaylist videoView:(VLCVideoView *)aVideoView; - (VLCPlaylist *)playlist; - (VLCVideoView *)videoView; @end /* It could be really useful to use that, this probably need to be reviewed to see * if it really belongs here */ @interface VLCPlaylistDataSource (OutlineViewDataSource) - (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item; - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item; - (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item; - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item; @end @interface VLCPlaylistDataSource (OutlineViewDataSourceDropping) - (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id )info item:(id)item childIndex:(int)index; - (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id )info proposedItem:(id)item proposedChildIndex:(int)index; @end Headers/Public/VLCServicesDiscoverer.h000066400000000000000000000025001250240207200201650ustar00rootroot00000000000000/***************************************************************************** * VLCServicesDiscoverer.h: VLC.framework VLCMediaDiscoverer header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ @interface VLCServicesDiscoverer : NSObject { NSArray * services; } + (id)sharedDiscoverer; - (id)init; - (NSArray *)services; @end Headers/Public/VLCStreamOutput.h000066400000000000000000000035571250240207200170450ustar00rootroot00000000000000/***************************************************************************** * VLCStreamOutput.h: VLCKit.framework VLCStreamOutput header ***************************************************************************** * Copyright (C) 2008 Pierre d'Herbemont * Copyright (C) 2008, 2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ extern NSString * VLCDefaultStreamOutputRTSP; extern NSString * VLCDefaultStreamOutputRTP; extern NSString * VLCDefaultStreamOutputRTP; @interface VLCStreamOutput : NSObject - (instancetype)initWithOptionDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER; + (instancetype)streamOutputWithOptionDictionary:(NSDictionary *)dictionary; + (id)rtpBroadcastStreamOutputWithSAPAnnounce:(NSString *)announceName; + (id)rtpBroadcastStreamOutput; + (id)ipodStreamOutputWithFilePath:(NSString *)filePath; + (instancetype)streamOutputWithFilePath:(NSString *)filePath; + (id)mpeg2StreamOutputWithFilePath:(NSString *)filePath; + (id)mpeg4StreamOutputWithFilePath:(NSString *)filePath; @end Headers/Public/VLCStreamSession.h000066400000000000000000000031151250240207200171560ustar00rootroot00000000000000/***************************************************************************** * VLCStreamSession.h: VLCKit.framework VLCStreamSession header ***************************************************************************** * Copyright (C) 2008 Pierre d'Herbemont * Copyright (C) 2008 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import #import @interface VLCStreamSession : VLCMediaPlayer + (instancetype)streamSession; @property (nonatomic, strong) VLCStreamOutput * streamOutput; @property (nonatomic, readonly) BOOL isComplete; @property (nonatomic, readonly) NSUInteger reattemptedConnections; - (void)startStreaming; - (void)stopStreaming; @end Headers/Public/VLCTime.h000066400000000000000000000037141250240207200152620ustar00rootroot00000000000000/***************************************************************************** * VLCTime.h: VLCKit.framework VLCTime header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import /** * Provides an object to define VLCMedia's time. */ @interface VLCTime : NSObject /* Factories */ + (VLCTime *)nullTime; + (VLCTime *)timeWithNumber:(NSNumber *)aNumber; + (VLCTime *)timeWithInt:(int)aInt; /* Initializers */ - (instancetype)initWithNumber:(NSNumber *)aNumber; - (instancetype)initWithInt:(int)aInt; /* Properties */ @property (nonatomic, readonly) NSNumber * value; //< Holds, in milliseconds, the VLCTime value @property (readonly) NSNumber * numberValue; // here for backwards compatibility @property (readonly) NSString * stringValue; @property (readonly) NSString * verboseStringValue; @property (readonly) NSString * minuteStringValue; @property (readonly) int intValue; /* Comparators */ - (NSComparisonResult)compare:(VLCTime *)aTime; @end Headers/Public/VLCVideoLayer.h000066400000000000000000000025211250240207200164220ustar00rootroot00000000000000/***************************************************************************** * VLCVideoLayer.h: VLCKit.framework VLCVideoLayer header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import @interface VLCVideoLayer : CALayer @property (nonatomic, readonly) BOOL hasVideo; @property (nonatomic) BOOL fillScreen; @end Headers/Public/VLCVideoView.h000066400000000000000000000027031250240207200162620ustar00rootroot00000000000000/***************************************************************************** * VLCVideoView.h: VLCKit.framework VLCVideoView header ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import @interface VLCVideoView : NSView /* Properties */ @property (nonatomic, weak) id delegate; @property (nonatomic, copy) NSColor *backColor; @property BOOL fillScreen; @property (nonatomic, readonly) BOOL hasVideo; @end Makefile000066400000000000000000000005521250240207200125120ustar00rootroot00000000000000VLCKit.zip: VLCKit zip -r -y -9 $@ $< VLCKit: build/Debug/VLCKit.framework rm -rf $@-tmp && mkdir -p $@-tmp cp -R $< $@-tmp cp COPYING $@-tmp mv $@-tmp $@ && touch $@ build/Debug/VLCKit.framework: xcodebuild -project VLCKit.xcodeproj -target "Build Everything" clean: xcodebuild -project VLCKit.xcodeproj clean rm -fr VLCKit VLCKit.zip .PHONY: clean MobileVLCKit.xcodeproj/000077500000000000000000000000001250240207200152705ustar00rootroot00000000000000MobileVLCKit.xcodeproj/project.pbxproj000066400000000000000000000530561250240207200203550ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXAggregateTarget section */ 7A5ECAF911DE917B00F66AF3 /* Aggregate static plugins */ = { isa = PBXAggregateTarget; buildConfigurationList = 7A5ECB1011DE919F00F66AF3 /* Build configuration list for PBXAggregateTarget "Aggregate static plugins" */; buildPhases = ( 7A5ECAF811DE917B00F66AF3 /* Aggregate static plugins script */, ); dependencies = ( ); name = "Aggregate static plugins"; productName = "Aggregate static plugins"; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 6360B0E211E7F0C000EAD790 /* VLCMediaDiscoverer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6360B0E111E7F0C000EAD790 /* VLCMediaDiscoverer.m */; }; 6360B10611E7F27300EAD790 /* VLCMediaDiscoverer.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 6360B0E311E7F0D300EAD790 /* VLCMediaDiscoverer.h */; }; 636E975811EBC67A002FE8A9 /* VLCMediaThumbnailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 636E975711EBC67A002FE8A9 /* VLCMediaThumbnailer.m */; }; 636E979111EBC97C002FE8A9 /* VLCMediaThumbnailer.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 636E979011EBC96D002FE8A9 /* VLCMediaThumbnailer.h */; }; 7A5ECACB11DE8F7300F66AF3 /* VLCEventManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A5ECAC411DE8F7300F66AF3 /* VLCEventManager.m */; }; 7A5ECACC11DE8F7300F66AF3 /* VLCLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A5ECAC511DE8F7300F66AF3 /* VLCLibrary.m */; }; 7A5ECACD11DE8F7300F66AF3 /* VLCMedia.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A5ECAC611DE8F7300F66AF3 /* VLCMedia.m */; }; 7A5ECACE11DE8F7300F66AF3 /* VLCMediaList.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A5ECAC711DE8F7300F66AF3 /* VLCMediaList.m */; }; 7A5ECACF11DE8F7300F66AF3 /* VLCMediaPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A5ECAC811DE8F7300F66AF3 /* VLCMediaPlayer.m */; }; 7A5ECAD011DE8F7300F66AF3 /* VLCTime.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A5ECAC911DE8F7300F66AF3 /* VLCTime.m */; }; 7A5ECAD111DE8F7300F66AF3 /* VLCAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A5ECACA11DE8F7300F66AF3 /* VLCAudio.m */; }; 7A5ECB5511DE961700F66AF3 /* VLCLibrary.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7A5ECAD411DE8FAB00F66AF3 /* VLCLibrary.h */; }; 7A5ECB5611DE961700F66AF3 /* VLCMedia.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7A5ECAD511DE8FAB00F66AF3 /* VLCMedia.h */; }; 7A5ECB5711DE961700F66AF3 /* VLCMediaList.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7A5ECAD611DE8FAB00F66AF3 /* VLCMediaList.h */; }; 7A5ECB5811DE961700F66AF3 /* VLCMediaPlayer.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7A5ECAD711DE8FAB00F66AF3 /* VLCMediaPlayer.h */; }; 7A5ECB5911DE961700F66AF3 /* VLCTime.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7A5ECAD811DE8FAB00F66AF3 /* VLCTime.h */; }; 7A5ECB5A11DE961700F66AF3 /* VLCAudio.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7A5ECAD911DE8FAB00F66AF3 /* VLCAudio.h */; }; 7A5ECB9E11DE975A00F66AF3 /* MobileVLCKit.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7A5ECB9D11DE975700F66AF3 /* MobileVLCKit.h */; }; 7D5F800A185B72EB00C2CD75 /* VLCMediaListPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D5F8009185B72EB00C2CD75 /* VLCMediaListPlayer.m */; }; 7D5F800C185B733800C2CD75 /* VLCMediaListPlayer.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 7D5F800B185B730F00C2CD75 /* VLCMediaListPlayer.h */; }; AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ CCD5C82E15947E6B00AED565 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 7A5ECAF911DE917B00F66AF3; remoteInfo = "Aggregate static plugins"; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 7A5ECB6211DE961B00F66AF3 /* Copy Headers */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = include/MobileVLCKit; dstSubfolderSpec = 16; files = ( 7A5ECB9E11DE975A00F66AF3 /* MobileVLCKit.h in Copy Headers */, 7A5ECB5511DE961700F66AF3 /* VLCLibrary.h in Copy Headers */, 7A5ECB5611DE961700F66AF3 /* VLCMedia.h in Copy Headers */, 636E979111EBC97C002FE8A9 /* VLCMediaThumbnailer.h in Copy Headers */, 7A5ECB5711DE961700F66AF3 /* VLCMediaList.h in Copy Headers */, 7A5ECB5811DE961700F66AF3 /* VLCMediaPlayer.h in Copy Headers */, 7D5F800C185B733800C2CD75 /* VLCMediaListPlayer.h in Copy Headers */, 6360B10611E7F27300EAD790 /* VLCMediaDiscoverer.h in Copy Headers */, 7A5ECB5911DE961700F66AF3 /* VLCTime.h in Copy Headers */, 7A5ECB5A11DE961700F66AF3 /* VLCAudio.h in Copy Headers */, ); name = "Copy Headers"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 6360B0E111E7F0C000EAD790 /* VLCMediaDiscoverer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaDiscoverer.m; path = Sources/VLCMediaDiscoverer.m; sourceTree = ""; }; 6360B0E311E7F0D300EAD790 /* VLCMediaDiscoverer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaDiscoverer.h; path = Headers/Public/VLCMediaDiscoverer.h; sourceTree = ""; }; 636E975711EBC67A002FE8A9 /* VLCMediaThumbnailer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaThumbnailer.m; path = Sources/VLCMediaThumbnailer.m; sourceTree = ""; }; 636E979011EBC96D002FE8A9 /* VLCMediaThumbnailer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaThumbnailer.h; path = Headers/Public/VLCMediaThumbnailer.h; sourceTree = ""; }; 7A5ECAC411DE8F7300F66AF3 /* VLCEventManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCEventManager.m; path = Sources/VLCEventManager.m; sourceTree = ""; }; 7A5ECAC511DE8F7300F66AF3 /* VLCLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCLibrary.m; path = Sources/VLCLibrary.m; sourceTree = ""; }; 7A5ECAC611DE8F7300F66AF3 /* VLCMedia.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMedia.m; path = Sources/VLCMedia.m; sourceTree = ""; }; 7A5ECAC711DE8F7300F66AF3 /* VLCMediaList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaList.m; path = Sources/VLCMediaList.m; sourceTree = ""; }; 7A5ECAC811DE8F7300F66AF3 /* VLCMediaPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaPlayer.m; path = Sources/VLCMediaPlayer.m; sourceTree = ""; }; 7A5ECAC911DE8F7300F66AF3 /* VLCTime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCTime.m; path = Sources/VLCTime.m; sourceTree = ""; }; 7A5ECACA11DE8F7300F66AF3 /* VLCAudio.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCAudio.m; path = Sources/VLCAudio.m; sourceTree = ""; }; 7A5ECAD411DE8FAB00F66AF3 /* VLCLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLibrary.h; path = Headers/Public/VLCLibrary.h; sourceTree = ""; }; 7A5ECAD511DE8FAB00F66AF3 /* VLCMedia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMedia.h; path = Headers/Public/VLCMedia.h; sourceTree = ""; }; 7A5ECAD611DE8FAB00F66AF3 /* VLCMediaList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaList.h; path = Headers/Public/VLCMediaList.h; sourceTree = ""; }; 7A5ECAD711DE8FAB00F66AF3 /* VLCMediaPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaPlayer.h; path = Headers/Public/VLCMediaPlayer.h; sourceTree = ""; }; 7A5ECAD811DE8FAB00F66AF3 /* VLCTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCTime.h; path = Headers/Public/VLCTime.h; sourceTree = ""; }; 7A5ECAD911DE8FAB00F66AF3 /* VLCAudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCAudio.h; path = Headers/Public/VLCAudio.h; sourceTree = ""; }; 7A5ECAE411DE8FEF00F66AF3 /* VLCLibVLCBridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLibVLCBridging.h; path = Headers/Internal/VLCLibVLCBridging.h; sourceTree = ""; }; 7A5ECAE511DE8FEF00F66AF3 /* VLCEventManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCEventManager.h; path = Headers/Internal/VLCEventManager.h; sourceTree = ""; }; 7A5ECB3311DE948C00F66AF3 /* MobileVLCKit.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = MobileVLCKit.xcconfig; path = MobileVLCKit/MobileVLCKit.xcconfig; sourceTree = ""; }; 7A5ECB3411DE94D600F66AF3 /* vlc-plugins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "vlc-plugins.h"; path = "MobileVLCKit/vlc-plugins.h"; sourceTree = ""; }; 7A5ECB9D11DE975700F66AF3 /* MobileVLCKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MobileVLCKit.h; path = Headers/Public/MobileVLCKit.h; sourceTree = ""; }; 7A5ECBAC11DE987400F66AF3 /* AggregateStaticPlugins.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = AggregateStaticPlugins.sh; path = MobileVLCKit/AggregateStaticPlugins.sh; sourceTree = ""; }; 7D5F8009185B72EB00C2CD75 /* VLCMediaListPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCMediaListPlayer.m; path = Sources/VLCMediaListPlayer.m; sourceTree = ""; }; 7D5F800B185B730F00C2CD75 /* VLCMediaListPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaListPlayer.h; path = Headers/Public/VLCMediaListPlayer.h; sourceTree = ""; }; AA747D9E0F9514B9006C5449 /* MobileVLCKit_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MobileVLCKit_Prefix.pch; sourceTree = SOURCE_ROOT; }; AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D2AAC07E0554694100DB518D /* libMobileVLCKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMobileVLCKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ D2AAC07C0554694100DB518D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DFFF38A50411DB9C8B /* Products */ = { isa = PBXGroup; children = ( D2AAC07E0554694100DB518D /* libMobileVLCKit.a */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* MobileVLCKit */ = { isa = PBXGroup; children = ( 7A5ECAE211DE8FD200F66AF3 /* Headers */, 08FB77AEFE84172EC02AAC07 /* Sources */, 32C88DFF0371C24200C91783 /* Other Sources */, 0867D69AFE84028FC02AAC07 /* Frameworks */, 034768DFFF38A50411DB9C8B /* Products */, ); name = MobileVLCKit; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* Frameworks */ = { isa = PBXGroup; children = ( AACBBE490F95108600F1A2B1 /* Foundation.framework */, ); name = Frameworks; sourceTree = ""; }; 08FB77AEFE84172EC02AAC07 /* Sources */ = { isa = PBXGroup; children = ( 7A5ECAC411DE8F7300F66AF3 /* VLCEventManager.m */, 7A5ECAC511DE8F7300F66AF3 /* VLCLibrary.m */, 7A5ECAC611DE8F7300F66AF3 /* VLCMedia.m */, 7A5ECAC711DE8F7300F66AF3 /* VLCMediaList.m */, 7A5ECAC811DE8F7300F66AF3 /* VLCMediaPlayer.m */, 7D5F8009185B72EB00C2CD75 /* VLCMediaListPlayer.m */, 636E975711EBC67A002FE8A9 /* VLCMediaThumbnailer.m */, 6360B0E111E7F0C000EAD790 /* VLCMediaDiscoverer.m */, 7A5ECAC911DE8F7300F66AF3 /* VLCTime.m */, 7A5ECACA11DE8F7300F66AF3 /* VLCAudio.m */, ); name = Sources; sourceTree = ""; }; 32C88DFF0371C24200C91783 /* Other Sources */ = { isa = PBXGroup; children = ( 7A5ECBAC11DE987400F66AF3 /* AggregateStaticPlugins.sh */, 7A5ECB3311DE948C00F66AF3 /* MobileVLCKit.xcconfig */, AA747D9E0F9514B9006C5449 /* MobileVLCKit_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 7A5ECAE211DE8FD200F66AF3 /* Headers */ = { isa = PBXGroup; children = ( 7A5ECB9D11DE975700F66AF3 /* MobileVLCKit.h */, 7A5ECAE311DE8FDF00F66AF3 /* Internal */, 7A5ECAD411DE8FAB00F66AF3 /* VLCLibrary.h */, 7A5ECAD511DE8FAB00F66AF3 /* VLCMedia.h */, 636E979011EBC96D002FE8A9 /* VLCMediaThumbnailer.h */, 7A5ECAD611DE8FAB00F66AF3 /* VLCMediaList.h */, 7A5ECAD711DE8FAB00F66AF3 /* VLCMediaPlayer.h */, 7D5F800B185B730F00C2CD75 /* VLCMediaListPlayer.h */, 6360B0E311E7F0D300EAD790 /* VLCMediaDiscoverer.h */, 7A5ECAD811DE8FAB00F66AF3 /* VLCTime.h */, 7A5ECAD911DE8FAB00F66AF3 /* VLCAudio.h */, ); name = Headers; sourceTree = ""; }; 7A5ECAE311DE8FDF00F66AF3 /* Internal */ = { isa = PBXGroup; children = ( 7A5ECB3411DE94D600F66AF3 /* vlc-plugins.h */, 7A5ECAE411DE8FEF00F66AF3 /* VLCLibVLCBridging.h */, 7A5ECAE511DE8FEF00F66AF3 /* VLCEventManager.h */, ); name = Internal; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ D2AAC07D0554694100DB518D /* MobileVLCKit */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "MobileVLCKit" */; buildPhases = ( D2AAC07B0554694100DB518D /* Sources */, 7A5ECB6211DE961B00F66AF3 /* Copy Headers */, D2AAC07C0554694100DB518D /* Frameworks */, ); buildRules = ( ); dependencies = ( CCD5C82F15947E6B00AED565 /* PBXTargetDependency */, ); name = MobileVLCKit; productName = MobileVLCKit; productReference = D2AAC07E0554694100DB518D /* libMobileVLCKit.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0420; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "MobileVLCKit" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( en, ); mainGroup = 0867D691FE84028FC02AAC07 /* MobileVLCKit */; productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( D2AAC07D0554694100DB518D /* MobileVLCKit */, 7A5ECAF911DE917B00F66AF3 /* Aggregate static plugins */, ); }; /* End PBXProject section */ /* Begin PBXShellScriptBuildPhase section */ 7A5ECAF811DE917B00F66AF3 /* Aggregate static plugins script */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Aggregate static plugins script"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/bin/sh ${SRCROOT}/MobileVLCKit/AggregateStaticPlugins.sh\nexit 0\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ D2AAC07B0554694100DB518D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 7A5ECACB11DE8F7300F66AF3 /* VLCEventManager.m in Sources */, 7D5F800A185B72EB00C2CD75 /* VLCMediaListPlayer.m in Sources */, 7A5ECACC11DE8F7300F66AF3 /* VLCLibrary.m in Sources */, 7A5ECACD11DE8F7300F66AF3 /* VLCMedia.m in Sources */, 7A5ECACE11DE8F7300F66AF3 /* VLCMediaList.m in Sources */, 7A5ECACF11DE8F7300F66AF3 /* VLCMediaPlayer.m in Sources */, 7A5ECAD011DE8F7300F66AF3 /* VLCTime.m in Sources */, 7A5ECAD111DE8F7300F66AF3 /* VLCAudio.m in Sources */, 6360B0E211E7F0C000EAD790 /* VLCMediaDiscoverer.m in Sources */, 636E975811EBC67A002FE8A9 /* VLCMediaThumbnailer.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ CCD5C82F15947E6B00AED565 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 7A5ECAF911DE917B00F66AF3 /* Aggregate static plugins */; targetProxy = CCD5C82E15947E6B00AED565 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 1DEB921F08733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7A5ECB3311DE948C00F66AF3 /* MobileVLCKit.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( "$(ARCHS_STANDARD_INCLUDING_64_BIT)", armv7s, ); CLANG_ENABLE_OBJC_ARC = YES; COPY_PHASE_STRIP = NO; DSTROOT = /tmp/MobileVLCKit.dst; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MobileVLCKit_Prefix.pch; GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = "$(SRCROOT)/MobileVLCKit/ImportedSources/vlc/include"; INSTALL_PATH = /usr/local/lib; IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; PRODUCT_NAME = MobileVLCKit; VLC_SRC_DIR = "$(PROJECT_DIR)/MobileVLCKit/ImportedSources/vlc"; }; name = Debug; }; 1DEB922008733DC00010E9CD /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7A5ECB3311DE948C00F66AF3 /* MobileVLCKit.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( "$(ARCHS_STANDARD_INCLUDING_64_BIT)", armv7s, ); CLANG_ENABLE_OBJC_ARC = YES; DSTROOT = /tmp/MobileVLCKit.dst; ENABLE_NS_ASSERTIONS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = MobileVLCKit_Prefix.pch; GCC_SYMBOLS_PRIVATE_EXTERN = YES; HEADER_SEARCH_PATHS = "$(SRCROOT)/MobileVLCKit/ImportedSources/vlc/include"; INSTALL_PATH = /usr/local/lib; IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; PRODUCT_NAME = MobileVLCKit; VLC_SRC_DIR = "$(PROJECT_DIR)/MobileVLCKit/ImportedSources/vlc"; }; name = Release; }; 1DEB922308733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.1; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Debug; }; 1DEB922408733DC00010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.1; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Release; }; 7A5ECAFA11DE917B00F66AF3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; PRODUCT_NAME = "Aggregate static plugins"; }; name = Debug; }; 7A5ECAFB11DE917B00F66AF3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; PRODUCT_NAME = "Aggregate static plugins"; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "MobileVLCKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB921F08733DC00010E9CD /* Debug */, 1DEB922008733DC00010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "MobileVLCKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB922308733DC00010E9CD /* Debug */, 1DEB922408733DC00010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 7A5ECB1011DE919F00F66AF3 /* Build configuration list for PBXAggregateTarget "Aggregate static plugins" */ = { isa = XCConfigurationList; buildConfigurations = ( 7A5ECAFA11DE917B00F66AF3 /* Debug */, 7A5ECAFB11DE917B00F66AF3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } MobileVLCKit/000077500000000000000000000000001250240207200132745ustar00rootroot00000000000000MobileVLCKit/AggregateStaticPlugins.sh000077500000000000000000000032411250240207200202330ustar00rootroot00000000000000#!/bin/sh # Pre-Compile.sh # MobileVLC # # Copyright Pierre d'Herbemont # License is the same as the COPYING file at root of the project pushd `dirname $0` > /dev/null PROJECT_DIR=`pwd` popd > /dev/null echo "PROJECT DIR = $PROJECT_DIR" ARCH=$ARCHS VLC_SRC_DIR="$PROJECT_DIR/ImportedSources/vlc" if [ "$PLATFORM_NAME" = "iphoneos" ]; then VLC_BUILD_DIR="$VLC_SRC_DIR/build-ios-OS/$CURRENT_ARCH" VLC_INSTALL_DIR="$VLC_SRC_DIR/install-ios-OS/$CURRENT_ARCH" else VLC_BUILD_DIR="$VLC_SRC_DIR/build-ios-Simulator/$CURRENT_ARCH" VLC_INSTALL_DIR="$VLC_SRC_DIR/install-ios-Simulator/$CURRENT_ARCH" fi VLC_CONTRIB_DIR="$VLC_INSTALL_DIR/contribs/" LDFLAGS="" echo "VLC_BUILD_DIR = $VLC_BUILD_DIR" echo "VLC_INSTALL_DIR = $VLC_INSTALL_DIR" echo "SRC DIR = $VLC_SRC_DIR" echo "VLC_CONTRIB_DIR = $VLC_CONTRIB_DIR" echo "=== Building for $ARCH ===" echo "-" echo "// This file is autogenerated by $(basename $0)\n\n" > $PROJECT_DIR/vlc-plugins.h echo "// This file is autogenerated by $(basename $0)\n\n" > $PROJECT_DIR/vlc-plugins.xcconfig VLC_MODULES=`ls $VLC_INSTALL_DIR/lib/vlc/plugins/lib*_plugin.a|tr \\\\n \ ` #echo $VLC_MODULES BUILTINS="const void *vlc_static_modules[] = {\n"; \ LDFLAGS="" DEFINITION="" for file in $VLC_MODULES; do name=`echo $file | sed 's/.*\/lib//' | sed 's/_plugin\.a//'` DEFINITION+="int vlc_entry__$name (int (*)(void *, void *, int, ...), void *);\n"; BUILTINS+=" vlc_entry__$name,\n" LDFLAGS+="\$(VLC_INSTALL_DIR)/lib/vlc/plugins/lib${name}_plugin.a " echo $name done; BUILTINS="$BUILTINS NULL\n};\n" echo -e "VLC_PLUGINS_LDFLAGS=$LDFLAGS" >> $PROJECT_DIR/vlc-plugins.xcconfig echo -e "$DEFINITION\n$BUILTINS" >> $PROJECT_DIR/vlc-plugins.h MobileVLCKit/MobileVLCKit.xcconfig000066400000000000000000000045071250240207200172500ustar00rootroot00000000000000// // vlc.xcconfig // VLC // // Created by Pierre d'Herbemont on 6/26/10. // Copyright 2010-2013 VLC Authors and VideoLAN. All rights reserved. // VLC_SRC_DIR=$(PROJECT_DIR)/MobileVLCKit/ImportedSources/vlc VLC_PLATFORM[sdk=iphonesimulator*]=Simulator VLC_PLATFORM[sdk=iphoneos*]=OS VLC_INSTALL_DIR=$(VLC_SRC_DIR)/install-ios-$(VLC_PLATFORM)/$(CURRENT_ARCH) //OTHER_CFLAGS= -ObjC -all_load #include "vlc-plugins.xcconfig" VLC_CONTRIB_DIR=$VLC_INSTALL_DIR/contribs AVCODEC=$(VLC_CONTRIB_DIR)/lib/libavutil.a ${VLC_CONTRIB_DIR}/lib/libavcodec.a $(VLC_CONTRIB_DIR)/lib/libavformat.a $(VLC_CONTRIB_DIR)/lib/libswscale.a $(VLC_CONTRIB_DIR)/lib/libgsm.a DVBPSI=$(VLC_CONTRIB_DIR)/lib/libdvbpsi.a FLAC=$(VLC_CONTRIB_DIR)/lib/libFLAC.a FREETYPE=$(VLC_CONTRIB_DIR)/lib/libfreetype.a FRIBIDI=$(VLC_CONTRIB_DIR)/lib/libfribidi.a ASS=$(VLC_CONTRIB_DIR)/lib/libass.a GCRYPT=$(VLC_CONTRIB_DIR)/lib/libgcrypt.a $(VLC_CONTRIB_DIR)/lib/libgpg-error.a HARFBUZZ=$(VLC_CONTRIB_DIR)/lib/libharfbuzz.a LIVE555=$(VLC_CONTRIB_DIR)/lib/libUsageEnvironment.a $(VLC_CONTRIB_DIR)/lib/libBasicUsageEnvironment.a $(VLC_CONTRIB_DIR)/lib/libgroupsock.a $(VLC_CONTRIB_DIR)/lib/libz.a $(VLC_CONTRIB_DIR)/lib/libliveMedia.a MKV=$(VLC_CONTRIB_DIR)/lib/libebml.a $(VLC_CONTRIB_DIR)/lib/libmatroska.a MODPLUG=$(VLC_CONTRIB_DIR)/lib/libmodplug.a OPUS=$(VLC_CONTRIB_DIR)/lib/libopus.a OGG=$(VLC_CONTRIB_DIR)/lib/libogg.a $(VLC_CONTRIB_DIR)/lib/libtheora.a $(VLC_CONTRIB_DIR)/lib/libtheoradec.a $(VLC_CONTRIB_DIR)/lib/libtheoraenc.a $(VLC_CONTRIB_DIR)/lib/libvorbis.a $(VLC_CONTRIB_DIR)/lib/libvorbisenc.a $(VLC_CONTRIB_DIR)/lib/libvorbisfile.a PICS=$(VLC_CONTRIB_DIR)/lib/libpng.a $(VLC_CONTRIB_DIR)/lib/libopenjpeg.a SPEEX=$(VLC_CONTRIB_DIR)/lib/libspeex.a $(VLC_CONTRIB_DIR)/lib/libspeexdsp.a TAGLIB=$(VLC_CONTRIB_DIR)/lib/libtag.a $(VLC_CONTRIB_DIR)/lib/libtag_c.a VPX=$(VLC_CONTRIB_DIR)/lib/libvpx.a XML=$(VLC_CONTRIB_DIR)/lib/libxml2.a ZLIB=$(VLC_CONTRIB_DIR)/lib/libz.a ZVBI=$(VLC_CONTRIB_DIR)/lib/libzvbi.a SSH=$(VLC_CONTRIB_DIR)/lib/libssh2.a OTHER_LIBTOOLFLAGS=$(ASS) $(AVCODEC) $(DVBPSI) $(FLAC) $(FRIBIDI) $(FREETYPE) $(GCRYPT) $(HARFBUZZ) $(LIVE555) $(MKV) $(MODPLUG) $(OGG) $(OPUS) $(PICS) $(SPEEX) $(TAGLIB) $(XML) $(VPX) $(ZLIB) $(ZVBI) $(SSH) $(VLC_INSTALL_DIR)/lib/vlc/libcompat.a $(VLC_INSTALL_DIR)/lib/libvlc.a $(VLC_INSTALL_DIR)/lib/libvlccore.a $(VLC_PLUGINS_LDFLAGS) $(OTHER_CFLAGS) MobileVLCKit/patches/000077500000000000000000000000001250240207200147235ustar00rootroot00000000000000MobileVLCKit/patches/0001-arm_neon-added-function-macro-to-handle-the-undersco.patch000066400000000000000000000041441250240207200303530ustar00rootroot00000000000000From 118fd3749f4269873a5ffb4c17d3c9fd8d8b7131 Mon Sep 17 00:00:00 2001 From: David Geldreich Date: Fri, 20 Apr 2012 16:41:19 +0200 Subject: [PATCH 01/15] arm_neon: added function macro to handle the underscore prefix for the iOS ARM ABI --- modules/arm_neon/asm.S | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 modules/arm_neon/asm.S diff --git a/modules/arm_neon/asm.S b/modules/arm_neon/asm.S new file mode 100644 index 0000000..d853255 --- /dev/null +++ b/modules/arm_neon/asm.S @@ -0,0 +1,49 @@ +@***************************************************************************** +@ asm.S : defines and macros +@***************************************************************************** +@ Copyright (C) 2012 David Geldreich +@ +@ This program is free software; you can redistribute it and/or modify +@ it under the terms of the GNU General Public License as published by +@ the Free Software Foundation; either version 2 of the License, or +@ (at your option) any later version. +@ +@ This program is distributed in the hope that it will be useful, +@ but WITHOUT ANY WARRANTY; without even the implied warranty of +@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +@ GNU General Public License for more details. +@ +@ You should have received a copy of the GNU General Public License +@ along with this program; if not, write to the Free Software Foundation, +@ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. +@****************************************************************************/ + +#ifdef __APPLE__ +# define EXTERN_ASM _ +#else +# define EXTERN_ASM +#endif + +#ifdef __ELF__ +# define ELF +#else +# define ELF @ +#endif + +.macro function name, export=0 + .macro endfunc +ELF .size \name, . - \name + .endfunc + .purgem endfunc + .endm + .text + .align 2 + .if \export + .global EXTERN_ASM\name +EXTERN_ASM\name: + .endif +ELF .type \name, %function + .func \name +\name: +.endm + -- 2.3.2 MobileVLCKit/patches/0002-arm_neon-use-a-macro-to-fix-compilation-for-iOS.patch000066400000000000000000000102671250240207200272320ustar00rootroot00000000000000From fb23aad296a0b5c6ad0b72b619313cbc524848c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Fri, 10 Aug 2012 16:01:49 +0200 Subject: [PATCH 02/15] arm_neon: use a macro to fix compilation for iOS --- modules/arm_neon/amplify.S | 9 +++--- modules/arm_neon/simple_channel_mixer.S | 57 +++++++++++++++------------------ 2 files changed, 31 insertions(+), 35 deletions(-) diff --git a/modules/arm_neon/amplify.S b/modules/arm_neon/amplify.S index 5938118..578f972 100644 --- a/modules/arm_neon/amplify.S +++ b/modules/arm_neon/amplify.S @@ -18,6 +18,8 @@ @ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. @****************************************************************************/ +#include "asm.S" + .syntax unified .arm .fpu neon @@ -26,10 +28,8 @@ #define DST r0 #define SRC r1 #define SIZE r2 - .align 2 - .global amplify_float_arm_neon - .type amplify_float_arm_neon, %function -amplify_float_arm_neon: + +function amplify_float_arm_neon, export=1 cmp SIZE, #0 bxeq lr #ifdef __ARM_PCS @@ -79,3 +79,4 @@ amplify_float_arm_neon: 4: vst1.f32 {d20-d21}, [DST,:128]! 5: vst1.f32 {d16-d17}, [DST,:128]! bx lr +endfunc diff --git a/modules/arm_neon/simple_channel_mixer.S b/modules/arm_neon/simple_channel_mixer.S index dcc51ed..4722be4 100644 --- a/modules/arm_neon/simple_channel_mixer.S +++ b/modules/arm_neon/simple_channel_mixer.S @@ -19,6 +19,8 @@ @ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. @****************************************************************************/ +#include "asm.S" + .fpu neon .text .align 2 @@ -34,9 +36,8 @@ coeff_7to2: .float 0.5 .float 0.25 .float 0.25 - .global convert_7to2_neon_asm - .type convert_7to2_neon_asm, %function -convert_7to2_neon_asm: + +function convert_7to2_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_7to2 @@ -63,16 +64,15 @@ convert_7to2_neon_asm: bne 0b pop {r4,pc} - +endfunc coeff_5to2: .float 0.5 .float 0.5 .float 0.33 .float 0.33 - .global convert_5to2_neon_asm - .type convert_5to2_neon_asm, %function -convert_5to2_neon_asm: + +function convert_5to2_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_5to2 @@ -95,14 +95,13 @@ convert_5to2_neon_asm: bne 0b pop {r4,pc} - +endfunc coeff_4to2: .float 0.5 .float 0.5 - .global convert_4to2_neon_asm - .type convert_4to2_neon_asm, %function -convert_4to2_neon_asm: + +function convert_4to2_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_4to2 @@ -119,14 +118,13 @@ convert_4to2_neon_asm: bne 0b pop {r4,pc} - +endfunc coeff_3to2: .float 0.5 .float 0.5 - .global convert_3to2_neon_asm - .type convert_3to2_neon_asm, %function -convert_3to2_neon_asm: + +function convert_3to2_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_3to2 @@ -147,16 +145,15 @@ convert_3to2_neon_asm: bne 0b pop {r4,pc} - +endfunc coeff_7to1: .float 0.25 .float 0.25 .float 0.125 .float 0.125 - .global convert_7to1_neon_asm - .type convert_7to1_neon_asm, %function -convert_7to1_neon_asm: + +function convert_7to1_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_7to1 @@ -181,16 +178,15 @@ convert_7to1_neon_asm: bne 0b pop {r4,pc} - +endfunc coeff_5to1: .float 0.25 .float 0.25 .float 0.16666667 .float 0.16666667 - .global convert_5to1_neon_asm - .type convert_5to1_neon_asm, %function -convert_5to1_neon_asm: + +function convert_5to1_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_5to1 @@ -212,16 +208,15 @@ convert_5to1_neon_asm: bne 0b pop {r4,pc} - +endfunc coeff_7to4: .float 0.5 .float 0.5 .float 0.16666667 .float 0.16666667 - .global convert_7to4_neon_asm - .type convert_7to4_neon_asm, %function -convert_7to4_neon_asm: + +function convert_7to4_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_7to4 @@ -247,14 +242,13 @@ convert_7to4_neon_asm: bne 0b pop {r4,pc} - +endfunc coeff_5to4: .float 0.5 .float 0.5 - .global convert_5to4_neon_asm - .type convert_5to4_neon_asm, %function -convert_5to4_neon_asm: + +function convert_5to4_neon_asm, export=1 push {r4,lr} adr COEFF, coeff_5to4 @@ -277,3 +271,4 @@ convert_5to4_neon_asm: bne 0b pop {r4,pc} +endfunc -- 2.3.2 MobileVLCKit/patches/0003-deinterlace-merge-use-a-macro-to-fix-compilation-for.patch000066400000000000000000000040031250240207200303100ustar00rootroot00000000000000From f8bc4a8fc785cba68c84f388d9a0678eb0e32e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Fri, 10 Aug 2012 16:02:07 +0200 Subject: [PATCH 03/15] deinterlace/merge: use a macro to fix compilation for iOS --- modules/video_filter/deinterlace/merge_arm.S | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/modules/video_filter/deinterlace/merge_arm.S b/modules/video_filter/deinterlace/merge_arm.S index dd77902..03e5042 100644 --- a/modules/video_filter/deinterlace/merge_arm.S +++ b/modules/video_filter/deinterlace/merge_arm.S @@ -18,6 +18,8 @@ @ Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. @****************************************************************************/ +#include "../../arm_neon/asm.S" + .syntax unified .arm .arch armv6 @@ -29,11 +31,8 @@ #define SRC2 r2 #define SIZE r3 - .align 2 - .global merge8_arm_neon - .type merge8_arm_neon, %function @ NOTE: Offset and pitch must be multiple of 16-bytes in VLC. -merge8_arm_neon: +function merge8_arm_neon, export=1 cmp SIZE, #64 blo 2f 1: @@ -70,11 +69,9 @@ merge8_arm_neon: vhadd.u8 q0, q0, q8 vst1.u8 {q0}, [DEST,:128]! bx lr +endfunc - .align 2 - .global merge16_arm_neon - .type merge16_arm_neon, %function -merge16_arm_neon: +function merge16_arm_neon, export=1 cmp SIZE, #64 blo 2f 1: @@ -111,11 +108,9 @@ merge16_arm_neon: vhadd.u16 q0, q0, q8 vst1.u16 {q0}, [DEST,:128]! bx lr +endfunc - .align 2 - .global merge8_armv6 - .type merge8_armv6, %function -merge8_armv6: +function merge8_armv6, export=1 push {r4-r9,lr} 1: pld [SRC1, #64] @@ -133,11 +128,9 @@ merge8_armv6: stm DEST!, {r6-r7} popeq {r4-r9,pc} b 1b +endfunc - .align 2 - .global merge16_armv6 - .type merge16_armv6, %function -merge16_armv6: +function merge16_armv6, export=1 push {r4-r9,lr} 1: pld [SRC1, #64] @@ -155,3 +148,4 @@ merge16_armv6: stm DEST!, {r6-r7} popeq {r4-r9,pc} b 1b +endfunc -- 2.3.2 MobileVLCKit/patches/0004-libass-fix-text-rendering-on-iOS-by-providing-a-font.patch000066400000000000000000000042471250240207200302250ustar00rootroot00000000000000From 8051881530e0f4c3b0d8022d15959f595a79cf93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Wed, 29 May 2013 13:25:54 +0200 Subject: [PATCH 04/15] libass: fix text rendering on iOS by providing a font lookup mechanism for the font shipped with Aspen --- modules/codec/libass.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/modules/codec/libass.c b/modules/codec/libass.c index dc247f4..dffe14e 100644 --- a/modules/codec/libass.c +++ b/modules/codec/libass.c @@ -29,6 +29,13 @@ # include "config.h" #endif +#if defined (__APPLE__) +#include +#if TARGET_OS_IPHONE +#include +#endif +#endif + #include #include #include @@ -213,6 +220,34 @@ static int Create( vlc_object_t *p_this ) #if defined( __ANDROID__ ) const char *psz_font = "/system/fonts/DroidSans-Bold.ttf"; const char *psz_family = "Droid Sans Bold"; +#elif defined (__APPLE__) +#if !TARGET_OS_IPHONE + const char *psz_font = NULL; /* We don't ship a default font with VLC */ + const char *psz_family = "Arial"; /* Use Arial if we can't find anything more suitable */ +#else + CFURLRef fileURL; + fileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("OpenSans-Regular.ttf"), + NULL, + NULL); + CFStringRef urlString = CFURLCopyFileSystemPath(fileURL, kCFURLPOSIXPathStyle); + CFRelease(fileURL); + + if (!urlString) + return VLC_EGENERIC; + + CFIndex length = CFStringGetLength(urlString); + if (!length) + return VLC_EGENERIC; + length++; + + char *psz_path = (char *)malloc(length); + CFStringGetCString(urlString, psz_path, length, kCFStringEncodingUTF8); + CFRelease(urlString); + + const char *psz_font = (const char *)strdup(psz_path); + free(psz_path); + const char *psz_family = "Open Sans"; +#endif #else const char *psz_font = NULL; /* We don't ship a default font with VLC */ const char *psz_family = "Arial"; /* Use Arial if we can't find anything more suitable */ -- 2.3.2 MobileVLCKit/patches/0005-contrib-png-fix-ARM-assembly-for-iOS.patch000066400000000000000000000071351250240207200250500ustar00rootroot00000000000000From c6eb25a963d03a5a137ea3a464f99155ee9ab417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20Ku=CC=88hne?= Date: Sat, 20 Jul 2013 23:35:05 +0200 Subject: [PATCH 05/15] contrib/png: fix ARM assembly for iOS --- contrib/src/png/ios.patch | 66 +++++++++++++++++++++++++++++++++++++++++++++++ contrib/src/png/rules.mak | 14 +++++++++- 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 contrib/src/png/ios.patch diff --git a/contrib/src/png/ios.patch b/contrib/src/png/ios.patch new file mode 100644 index 0000000..f4b8bc1 --- /dev/null +++ b/contrib/src/png/ios.patch @@ -0,0 +1,66 @@ +diff -ru png/arm/filter_neon.S png-fixed/arm/filter_neon.S +--- png/arm/filter_neon.S 2013-06-27 05:25:41.000000000 +0200 ++++ png-fixed/arm/filter_neon.S 2013-07-20 23:33:23.000000000 +0200 +@@ -46,7 +46,7 @@ + \name: + .endm + +-func png_read_filter_row_sub4_neon, export=1 ++func _png_read_filter_row_sub4_neon, export=1 + ldr r3, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + 1: +@@ -62,7 +62,7 @@ + bx lr + endfunc + +-func png_read_filter_row_sub3_neon, export=1 ++func _png_read_filter_row_sub3_neon, export=1 + ldr r3, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + mov r0, r1 +@@ -88,7 +88,7 @@ + bx lr + endfunc + +-func png_read_filter_row_up_neon, export=1 ++func _png_read_filter_row_up_neon, export=1 + ldr r3, [r0, #4] @ rowbytes + 1: + vld1.8 {q0}, [r1,:128] +@@ -101,7 +101,7 @@ + bx lr + endfunc + +-func png_read_filter_row_avg4_neon, export=1 ++func _png_read_filter_row_avg4_neon, export=1 + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + 1: +@@ -122,7 +122,7 @@ + bx lr + endfunc + +-func png_read_filter_row_avg3_neon, export=1 ++func _png_read_filter_row_avg3_neon, export=1 + push {r4,lr} + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 +@@ -173,7 +173,7 @@ + vbsl \rx, \ra, d28 + .endm + +-func png_read_filter_row_paeth4_neon, export=1 ++func _png_read_filter_row_paeth4_neon, export=1 + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 + vmov.i8 d20, #0 +@@ -196,7 +196,7 @@ + bx lr + endfunc + +-func png_read_filter_row_paeth3_neon, export=1 ++func _png_read_filter_row_paeth3_neon, export=1 + push {r4,lr} + ldr r12, [r0, #4] @ rowbytes + vmov.i8 d3, #0 diff --git a/contrib/src/png/rules.mak b/contrib/src/png/rules.mak index c5a3fba..7649c4b 100644 --- a/contrib/src/png/rules.mak +++ b/contrib/src/png/rules.mak @@ -7,6 +7,15 @@ ifeq ($(call need_pkg,"libpng"),) PKGS_FOUND += png endif +PNGCONF = +ifdef HAVE_IOS +ifdef HAVE_ARMV7A +PNGCONF = --enable-arm-neon=yes +else +PNGCONF = --enable-arm-neon=no +endif +endif + $(TARBALLS)/libpng-$(PNG_VERSION).tar.xz: $(call download,$(PNG_URL)) @@ -17,12 +26,15 @@ png: libpng-$(PNG_VERSION).tar.xz .sum-png $(APPLY) $(SRC)/png/winrt.patch $(APPLY) $(SRC)/png/bins.patch $(APPLY) $(SRC)/png/automake.patch +ifdef HAVE_IOS + $(APPLY) $(SRC)/png/ios.patch +endif $(MOVE) DEPS_png = zlib $(DEPS_zlib) .png: png $(RECONF) - cd $< && $(HOSTVARS) ./configure $(HOSTCONF) + cd $< && $(HOSTVARS) ./configure $(HOSTCONF) $(PNGCONF) cd $< && $(MAKE) install touch $@ -- 2.3.2 MobileVLCKit/patches/0006-lib-media_player-inherit-deinterlace-and-vbi-variabl.patch000066400000000000000000000023121250240207200303750ustar00rootroot00000000000000From 66ddb686d2be5b6dec1609dcf94ac6807ef72e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Thu, 21 Nov 2013 16:26:40 +0100 Subject: [PATCH 06/15] lib/media_player: inherit deinterlace and vbi variables to fix correct variables values on first use --- lib/media_player.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/media_player.c b/lib/media_player.c index b4a5f10..5691345 100644 --- a/lib/media_player.c +++ b/lib/media_player.c @@ -436,11 +436,10 @@ libvlc_media_player_new( libvlc_instance_t *instance ) var_SetFloat (mp, "scale", 1.); var_Create (mp, "aspect-ratio", VLC_VAR_STRING); var_Create (mp, "crop", VLC_VAR_STRING); - var_Create (mp, "deinterlace", VLC_VAR_INTEGER); + var_Create (mp, "deinterlace", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); var_Create (mp, "deinterlace-mode", VLC_VAR_STRING); - var_Create (mp, "vbi-page", VLC_VAR_INTEGER); - var_SetInteger (mp, "vbi-page", 100); + var_Create (mp, "vbi-page", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); var_Create (mp, "marq-marquee", VLC_VAR_STRING); var_Create (mp, "marq-color", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); -- 2.3.2 MobileVLCKit/patches/0007-contrib-opus-disable-asm-on-arm.patch000066400000000000000000000013371250240207200243260ustar00rootroot00000000000000From e5d0eb1cb4a11c1b832e7d940999eb8e5aacbcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Wed, 15 Jan 2014 15:26:46 +0100 Subject: [PATCH 07/15] contrib/opus disable asm on arm --- contrib/src/opus/rules.mak | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/src/opus/rules.mak b/contrib/src/opus/rules.mak index 56f0933..273521f 100644 --- a/contrib/src/opus/rules.mak +++ b/contrib/src/opus/rules.mak @@ -23,6 +23,9 @@ OPUS_CONF= --disable-extra-programs --disable-doc ifndef HAVE_FPU OPUS_CONF += --enable-fixed-point endif +ifdef HAVE_IOS +OPUS_CONF += --disable-asm +endif .opus: opus cd $< && $(HOSTVARS) ./configure $(HOSTCONF) $(OPUS_CONF) -- 2.3.2 MobileVLCKit/patches/0008-contrib-gcrypt-disable-asm-on-iOS.patch000066400000000000000000000013321250240207200245570ustar00rootroot00000000000000From 859dce39d1b8ba6ef906d44ca4ce43fc4e4b9675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Wed, 22 Jan 2014 09:56:23 +0100 Subject: [PATCH 08/15] contrib/gcrypt: disable asm on iOS --- contrib/src/gcrypt/rules.mak | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/src/gcrypt/rules.mak b/contrib/src/gcrypt/rules.mak index 0cc1222..7e67319 100644 --- a/contrib/src/gcrypt/rules.mak +++ b/contrib/src/gcrypt/rules.mak @@ -31,6 +31,9 @@ GCRYPT_EXTRA_CFLAGS = endif ifdef HAVE_MACOSX GCRYPT_CONF += --disable-aesni-support +ifdef HAVE_IOS +GCRYPT_CONF += --disable-asm +endif else ifdef HAVE_BSD GCRYPT_CONF += --disable-asm --disable-aesni-support -- 2.3.2 MobileVLCKit/patches/0009-fix-libtool.patch000066400000000000000000000022621250240207200205640ustar00rootroot00000000000000From eb2e857794ccc1b75b398ef6fabd57f74fc686f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Fri, 10 Aug 2012 16:02:33 +0200 Subject: [PATCH 09/15] fix libtool --- modules/arm_neon/Makefile.am | 4 ++++ modules/video_filter/Modules.am | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/modules/arm_neon/Makefile.am b/modules/arm_neon/Makefile.am index 4e73a4f..8631f76 100644 --- a/modules/arm_neon/Makefile.am +++ b/modules/arm_neon/Makefile.am @@ -1,3 +1,7 @@ +# When using a specific AS tool instead of gcc libtool goes mad +# without this. (This is the case with iOS). +LIBTOOL=@LIBTOOL@ --tag=CC + neondir = $(pluginsdir)/arm_neon libsimple_channel_mixer_neon_plugin_la_SOURCES = \ diff --git a/modules/video_filter/Modules.am b/modules/video_filter/Modules.am index 3bb8cdb..542abaa 100644 --- a/modules/video_filter/Modules.am +++ b/modules/video_filter/Modules.am @@ -1,3 +1,7 @@ +# When using a specific AS tool instead of gcc libtool goes mad +# without this. (This is the case with iOS). +LIBTOOL=@LIBTOOL@ --tag=CC + SOURCES_mosaic = mosaic.c mosaic.h SOURCES_transform = transform.c SOURCES_invert = invert.c -- 2.3.2 MobileVLCKit/patches/0010-freetype-added-a-fake-font-lookup-mechanism-for-iOS-.patch000066400000000000000000000064571250240207200301100ustar00rootroot00000000000000From 6690fbcd6833360e7ca307acf18aa41a9df600bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Wed, 22 Jan 2014 13:55:16 +0100 Subject: [PATCH 10/15] freetype: added a fake font lookup mechanism for iOS to use the packaged demo fonts --- modules/text_renderer/freetype.c | 2 ++ modules/text_renderer/platform_fonts.c | 40 ++++++++++++++++++++++++++++++++++ modules/text_renderer/platform_fonts.h | 3 +++ 3 files changed, 45 insertions(+) diff --git a/modules/text_renderer/freetype.c b/modules/text_renderer/freetype.c index b9da7bf..f7dbe21 100644 --- a/modules/text_renderer/freetype.c +++ b/modules/text_renderer/freetype.c @@ -1956,6 +1956,8 @@ static int Create( vlc_object_t *p_this ) #elif defined( __APPLE__ ) #if !TARGET_OS_IPHONE p_sys->pf_select = MacLegacy_Select; +#else + p_sys->pf_select = iOSFake_Select; #endif #elif defined( _WIN32 ) && defined( HAVE_GET_FONT_BY_FAMILY_NAME ) p_sys->pf_select = Win32_Select; diff --git a/modules/text_renderer/platform_fonts.c b/modules/text_renderer/platform_fonts.c index 7869dba..2ede6a0 100644 --- a/modules/text_renderer/platform_fonts.c +++ b/modules/text_renderer/platform_fonts.c @@ -42,6 +42,9 @@ #include #if !TARGET_OS_IPHONE #include +#else +#include +#include #endif #include /* for MAXPATHLEN */ #undef HAVE_FONTCONFIG @@ -405,6 +408,43 @@ char* MacLegacy_Select( filter_t *p_filter, const char* psz_fontname, return psz_path; } +#else +char *iOSFake_Select( filter_t *p_filter, const char* psz_fontname, + bool b_bold, bool b_italic, int i_size, int *i_idx ) +{ + VLC_UNUSED(p_filter); + VLC_UNUSED(psz_fontname); + VLC_UNUSED(b_bold); + VLC_UNUSED(b_italic); + VLC_UNUSED(i_size); + VLC_UNUSED(i_idx); + + CFURLRef fileURL; + fileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), + CFSTR("OpenSans-Regular.ttf"), + NULL, + NULL); + if (!fileURL) + return NULL; + CFStringRef urlString = CFURLCopyFileSystemPath(fileURL, kCFURLPOSIXPathStyle); + CFRelease(fileURL); + + if (!urlString) + return NULL; + + CFIndex length = CFStringGetLength(urlString); + if (!length) + return NULL; + length++; + + char *psz_path = (char *)malloc(length); + CFStringGetCString(urlString, psz_path, length, kCFStringEncodingUTF8); + CFRelease(urlString); + + psz_path = strdup(psz_path); + + return psz_path; +} #endif #endif diff --git a/modules/text_renderer/platform_fonts.h b/modules/text_renderer/platform_fonts.h index cff52b1..40b25fb 100644 --- a/modules/text_renderer/platform_fonts.h +++ b/modules/text_renderer/platform_fonts.h @@ -95,6 +95,9 @@ char* Win32_Select( filter_t *p_filter, const char* family, #if !TARGET_OS_IPHONE char* MacLegacy_Select( filter_t *p_filter, const char* psz_fontname, bool b_bold, bool b_italic, int i_size, int *i_idx ); +#else +char *iOSFake_Select( filter_t *p_filter, const char* psz_fontname, + bool b_bold, bool b_italic, int i_size, int *i_idx ); #endif #endif -- 2.3.2 MobileVLCKit/patches/0011-contrib-speexdsp-disable-neon-for-AArch64.patch000066400000000000000000000014061250240207200260650ustar00rootroot00000000000000From df4089b6d3193a15a656a2e6f4376de37883fc41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Wed, 22 Jan 2014 15:19:43 +0100 Subject: [PATCH 11/15] contrib/speexdsp: disable neon for AArch64 --- contrib/src/speexdsp/rules.mak | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/src/speexdsp/rules.mak b/contrib/src/speexdsp/rules.mak index e82c6ba..658a72e 100644 --- a/contrib/src/speexdsp/rules.mak +++ b/contrib/src/speexdsp/rules.mak @@ -31,6 +31,11 @@ ifeq ($(ARCH),arm) SPEEXDSP_CONF += --enable-arm5e-asm endif endif +ifdef HAVE_IOS +ifndef HAVE_ARMV7A +SPEEXDSP_CONF += --disable-neon +endif +endif .speexdsp: speexdsp cd $< && $(HOSTVARS) ./configure $(HOSTCONF) $(SPEEXDSP_CONF) -- 2.3.2 MobileVLCKit/patches/0012-contrib-add-arch-option-for-platforms-where-the-arch.patch000066400000000000000000000045141250240207200303310ustar00rootroot00000000000000From 304ea3a9f8ff7fd1593fa95f6bc7967749f3b308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Thu, 3 Oct 2013 18:27:43 +0200 Subject: [PATCH 12/15] contrib: add arch option for platforms where the arch triplet would be ambigous --- contrib/bootstrap | 16 +++++++++++++++- contrib/src/main.mak | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/contrib/bootstrap b/contrib/bootstrap index b77a9d9..86d4b9e 100755 --- a/contrib/bootstrap +++ b/contrib/bootstrap @@ -31,6 +31,7 @@ usage() echo " --disable-sout configure to not build stream output packages" echo " --enable-small optimize libraries for size with slight speed decrease [DANGEROUS]" echo " --disable-gpl configure to not build viral GPL code" + echo " --arch=ARCH configure to set the target architecture if host triple is ambigous" } BUILD= @@ -42,6 +43,7 @@ BUILD_ENCODERS="1" BUILD_NETWORK="1" BUILD_DISCS="1" GPL="1" +ARCH= if test ! -f "../../contrib/src/main.mak" then @@ -86,6 +88,9 @@ do --enable-*) PKGS_ENABLE="${PKGS_ENABLE} ${1#--enable-}" ;; + --arch=*) + ARCH="${1#--arch=}" + ;; *) echo "Unrecognized options $1" usage @@ -222,6 +227,7 @@ test -z "$BUILD_ENCODERS" || add_make_enabled "BUILD_ENCODERS" test -z "$BUILD_NETWORK" || add_make_enabled "BUILD_NETWORK" test -z "$ENABLE_SMALL" || add_make_enabled "ENABLE_SMALL" test -z "$GPL" || add_make_enabled "GPL" +test -z "$ARCH" || add_make "ARCH := $ARCH" # # Checks @@ -235,7 +241,15 @@ case "${OS}" in add_make_enabled "HAVE_MACOSX" "HAVE_DARWIN_OS" "HAVE_BSD" else check_ios_sdk - add_make_enabled "HAVE_IOS" "HAVE_DARWIN_OS" "HAVE_BSD" "HAVE_NEON" "HAVE_ARMV7A" + add_make_enabled "HAVE_IOS" "HAVE_DARWIN_OS" "HAVE_BSD" + case "${ARCH}" in + *arm*) + add_make_enabled "HAVE_NEON" + if [ "$ARCH" != "arm64" ]; then + add_make_enabled "HAVE_ARMV7A" + fi + ;; + esac fi ;; *bsd*) diff --git a/contrib/src/main.mak b/contrib/src/main.mak index c9f409a..1ae11e9 100644 --- a/contrib/src/main.mak +++ b/contrib/src/main.mak @@ -35,7 +35,9 @@ PREFIX := $(abspath $(PREFIX)) ifneq ($(HOST),$(BUILD)) HAVE_CROSS_COMPILE = 1 endif +ifndef ARCH ARCH := $(shell $(SRC)/get-arch.sh $(HOST)) +endif ifeq ($(ARCH)-$(HAVE_WIN32),x86_64-1) HAVE_WIN64 := 1 -- 2.3.2 MobileVLCKit/patches/0013-contrib-gcrypt-use-git-version-on-iOS.patch000066400000000000000000000114401250240207200254330ustar00rootroot00000000000000From e4afa33f1f16062a06ff08730d82e0f77fb831b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Thu, 31 Oct 2013 20:42:59 +0100 Subject: [PATCH 13/15] contrib/gcrypt: use git version on iOS --- contrib/src/gcrypt/disable-doc-compilation.patch | 43 ++++++++++++++++++++++ contrib/src/gcrypt/rules.mak | 14 ++++++- .../gcrypt/work-around-libtool-limitation.patch | 25 +++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 contrib/src/gcrypt/disable-doc-compilation.patch create mode 100644 contrib/src/gcrypt/work-around-libtool-limitation.patch diff --git a/contrib/src/gcrypt/disable-doc-compilation.patch b/contrib/src/gcrypt/disable-doc-compilation.patch new file mode 100644 index 0000000..e63224e --- /dev/null +++ b/contrib/src/gcrypt/disable-doc-compilation.patch @@ -0,0 +1,43 @@ +From 18ac3f6a6e0ab9fe353ee8b5ab2b34ef5ce500d7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= +Date: Thu, 31 Oct 2013 20:34:15 +0100 +Subject: [PATCH] disable doc compilation + +--- + Makefile.am | 6 +++--- + configure.ac | 1 - + 2 files changed, 3 insertions(+), 4 deletions(-) + +diff --git a/Makefile.am b/Makefile.am +index f1dbd09..9e0abd6 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -25,10 +25,10 @@ DISTCHECK_CONFIGURE_FLAGS = --disable-random-daemon \ + # (A suitable gitlog-to-changelog script can be found in GnuPG master.) + GITLOG_TO_CHANGELOG=gitlog-to-changelog + +-DIST_SUBDIRS = m4 compat mpi cipher random src doc tests +-SUBDIRS = compat mpi cipher random src doc tests ++DIST_SUBDIRS = m4 compat mpi cipher random src tests ++SUBDIRS = compat mpi cipher random src tests + EXTRA_DIST = autogen.sh README.GIT \ +- ChangeLog-2011 scripts/ChangeLog-2011 doc/ChangeLog-2011 \ ++ ChangeLog-2011 scripts/ChangeLog-2011 \ + m4/ChangeLog-2011 cipher/ChangeLog-2011 src/ChangeLog-2011 \ + random/ChangeLog-2011 tests/ChangeLog-2011 mpi/ChangeLog-2011 \ + scripts/git-log-footer scripts/git-log-fix +diff --git a/configure.ac b/configure.ac +index e3471d0..6fa4ad6 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1799,7 +1799,6 @@ compat/Makefile + mpi/Makefile + cipher/Makefile + random/Makefile +-doc/Makefile + src/Makefile + src/gcrypt.h + src/libgcrypt-config +-- +1.8.3.4 (Apple Git-47) + diff --git a/contrib/src/gcrypt/rules.mak b/contrib/src/gcrypt/rules.mak index 7e67319..8773aa1 100644 --- a/contrib/src/gcrypt/rules.mak +++ b/contrib/src/gcrypt/rules.mak @@ -1,6 +1,7 @@ # GCRYPT GCRYPT_VERSION := 1.6.2 GCRYPT_URL := ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-$(GCRYPT_VERSION).tar.bz2 +GCRYPT_GITURL := git://git.gnupg.org/libgcrypt.git PKGS += gcrypt @@ -9,11 +10,22 @@ $(TARBALLS)/libgcrypt-$(GCRYPT_VERSION).tar.bz2: .sum-gcrypt: libgcrypt-$(GCRYPT_VERSION).tar.bz2 +$(TARBALLS)/libgcrypt-git.tar.xz: + $(call download_git,$(GCRYPT_GITURL),,d1cadd145) + +ifndef HAVE_IOS libgcrypt: libgcrypt-$(GCRYPT_VERSION).tar.bz2 .sum-gcrypt $(UNPACK) $(APPLY) $(SRC)/gcrypt/fix-amd64-assembly-on-solaris.patch $(APPLY) $(SRC)/gcrypt/0001-Fix-assembly-division-check.patch $(MOVE) +else +libgcrypt: libgcrypt-git.tar.xz + $(UNPACK) + $(APPLY) $(SRC)/gcrypt/disable-doc-compilation.patch + $(APPLY) $(SRC)/gcrypt/work-around-libtool-limitation.patch + $(MOVE) +endif DEPS_gcrypt = gpg-error @@ -47,6 +59,6 @@ endif .gcrypt: libgcrypt $(RECONF) - cd $< && $(HOSTVARS) CFLAGS="$(CFLAGS) $(GCRYPT_EXTRA_CFLAGS)" ./configure $(HOSTCONF) $(GCRYPT_CONF) + cd $< && $(HOSTVARS) ./configure $(HOSTCONF) $(GCRYPT_CONF) cd $< && $(MAKE) install touch $@ diff --git a/contrib/src/gcrypt/work-around-libtool-limitation.patch b/contrib/src/gcrypt/work-around-libtool-limitation.patch new file mode 100644 index 0000000..df97ffb --- /dev/null +++ b/contrib/src/gcrypt/work-around-libtool-limitation.patch @@ -0,0 +1,25 @@ +diff -ru libgcrypt-broken/cipher/Makefile.am libgcrypt/cipher/Makefile.am +--- libgcrypt-broken/cipher/Makefile.am 2013-11-06 23:05:24.000000000 +0100 ++++ libgcrypt/cipher/Makefile.am 2013-11-06 23:21:25.000000000 +0100 +@@ -19,6 +19,8 @@ + + # Process this file with automake to produce Makefile.in + ++LIBTOOL=@LIBTOOL@ --tag=CC ++ + EXTRA_DIST = Manifest + + # Need to include ../src in addition to top_srcdir because gcrypt.h is +diff -ru libgcrypt-broken/mpi/Makefile.am libgcrypt/mpi/Makefile.am +--- libgcrypt-broken/mpi/Makefile.am 2013-11-06 23:05:24.000000000 +0100 ++++ libgcrypt/mpi/Makefile.am 2013-11-06 23:22:04.000000000 +0100 +@@ -23,6 +23,9 @@ + + # Need to include ../src in addition to top_srcdir because gcrypt.h is + # a built header. ++ ++LIBTOOL=@LIBTOOL@ --tag=CC ++ + AM_CPPFLAGS = -I../src -I$(top_srcdir)/src + AM_CFLAGS = $(GPG_ERROR_CFLAGS) + -- 2.3.2 MobileVLCKit/patches/0014-libvlc-add-preliminary-code-path-to-modify-quartztex.patch000066400000000000000000000243221250240207200304770ustar00rootroot00000000000000From 3df686107dd8789e073cecc33f9de9f559c94c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Mon, 31 Mar 2014 17:54:01 +0200 Subject: [PATCH 14/15] libvlc: add preliminary code path to modify quartztext variables on-the-fly --- include/vlc/libvlc_media_player.h | 21 +++++++++++++ lib/libvlc.sym | 4 +++ lib/media_player.c | 6 ++++ lib/video.c | 47 +++++++++++++++++++++++++++++ modules/text_renderer/quartztext.c | 61 ++++++++++++++++++++++++++++++++------ 5 files changed, 130 insertions(+), 9 deletions(-) diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h index 94bf7e8..c55e85d 100644 --- a/include/vlc/libvlc_media_player.h +++ b/include/vlc/libvlc_media_player.h @@ -1383,6 +1383,27 @@ LIBVLC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, LIBVLC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, unsigned option, float value ); +/** option values for libvlc_video_{get,set}_adjust_{int,float,bool} */ +enum libvlc_video_textrenderer_option_t { + libvlc_textrender_font = 0, + libvlc_textrender_fontsize, + libvlc_textrender_fontcolor, +}; + +LIBVLC_API int libvlc_video_get_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option ); + +LIBVLC_API void libvlc_video_set_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +LIBVLC_API char *libvlc_video_get_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option ); + +LIBVLC_API void libvlc_video_set_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option, + const char *psz_text ); + + /** @} video */ /** \defgroup libvlc_audio LibVLC audio controls diff --git a/lib/libvlc.sym b/lib/libvlc.sym index c0c66dd..7810ed7 100644 --- a/lib/libvlc.sym +++ b/lib/libvlc.sym @@ -217,6 +217,8 @@ libvlc_video_get_spu_count libvlc_video_get_spu_delay libvlc_video_get_spu_description libvlc_video_get_teletext +libvlc_video_get_text_renderer_int +libvlc_video_get_text_renderer_string libvlc_video_get_title_description libvlc_video_get_track libvlc_video_get_track_count @@ -241,6 +243,8 @@ libvlc_video_set_spu libvlc_video_set_spu_delay libvlc_video_set_subtitle_file libvlc_video_set_teletext +libvlc_video_set_text_renderer_int +libvlc_video_set_text_renderer_string libvlc_video_set_track libvlc_video_take_snapshot libvlc_vlm_add_broadcast diff --git a/lib/media_player.c b/lib/media_player.c index 5691345..3ca1e10 100644 --- a/lib/media_player.c +++ b/lib/media_player.c @@ -465,6 +465,12 @@ libvlc_media_player_new( libvlc_instance_t *instance ) var_Create (mp, "saturation", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); var_Create (mp, "gamma", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); +#ifdef __APPLE__ + var_Create (mp, "quartztext-font", VLC_VAR_STRING | VLC_VAR_DOINHERIT); + var_Create (mp, "quartztext-fontsize", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); + var_Create (mp, "quartztext-color", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); +#endif + /* Audio */ var_Create (mp, "aout", VLC_VAR_STRING | VLC_VAR_DOINHERIT); var_Create (mp, "mute", VLC_VAR_BOOL); diff --git a/lib/video.c b/lib/video.c index 19065fb..8988069 100644 --- a/lib/video.c +++ b/lib/video.c @@ -934,3 +934,50 @@ float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, { return get_float( p_mi, "adjust", adjust_option_bynumber(option) ); } + + +static const opt_t * +textrenderer_option_bynumber( unsigned option ) +{ + static const opt_t optlist[] = + { + { "quartztext-font", VLC_VAR_STRING }, + { "quartztext-fontsize", VLC_VAR_INTEGER }, + { "quartztext-color", VLC_VAR_INTEGER }, + }; + enum { num_opts = sizeof(optlist) / sizeof(*optlist) }; + + const opt_t *r = option < num_opts ? optlist+option : NULL; + if( !r ) + libvlc_printerr( "Unknown quartztext option" ); + return r; +} + +/* basic text renderer support */ + +void libvlc_video_set_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option, int value ) +{ + set_int( p_mi, "quartztext", textrenderer_option_bynumber(option), value ); +} + + +int libvlc_video_get_textrenderer_int( libvlc_media_player_t *p_mi, + unsigned option ) +{ + return get_int( p_mi, "quartztext", textrenderer_option_bynumber(option) ); +} + + +void libvlc_video_set_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option, const char *psz_value ) +{ + set_string( p_mi, "quartztext", textrenderer_option_bynumber(option), psz_value ); +} + + +char * libvlc_video_get_textrenderer_string( libvlc_media_player_t *p_mi, + unsigned option ) +{ + return get_string( p_mi, "quartztext", textrenderer_option_bynumber(option) ); +} diff --git a/modules/text_renderer/quartztext.c b/modules/text_renderer/quartztext.c index 8de1081..112e952 100644 --- a/modules/text_renderer/quartztext.c +++ b/modules/text_renderer/quartztext.c @@ -65,6 +65,10 @@ static int Create (vlc_object_t *); static void Destroy(vlc_object_t *); +static int QuartztextCallback( vlc_object_t *p_this, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, + void *p_data ); + static int LoadFontsFromAttachments(filter_t *p_filter); static int RenderText(filter_t *, subpicture_region_t *, @@ -128,14 +132,17 @@ vlc_module_begin () add_string("quartztext-font", DEFAULT_FONT, FONT_TEXT, FONT_LONGTEXT, false) - add_integer("quartztext-rel-fontsize", DEFAULT_REL_FONT_SIZE, FONTSIZER_TEXT, + change_safe() + add_integer("quartztext-fontsize", DEFAULT_REL_FONT_SIZE, FONTSIZER_TEXT, FONTSIZER_LONGTEXT, false) + change_safe() change_integer_list(pi_sizes, ppsz_sizes_text) add_integer("quartztext-color", 0x00FFFFFF, COLOR_TEXT, COLOR_LONGTEXT, false) + change_safe() change_integer_list(pi_color_values, ppsz_color_descriptions) set_capability("text renderer", 50) - add_shortcut("text") + add_shortcut("quartztext") set_callbacks(Create, Destroy) vlc_module_end () @@ -177,7 +184,8 @@ struct offscreen_bitmap_t *****************************************************************************/ struct filter_sys_t { - char *psz_font_name; + vlc_mutex_t lock; + char *psz_font_name; uint8_t i_font_opacity; int i_font_color; int i_font_size; @@ -202,9 +210,9 @@ static int Create(vlc_object_t *p_this) p_filter->p_sys = p_sys = malloc(sizeof(filter_sys_t)); if (!p_sys) return VLC_ENOMEM; - p_sys->psz_font_name = var_CreateGetString(p_this, "quartztext-font"); + p_sys->psz_font_name = var_CreateGetStringCommand(p_this, "quartztext-font"); p_sys->i_font_opacity = 255; - p_sys->i_font_color = VLC_CLIP(var_CreateGetInteger(p_this, "quartztext-color") , 0, 0xFFFFFF); + p_sys->i_font_color = VLC_CLIP(var_CreateGetIntegerCommand(p_this, "quartztext-color") , 0, 0xFFFFFF); p_sys->i_font_size = GetFontSize(p_filter); p_filter->pf_render_text = RenderText; @@ -215,6 +223,11 @@ static int Create(vlc_object_t *p_this) p_sys->i_fonts = 0; #endif + vlc_mutex_init( &p_sys->lock ); + var_AddCallback( p_filter, "quartztext-font", QuartztextCallback, p_sys ); + var_AddCallback( p_filter, "quartztext-fontsize", QuartztextCallback, p_sys ); + var_AddCallback( p_filter, "quartztext-color", QuartztextCallback, p_sys ); + LoadFontsFromAttachments(p_filter); return VLC_SUCCESS; @@ -229,6 +242,16 @@ static void Destroy(vlc_object_t *p_this) { filter_t *p_filter = (filter_t *)p_this; filter_sys_t *p_sys = p_filter->p_sys; + + var_DelCallback( p_filter, "quartztext-font", QuartztextCallback, p_sys ); + var_DelCallback( p_filter, "quartztext-fontsize", QuartztextCallback, p_sys ); + var_DelCallback( p_filter, "quartztext-color", QuartztextCallback, p_sys ); + vlc_mutex_destroy( &p_sys->lock ); + + var_Destroy( p_filter, "quartztext-font" ) ; + var_Destroy( p_filter, "quartztext-fontsize" ); + var_Destroy( p_filter, "quartztext-color" ); + #ifndef TARGET_OS_IPHONE if (p_sys->p_fonts) { for (int k = 0; k < p_sys->i_fonts; k++) { @@ -236,8 +259,8 @@ static void Destroy(vlc_object_t *p_this) free(p_sys->p_fonts); } -#endif free(p_sys->psz_font_name); +#endif free(p_sys); } @@ -949,12 +972,12 @@ static int GetFontSize(filter_t *p_filter) { int i_size = 0; - int i_ratio = var_CreateGetInteger( p_filter, "quartztext-rel-fontsize" ); + int i_ratio = var_CreateGetIntegerCommand( p_filter, "quartztext-fontsize" ); + if( i_ratio > 0 ) i_size = (int)p_filter->fmt_out.video.i_height / i_ratio; - if( i_size <= 0 ) - { + if( i_size <= 0 ) { msg_Warn( p_filter, "invalid fontsize, using 12" ); i_size = 12; } @@ -1041,3 +1064,23 @@ static int RenderYUVA(filter_t *p_filter, subpicture_region_t *p_region, return VLC_SUCCESS; } + +static int QuartztextCallback( vlc_object_t *p_this, char const *psz_var, + vlc_value_t oldval, vlc_value_t newval, + void *p_data ) +{ + VLC_UNUSED(oldval); + filter_t *p_filter = (filter_t *)p_this; + filter_sys_t *p_sys = (filter_sys_t *)p_data; + + vlc_mutex_lock( &p_sys->lock ); + if( !strcmp( psz_var, "quartztext-font" ) ) + p_sys->psz_font_name = newval.psz_string; + else if( !strcmp( psz_var, "quartztext-fontsize" ) ) + p_sys->i_font_size = (int)p_filter->fmt_out.video.i_height / newval.i_int; + else if( !strcmp( psz_var, "quartztext-color" ) ) + p_sys->i_font_color = VLC_CLIP(newval.i_int, 0, 0xFFFFFF); + vlc_mutex_unlock( &p_sys->lock ); + + return VLC_SUCCESS; +} -- 2.3.2 MobileVLCKit/patches/0015-contrib-speex-fix-compilation-for-non-ARMv7-iOS-targ.patch000066400000000000000000000013671250240207200301110ustar00rootroot00000000000000From 47be49f90005cbc224c9769892d42f9fa00e6eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Paul=20K=C3=BChne?= Date: Wed, 22 Jan 2014 13:37:59 +0100 Subject: [PATCH 15/15] contrib/speex: fix compilation for non-ARMv7 iOS targets --- contrib/src/speex/rules.mak | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/src/speex/rules.mak b/contrib/src/speex/rules.mak index a5f003c..916b0ea 100644 --- a/contrib/src/speex/rules.mak +++ b/contrib/src/speex/rules.mak @@ -27,6 +27,11 @@ endif ifeq ($(ARCH),aarch64) SPEEX_CONF += --disable-neon endif +ifdef HAVE_IOS +ifndef HAVE_ARMV7A +SPEEX_CONF += --disable-neon +endif +endif .speex: speex cd $< && $(HOSTVARS) ./configure $(HOSTCONF) $(SPEEX_CONF) -- 2.3.2 MobileVLCKit_Prefix.pch000066400000000000000000000005351250240207200153100ustar00rootroot00000000000000// // Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project. // #ifdef __OBJC__ #import #import #endif #import #ifndef NDEBUG #define VKLog(format, ...) NSLog(format, ## __VA_ARGS__) #else #define VKLog(format, ...) #endif NEWS000066400000000000000000000105401250240207200115470ustar00rootroot00000000000000Version 2.2.0: -------------- Cross-platform: - Fixed deinterlacing if requested - Fixed decoding and display of Teletext-based subtitles - Improved thumbnailing reliability - Added support for inclusion in swift projects - Switched to Automatic Reference Counting - Various stability improvements MobileVLCKit: - It is finally possible to compile the framework without relying on third party scripts - Added 2 sample projects illustrating video playback - Added support for https and hls playback - VLCMediaListPlayer is available now - Added support for https connectivity VLCKit: - VLCMediaThumbnailer is a public API on the Mac now matching the mobile counterpart - Updated samples projects illustrating playback, file conversation, ... New APIs: - VLCMediaThumbnailer: - added property: snapshotPosition to overwrite the default - VLCMediaListPlayer: - added initWithOptions selector matching VLCMediaPlayer's implementation - added pause selector - added previous, next and playItemAtIndex selectors - VLCMedia: - added delegate method mediaMetaDataDidChange - VLCMediaPlayer: - added equalizer - added countOfTitles Modified API behavior: - VLCMediaPlayer: - implementing mediaPlayerTimeChanged and mediaPlayerStateChanged within a delegate object is optional now - VLCMedia: - nowPlaying meta information is correctly handled now Deprecated APIs: - VLCMedia: - media:metaValueChangedFrom:forKey: Changes within VLCKit between 2.0.0 and 2.1.0: ---------------------------------------------- The entire framework was relicensed to LGPL 2.1 or later as well as its underlying playback modules. Support for transcoding and streaming as well as DVD playback was not affected by this move and stays under GPL until further notice. Please note that the Objective-C syntax was updated, so VLCKit may no longer compile with outdated versions of Xcode / clang. New APIs: - VLCStreamOutput: - support for subtitle transcoding - VLCMedia: - extended media track information for bitrate, language, description, source aspect ratio, source aspect denominator, frame rate, frame rate denominator, and text encoding - added setter and getter for individual meta data values as well as the ability to write changes to the media file - added (BOOL)isMediaSizeSuitableForDevice to let VLCKit determine whether the current media is considered to be suitable for the current device or playback is discouraged. Will always return true on OS X devices. - added individual getters for all statistic values, so client application can fetch single values instead of having to process a NSDictionary with all the available values. The old API is still available and will stay. - VLCMediaPlayer: - added support to enable, switch and disable video tracks - added setter/getter for SPU and audio delays - added setter/getter for the video scale factor - added support for the "adjust" video filter to manipulate contrast, brightness, hue, saturation and gamma on the fly - new interfaces to fetch names and IDs of audio, subtitle and video tracks - added the ability to launch instances with custom libvlc options - VLCLibrary: - added the ability to launch instances with custom libvlc options - added methods to set App ID and User-Agent - added readonly property to fetch compiler information Deprecated APIs: - VLCMediaPlayer: @property (readonly) NSUInteger fps; - use (float)fps instead. - (NSArray *)videoSubTitles; - use - (NSArray *)videoSubtitleNames; instead - (NSArray *)audioTracks; - use - (NSArray *)audioTrackNames; instead - (NSArray *)videoTracks; - use - (NSArray *)videoTrackNames; instead Modified behavior: - use of clang instead of llvm-gcc-4.2 - updated project file for Xcode 4.3 and later - iOS Deployment target was raised to iOS 5.1 - dropped support for the PowerPC architecture - Mac Deployment target was raised to OS X 10.7 - different logging behavior: to see any debug messages, the framework needs to be compiled in debug mode MobileVLCKit features: - added support for Opus - slimmed binary by removing dysfunctional or irrelevant modules - screen sleep is prevented during playback - functionality is strictly limited for full LGPL compliance Removed APIs: - VLCMedia: - (void)setValue:(id)value forMeta:(NSString *)VLCMetaInformation; use setMetadata:(NSString *)data forKey:(NSString *)key instead Packaging/000077500000000000000000000000001250240207200127345ustar00rootroot00000000000000Packaging/create-dmg.sh000077500000000000000000000056541250240207200153150ustar00rootroot00000000000000#!/bin/sh set -e info() { local green="\033[1;32m" local normal="\033[0m" echo "[${green}Package${normal}] $1" } spushd() { pushd "$1" > /dev/null } spopd() { popd > /dev/null } MOBILE=no VERBOSE=no USEZIP=no usage() { cat << EOF usage: $0 [options] Build vlc in the current directory OPTIONS: -h Show some help -v Be verbose -m Package MobileVLCKit -z Use zip file format EOF } while getopts "hvmz" OPTION do case $OPTION in h) usage exit 1 ;; v) VERBOSE=yes ;; m) MOBILE=yes ;; z) USEZIP=yes ;; esac done shift $(($OPTIND - 1)) out="/dev/null" if [ "$VERBOSE" = "yes" ]; then out="/dev/stdout" fi if [ "x$1" != "x" ]; then usage exit 1 fi root=`dirname $0`/../ DMGFOLDERNAME="VLCKit - binary package" DMGITEMNAME="VLCKit-REPLACEWITHVERSION" if [ "$MOBILE" = "yes" ]; then if [ "$USEZIP" = "yes" ]; then DMGFOLDERNAME="MobileVLCKit-binary" else DMGFOLDERNAME="MobileVLCKit - binary package" fi DMGITEMNAME="MobileVLCKit-REPLACEWITHVERSION" fi info "checking for distributable binary package" spushd ${root} if [ "$MOBILE" = "no" ]; then if [ ! -e "VLCKit" ]; then info "VLCKit not found for distribution, creating..." if [ "$VERBOSE" = "yes" ]; then make VLCKit V=1 else make VLCKit fi fi else if [ ! -e "build/MobileVLCKit.framework" ]; then info "MobileVLCKit not found for distribution, creating... this will take long" ./buildMobileVLCKit.sh -f fi fi if [ ! -e "${DMGFOLDERNAME}" ]; then info "Collecting items" mkdir -p "${DMGFOLDERNAME}" mkdir -p "${DMGFOLDERNAME}/Sample Code" if [ "$MOBILE" = "no" ]; then cp -R VLCKit/* "${DMGFOLDERNAME}" cp -R Examples_OSX/* "${DMGFOLDERNAME}/Sample Code" else cp -R build/MobileVLCKit.framework "${DMGFOLDERNAME}" cp -R Examples_iOS/* "${DMGFOLDERNAME}/Sample Code" cp COPYING "${DMGFOLDERNAME}" fi cp NEWS "${DMGFOLDERNAME}" spushd "${DMGFOLDERNAME}" mv NEWS NEWS.txt mv COPYING COPYING.txt spopd rm -f ${DMGITEMNAME}-rw.dmg fi if [ "$USEZIP" = "no" ]; then info "Creating disk-image" hdiutil create -srcfolder "${DMGFOLDERNAME}" "${DMGITEMNAME}-rw.dmg" -scrub -format UDRW mkdir -p ./mount info "Moving file icons around" hdiutil attach -readwrite -noverify -noautoopen -mountRoot ./mount ${DMGITEMNAME}-rw.dmg if [ "$MOBILE" = "no" ]; then osascript Packaging/dmg_setup.scpt "${DMGFOLDERNAME}" else osascript Packaging/mobile_dmg_setup.scpt "${DMGFOLDERNAME}" fi hdiutil detach ./mount/"${DMGFOLDERNAME}" info "Compressing disk-image" rm -f ${DMGITEMNAME}.dmg hdiutil convert "${DMGITEMNAME}-rw.dmg" -format UDBZ -o "${DMGITEMNAME}.dmg" rm -f ${DMGITEMNAME}-rw.dmg rm -rf "${DMGFOLDERNAME}" else info "Creating zip-archive" zip -r ${DMGITEMNAME}.zip "${DMGFOLDERNAME}" fi spopd info "Distributable package created" Packaging/dmg_setup.scpt000066400000000000000000000106561250240207200156260ustar00rootroot00000000000000FasdUAS 1.101.10 k i I .aevtoappnull**** o 0argv O O k I .aevtodocnullalis r m  ecvwicnv n 1  pvew 1  cwnd r$ m  boovfals n 1!#  tbvi 1!  cwnd r%, m%&  boovfals n!" !1)+  stvi "1&)  cwnd#$ #r-9%& %J-3''() (m-.,)*+ *m./d+,- ,m/0-. .m01 &l/ /n01 0168  pbnd 1136  cwnd$23 2r:C45 4l:?6 6n:?78 7m=?  icop 81:=  cwnd 5o 0theviewoptionstheViewOptions39: 9rDO;< ;mDG  earrnarr <n=> =1JN  iarr >oGJ 0theviewoptionstheViewOptions:?@ ?rP[AB AmPSh BnCD C1VZ  lvis DoSV 0theviewoptionstheViewOptions@EF Er\oGH GJ\bIIJK Jm\_nKL Lm_`d HnMN M1jn  posn NnbjOP O4ejQ  cobj QmfiRRSS VLCKit.framework P1be  cwndFTU TrpVW VJpvXXYZ YmpsOZ[ [mstd Wn\] \1~  posn ]nv~^_ ^4y~`  cobj `mz}aabbSample Code _1vy  cwndUcd cref eJgghi hmnij jm fnkl k1  posn lnmn m4o  cobj omppqqNEWS.txt n1  cwnddrs rrtu tJvvwx wmOxy ym unz{ z1  posn {n|} |4~  cobj ~mCOPYING.txt }1  cwnds l IC Force saving changes to the disk by closing and opening the window Force saving changes to the disk by closing and opening the window I .coreclosnullobj  I .aevtodocnullalis I .fndrfupdnullobj   reg? m  boovfals I .sysodelanullnmbr m 4  cdis l n 4  cobj m  o 0argv mMACSalist Macintosh HDrP\H+ Finder.app"6 CoreServicesrBL"( 6Macintosh HD:System:Library:CoreServices:Finder.app Finder.app Macintosh HD&System/Library/CoreServices/Finder.app/ l .aevtoappnull**** 0theviewoptionstheViewOptions .aevtoappnull**** 0argv 0argv"Rap  cdis  cobj .aevtodocnullalis  ecvwicnv  cwnd  pvew  tbvi  stvi,d  pbnd  icop 0theviewoptionstheViewOptions  earrnarr  iarrh  lvisn  posnO .coreclosnullobj  reg? .fndrfupdnullobj  .sysodelanullnmbr*k/E/*j O*,,FOf*,,FOf*,,FOv*,,FO*,,E`Oa_a,FOa_a,FOalv*,a/a,FOalv*,a/a,FOaalv*,a/a,FOaalv*,a/a,FO*j O*j O*afl Oa j !UU  browuS  kfrmID  icopascr ޭPackaging/mobile_dmg_setup.scpt000066400000000000000000000106721250240207200171530ustar00rootroot00000000000000FasdUAS 1.101.10 k i I .aevtoappnull**** o 0argv O O k I .aevtodocnullalis r m  ecvwicnv n 1  pvew 1  cwnd r$ m  boovfals n 1!#  tbvi 1!  cwnd r%, m%&  boovfals n!" !1)+  stvi "1&)  cwnd#$ #r-9%& %J-3''() (m-.,)*+ *m./d+,- ,m/0-. .m01 &l/ /n01 0168  pbnd 1136  cwnd$23 2r:C45 4l:?6 6n:?78 7m=?  icop 81:=  cwnd 5o 0theviewoptionstheViewOptions39: 9rDO;< ;mDG  earrnarr <n=> =1JN  iarr >oGJ 0theviewoptionstheViewOptions:?@ ?rP[AB AmPSh BnCD C1VZ  lvis DoSV 0theviewoptionstheViewOptions@EF Er\oGH GJ\bIIJK Jm\_nKL Lm_`d HnMN M1jn  posn NnbjOP O4ejQ  cobj QmfiRRSS,MobileVLCKit.framework P1be  cwndFTU TrpVW VJpvXXYZ YmpsOZ[ [mstd Wn\] \1~  posn ]nv~^_ ^4y~`  cobj `mz}aabbSample Code _1vy  cwndUcd cref eJgghi hmnij jm fnkl k1  posn lnmn m4o  cobj omppqqNEWS.txt n1  cwnddrs rrtu tJvvwx wmOxy ym unz{ z1  posn {n|} |4~  cobj ~mCOPYING.txt }1  cwnds l IC Force saving changes to the disk by closing and opening the window Force saving changes to the disk by closing and opening the window I .coreclosnullobj  I .aevtodocnullalis I .fndrfupdnullobj   reg? m  boovfals I .sysodelanullnmbr m 4  cdis l n 4  cobj m  o 0argv mMACSalist Macintosh HDrP\H+ Finder.app"6 CoreServicesrBL"( 6Macintosh HD:System:Library:CoreServices:Finder.app Finder.app Macintosh HD&System/Library/CoreServices/Finder.app/ l .aevtoappnull**** 0theviewoptionstheViewOptions .aevtoappnull**** 0argv 0argv"Rap  cdis  cobj .aevtodocnullalis  ecvwicnv  cwnd  pvew  tbvi  stvi,d  pbnd  icop 0theviewoptionstheViewOptions  earrnarr  iarrh  lvisn  posnO .coreclosnullobj  reg? .fndrfupdnullobj  .sysodelanullnmbr*k/E/*j O*,,FOf*,,FOf*,,FOv*,,FO*,,E`Oa_a,FOa_a,FOalv*,a/a,FOalv*,a/a,FOaalv*,a/a,FOaalv*,a/a,FO*j O*j O*afl Oa j !UU  browu  kfrmID  icopascr ޭPre-Compile.sh000066400000000000000000000252011250240207200135200ustar00rootroot00000000000000#!/bin/sh # # Pre-Compile.sh # # Script that install libvlc and its modules inside VLCKit. # # This is for some creepy reasons also used by legacy VLC.app or # the moz plugin. # # We are building VLC.app or the moz plugin # if test "${ACTION}" = "release-makefile"; then echo "running Pre-Compile.sh in release-makefile mode" FULL_PRODUCT_NAME="${PRODUCT}" if [ "$FULL_PRODUCT_NAME" = "VLC-Plugin.plugin" ] ; then TARGET_BUILD_DIR="${src_dir}" else TARGET_BUILD_DIR="${build_dir}" fi CONTENTS_FOLDER_PATH="${FULL_PRODUCT_NAME}/Contents/MacOS" VLC_BUILD_DIR="${build_dir}" VLC_SRC_DIR="${src_dir}" ACTION="build" RELEASE_MAKEFILE="yes" use_archs="no" main_build_dir="${VLC_BUILD_DIR}" else use_archs="yes" main_build_dir="${VLC_BUILD_DIR}/${ARCHS%% *}" echo "Building for $ARCHS" fi if test "${ACTION}" = "clean"; then rm -Rf "${VLC_BUILD_DIR}/tmp" exit 0 fi if test "${ACTION}" != "build"; then echo "This script is supposed to run from xcodebuild or Xcode" exit 1 fi lib="lib" plugins="plugins" share="share" include="include" target="${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}" target_bin="${target}/bin" target_lib="${target}/${lib}" # Should we consider using a different well-known folder like shared resources? target_plugins="${target}/${plugins}" # Should we consider using a different well-known folder like shared resources? target_share="${target}/${share}" # Should we consider using a different well-known folder like shared resources? linked_libs="" prefix=".libs" suffix="dylib" num_archs=$(echo `echo $ARCHS | wc -w`) ########################## # @function vlc_install_object(src_lib, dest_dir, type, lib_install_prefix, destination_name, suffix) # @description Installs the specified library into the destination folder, automatically changes the references to dependencies # @param src_lib source library to copy to the destination directory # @param dest_dir destination directory where the src_lib should be copied to vlc_install_object() { local src_lib=${1} local dest_dir=${2} local type=${3} local lib_install_prefix=${4} local destination_name=${5} local suffix=${6} if [ $type = "library" ]; then local install_name="@loader_path/lib" elif [ $type = "module" ]; then local install_name="@loader_path/plugins" fi if [ "$destination_name" != "" ]; then local lib_dest="$dest_dir/$destination_name$suffix" local lib_name=`basename $destination_name` else local lib_dest="$dest_dir/`basename $src_lib`$suffix" local lib_name=`basename $src_lib` fi if [ "x$lib_install_prefix" != "x" ]; then local lib_install_prefix="$lib_install_prefix" else local lib_install_prefix="@loader_path/../lib" fi if test ! -e ${src_lib}; then return fi if ( (test ! -e ${lib_dest}) || test ${src_lib} -nt ${lib_dest} ); then mkdir -p ${dest_dir} # Lets copy the library from the source folder to our new destination folder if [ "${type}" = "bin" ]; then install -m 755 ${src_lib} ${lib_dest} else install -m 644 ${src_lib} ${lib_dest} fi # Update the dynamic library so it will know where to look for the other libraries echo "Installing ${type} `basename ${lib_dest}`" if [ "${type}" = "library" ]; then # Change the reference of libvlc.1 stored in the usr directory to libvlc.dylib in the framework's library directory install_name_tool -id "${install_name}/${lib_name}" ${lib_dest} > /dev/null fi if [ "${type}" != "data" ]; then # Iterate through each installed library and modify the references to other dynamic libraries to match the framework's library directory for linked_lib in `otool -L ${lib_dest} | grep '(' | sed 's/\((.*)\)//'`; do local name=`basename ${linked_lib}` case "${linked_lib}" in */vlc_build_dir/* | */vlc_install_dir/* | *vlc* | */extras/contrib/*) if test -e ${linked_lib}; then install_name_tool -change "$linked_lib" "${lib_install_prefix}/${name}" "${lib_dest}" linked_libs="${linked_libs} ${ref_lib}" vlc_install_object ${linked_lib} ${target_lib} "library" fi ;; esac done fi fi } # @function vlc_install_object ########################## ########################## # @function vlc_install(src_lib_dir, src_lib_name, dest_dir, type, lib_install_prefix) # @description Installs the specified library into the destination folder, automatically changes the references to dependencies # @param src_lib source library to copy to the destination directory # @param dest_dir destination directory where the src_lib should be copied to vlc_install() { local src_dir=$1 local src=$2 local dest_dir=$3 local type=$4 if test "$use_archs" = "no"; then vlc_install_object "$VLC_BUILD_DIR/$src_dir/$src" "$dest_dir" "$type" $5 else if test $type = "data"; then vlc_install_object "$main_build_dir/$src_dir/$src" "$dest_dir" "$type" $5 else local fatdest="$dest_dir/$2" local shouldUpdate="no" # Determine what architectures are available in the destination image local fatdest_archs="" if [ -e ${fatdest} ]; then fatdest_archs=`lipo -info "${fatdest}" 2> /dev/null | sed -E -e 's/[[:space:]]+$//' -e 's/.+:[[:space:]]*//' -e 's/[^[:space:]]+/(&)/g'` # Check to see if the destination image needs to be reconstructed for arch in $ARCHS; do # Only install if the new image is newer than the one we have installed or the required arch is missing. if test $shouldUpdate = "no" && (! [[ "$fatdest_archs" =~ \($arch\) ]] || test "$VLC_BUILD_DIR/$arch/$src_dir/$src" -nt "${fatdest}"); then shouldUpdate="yes" fi fatdest_archs=${fatdest_archs//\($arch\)/} done # Reconstruct the destination image, if the update flag is set or if there are more archs in the desintation then we need fatdest_archs=${fatdest_archs// /} else # If the destination image does not exist, then we have to reconstruct it shouldUpdate="yes" fi # If we should update the destination image or if there were unexpected archs in the destination image, then reconstruct it if test "$shouldUpdate" = "yes" || test -n "${fatdest_archs}"; then # If the destination image exists, get rid of it so we can copy over the newly constructed image if test -e ${fatdest}; then rm "$fatdest" fi if test "$num_archs" = "1"; then echo "Copying $ARCHS $type $fatdest" local arch_src="$VLC_BUILD_DIR/$ARCHS/$src_dir/$src" vlc_install_object "$arch_src" "$dest_dir" "$type" "$5" "" else # Create a temporary destination dir to store each ARCH object file local tmp_dest_dir="$VLC_BUILD_DIR/tmp/$type" rm -Rf "${tmp_dest_dir}/*" mkdir -p "$tmp_dest_dir" # Search for each ARCH object file used to construct a fat image local objects="" for arch in $ARCHS; do local arch_src="$VLC_BUILD_DIR/$arch/$src_dir/$src" vlc_install_object "$arch_src" "$tmp_dest_dir" "$type" "$5" "" ".$arch" local dest="$tmp_dest_dir/$src.$arch" if [ -e ${dest} ]; then objects="${dest} $objects" else echo "Warning: building $arch_src without $arch" fi done; echo "Creating fat $type $fatdest" lipo $objects -output "$fatdest" -create fi fi fi fi } # @function vlc_install ########################## ########################## # Create a symbolic link in the root of the framework mkdir -p ${target_lib} mkdir -p ${target_plugins} mkdir -p ${target_bin} if [ "$RELEASE_MAKEFILE" != "yes" ] ; then pushd `pwd` > /dev/null cd ${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME} ln -sf Versions/Current/${lib} . ln -sf Versions/Current/${plugins} . ln -sf Versions/Current/${include} . ln -sf Versions/Current/${share} . ln -sf Versions/Current/bin . ln -sf ../plugins Versions/Current/bin ln -sf ../share Versions/Current/bin popd > /dev/null fi ########################## # Hack for VLC.app if [ "$FULL_PRODUCT_NAME" = "VLC.app" ] ; then vlc_install "bin/${prefix}" "vlc" "${target}" "bin" "@loader_path/lib" mv ${target}/vlc ${target}/VLC chmod +x ${target}/VLC elif [ "$FULL_PRODUCT_NAME" = "VLC-Plugin.plugin" ] ; then # install Safari webplugin vlc_install "projects/mozilla/${prefix}" "npvlc.${suffix}" "${target}" "lib" "@loader_path/lib" mv ${target}/npvlc.${suffix} "${target}/VLC Plugin" chmod +x "${target}/VLC Plugin" else vlc_install "bin/${prefix}" "vlc" "${target}/bin" "bin" "@loader_path/../lib" fi ########################## # Build the plugins folder (Same as VLCKit.framework/plugins in Makefile) echo "Building plugins folder..." # Figure out what plugins are available to install for module in `find ${main_build_dir}/modules -path "*dylib.dSYM*" -prune -o -name "lib*_plugin.dylib" -print | sed -e s:${main_build_dir}/::` ; do # Check to see that the reported module actually exists if test -n ${module}; then vlc_install `dirname ${module}` `basename ${module}` ${target_plugins} "module" fi done ########################## # Build the lib folder vlc_install "lib/${prefix}" "libvlc.5.dylib" "${target_lib}" "library" vlc_install "src/${prefix}" "libvlccore.8.dylib" "${target_lib}" "library" pushd `pwd` > /dev/null cd ${target_lib} ln -sf libvlc.5.dylib libvlc.dylib ln -sf libvlccore.8.dylib libvlccore.dylib popd > /dev/null ########################## # Build the share folder echo "Building share folder..." echo ${VLC_BUILD_DIR} pbxcp="cp -R -L" mkdir -p ${target_share} if test "$use_archs" = "no"; then $pbxcp ${VLC_BUILD_DIR}/share/lua ${target_share} else $pbxcp ${main_build_dir}/share/lua ${target_share} fi Resources/000077500000000000000000000000001250240207200130225ustar00rootroot00000000000000Resources/Info.plist000066400000000000000000000012271250240207200147740ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable VLCKit CFBundleIdentifier org.videolan.vlckitframework CFBundleInfoDictionaryVersion 6.0 CFBundleName VLC CFBundlePackageType FMWK CFBundleShortVersionString 0.1 CFBundleVersion 0.1 Resources/version.plist000066400000000000000000000005421250240207200155650ustar00rootroot00000000000000 CFBundleShortVersionString 0.1 CFBundleVersion 0.1 ProjectName VLC Sources/000077500000000000000000000000001250240207200124735ustar00rootroot00000000000000Sources/VLCAudio.m000066400000000000000000000057301250240207200142640ustar00rootroot00000000000000/***************************************************************************** * VLCAudio.m: VLCKit.framework VLCAudio implementation ***************************************************************************** * Copyright (C) 2007 Faustino E. Osuna * Copyright (C) 2007, 2014 VLC authors and VideoLAN * $Id$ * * Authors: Faustino E. Osuna * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCAudio.h" #import "VLCLibVLCBridging.h" #define VOLUME_STEP 6 #define VOLUME_MAX 200 #define VOLUME_MIN 0 @interface VLCAudio () { void *_instance; } @end /* Notification Messages */ NSString *const VLCMediaPlayerVolumeChanged = @"VLCMediaPlayerVolumeChanged"; /* libvlc event callback */ // TODO: Callbacks @implementation VLCAudio /** * Use this method instead of instance directly as this one is type checked. */ - (libvlc_media_player_t *)instance { return _instance; } - (instancetype)init { return nil; } - (instancetype)initWithMediaPlayer:(VLCMediaPlayer *)mediaPlayer { self = [super init]; if (!self) return nil; _instance = [mediaPlayer libVLCMediaPlayer]; libvlc_media_player_retain([self instance]); return self; } - (void) dealloc { libvlc_media_player_release([self instance]); } - (void)setMute:(BOOL)value { libvlc_audio_set_mute([self instance], value); } - (BOOL)isMuted { return libvlc_audio_get_mute([self instance]); } - (void)setVolume:(int)value { if (value < VOLUME_MIN) value = VOLUME_MIN; else if (value > VOLUME_MAX) value = VOLUME_MAX; libvlc_audio_set_volume([self instance], value); } - (void)volumeUp { int tempVolume = [self volume] + VOLUME_STEP; if (tempVolume > VOLUME_MAX) tempVolume = VOLUME_MAX; else if (tempVolume < VOLUME_MIN) tempVolume = VOLUME_MIN; [self setVolume: tempVolume]; } - (void)volumeDown { int tempVolume = [self volume] - VOLUME_STEP; if (tempVolume > VOLUME_MAX) tempVolume = VOLUME_MAX; else if (tempVolume < VOLUME_MIN) tempVolume = VOLUME_MIN; [self setVolume: tempVolume]; } - (int)volume { return libvlc_audio_get_volume([self instance]); } @end Sources/VLCEventManager.m000066400000000000000000000320121250240207200155700ustar00rootroot00000000000000/***************************************************************************** * VLCEventManager.m: VLCKit.framework VLCEventManager implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCEventManager.h" #import /** * Defines the type of interthread message on the queue. */ typedef enum { VLCNotification, //< Standard NSNotification. VLCObjectMethodWithObjectArg, //< Method with an object argument. VLCObjectMethodWithArrayArg //< Method with an array argument. } message_type_t; /** * Data structured used to enqueue messages onto the queue. */ @interface message_t : NSObject @property (nonatomic, strong) id target; //< Target object that should receive the message (retained until method is called). @property (nonatomic) SEL sel; //< A selector that identifies the message to be sent to the target. @property (nonatomic, copy) NSString * name; //< Name to be used for NSNotification @property (nonatomic, strong) id object; //< Object argument to pass to the target via the selector. @property (nonatomic) message_type_t type; //< Type of queued message. @end @implementation message_t - (BOOL)isEqual:(id)object { if (![object isKindOfClass:[message_t class]]) return NO; message_t *otherObject = object; BOOL notificationMatches = (otherObject.type == VLCNotification && [otherObject.name isEqualToString:self.name]) || (otherObject.type == VLCObjectMethodWithArrayArg && [otherObject.object isEqual:self.object]) || (otherObject.type == VLCObjectMethodWithObjectArg && [otherObject.object isEqual:self.object]); return [otherObject.target isEqual:_target] && otherObject.sel == self.sel && otherObject.type == self.type && notificationMatches; } @end @interface VLCEventManager () { NSMutableArray *_messageQueue; //< Holds a queue of messages. NSMutableArray *_pendingMessagesOnMainThread; //< Holds the message that are being posted on main thread. NSLock *_pendingMessagesLock; pthread_t _dispatcherThread; //< Thread responsible for dispatching messages. pthread_mutex_t _queueLock; //< Queue lock. pthread_cond_t _signalData; //< Data lock. } - (void)startEventLoop; - (void)addMessageToHandleOnMainThread:(message_t *)message; @end /** * Provides a function for the main entry point for the dispatch thread. It dispatches any messages that is queued. * \param user_data Pointer to the VLCEventManager instance that instiated this thread. */ static void * EventDispatcherMainLoop(void * user_data) { VLCEventManager * self = (__bridge VLCEventManager *)(user_data); [self startEventLoop]; return NULL; } @implementation VLCEventManager + (id)sharedManager { static dispatch_once_t onceToken; static VLCEventManager *defaultManager = nil; dispatch_once(&onceToken, ^{ defaultManager = [[VLCEventManager alloc] init]; }); return defaultManager; } - (void)dummy { /* Put Cocoa in multithreaded mode by calling a dummy function */ } - (id)init { if (self = [super init]) { if (![NSThread isMultiThreaded]) { [NSThread detachNewThreadSelector:@selector(dummy) toTarget:self withObject:nil]; NSAssert([NSThread isMultiThreaded], @"Can't put Cocoa in multithreaded mode"); } _messageQueue = [NSMutableArray new]; _pendingMessagesOnMainThread = [NSMutableArray new]; _pendingMessagesLock = [[NSLock alloc] init]; pthread_mutex_init(&_queueLock, NULL); pthread_cond_init(&_signalData, NULL); pthread_create(&_dispatcherThread, NULL, EventDispatcherMainLoop, (__bridge void *)(self)); } return self; } - (void)dealloc { pthread_kill(_dispatcherThread, SIGKILL); pthread_join(_dispatcherThread, NULL); } #pragma mark - - (void)startEventLoop { for (;;) { @autoreleasepool { message_t * message, * message_newer = NULL; /* Wait for some data */ /* Wait until we have something on the queue */ pthread_mutex_lock(&_queueLock); while (_messageQueue.count <= 0) pthread_cond_wait(&_signalData, &_queueLock); /* Get the first object off the queue. */ message = [_messageQueue lastObject]; // Released in 'call' [_messageQueue removeLastObject]; /* Remove duplicate notifications (keep the newest one). */ if (message.type == VLCNotification) { NSInteger last_match_msg = -1; for (NSInteger i = _messageQueue.count - 1; i >= 0; i--) { message_newer = _messageQueue[i]; if (message_newer.type == VLCNotification && message_newer.target == message.target && [message_newer.name isEqualToString:message.name]) { if (last_match_msg >= 0) { [_messageQueue removeObjectAtIndex:(NSUInteger) last_match_msg]; } last_match_msg = i; } } if (last_match_msg >= 0) { // newer notification detected, ignore current one pthread_mutex_unlock(&_queueLock); continue; } } else if (message.type == VLCObjectMethodWithArrayArg) { NSMutableArray * newArg = nil; /* Collapse messages that takes array arg by sending one bigger array */ for (NSInteger i = [_messageQueue count] - 1; i >= 0; i--) { message_newer = _messageQueue[i]; if (message_newer.type == VLCObjectMethodWithArrayArg && message_newer.target == message.target && message_newer.sel == message.sel) { if (!newArg) { newArg = [NSMutableArray arrayWithArray:message.object]; } [newArg addObjectsFromArray:message_newer.object]; [_messageQueue removeObjectAtIndex:(NSUInteger) i]; } /* It shouldn be a good idea not to collapse event with other kind of event in-between. * This could be particulary problematic when the same object receive two related events * (for instance Added and Removed). * Ignore for now only if target is the same */ else if (message_newer.target == message.target) break; } if (newArg) message.object = newArg; } [self addMessageToHandleOnMainThread:message]; pthread_mutex_unlock(&_queueLock); if (message.type == VLCNotification) { dispatch_async(dispatch_get_main_queue(), ^{ [self callDelegateOfObjectAndSendNotificationWithArgs:message]; }); } else { dispatch_sync(dispatch_get_main_queue(), ^{ [self callObjectMethodWithArgs:message]; }); } } /* Sleep a bit not to flood the interface */ usleep(300); } } - (void)callOnMainThreadDelegateOfObject:(id)aTarget withDelegateMethod:(SEL)aSelector withNotificationName:(NSString *)aNotificationName { /* Don't send on main thread before this gets sorted out */ @autoreleasepool { message_t *message = [message_t new]; message.sel = aSelector; message.target = aTarget; message.name = aNotificationName; message.type = VLCNotification; pthread_mutex_lock(&_queueLock); [_messageQueue insertObject:message atIndex:0]; pthread_cond_signal(&_signalData); pthread_mutex_unlock(&_queueLock); } } - (void)callOnMainThreadObject:(id)aTarget withMethod:(SEL)aSelector withArgumentAsObject:(id)arg { @autoreleasepool { message_t *message = [message_t new]; message.sel = aSelector; message.target = aTarget; message.object = arg; message.type = [arg isKindOfClass:[NSArray class]] ? VLCObjectMethodWithArrayArg : VLCObjectMethodWithObjectArg; pthread_mutex_lock(&_queueLock); [_messageQueue insertObject:message atIndex:0]; pthread_cond_signal(&_signalData); pthread_mutex_unlock(&_queueLock); } } - (void)cancelCallToObject:(id)target { // Remove all queued message pthread_mutex_lock(&_queueLock); [_pendingMessagesLock lock]; // Keep a hold on the secondary objects and release them only AFTER we have released our locks to prevents deadlocks. // i.e. dealloc'ing a VLCMediaPlayer that has pending messages with its VLCMedia as message object, // and these references are the last ones to the VLCMedia, so releasing message->u.object would dealloc the VLCMedia which in // turn would call -cancelCallToObject, effectively causing a deadlock. NSMutableArray *secondaryObjects = [[NSMutableArray alloc] init]; for (NSInteger i = _messageQueue.count - 1; i >= 0; i--) { message_t *message = _messageQueue[i]; if (message.target == target) { if (message.object != nil) [secondaryObjects addObject:message.object]; [_messageQueue removeObjectAtIndex:(NSUInteger) i]; } } // Remove all pending messages NSMutableArray *messages = _pendingMessagesOnMainThread; // need to interate in reverse since we are removing objects for (NSInteger i = [messages count] - 1; i >= 0; i--) { message_t *message = messages[i]; if (message.target == target) { if (message.object != nil) [secondaryObjects addObject:message.object]; [messages removeObjectAtIndex:(NSUInteger) i]; } } [_pendingMessagesLock unlock]; pthread_mutex_unlock(&_queueLock); // secondaryObjects will be disposed of now, but just to make sure that ARC doesn't // dispose it earlier, play a little trick to keep it alive up to this point by calling a selector // keeping the objects alive until the mutex has been unlocked is crucial to preventing recursion+deadlock [secondaryObjects removeAllObjects]; } - (void)addMessageToHandleOnMainThread:(message_t *)message { [_pendingMessagesLock lock]; [_pendingMessagesOnMainThread addObject:message]; [_pendingMessagesLock unlock]; } - (BOOL)markMessageHandledOnMainThreadIfExists:(message_t *)message { [_pendingMessagesLock lock]; BOOL cancelled = ![_pendingMessagesOnMainThread containsObject:message]; if (!cancelled) { [_pendingMessagesOnMainThread removeObject:message]; } [_pendingMessagesLock unlock]; return !cancelled; } - (void)callDelegateOfObjectAndSendNotificationWithArgs:(message_t *)message { // Check that we were not cancelled, ie, target was released if ([self markMessageHandledOnMainThreadIfExists:message]) { NSString *notificationName = message.name; id target = message.target; SEL targetSelector = message.sel; [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:notificationName object:target]]; id delegate = [message.target delegate]; if (!delegate || ![delegate respondsToSelector:targetSelector]) return; void (*method)(id, SEL, id) = (void (*)(id, SEL, id))[delegate methodForSelector:targetSelector]; method(delegate, targetSelector, [NSNotification notificationWithName:notificationName object:target]); } } - (void)callObjectMethodWithArgs:(message_t *)message { // Check that we were not cancelled if ([self markMessageHandledOnMainThreadIfExists:message]) { void (*method)(id, SEL, id) = (void (*)(id, SEL, id))[message.target methodForSelector: message.sel]; method(message.target, message.sel, message.object); } } @end Sources/VLCExtension.m000066400000000000000000000032701250240207200151740ustar00rootroot00000000000000/***************************************************************************** * VLCKit: VLCExtensions ***************************************************************************** * Copyright (C) 2010-2012, 2014 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCExtension.h" #import @interface VLCExtension () { struct extension_t *_instance; } @end @implementation VLCExtension - (NSString *)description { return [NSString stringWithFormat:@"VLC Extension %@", [self name]]; } - (instancetype)initWithInstance:(struct extension_t *)instance { self = [super init]; if (!self) return nil; _instance = instance; return self; } - (struct extension_t *)instance { return _instance; } - (NSString *)name { return @(_instance->psz_name); } - (NSString *)title { return @(_instance->psz_title); } @end Sources/VLCExtensionsManager.m000066400000000000000000000116121250240207200166510ustar00rootroot00000000000000/***************************************************************************** * VLCKit: VLCExtensionsManager ***************************************************************************** * Copyright (C) 2010-2012, 2014 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCExtensionsManager.h" #import "VLCExtension.h" #import "VLCLibrary.h" #import "VLCLibVLCBridging.h" #import #import #include // Here comes the nasty hack. #define MODULE_STRING "VLCKit" #import "../vlc-unstable/lib/media_player_internal.h" #import "../vlc-unstable/lib/libvlc_internal.h" static input_thread_t *libvlc_media_player_get_input_thread(libvlc_media_player_t *player) { vlc_mutex_lock(&player->input.lock); input_thread_t *input = player->input.p_thread; if(input) vlc_object_hold(input); vlc_mutex_unlock(&player->input.lock); return input; } static vlc_object_t *libvlc_get_vlc_instance(libvlc_instance_t *instance) { vlc_mutex_lock(&instance->instance_lock); libvlc_int_t *libvlc = instance->p_libvlc_int; if(libvlc) vlc_object_hold(libvlc); vlc_mutex_unlock(&instance->instance_lock); return VLC_OBJECT(libvlc); } #define _instance ((extensions_manager_t *)instance) @interface VLCExtensionsManager () { void *instance; NSMutableArray *_extensions; VLCMediaPlayer *_player; void *_previousInput; } @end @implementation VLCExtensionsManager + (VLCExtensionsManager *)sharedManager { static VLCExtensionsManager *sharedManager; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedManager = [[self alloc] init]; }); return sharedManager; } - (void)dealloc { module_unneed(_instance, _instance->p_module); vlc_object_release(_instance); [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (NSArray *)extensions { if (!instance) { vlc_object_t *libvlc = libvlc_get_vlc_instance([VLCLibrary sharedInstance]); instance = vlc_object_create(libvlc, sizeof(extensions_manager_t)); if (!_instance) { vlc_object_release(libvlc); return nil; } _instance->p_module = module_need(_instance, "extension", NULL, false); NSAssert(_instance->p_module, @"Unable to load extensions module"); vlc_object_release(libvlc); } if (_extensions) return _extensions; _extensions = [[NSMutableArray alloc] init]; extension_t *ext; vlc_mutex_lock(&_instance->lock); FOREACH_ARRAY(ext, _instance->extensions) [_extensions addObject:[[VLCExtension alloc] initWithInstance:ext]]; FOREACH_END() vlc_mutex_unlock(&_instance->lock); return _extensions; } - (void)runExtension:(VLCExtension *)extension { extension_t *ext = [extension instance]; if(extension_TriggerOnly(_instance, ext)) extension_Trigger(_instance, ext); else { if(!extension_IsActivated(_instance, ext)) extension_Activate(_instance, ext); } } - (void)mediaPlayerLikelyChangedInput { input_thread_t *input = _player ? libvlc_media_player_get_input_thread([_player libVLCMediaPlayer]) : NULL; // Don't send more than appropriate if (_previousInput == input) return; _previousInput = input; for(VLCExtension *extension in _extensions) extension_SetInput(_instance, [extension instance], input); if (input) vlc_object_release(input); } - (void)setMediaPlayer:(VLCMediaPlayer *)player { if (_player == player) return; // Don't set a NULL mediaPlayer. // so that we always have an input around. if (!player) return; NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center removeObserver:self name:VLCMediaPlayerStateChanged object:_player]; _player = player; [self mediaPlayerLikelyChangedInput]; if (player) [center addObserver:self selector:@selector(mediaPlayerLikelyChangedInput) name:VLCMediaPlayerStateChanged object:_player]; } - (VLCMediaPlayer *)mediaPlayer { return _player; } @end Sources/VLCLibrary.m000066400000000000000000000122741250240207200146300ustar00rootroot00000000000000/***************************************************************************** * VLCLibrary.m: VLCKit.framework VLCLibrary implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCLibrary.h" #import "VLCLibVLCBridging.h" #if TARGET_OS_IPHONE # include "vlc-plugins.h" #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include static VLCLibrary * sharedLibrary = nil; @interface VLCLibrary() @property (nonatomic, assign) void *instance; @end @implementation VLCLibrary + (VLCLibrary *)sharedLibrary { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedLibrary = [[self alloc] init]; }); return sharedLibrary; } + (void *)sharedInstance { return [self sharedLibrary].instance; } - (instancetype)init { if (self = [super init]) { [self prepareInstanceWithOptions:nil]; } return self; } - (instancetype)initWithOptions:(NSArray*)options { if (self = [super init]) { [self prepareInstanceWithOptions:options]; } return self; } - (void)prepareInstanceWithOptions:(NSArray *)options { NSArray *allOptions = options ? [[self _defaultOptions] arrayByAddingObjectsFromArray:options] : [self _defaultOptions]; NSUInteger paramNum = 0; int count = (int)allOptions.count; const char *lib_vlc_params[count]; while (paramNum < count) { lib_vlc_params[paramNum] = [allOptions[paramNum] cStringUsingEncoding:NSASCIIStringEncoding]; paramNum++; } _instance = libvlc_new(count, lib_vlc_params); if (_instance) libvlc_retain(_instance); NSAssert(_instance, @"libvlc failed to initialize"); } - (NSArray *)_defaultOptions { NSArray *vlcParams = [[NSUserDefaults standardUserDefaults] objectForKey:@"VLCParams"]; #if TARGET_OS_IPHONE if (!vlcParams) { vlcParams = @[@"--no-color", @"--no-osd", @"--no-video-title-show", @"--no-stats", #ifndef NOSCARYCODECS @"--avcodec-fast", #endif @"--verbose=0", @"--text-renderer=quartztext", @"--avi-index=3", @"--extraintf=ios_dialog_provider"]; } #else if (!vlcParams) { NSMutableArray *defaultParams = [NSMutableArray array]; [defaultParams addObject:@"--play-and-pause"]; // We want every movie to pause instead of stopping at eof [defaultParams addObject:@"--no-color"]; // Don't use color in output (Xcode doesn't show it) [defaultParams addObject:@"--no-video-title-show"]; // Don't show the title on overlay when starting to play [defaultParams addObject:@"--verbose=4"]; // Let's not wreck the logs [defaultParams addObject:@"--no-sout-keep"]; [defaultParams addObject:@"--vout=macosx"]; // Select Mac OS X video output [defaultParams addObject:@"--text-renderer=quartztext"]; // our CoreText-based renderer [defaultParams addObject:@"--extraintf=macosx_dialog_provider"]; // Some extra dialog (login, progress) may come up from here [[NSUserDefaults standardUserDefaults] setObject:defaultParams forKey:@"VLCParams"]; [[NSUserDefaults standardUserDefaults] synchronize]; vlcParams = defaultParams; } #endif return vlcParams; } - (NSString *)version { return @(libvlc_get_version()); } - (NSString *)compiler { return @(libvlc_get_compiler()); } - (NSString *)changeset { return @(libvlc_get_changeset()); } - (void)setHumanReadableName:(NSString *)readableName withHTTPUserAgent:(NSString *)userAgent { if (_instance) libvlc_set_user_agent(_instance, [readableName UTF8String], [userAgent UTF8String]); } - (void)setApplicationIdentifier:(NSString *)identifier withVersion:(NSString *)version andApplicationIconName:(NSString *)icon { if (_instance) libvlc_set_app_id(_instance, [identifier UTF8String], [version UTF8String], [icon UTF8String]); } - (void)dealloc { if (_instance) libvlc_release(_instance); } @end Sources/VLCMedia.m000066400000000000000000000776721250240207200142600ustar00rootroot00000000000000/***************************************************************************** * VLCMedia.m: VLCKit.framework VLCMedia implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2013 Felix Paul K√ºhne * Copyright (C) 2007, 2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul K√ºhne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCMedia.h" #import "VLCMediaList.h" #import "VLCEventManager.h" #import "VLCLibrary.h" #import "VLCLibVLCBridging.h" #import #import // for sysctlbyname /* Meta Dictionary Keys */ NSString *const VLCMetaInformationTitle = @"title"; NSString *const VLCMetaInformationArtist = @"artist"; NSString *const VLCMetaInformationGenre = @"genre"; NSString *const VLCMetaInformationCopyright = @"copyright"; NSString *const VLCMetaInformationAlbum = @"album"; NSString *const VLCMetaInformationTrackNumber = @"trackNumber"; NSString *const VLCMetaInformationDescription = @"description"; NSString *const VLCMetaInformationRating = @"rating"; NSString *const VLCMetaInformationDate = @"date"; NSString *const VLCMetaInformationSetting = @"setting"; NSString *const VLCMetaInformationURL = @"url"; NSString *const VLCMetaInformationLanguage = @"language"; NSString *const VLCMetaInformationNowPlaying = @"nowPlaying"; NSString *const VLCMetaInformationPublisher = @"publisher"; NSString *const VLCMetaInformationEncodedBy = @"encodedBy"; NSString *const VLCMetaInformationArtworkURL = @"artworkURL"; NSString *const VLCMetaInformationArtwork = @"artwork"; NSString *const VLCMetaInformationTrackID = @"trackID"; /* Notification Messages */ NSString *const VLCMediaMetaChanged = @"VLCMediaMetaChanged"; /****************************************************************************** * VLCMedia () */ @interface VLCMedia() { void * p_md; //< Internal media descriptor instance BOOL isArtFetched; //< Value used to determine of the artwork has been parsed BOOL areOthersMetaFetched; //< Value used to determine of the other meta has been parsed BOOL isArtURLFetched; //< Value used to determine of the other meta has been preparsed BOOL isParsed; NSMutableDictionary *_metaDictionary; } /* Make our properties internally readwrite */ @property (nonatomic, readwrite) VLCMediaState state; @property (nonatomic, readwrite, strong) VLCMediaList * subitems; /* Statics */ + (libvlc_meta_t)stringToMetaType:(NSString *)string; + (NSString *)metaTypeToString:(libvlc_meta_t)type; /* Initializers */ - (void)initInternalMediaDescriptor; /* Operations */ - (void)fetchMetaInformationFromLibVLCWithType:(NSString*)metaType; #if !TARGET_OS_IPHONE - (void)fetchMetaInformationForArtWorkWithURL:(NSString *)anURL; - (void)setArtwork:(NSImage *)art; #endif - (void)parseIfNeeded; /* Callback Methods */ - (void)parsedChanged:(NSNumber *)isParsedAsNumber; - (void)metaChanged:(NSString *)metaType; - (void)subItemAdded; - (void)setStateAsNumber:(NSNumber *)newStateAsNumber; @end static VLCMediaState libvlc_state_to_media_state[] = { [libvlc_NothingSpecial] = VLCMediaStateNothingSpecial, [libvlc_Stopped] = VLCMediaStateNothingSpecial, [libvlc_Opening] = VLCMediaStateNothingSpecial, [libvlc_Buffering] = VLCMediaStateBuffering, [libvlc_Ended] = VLCMediaStateNothingSpecial, [libvlc_Error] = VLCMediaStateError, [libvlc_Playing] = VLCMediaStatePlaying, [libvlc_Paused] = VLCMediaStatePlaying, }; static inline VLCMediaState LibVLCStateToMediaState( libvlc_state_t state ) { return libvlc_state_to_media_state[state]; } /****************************************************************************** * LibVLC Event Callback */ static void HandleMediaMetaChanged(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(metaChanged:) withArgumentAsObject:[VLCMedia metaTypeToString:event->u.media_meta_changed.meta_type]]; } } static void HandleMediaDurationChanged(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(setLength:) withArgumentAsObject:[VLCTime timeWithNumber: @(event->u.media_duration_changed.new_duration)]]; } } static void HandleMediaStateChanged(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(setStateAsNumber:) withArgumentAsObject:@(LibVLCStateToMediaState(event->u.media_state_changed.new_state))]; } } static void HandleMediaSubItemAdded(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(subItemAdded) withArgumentAsObject:nil]; } } static void HandleMediaParsedChanged(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(parsedChanged:) withArgumentAsObject:@((BOOL)event->u.media_parsed_changed.new_status)]; } } /****************************************************************************** * Implementation */ @implementation VLCMedia + (instancetype)mediaWithURL:(NSURL *)anURL; { return [[VLCMedia alloc] initWithURL:anURL]; } + (instancetype)mediaWithPath:(NSString *)aPath; { return [[VLCMedia alloc] initWithPath:aPath]; } + (instancetype)mediaAsNodeWithName:(NSString *)aName; { return [[VLCMedia alloc] initAsNodeWithName:aName]; } - (instancetype)initWithPath:(NSString *)aPath { return [self initWithURL:[NSURL fileURLWithPath:aPath isDirectory:NO]]; } - (instancetype)initWithURL:(NSURL *)anURL { if (self = [super init]) { VLCLibrary *library = [VLCLibrary sharedLibrary]; NSAssert(library.instance, @"no library instance when creating media"); p_md = libvlc_media_new_location(library.instance, [[anURL absoluteString] UTF8String]); _metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3]; [self initInternalMediaDescriptor]; } return self; } - (instancetype)initAsNodeWithName:(NSString *)aName { if (self = [super init]) { p_md = libvlc_media_new_as_node([VLCLibrary sharedInstance], [aName UTF8String]); _metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3]; [self initInternalMediaDescriptor]; } return self; } - (void)dealloc { libvlc_event_manager_t * p_em = libvlc_media_event_manager(p_md); libvlc_event_detach(p_em, libvlc_MediaMetaChanged, HandleMediaMetaChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaDurationChanged, HandleMediaDurationChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaStateChanged, HandleMediaStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaSubItemAdded, HandleMediaSubItemAdded, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaParsedChanged, HandleMediaParsedChanged, (__bridge void *)(self)); [[VLCEventManager sharedManager] cancelCallToObject:self]; libvlc_media_release( p_md ); } - (NSString *)description { NSString * result = _metaDictionary[VLCMetaInformationTitle]; return [NSString stringWithFormat:@"<%@ %p> %@", [self class], self, (result ? result : [_url absoluteString])]; } - (NSComparisonResult)compare:(VLCMedia *)media { if (self == media) return NSOrderedSame; if (!media) return NSOrderedDescending; return p_md == [media libVLCMediaDescriptor] ? NSOrderedSame : NSOrderedAscending; } - (VLCTime *)length { if (!_length) { // Try figuring out what the length is long long duration = libvlc_media_get_duration( p_md ); if (duration < 0) return [VLCTime nullTime]; _length = [VLCTime timeWithNumber:@(duration)]; } return _length; } - (VLCTime *)lengthWaitUntilDate:(NSDate *)aDate { static const long long thread_sleep = 10000; if (!_length) { // Force parsing of this item. [self parseIfNeeded]; // wait until we are preparsed while (!_length && !libvlc_media_is_parsed(p_md) && [aDate timeIntervalSinceNow] > 0) usleep( thread_sleep ); // So we're done waiting, but sometimes we trap the fact that the parsing // was done before the length gets assigned, so lets go ahead and assign // it ourselves. if (!_length) return [self length]; } return _length; } - (BOOL)isParsed { return isParsed; } - (void)parse { if (p_md) libvlc_media_parse_async(p_md); } - (void)synchronousParse { if (p_md) libvlc_media_parse(p_md); } - (void)addOptions:(NSDictionary*)options { if (p_md) { [options enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { if (![obj isKindOfClass:[NSNull class]]) libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@=%@", key, obj] UTF8String]); else libvlc_media_add_option(p_md, [key UTF8String]); }]; } } - (NSDictionary*) stats { if (!p_md) return nil; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return @{ @"demuxBitrate" : @(p_stats.f_demux_bitrate), @"inputBitrate" : @(p_stats.f_input_bitrate), @"sendBitrate" : @(p_stats.f_send_bitrate), @"decodedAudio" : @(p_stats.i_decoded_audio), @"decodedVideo" : @(p_stats.i_decoded_video), @"demuxCorrupted" : @(p_stats.i_demux_corrupted), @"demuxDiscontinuity" : @(p_stats.i_demux_discontinuity), @"demuxReadBytes" : @(p_stats.i_demux_read_bytes), @"displayedPictures" : @(p_stats.i_displayed_pictures), @"lostAbuffers" : @(p_stats.i_lost_abuffers), @"lostPictures" : @(p_stats.i_lost_pictures), @"playedAbuffers" : @(p_stats.i_played_abuffers), @"readBytes" : @(p_stats.i_read_bytes), @"sentBytes" : @(p_stats.i_sent_bytes), @"sentPackets" : @(p_stats.i_sent_packets) }; } - (NSInteger)numberOfReadBytesOnInput { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_read_bytes; } - (float)inputBitrate { if (!p_md) return .0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.f_input_bitrate; } - (NSInteger)numberOfReadBytesOnDemux { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_demux_read_bytes; } - (float)demuxBitrate { if (!p_md) return .0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.f_demux_bitrate; } - (NSInteger)numberOfDecodedVideoBlocks { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_decoded_video; } - (NSInteger)numberOfDecodedAudioBlocks { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_decoded_audio; } - (NSInteger)numberOfDisplayedPictures { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_displayed_pictures; } - (NSInteger)numberOfLostPictures { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_lost_pictures; } - (NSInteger)numberOfPlayedAudioBuffers { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_played_abuffers; } - (NSInteger)numberOfLostAudioBuffers { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_lost_abuffers; } - (NSInteger)numberOfSentPackets { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_sent_packets; } - (NSInteger)numberOfSentBytes { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_sent_bytes; } - (float)streamOutputBitrate { if (!p_md) return .0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.f_send_bitrate; } - (NSInteger)numberOfCorruptedDataPackets { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_demux_corrupted; } - (NSInteger)numberOfDiscontinuties { if (!p_md) return 0; libvlc_media_stats_t p_stats; libvlc_media_get_stats(p_md, &p_stats); return p_stats.i_demux_discontinuity; } NSString *const VLCMediaTracksInformationCodec = @"codec"; // NSNumber NSString *const VLCMediaTracksInformationId = @"id"; // NSNumber NSString *const VLCMediaTracksInformationType = @"type"; // NSString NSString *const VLCMediaTracksInformationCodecProfile = @"profile"; // NSNumber NSString *const VLCMediaTracksInformationCodecLevel = @"level"; // NSNumber NSString *const VLCMediaTracksInformationTypeAudio = @"audio"; NSString *const VLCMediaTracksInformationTypeVideo = @"video"; NSString *const VLCMediaTracksInformationTypeText = @"text"; NSString *const VLCMediaTracksInformationTypeUnknown = @"unknown"; NSString *const VLCMediaTracksInformationBitrate = @"bitrate"; // NSNumber NSString *const VLCMediaTracksInformationLanguage = @"language"; // NSString NSString *const VLCMediaTracksInformationDescription = @"description"; // NSString NSString *const VLCMediaTracksInformationAudioChannelsNumber = @"channelsNumber"; // NSNumber NSString *const VLCMediaTracksInformationAudioRate = @"rate"; // NSNumber NSString *const VLCMediaTracksInformationVideoHeight = @"height"; // NSNumber NSString *const VLCMediaTracksInformationVideoWidth = @"width"; // NSNumber NSString *const VLCMediaTracksInformationSourceAspectRatio = @"sar_num"; // NSNumber NSString *const VLCMediaTracksInformationSourceAspectDenominator = @"sar_den"; // NSNumber NSString *const VLCMediaTracksInformationFrameRate = @"frame_rate_num"; // NSNumber NSString *const VLCMediaTracksInformationFrameRateDenominator = @"frame_rate_den"; // NSNumber NSString *const VLCMediaTracksInformationTextEncoding = @"encoding"; // NSString - (NSArray *)tracksInformation { [self synchronousParse]; libvlc_media_track_t **tracksInfo; unsigned int count = libvlc_media_tracks_get(p_md, &tracksInfo); NSMutableArray *array = [NSMutableArray array]; for (NSUInteger i = 0; i < count; i++) { NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys: @(tracksInfo[i]->i_codec), VLCMediaTracksInformationCodec, @(tracksInfo[i]->i_id), VLCMediaTracksInformationId, @(tracksInfo[i]->i_profile), VLCMediaTracksInformationCodecProfile, @(tracksInfo[i]->i_level), VLCMediaTracksInformationCodecLevel, @(tracksInfo[i]->i_bitrate), VLCMediaTracksInformationBitrate, nil]; if (tracksInfo[i]->psz_language) dictionary[VLCMediaTracksInformationLanguage] = [NSString stringWithUTF8String:tracksInfo[i]->psz_language]; if (tracksInfo[i]->psz_description) dictionary[VLCMediaTracksInformationDescription] = [NSString stringWithUTF8String:tracksInfo[i]->psz_description]; NSString *type; switch (tracksInfo[i]->i_type) { case libvlc_track_audio: type = VLCMediaTracksInformationTypeAudio; dictionary[VLCMediaTracksInformationAudioChannelsNumber] = @(tracksInfo[i]->audio->i_channels); dictionary[VLCMediaTracksInformationAudioRate] = @(tracksInfo[i]->audio->i_rate); break; case libvlc_track_video: type = VLCMediaTracksInformationTypeVideo; dictionary[VLCMediaTracksInformationVideoWidth] = @(tracksInfo[i]->video->i_width); dictionary[VLCMediaTracksInformationVideoHeight] = @(tracksInfo[i]->video->i_height); dictionary[VLCMediaTracksInformationSourceAspectRatio] = @(tracksInfo[i]->video->i_sar_num); dictionary[VLCMediaTracksInformationSourceAspectDenominator] = @(tracksInfo[i]->video->i_sar_den); dictionary[VLCMediaTracksInformationFrameRate] = @(tracksInfo[i]->video->i_frame_rate_num); dictionary[VLCMediaTracksInformationFrameRateDenominator] = @(tracksInfo[i]->video->i_frame_rate_den); break; case libvlc_track_text: type = VLCMediaTracksInformationTypeText; if (tracksInfo[i]->subtitle->psz_encoding) dictionary[VLCMediaTracksInformationTextEncoding] = [NSString stringWithUTF8String: tracksInfo[i]->subtitle->psz_encoding]; break; case libvlc_track_unknown: default: type = VLCMediaTracksInformationTypeUnknown; break; } [dictionary setValue:type forKey:VLCMediaTracksInformationType]; [array addObject:dictionary]; } libvlc_media_tracks_release(tracksInfo, count); return array; } - (BOOL)isMediaSizeSuitableForDevice { #if TARGET_OS_IPHONE // Trigger parsing if needed if (![self isParsed]) [self synchronousParse]; NSUInteger biggestWidth = 0; NSUInteger biggestHeight = 0; libvlc_media_track_t **tracksInfo; unsigned int count = libvlc_media_tracks_get(p_md, &tracksInfo); for (NSUInteger i = 0; i < count; i++) { switch (tracksInfo[i]->i_type) { case libvlc_track_video: if (tracksInfo[i]->video->i_width > biggestWidth) biggestWidth = tracksInfo[i]->video->i_width; if (tracksInfo[i]->video->i_height > biggestHeight) biggestHeight = tracksInfo[i]->video->i_height; break; default: break; } } if (biggestHeight > 0 && biggestWidth > 0) { size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *answer = malloc(size); sysctlbyname("hw.machine", answer, &size, NULL, 0); NSString *currentMachine = @(answer); free(answer); NSUInteger totalNumberOfPixels = biggestWidth * biggestHeight; if ([currentMachine hasPrefix:@"iPhone2"] || [currentMachine hasPrefix:@"iPhone3"] || [currentMachine hasPrefix:@"iPad1"] || [currentMachine hasPrefix:@"iPod3"] || [currentMachine hasPrefix:@"iPod4"]) { // iPhone 3GS, iPhone 4, first gen. iPad, 3rd and 4th generation iPod touch return (totalNumberOfPixels < 600000); // between 480p and 720p } else if ([currentMachine hasPrefix:@"iPhone4"] || [currentMachine hasPrefix:@"iPad3,1"] || [currentMachine hasPrefix:@"iPad3,2"] || [currentMachine hasPrefix:@"iPad3,3"] || [currentMachine hasPrefix:@"iPod4"] || [currentMachine hasPrefix:@"iPad2"] || [currentMachine hasPrefix:@"iPod5"]) { // iPhone 4S, iPad 2 and 3, iPod 4 and 5 return (totalNumberOfPixels < 922000); // 720p } else { // iPhone 5, iPad 4 return (totalNumberOfPixels < 2074000); // 1080p } } #endif return YES; } - (NSString *)metadataForKey:(NSString *)key { if (!p_md) return nil; if (![self isParsed]) [self synchronousParse]; char *returnValue = libvlc_media_get_meta(p_md, [VLCMedia stringToMetaType:key]); if (!returnValue) return nil; NSString *actualReturnValue = @(returnValue); free(returnValue); return actualReturnValue; } - (void)setMetadata:(NSString *)data forKey:(NSString *)key { if (!p_md) return; libvlc_media_set_meta(p_md, [VLCMedia stringToMetaType:key], [data UTF8String]); } - (BOOL)saveMetadata { if (p_md) return libvlc_media_save_meta(p_md) != 0; return NO; } /****************************************************************************** * Implementation VLCMedia () */ + (libvlc_meta_t)stringToMetaType:(NSString *)string { static NSDictionary * stringToMetaDictionary = nil; // TODO: Thread safe-ize if (!stringToMetaDictionary) { #define VLCStringToMeta( name ) [NSNumber numberWithInt: libvlc_meta_##name], VLCMetaInformation##name stringToMetaDictionary = [NSDictionary dictionaryWithObjectsAndKeys: VLCStringToMeta(Title), VLCStringToMeta(Artist), VLCStringToMeta(Genre), VLCStringToMeta(Copyright), VLCStringToMeta(Album), VLCStringToMeta(TrackNumber), VLCStringToMeta(Description), VLCStringToMeta(Rating), VLCStringToMeta(Date), VLCStringToMeta(Setting), VLCStringToMeta(URL), VLCStringToMeta(Language), VLCStringToMeta(NowPlaying), VLCStringToMeta(Publisher), VLCStringToMeta(ArtworkURL), VLCStringToMeta(TrackID), nil]; #undef VLCStringToMeta } NSNumber * number = stringToMetaDictionary[string]; return (libvlc_meta_t) (number ? [number intValue] : -1); } + (NSString *)metaTypeToString:(libvlc_meta_t)type { #define VLCMetaToString( name, type ) if (libvlc_meta_##name == type) return VLCMetaInformation##name; VLCMetaToString(Title, type); VLCMetaToString(Artist, type); VLCMetaToString(Genre, type); VLCMetaToString(Copyright, type); VLCMetaToString(Album, type); VLCMetaToString(TrackNumber, type); VLCMetaToString(Description, type); VLCMetaToString(Rating, type); VLCMetaToString(Date, type); VLCMetaToString(Setting, type); VLCMetaToString(URL, type); VLCMetaToString(Language, type); VLCMetaToString(NowPlaying, type); VLCMetaToString(Publisher, type); VLCMetaToString(ArtworkURL, type); VLCMetaToString(TrackID, type); #undef VLCMetaToString return nil; } - (void)initInternalMediaDescriptor { char * p_url = libvlc_media_get_mrl( p_md ); if (!p_url) return; _url = [NSURL URLWithString:@(p_url)]; if (!_url) /* Attempt to interpret as a file path then */ _url = [NSURL fileURLWithPath:@(p_url)]; free(p_url); libvlc_media_set_user_data(p_md, (__bridge void*)self); libvlc_event_manager_t * p_em = libvlc_media_event_manager( p_md ); libvlc_event_attach(p_em, libvlc_MediaMetaChanged, HandleMediaMetaChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaDurationChanged, HandleMediaDurationChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaStateChanged, HandleMediaStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaSubItemAdded, HandleMediaSubItemAdded, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaParsedChanged, HandleMediaParsedChanged, (__bridge void *)(self)); libvlc_media_list_t * p_mlist = libvlc_media_subitems( p_md ); if (p_mlist) { self.subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist]; libvlc_media_list_release( p_mlist ); } isParsed = libvlc_media_is_parsed(p_md) != 0; self.state = LibVLCStateToMediaState(libvlc_media_get_state( p_md )); } - (void)fetchMetaInformationFromLibVLCWithType:(NSString *)metaType { char * psz_value = libvlc_media_get_meta( p_md, [VLCMedia stringToMetaType:metaType] ); NSString * newValue = psz_value ? @(psz_value) : nil; NSString * oldValue = [_metaDictionary valueForKey:metaType]; free(psz_value); if (newValue != oldValue && !(oldValue && newValue && [oldValue compare:newValue] == NSOrderedSame)) { // Only fetch the art if needed. (ie, create the NSImage, if it was requested before) if (isArtFetched && [metaType isEqualToString:VLCMetaInformationArtworkURL]) { [NSThread detachNewThreadSelector:@selector(fetchMetaInformationForArtWorkWithURL:) toTarget:self withObject:newValue]; } [_metaDictionary setValue:newValue forKeyPath:metaType]; } } #if !TARGET_OS_IPHONE - (void)fetchMetaInformationForArtWorkWithURL:(NSString *)anURL { @autoreleasepool { NSImage * art = nil; if (anURL) { // Go ahead and load up the art work NSURL * artUrl = [NSURL URLWithString:[anURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; // Don't attempt to fetch artwork from remote. Core will do that alone if ([artUrl isFileURL]) art = [[NSImage alloc] initWithContentsOfURL:artUrl]; } // If anything was found, lets save it to the meta data dictionary [self performSelectorOnMainThread:@selector(setArtwork:) withObject:art waitUntilDone:NO]; } } - (void)setArtwork:(NSImage *)art { if (!art) [(NSMutableDictionary *)_metaDictionary removeObjectForKey:@"artwork"]; else ((NSMutableDictionary *)_metaDictionary)[@"artwork"] = art; } #endif - (void)parseIfNeeded { if (![self isParsed]) [self parse]; } - (void)metaChanged:(NSString *)metaType { [self fetchMetaInformationFromLibVLCWithType:metaType]; if ([_delegate respondsToSelector:@selector(mediaMetaDataDidChange:)]) [_delegate mediaMetaDataDidChange:self]; } - (void)subItemAdded { if (_subitems) return; /* Nothing to do */ libvlc_media_list_t * p_mlist = libvlc_media_subitems( p_md ); NSAssert( p_mlist, @"The mlist shouldn't be nil, we are receiving a subItemAdded"); self.subitems = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist]; libvlc_media_list_release( p_mlist ); } - (void)parsedChanged:(NSNumber *)isParsedAsNumber { [self willChangeValueForKey:@"parsed"]; isParsed = [isParsedAsNumber boolValue]; [self didChangeValueForKey:@"parsed"]; // FIXME: Probably don't even call this if there is no delegate. if (!_delegate || !isParsed) return; if ([_delegate respondsToSelector:@selector(mediaDidFinishParsing:)]) [_delegate mediaDidFinishParsing:self]; } - (void)setStateAsNumber:(NSNumber *)newStateAsNumber { [self setState: [newStateAsNumber intValue]]; } #if TARGET_OS_IPHONE - (NSDictionary *)metaDictionary { if (!areOthersMetaFetched) { areOthersMetaFetched = YES; [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationTitle]; [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationArtist]; [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationAlbum]; [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationDate]; [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationGenre]; [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationTrackNumber]; [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationNowPlaying]; } if (!isArtURLFetched) { isArtURLFetched = YES; /* Force isArtURLFetched, that will trigger artwork download eventually * And all the other meta will be added through the libvlc event system */ [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationArtworkURL]; } return [NSDictionary dictionaryWithDictionary:_metaDictionary]; } #else - (NSDictionary *)metaDictionary { return [NSDictionary dictionaryWithDictionary:_metaDictionary]; } - (id)valueForKeyPath:(NSString *)keyPath { if (!isArtFetched && [keyPath isEqualToString:@"metaDictionary.artwork"]) { isArtFetched = YES; /* Force the retrieval of the artwork now that someone asked for it */ [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationArtworkURL]; } else if (!areOthersMetaFetched && [keyPath hasPrefix:@"metaDictionary."]) { areOthersMetaFetched = YES; /* Force VLCMetaInformationTitle, that will trigger preparsing * And all the other meta will be added through the libvlc event system */ [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationTitle]; } else if (!isArtURLFetched && [keyPath hasPrefix:@"metaDictionary.artworkURL"]) { isArtURLFetched = YES; /* Force isArtURLFetched, that will trigger artwork download eventually * And all the other meta will be added through the libvlc event system */ [self fetchMetaInformationFromLibVLCWithType: VLCMetaInformationArtworkURL]; } return [super valueForKeyPath:keyPath]; } #endif @end /****************************************************************************** * Implementation VLCMedia (LibVLCBridging) */ @implementation VLCMedia (LibVLCBridging) + (id)mediaWithLibVLCMediaDescriptor:(void *)md { return [[VLCMedia alloc] initWithLibVLCMediaDescriptor:md]; } + (id)mediaWithMedia:(VLCMedia *)media andLibVLCOptions:(NSDictionary *)options { libvlc_media_t * p_md; p_md = libvlc_media_duplicate([media libVLCMediaDescriptor]); for (NSString * key in [options allKeys]) { if (options[key] != [NSNull null]) libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@=%@", key, options[key]] UTF8String]); else libvlc_media_add_option(p_md, [[NSString stringWithFormat:@"%@", key] UTF8String]); } return [VLCMedia mediaWithLibVLCMediaDescriptor:p_md]; } - (id)initWithLibVLCMediaDescriptor:(void *)md { if (self = [super init]) { libvlc_media_retain(md); p_md = md; _metaDictionary = [[NSMutableDictionary alloc] initWithCapacity:3]; [self initInternalMediaDescriptor]; } return self; } - (void *)libVLCMediaDescriptor { return p_md; } @end Sources/VLCMediaDiscoverer.m000066400000000000000000000131141250240207200162630ustar00rootroot00000000000000/***************************************************************************** * VLCMediaDiscoverer.m: VLCKit.framework VLCMediaDiscoverer implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007, 2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCMediaDiscoverer.h" #import "VLCLibrary.h" #import "VLCLibVLCBridging.h" #import "VLCEventManager.h" #include @interface VLCMediaDiscoverer () { NSString * _localizedName; VLCMediaList * _discoveredMedia; void * _mdis; BOOL _running; } @end static NSArray * availableMediaDiscoverer = nil; // Global list of media discoverers /** * Declares call back functions to be used with libvlc event callbacks. */ @interface VLCMediaDiscoverer() { VLCLibrary *_privateLibrary; } /** * libvlc told us that the discoverer is actually running */ - (void)_mediaDiscovererStarted; /** * libvlc told us that the discoverer stopped running */ - (void)_mediaDiscovererEnded; @end /* libvlc event callback */ static void HandleMediaDiscovererStarted(const libvlc_event_t * event, void * user_data) { @autoreleasepool { NSLog(@"HandleMediaDiscovererStarted"); id self = (__bridge id)(user_data); [[VLCEventManager sharedManager] callOnMainThreadObject:self withMethod:@selector(_mediaDiscovererStarted) withArgumentAsObject:nil]; } } static void HandleMediaDiscovererEnded( const libvlc_event_t * event, void * user_data) { @autoreleasepool { NSLog(@"HandleMediaDiscovererEnded"); id self = (__bridge id)(user_data); [[VLCEventManager sharedManager] callOnMainThreadObject:self withMethod:@selector(_mediaDiscovererEnded) withArgumentAsObject:nil]; } } @implementation VLCMediaDiscoverer + (NSArray *)availableMediaDiscoverer { if (!availableMediaDiscoverer) { availableMediaDiscoverer = @[[[VLCMediaDiscoverer alloc] initWithName:@"sap"], [[VLCMediaDiscoverer alloc] initWithName:@"upnp"], [[VLCMediaDiscoverer alloc] initWithName:@"freebox"], [[VLCMediaDiscoverer alloc] initWithName:@"video_dir"]]; } return availableMediaDiscoverer; } - (instancetype)initWithName:(NSString *)aServiceName { if (self = [super init]) { _localizedName = nil; _discoveredMedia = nil; _privateLibrary = [VLCLibrary sharedLibrary]; libvlc_retain([_privateLibrary instance]); _mdis = libvlc_media_discoverer_new_from_name([_privateLibrary instance], [aServiceName UTF8String]); NSAssert(_mdis, @"No such media discoverer"); libvlc_event_manager_t * p_em = libvlc_media_discoverer_event_manager(_mdis); libvlc_event_attach(p_em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaDiscovererEnded, HandleMediaDiscovererEnded, (__bridge void *)(self)); _running = libvlc_media_discoverer_is_running(_mdis); } return self; } - (void)dealloc { libvlc_event_manager_t *em = libvlc_media_list_event_manager(_mdis); libvlc_event_detach(em, libvlc_MediaDiscovererStarted, HandleMediaDiscovererStarted, (__bridge void *)(self)); libvlc_event_detach(em, libvlc_MediaDiscovererEnded, HandleMediaDiscovererEnded, (__bridge void *)(self)); [[VLCEventManager sharedManager] cancelCallToObject:self]; libvlc_media_discoverer_release( _mdis ); libvlc_release(_privateLibrary.instance); } - (VLCMediaList *) discoveredMedia { if (_discoveredMedia) return _discoveredMedia; libvlc_media_list_t * p_mlist = libvlc_media_discoverer_media_list( _mdis ); VLCMediaList * ret = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist]; libvlc_media_list_release( p_mlist ); _discoveredMedia = ret; return _discoveredMedia; } - (NSString *)localizedName { if (_localizedName) return _localizedName; char * name = libvlc_media_discoverer_localized_name( _mdis ); if (name) { _localizedName = @(name); free( name ); } return _localizedName; } - (BOOL)isRunning { return _running; } - (void)_mediaDiscovererStarted { [self willChangeValueForKey:@"running"]; _running = YES; [self didChangeValueForKey:@"running"]; } - (void)_mediaDiscovererEnded { [self willChangeValueForKey:@"running"]; _running = NO; [self didChangeValueForKey:@"running"]; } @end Sources/VLCMediaLibrary.m000066400000000000000000000046021250240207200155640ustar00rootroot00000000000000/***************************************************************************** * VLCMediaLibrary.m: VLCKit.framework VLCMediaLibrary implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007, 2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "VLCMediaLibrary.h" #import "VLCLibrary.h" #import "VLCLibVLCBridging.h" #include @interface VLCMediaLibrary () { void *_mlib; } @property (nonatomic) dispatch_once_t once; @property (nonatomic, readwrite, strong) VLCMediaList * allMedia; @end @implementation VLCMediaLibrary + (VLCMediaLibrary*)sharedMediaLibrary { static VLCMediaLibrary * sharedMediaLibrary = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMediaLibrary = [[VLCMediaLibrary alloc] init]; }); return sharedMediaLibrary; } - (instancetype)init { if (self = [super init]) { _mlib = libvlc_media_library_new( [VLCLibrary sharedInstance]); libvlc_media_library_load( _mlib ); } return self; } - (void)dealloc { libvlc_media_library_release(_mlib); _mlib = nil; // make sure that the pointer is dead } - (VLCMediaList *)allMedia { dispatch_once(&_once, ^{ libvlc_media_list_t * p_mlist = libvlc_media_library_media_list( _mlib ); _allMedia = [VLCMediaList mediaListWithLibVLCMediaList:p_mlist]; libvlc_media_list_release(p_mlist); }); return _allMedia; } @end Sources/VLCMediaList.m000066400000000000000000000235661250240207200151050ustar00rootroot00000000000000/***************************************************************************** * VLCMediaList.m: VLCKit.framework VLCMediaList implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * Copyright (C) 2009, 2013 Felix Paul Kühne * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCMediaList.h" #import "VLCLibrary.h" #import "VLCEventManager.h" #import "VLCLibVLCBridging.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include /* Notification Messages */ NSString *const VLCMediaListItemAdded = @"VLCMediaListItemAdded"; NSString *const VLCMediaListItemDeleted = @"VLCMediaListItemDeleted"; // TODO: Documentation @interface VLCMediaList (Private) /* Initializers */ - (void)initInternalMediaList; /* Libvlc event bridges */ - (void)mediaListItemAdded:(NSArray *)args; - (void)mediaListItemRemoved:(NSNumber *)index; @end /* libvlc event callback */ static void HandleMediaListItemAdded(const libvlc_event_t * event, void * user_data) { @autoreleasepool { id self = (__bridge id)(user_data); [[VLCEventManager sharedManager] callOnMainThreadObject:self withMethod:@selector(mediaListItemAdded:) withArgumentAsObject:@[@{@"media": [VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_list_item_added.item], @"index": @(event->u.media_list_item_added.index)}]]; } } static void HandleMediaListItemDeleted( const libvlc_event_t * event, void * user_data) { @autoreleasepool { id self = (__bridge id)(user_data); [[VLCEventManager sharedManager] callOnMainThreadObject:self withMethod:@selector(mediaListItemRemoved:) withArgumentAsObject:@(event->u.media_list_item_deleted.index)]; } } @interface VLCMediaList() { void * p_mlist; //< Internal instance of media list id __weak delegate; //< Delegate object /* We need that private copy because of Cocoa Bindings, that need to be working on first thread */ NSMutableArray * cachedMedia; //< Private copy of media objects. } @end @implementation VLCMediaList - (instancetype)init { if (self = [super init]) { // Create a new libvlc media list instance p_mlist = libvlc_media_list_new([VLCLibrary sharedLibrary].instance); // Initialize internals to defaults cachedMedia = [[NSMutableArray alloc] init]; [self initInternalMediaList]; } return self; } - (instancetype)initWithArray:(NSArray *)array { if (self = [self init]) { /* do something useful with the provided array */ NSUInteger count = [array count]; for (NSUInteger x = 0; x < count; x++) [self addMedia:array[x]]; } return self; } - (void)dealloc { libvlc_event_manager_t *em = libvlc_media_list_event_manager(p_mlist); libvlc_event_detach(em, libvlc_MediaListItemDeleted, HandleMediaListItemDeleted, (__bridge void *)(self)); libvlc_event_detach(em, libvlc_MediaListItemAdded, HandleMediaListItemAdded, (__bridge void *)(self)); [[VLCEventManager sharedManager] cancelCallToObject:self]; // Release allocated memory delegate = nil; libvlc_media_list_release( p_mlist ); } - (NSString *)description { NSMutableString * content = [NSMutableString string]; for (NSInteger i = 0; i < [self count]; i++) { [content appendFormat:@"%@\n", [self mediaAtIndex: i]]; } return [NSString stringWithFormat:@"<%@ %p> {\n%@}", [self class], self, content]; } - (void)lock { libvlc_media_list_lock( p_mlist ); } - (void)unlock { libvlc_media_list_unlock( p_mlist ); } - (NSInteger)addMedia:(VLCMedia *)media { NSInteger index = [self count]; [self insertMedia:media atIndex:index]; return index; } - (void)insertMedia:(VLCMedia *)media atIndex: (NSInteger)index { // Add it to libvlc's medialist libvlc_media_list_insert_media(p_mlist, [media libVLCMediaDescriptor], (int)index); // we will add the media object to cachedMedia in the callback when libvlc acknowledges its addition } - (void)removeMediaAtIndex:(NSInteger)index { if (index >= [cachedMedia count]) return; // Remove it from libvlc's medialist libvlc_media_list_remove_index(p_mlist, (int)index); // we will remove the media object cachedMedia when libvlc acknowledges that it's gone } - (VLCMedia *)mediaAtIndex:(NSInteger)index { if (index < [cachedMedia count]) return cachedMedia[index]; return nil; } - (NSInteger)indexOfMedia:(VLCMedia *)media { NSInteger result = libvlc_media_list_index_of_item(p_mlist, [media libVLCMediaDescriptor]); return result; } /* KVC Compliance: For the @"media" key */ - (NSInteger)countOfMedia { return [self count]; } - (id)objectInMediaAtIndex:(NSUInteger)i { return [self mediaAtIndex:i]; } - (NSInteger)count { return [cachedMedia count]; } - (void)insertObject:(id)object inMediaAtIndex:(NSUInteger)i { [self insertMedia:object atIndex:i]; } - (void)removeObjectFromMediaAtIndex:(NSUInteger)i { [self removeMediaAtIndex:i]; } @synthesize delegate; - (BOOL)isReadOnly { return libvlc_media_list_is_readonly( p_mlist ); } @end @implementation VLCMediaList (LibVLCBridging) + (id)mediaListWithLibVLCMediaList:(void *)p_new_mlist; { return [[VLCMediaList alloc] initWithLibVLCMediaList:p_new_mlist]; } - (id)initWithLibVLCMediaList:(void *)p_new_mlist; { if (self = [super init]) { p_mlist = p_new_mlist; libvlc_media_list_retain( p_mlist ); libvlc_media_list_lock( p_mlist ); cachedMedia = [[NSMutableArray alloc] initWithCapacity:libvlc_media_list_count(p_mlist)]; NSUInteger count = libvlc_media_list_count(p_mlist); for (int i = 0; i < count; i++) { libvlc_media_t * p_md = libvlc_media_list_item_at_index(p_mlist, i); [cachedMedia addObject:[VLCMedia mediaWithLibVLCMediaDescriptor:p_md]]; libvlc_media_release(p_md); } [self initInternalMediaList]; libvlc_media_list_unlock(p_mlist); } return self; } - (void *)libVLCMediaList { return p_mlist; } @end @implementation VLCMediaList (Private) - (void)initInternalMediaList { // Add event callbacks libvlc_event_manager_t * p_em = libvlc_media_list_event_manager(p_mlist); libvlc_event_attach( p_em, libvlc_MediaListItemAdded, HandleMediaListItemAdded, (__bridge void *)(self)); libvlc_event_attach( p_em, libvlc_MediaListItemDeleted, HandleMediaListItemDeleted, (__bridge void *)(self)); } - (void)mediaListItemAdded:(NSArray *)arrayOfArgs { /* We hope to receive index in a nide range, that could change one day */ NSInteger start = [arrayOfArgs[0][@"index"] intValue]; NSInteger end = [arrayOfArgs[[arrayOfArgs count]-1][@"index"] intValue]; NSRange range = NSMakeRange(start, end-start); [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range] forKey:@"media"]; for (NSDictionary * args in arrayOfArgs) { NSInteger index = [args[@"index"] intValue]; VLCMedia * media = args[@"media"]; /* Sanity check */ if (index && index > [cachedMedia count]) index = [cachedMedia count]; [cachedMedia insertObject:media atIndex:index]; index = [cachedMedia count] - 1; if (delegate && [delegate respondsToSelector:@selector(mediaList:mediaAdded:atIndex:)]) [delegate mediaList:self mediaAdded:media atIndex:index]; } [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range] forKey:@"media"]; // Post the notification // [[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaListItemAdded // object:self // userInfo:args]; } - (void)mediaListItemRemoved:(NSNumber *)index { [self willChange:NSKeyValueChangeRemoval valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"media"]; [cachedMedia removeObjectAtIndex:[index intValue]]; [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"media"]; // Post the notification [[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaListItemDeleted object:self userInfo:@{@"index": index}]; // Let the delegate know that the item is being removed if (delegate && [delegate respondsToSelector:@selector(mediaList:mediaRemovedAtIndex:)]) [delegate mediaList:self mediaRemovedAtIndex:[index intValue]]; } @end Sources/VLCMediaListPlayer.m000066400000000000000000000104131250240207200162450ustar00rootroot00000000000000/***************************************************************************** * VLCMediaListPlayer.m: VLCKit.framework VLCMediaListPlayer implementation ***************************************************************************** * Copyright (C) 2009 Pierre d'Herbemont * Partial Copyright (C) 2009-2013 Felix Paul Kühne * Copyright (C) 2009-2013 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * Felix Paul Kühne * Faustion Osuna * Felix Paul Kühne * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCLibrary.h" #import "VLCMediaPlayer.h" #import "VLCEventManager.h" #import "VLCLibVLCBridging.h" #if !TARGET_OS_IPHONE # import "VLCVideoView.h" #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #if !TARGET_OS_IPHONE /* prevent system sleep */ # import /* FIXME: Ugly hack! */ # ifdef __x86_64__ # import # endif #endif #include /* Notification Messages */ NSString *const VLCMediaPlayerTimeChanged = @"VLCMediaPlayerTimeChanged"; NSString *const VLCMediaPlayerStateChanged = @"VLCMediaPlayerStateChanged"; NSString * VLCMediaPlayerStateToString(VLCMediaPlayerState state) { static NSString * stateToStrings[] = { [VLCMediaPlayerStateStopped] = @"VLCMediaPlayerStateStopped", [VLCMediaPlayerStateOpening] = @"VLCMediaPlayerStateOpening", [VLCMediaPlayerStateBuffering] = @"VLCMediaPlayerStateBuffering", [VLCMediaPlayerStateEnded] = @"VLCMediaPlayerStateEnded", [VLCMediaPlayerStateError] = @"VLCMediaPlayerStateError", [VLCMediaPlayerStatePlaying] = @"VLCMediaPlayerStatePlaying", [VLCMediaPlayerStatePaused] = @"VLCMediaPlayerStatePaused" }; return stateToStrings[state]; } static void HandleMediaTimeChanged(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(mediaPlayerTimeChanged:) withArgumentAsObject:@(event->u.media_player_time_changed.new_time)]; [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:(__bridge id)(self) withDelegateMethod:@selector(mediaPlayerTimeChanged:) withNotificationName:VLCMediaPlayerTimeChanged]; } } static void HandleMediaPositionChanged(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(mediaPlayerPositionChanged:) withArgumentAsObject:@(event->u.media_player_position_changed.new_position)]; } } static void HandleMediaInstanceStateChanged(const libvlc_event_t * event, void * self) { VLCMediaPlayerState newState; if (event->type == libvlc_MediaPlayerPlaying) newState = VLCMediaPlayerStatePlaying; else if (event->type == libvlc_MediaPlayerPaused) newState = VLCMediaPlayerStatePaused; else if (event->type == libvlc_MediaPlayerEndReached || event->type == libvlc_MediaPlayerStopped) newState = VLCMediaPlayerStateStopped; else if (event->type == libvlc_MediaPlayerEncounteredError) newState = VLCMediaPlayerStateError; else if (event->type == libvlc_MediaPlayerBuffering) newState = VLCMediaPlayerStateBuffering; else if (event->type == libvlc_MediaPlayerOpening) newState = VLCMediaPlayerStateOpening; else { VKLog(@"%s: Unknown event", __FUNCTION__); return; } @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(mediaPlayerStateChanged:) withArgumentAsObject:@(newState)]; [[VLCEventManager sharedManager] callOnMainThreadDelegateOfObject:(__bridge id)(self) withDelegateMethod:@selector(mediaPlayerStateChanged:) withNotificationName:VLCMediaPlayerStateChanged]; } } static void HandleMediaPlayerMediaChanged(const libvlc_event_t * event, void * self) { @autoreleasepool { [[VLCEventManager sharedManager] callOnMainThreadObject:(__bridge id)(self) withMethod:@selector(mediaPlayerMediaChanged:) withArgumentAsObject:[VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_player_media_changed.new_media]]; } } // TODO: Documentation @interface VLCMediaPlayer (Private) - (id)initWithDrawable:(id)aDrawable options:(NSArray *)options; - (void)registerObservers; - (void)unregisterObservers; - (void)mediaPlayerTimeChanged:(NSNumber *)newTime; - (void)mediaPlayerPositionChanged:(NSNumber *)newTime; - (void)mediaPlayerStateChanged:(NSNumber *)newState; - (void)mediaPlayerMediaChanged:(VLCMedia *)media; @end @interface VLCMediaPlayer () { VLCLibrary *_privateLibrary; void * _playerInstance; // Internal VLCMedia * _media; //< Current media being played VLCTime * _cachedTime; //< Cached time of the media being played VLCTime * _cachedRemainingTime; //< Cached remaining time of the media being played VLCMediaPlayerState _cachedState; //< Cached state of the media being played float _position; //< The position of the media being played id _drawable; //< The drawable associated to this media player VLCAudio *_audio; libvlc_equalizer_t *_equalizerInstance; BOOL _equalizerEnabled; } @end @implementation VLCMediaPlayer @synthesize libraryInstance = _privateLibrary; /* Bindings */ + (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key { static NSDictionary * dict = nil; NSSet * superKeyPaths; if (!dict) { dict = @{@"playing": [NSSet setWithObject:@"state"], @"seekable": [NSSet setWithObjects:@"state", @"media", nil], @"canPause": [NSSet setWithObjects:@"state", @"media", nil], @"description": [NSSet setWithObjects:@"state", @"media", nil]}; } if ((superKeyPaths = [super keyPathsForValuesAffectingValueForKey: key])) { NSMutableSet * ret = [NSMutableSet setWithSet:dict[key]]; [ret unionSet:superKeyPaths]; return ret; } return dict[key]; } /* Constructor */ - (instancetype)init { return [self initWithDrawable:nil options:nil]; } #if !TARGET_OS_IPHONE - (instancetype)initWithVideoView:(VLCVideoView *)aVideoView { return [self initWithDrawable: aVideoView options:nil]; } - (instancetype)initWithVideoLayer:(VLCVideoLayer *)aVideoLayer { return [self initWithDrawable: aVideoLayer options:nil]; } - (instancetype)initWithVideoView:(VLCVideoView *)aVideoView options:(NSArray *)options { return [self initWithDrawable: aVideoView options:options]; } - (instancetype)initWithVideoLayer:(VLCVideoLayer *)aVideoLayer options:(NSArray *)options { return [self initWithDrawable: aVideoLayer options:options]; } #endif - (instancetype)initWithOptions:(NSArray *)options { return [self initWithDrawable:nil options:options]; } - (void)dealloc { NSAssert(libvlc_media_player_get_state(_playerInstance) == libvlc_Stopped || libvlc_media_player_get_state(_playerInstance) == libvlc_NothingSpecial, @"You released the media player before ensuring that it is stopped"); [self unregisterObservers]; [[VLCEventManager sharedManager] cancelCallToObject:self]; // Always get rid of the delegate first so we can stop sending messages to it // TODO: Should we tell the delegate that we're shutting down? _delegate = nil; // Clear our drawable as we are going to release it, we don't // want the core to use it from this point. This won't happen as // the media player must be stopped. libvlc_media_player_set_nsobject(_playerInstance, nil); if (_equalizerInstance) { libvlc_media_player_set_equalizer(_playerInstance, NULL); libvlc_audio_equalizer_release(_equalizerInstance); } libvlc_media_player_release(_playerInstance); if (_privateLibrary != [VLCLibrary sharedLibrary]) libvlc_release(_privateLibrary.instance); } #if !TARGET_OS_IPHONE - (void)setVideoView:(VLCVideoView *)aVideoView { [self setDrawable: aVideoView]; } - (void)setVideoLayer:(VLCVideoLayer *)aVideoLayer { [self setDrawable: aVideoLayer]; } #endif - (void)setDrawable:(id)aDrawable { // Make sure that this instance has been associated with the drawing canvas. libvlc_media_player_set_nsobject(_playerInstance, (__bridge void *)(aDrawable)); } - (id)drawable { return (__bridge id)(libvlc_media_player_get_nsobject(_playerInstance)); } - (VLCAudio *)audio { if (!_audio) _audio = [[VLCAudio alloc] initWithMediaPlayer:self]; return _audio; } #pragma mark - #pragma mark Video Tracks - (void)setCurrentVideoTrackIndex:(NSUInteger)value { libvlc_video_set_track(_playerInstance, (int)value); } - (NSUInteger)currentVideoTrackIndex { NSInteger count = libvlc_video_get_track_count(_playerInstance); if (count <= 0) return NSNotFound; NSUInteger result = libvlc_video_get_track(_playerInstance); return result; } - (NSArray *)videoTrackNames { NSInteger count = libvlc_video_get_track_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *currentTrack = libvlc_video_get_track_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; while (currentTrack) { [tempArray addObject:@(currentTrack->psz_name)]; currentTrack = currentTrack->p_next; } libvlc_track_description_list_release(currentTrack); return [NSArray arrayWithArray: tempArray]; } - (NSArray *)videoTrackIndexes { NSInteger count = libvlc_video_get_track_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *currentTrack = libvlc_video_get_track_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; while (currentTrack) { [tempArray addObject:@(currentTrack->i_id)]; currentTrack = currentTrack->p_next; } libvlc_track_description_list_release(currentTrack); return [NSArray arrayWithArray: tempArray]; } - (NSArray *)videoTracks { NSInteger count = libvlc_video_get_track_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *tracks = libvlc_video_get_track_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; for (NSUInteger i = 0; i < count ; i++) { [tempArray addObject:@(tracks->psz_name)]; tracks = tracks->p_next; } libvlc_track_description_list_release(tracks); return [NSArray arrayWithArray: tempArray]; } #pragma mark - #pragma mark Subtitles - (void)setCurrentVideoSubTitleIndex:(NSUInteger)index { libvlc_video_set_spu(_playerInstance, (int)index); } - (NSUInteger)currentVideoSubTitleIndex { NSInteger count = libvlc_video_get_spu_count(_playerInstance); if (count <= 0) return NSNotFound; return libvlc_video_get_spu(_playerInstance); } - (NSArray *)videoSubTitlesNames { NSInteger count = libvlc_video_get_spu_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *currentTrack = libvlc_video_get_spu_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; while (currentTrack) { [tempArray addObject:@(currentTrack->psz_name)]; currentTrack = currentTrack->p_next; } libvlc_track_description_list_release(currentTrack); return [NSArray arrayWithArray: tempArray]; } - (NSArray *)videoSubTitlesIndexes { NSInteger count = libvlc_video_get_spu_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *currentTrack = libvlc_video_get_spu_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; while (currentTrack) { [tempArray addObject:@(currentTrack->i_id)]; currentTrack = currentTrack->p_next; } libvlc_track_description_list_release(currentTrack); return [NSArray arrayWithArray: tempArray]; } - (BOOL)openVideoSubTitlesFromFile:(NSString *)path { return libvlc_video_set_subtitle_file(_playerInstance, [path UTF8String]); } - (NSArray *)videoSubTitles { libvlc_track_description_t *currentTrack = libvlc_video_get_spu_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; while (currentTrack) { [tempArray addObject:@(currentTrack->psz_name)]; currentTrack = currentTrack->p_next; } libvlc_track_description_list_release(currentTrack); return [NSArray arrayWithArray: tempArray]; } - (void)setCurrentVideoSubTitleDelay:(NSInteger)index { libvlc_video_set_spu_delay(_playerInstance, index); } - (NSInteger)currentVideoSubTitleDelay { return libvlc_video_get_spu_delay(_playerInstance); } #if TARGET_OS_IPHONE - (void)setTextRendererFontSize:(NSNumber *)fontSize { libvlc_video_set_textrenderer_int(_playerInstance, libvlc_textrender_fontsize, [fontSize intValue]); } #endif #if TARGET_OS_IPHONE - (void)setTextRendererFont:(NSString *)fontname { libvlc_video_set_textrenderer_string(_playerInstance, libvlc_textrender_font, [fontname UTF8String]); } #endif #if TARGET_OS_IPHONE - (void)setTextRendererFontColor:(NSNumber *)fontColor { libvlc_video_set_textrenderer_int(_playerInstance, libvlc_textrender_fontcolor, [fontColor intValue]); } #endif #pragma mark - #pragma mark Video Crop geometry - (void)setVideoCropGeometry:(char *)value { libvlc_video_set_crop_geometry(_playerInstance, value); } - (char *)videoCropGeometry { char * result = libvlc_video_get_crop_geometry(_playerInstance); return result; } - (void)setVideoAspectRatio:(char *)value { libvlc_video_set_aspect_ratio(_playerInstance, value); } - (char *)videoAspectRatio { char * result = libvlc_video_get_aspect_ratio(_playerInstance); return result; } - (void)setScaleFactor:(float)value { libvlc_video_set_scale(_playerInstance, value); } - (float)scaleFactor { return libvlc_video_get_scale(_playerInstance); } - (void)saveVideoSnapshotAt:(NSString *)path withWidth:(int)width andHeight:(int)height { int failure = libvlc_video_take_snapshot(_playerInstance, 0, [path UTF8String], width, height); if (failure) [[NSException exceptionWithName:@"Can't take a video snapshot" reason:@"No video output" userInfo:nil] raise]; } - (void)setDeinterlaceFilter:(NSString *)name { if (!name || name.length < 1) libvlc_video_set_deinterlace(_playerInstance, NULL); else libvlc_video_set_deinterlace(_playerInstance, [name UTF8String]); } - (BOOL)adjustFilterEnabled { return libvlc_video_get_adjust_int(_playerInstance, libvlc_adjust_Enable); } - (void)setAdjustFilterEnabled:(BOOL)b_value { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, b_value); } - (float)contrast { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); return libvlc_video_get_adjust_float(_playerInstance, libvlc_adjust_Contrast); } - (void)setContrast:(float)f_value { if (f_value <= 2. && f_value >= 0.) { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); libvlc_video_set_adjust_float(_playerInstance,libvlc_adjust_Contrast, f_value); } } - (float)brightness { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); return libvlc_video_get_adjust_float(_playerInstance, libvlc_adjust_Brightness); } - (void)setBrightness:(float)f_value { if (f_value <= 2. && f_value >= 0.) { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); libvlc_video_set_adjust_float(_playerInstance, libvlc_adjust_Brightness, f_value); } } - (int)hue { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); return libvlc_video_get_adjust_int(_playerInstance, libvlc_adjust_Hue); } - (void)setHue:(int)i_value { if (i_value <= 360 && i_value >= 0) { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Hue, i_value); } } - (float)saturation { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); return libvlc_video_get_adjust_float(_playerInstance, libvlc_adjust_Saturation); } - (void)setSaturation:(float)f_value { if (f_value <= 3. && f_value >= 0.) { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); libvlc_video_set_adjust_float(_playerInstance, libvlc_adjust_Saturation, f_value); } } - (float)gamma { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); return libvlc_video_get_adjust_float(_playerInstance, libvlc_adjust_Gamma); } - (void)setGamma:(float)f_value { if (f_value <= 10. && f_value >= 0.) { libvlc_video_set_adjust_int(_playerInstance, libvlc_adjust_Enable, 1); libvlc_video_set_adjust_float(_playerInstance, libvlc_adjust_Gamma, f_value); } } - (void)setRate:(float)value { libvlc_media_player_set_rate(_playerInstance, value); } - (float)rate { return libvlc_media_player_get_rate(_playerInstance); } - (CGSize)videoSize { unsigned height = 0, width = 0; int failure = libvlc_video_get_size(_playerInstance, 0, &width, &height); if (failure) return CGSizeZero; return CGSizeMake(width, height); } - (BOOL)hasVideoOut { return libvlc_media_player_has_vout(_playerInstance); } - (float)framesPerSecond { return libvlc_media_player_get_fps(_playerInstance); } - (void)setTime:(VLCTime *)value { // Time is managed in seconds, while duration is managed in microseconds // TODO: Redo VLCTime to provide value numberAsMilliseconds, numberAsMicroseconds, numberAsSeconds, numberAsMinutes, numberAsHours libvlc_media_player_set_time(_playerInstance, value ? [[value numberValue] longLongValue] : 0); } - (VLCTime *)time { return _cachedTime; } - (VLCTime *)remainingTime { return _cachedRemainingTime; } - (NSUInteger)fps { return libvlc_media_player_get_fps(_playerInstance); } #pragma mark - #pragma mark Chapters - (void)setCurrentChapterIndex:(int)value; { libvlc_media_player_set_chapter(_playerInstance, value); } - (int)currentChapterIndex { int count = libvlc_media_player_get_chapter_count(_playerInstance); if (count <= 0) return NSNotFound; int result = libvlc_media_player_get_chapter(_playerInstance); return result; } - (void)nextChapter { libvlc_media_player_next_chapter(_playerInstance); } - (void)previousChapter { libvlc_media_player_previous_chapter(_playerInstance); } - (NSArray *)chaptersForTitleIndex:(int)title { NSInteger count = libvlc_media_player_get_chapter_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *tracks = libvlc_video_get_chapter_description(_playerInstance, title); NSMutableArray *tempArray = [NSMutableArray array]; for (NSInteger i = 0; i < count ; i++) { [tempArray addObject:@(tracks->psz_name)]; tracks = tracks->p_next; } libvlc_track_description_list_release(tracks); return [NSArray arrayWithArray:tempArray]; } #pragma mark - #pragma mark Titles - (void)setCurrentTitleIndex:(int)value { libvlc_media_player_set_title(_playerInstance, value); } - (int)currentTitleIndex { NSInteger count = libvlc_media_player_get_title_count(_playerInstance); if (count <= 0) return NSNotFound; return libvlc_media_player_get_title(_playerInstance); } - (NSUInteger)countOfTitles { NSUInteger result = libvlc_media_player_get_title_count(_playerInstance); return result; } - (NSArray *)titles { NSUInteger count = [self countOfTitles]; if (count == 0) return [NSArray array]; libvlc_track_description_t *tracks = libvlc_video_get_title_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; if (!tracks) return tempArray; while (1) { if (tracks->psz_name != nil) [tempArray addObject:@(tracks->psz_name)]; if (tracks->p_next) tracks = tracks->p_next; else break; } libvlc_track_description_list_release(tracks); return [NSArray arrayWithArray: tempArray]; } #pragma mark - #pragma mark Audio tracks - (void)setCurrentAudioTrackIndex:(NSUInteger)value { libvlc_audio_set_track(_playerInstance, (int)value); } - (NSUInteger)currentAudioTrackIndex { NSInteger count = libvlc_audio_get_track_count(_playerInstance); if (count <= 0) return NSNotFound; NSUInteger result = libvlc_audio_get_track(_playerInstance); return result; } - (NSArray *)audioTrackNames { NSInteger count = libvlc_audio_get_track_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *currentTrack = libvlc_audio_get_track_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; while (currentTrack) { [tempArray addObject:@(currentTrack->psz_name)]; currentTrack = currentTrack->p_next; } libvlc_track_description_list_release(currentTrack); return [NSArray arrayWithArray: tempArray]; } - (NSArray *)audioTrackIndexes { NSInteger count = libvlc_audio_get_track_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *currentTrack = libvlc_audio_get_track_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; while (currentTrack) { [tempArray addObject:@(currentTrack->i_id)]; currentTrack = currentTrack->p_next; } libvlc_track_description_list_release(currentTrack); return [NSArray arrayWithArray: tempArray]; } - (NSArray *)audioTracks { NSInteger count = libvlc_audio_get_track_count(_playerInstance); if (count <= 0) return @[]; libvlc_track_description_t *tracks = libvlc_audio_get_track_description(_playerInstance); NSMutableArray *tempArray = [NSMutableArray array]; for (NSUInteger i = 0; i < count ; i++) { [tempArray addObject:@(tracks->psz_name)]; tracks = tracks->p_next; } libvlc_track_description_list_release(tracks); return [NSArray arrayWithArray: tempArray]; } - (void)setAudioChannel:(int)value { libvlc_audio_set_channel(_playerInstance, value); } - (int)audioChannel { return libvlc_audio_get_channel(_playerInstance); } - (void)setCurrentAudioPlaybackDelay:(NSInteger)index { libvlc_audio_set_delay(_playerInstance, index); } - (NSInteger)currentAudioPlaybackDelay { return libvlc_audio_get_delay(_playerInstance); } #pragma mark - #pragma mark equalizer - (void)setEqualizerEnabled:(BOOL)equalizerEnabled { _equalizerEnabled = equalizerEnabled; if (!_equalizerEnabled) { libvlc_media_player_set_equalizer(_playerInstance, NULL); if (_equalizerInstance) libvlc_audio_equalizer_release(_equalizerInstance); return; } if (!_equalizerInstance) _equalizerInstance = libvlc_audio_equalizer_new(); libvlc_media_player_set_equalizer(_playerInstance, _equalizerInstance); } - (BOOL)equalizerEnabled { return _equalizerEnabled; } - (NSArray *)equalizerProfiles { unsigned count = libvlc_audio_equalizer_get_preset_count(); NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:count]; for (unsigned x = 0; x < count; x++) [array addObject:@(libvlc_audio_equalizer_get_preset_name(x))]; return [NSArray arrayWithArray:array]; } - (void)resetEqualizerFromProfile:(unsigned)profile { BOOL wasactive = NO; if (_equalizerInstance) { libvlc_media_player_set_equalizer(_playerInstance, NULL); libvlc_audio_equalizer_release(_equalizerInstance); wasactive = YES; } _equalizerInstance = libvlc_audio_equalizer_new_from_preset(profile); if (wasactive) libvlc_media_player_set_equalizer(_playerInstance, _equalizerInstance); } - (CGFloat)preAmplification { if (!_equalizerInstance) return 0.; return libvlc_audio_equalizer_get_preamp(_equalizerInstance); } - (void)setPreAmplification:(CGFloat)preAmplification { if (!_equalizerInstance) _equalizerInstance = libvlc_audio_equalizer_new(); libvlc_audio_equalizer_set_preamp(_equalizerInstance, preAmplification); libvlc_media_player_set_equalizer(_playerInstance, _equalizerInstance); } - (unsigned)numberOfBands { return libvlc_audio_equalizer_get_band_count(); } - (CGFloat)frequencyOfBandAtIndex:(unsigned int)index { return libvlc_audio_equalizer_get_band_frequency(index); } - (void)setAmplification:(CGFloat)amplification forBand:(unsigned int)index { if (!_equalizerInstance) _equalizerInstance = libvlc_audio_equalizer_new(); libvlc_audio_equalizer_set_amp_at_index(_equalizerInstance, amplification, index); } - (CGFloat)amplificationOfBand:(unsigned int)index { if (!_equalizerInstance) return 0.; return libvlc_audio_equalizer_get_amp_at_index(_equalizerInstance, index); } #pragma mark - #pragma mark set/get media - (void)setMedia:(VLCMedia *)value { if (_media != value) { if (_media && [_media compare:value] == NSOrderedSame) return; _media = value; libvlc_media_player_set_media(_playerInstance, [_media libVLCMediaDescriptor]); } } - (VLCMedia *)media { return _media; } #pragma mark - #pragma mark playback - (BOOL)play { libvlc_media_player_play(_playerInstance); return YES; } - (void)pause { if ([NSThread isMainThread]) { /* Hack because we create a dead lock here, when the vout is stopped * and tries to recontact us on the main thread */ /* FIXME: to do this properly we need to do some locking. We may want * to move that to libvlc */ [self performSelectorInBackground:@selector(pause) withObject:nil]; return; } // Pause the stream libvlc_media_player_pause(_playerInstance); } - (void)stop { if ([NSThread isMainThread]) { /* Hack because we create a dead lock here, when the vout is stopped * and tries to recontact us on the main thread */ /* FIXME: to do this properly we need to do some locking. We may want * to move that to libvlc */ [self performSelectorInBackground:@selector(stop) withObject:nil]; return; } libvlc_media_player_stop(_playerInstance); } - (void)gotoNextFrame { libvlc_media_player_next_frame(_playerInstance); } - (void)fastForward { [self fastForwardAtRate: 2.0]; } - (void)fastForwardAtRate:(float)rate { [self setRate:rate]; } - (void)rewind { [self rewindAtRate: 2.0]; } - (void)rewindAtRate:(float)rate { [self setRate: -rate]; } - (void)jumpBackward:(int)interval { if ([self isSeekable]) { interval = interval * 1000; [self setTime: [VLCTime timeWithInt: ([[self time] intValue] - interval)]]; } } - (void)jumpForward:(int)interval { if ([self isSeekable]) { interval = interval * 1000; [self setTime: [VLCTime timeWithInt: ([[self time] intValue] + interval)]]; } } - (void)extraShortJumpBackward { [self jumpBackward:3]; } - (void)extraShortJumpForward { [self jumpForward:3]; } - (void)shortJumpBackward { [self jumpBackward:10]; } - (void)shortJumpForward { [self jumpForward:10]; } - (void)mediumJumpBackward { [self jumpBackward:60]; } - (void)mediumJumpForward { [self jumpForward:60]; } - (void)longJumpBackward { [self jumpBackward:300]; } - (void)longJumpForward { [self jumpForward:300]; } + (NSSet *)keyPathsForValuesAffectingIsPlaying { return [NSSet setWithObjects:@"state", nil]; } - (BOOL)isPlaying { return libvlc_media_player_is_playing(_playerInstance); } - (BOOL)willPlay { return libvlc_media_player_will_play(_playerInstance); } - (VLCMediaPlayerState)state { return _cachedState; } - (float)position { return _position; } - (void)setPosition:(float)newPosition { libvlc_media_player_set_position(_playerInstance, newPosition); } - (BOOL)isSeekable { return libvlc_media_player_is_seekable(_playerInstance); } - (BOOL)canPause { return libvlc_media_player_can_pause(_playerInstance); } - (void *)libVLCMediaPlayer { return _playerInstance; } @end @implementation VLCMediaPlayer (Private) - (id)initWithDrawable:(id)aDrawable options:(NSArray *)options { if (self = [super init]) { _cachedTime = [VLCTime nullTime]; _cachedRemainingTime = [VLCTime nullTime]; _position = 0.0f; _cachedState = VLCMediaPlayerStateStopped; // Create a media instance, it doesn't matter what library we start off with // it will change depending on the media descriptor provided to the media // instance if (options && options.count > 0) { VKLog(@"creating player instance with private library as options were given"); _privateLibrary = [[VLCLibrary alloc] initWithOptions:options]; } else { VKLog(@"creating player instance using shared library"); _privateLibrary = [VLCLibrary sharedLibrary]; } libvlc_retain([_privateLibrary instance]); _playerInstance = libvlc_media_player_new([_privateLibrary instance]); libvlc_media_player_retain(_playerInstance); [self registerObservers]; [self setDrawable:aDrawable]; } return self; } - (void)registerObservers { // Attach event observers into the media instance libvlc_event_manager_t * p_em = libvlc_media_player_event_manager(_playerInstance); libvlc_event_attach(p_em, libvlc_MediaPlayerPlaying, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerPaused, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerEndReached, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerStopped, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerOpening, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerBuffering, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerPositionChanged, HandleMediaPositionChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerTimeChanged, HandleMediaTimeChanged, (__bridge void *)(self)); libvlc_event_attach(p_em, libvlc_MediaPlayerMediaChanged, HandleMediaPlayerMediaChanged, (__bridge void *)(self)); } - (void)unregisterObservers { libvlc_event_manager_t * p_em = libvlc_media_player_event_manager(_playerInstance); libvlc_event_detach(p_em, libvlc_MediaPlayerPlaying, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerPaused, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerEncounteredError, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerEndReached, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerStopped, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerOpening, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerBuffering, HandleMediaInstanceStateChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerPositionChanged, HandleMediaPositionChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerTimeChanged, HandleMediaTimeChanged, (__bridge void *)(self)); libvlc_event_detach(p_em, libvlc_MediaPlayerMediaChanged, HandleMediaPlayerMediaChanged, (__bridge void *)(self)); } - (void)mediaPlayerTimeChanged:(NSNumber *)newTime { [self willChangeValueForKey:@"time"]; [self willChangeValueForKey:@"remainingTime"]; _cachedTime = [VLCTime timeWithNumber:newTime]; double currentTime = [[_cachedTime numberValue] doubleValue]; if (currentTime > 0) { double remaining = currentTime / _position * (1 - _position); _cachedRemainingTime = [VLCTime timeWithNumber:@(-remaining)]; } else _cachedRemainingTime = [VLCTime nullTime]; [self didChangeValueForKey:@"remainingTime"]; [self didChangeValueForKey:@"time"]; } #if !TARGET_OS_IPHONE - (void)delaySleep { UpdateSystemActivity(UsrActivity); } #endif - (void)mediaPlayerPositionChanged:(NSNumber *)newPosition { #if !TARGET_OS_IPHONE // This seems to be the most relevant place to delay sleeping and screen saver. [self delaySleep]; #endif [self willChangeValueForKey:@"position"]; _position = [newPosition floatValue]; [self didChangeValueForKey:@"position"]; } - (void)mediaPlayerStateChanged:(NSNumber *)newState { [self willChangeValueForKey:@"state"]; _cachedState = [newState intValue]; #if TARGET_OS_IPHONE // Disable idle timer if player is playing media // Exclusion can be made for audio only media [UIApplication sharedApplication].idleTimerDisabled = [self isPlaying]; #endif [self didChangeValueForKey:@"state"]; } - (void)mediaPlayerMediaChanged:(VLCMedia *)newMedia { [self willChangeValueForKey:@"media"]; if (_media != newMedia) _media = newMedia; [self didChangeValueForKey:@"media"]; } @end Sources/VLCMediaThumbnailer.m000066400000000000000000000271571250240207200164440ustar00rootroot00000000000000/***************************************************************************** * VLCKit: VLCMediaThumbnailer ***************************************************************************** * Copyright (C) 2010-2012 Pierre d'Herbemont and VideoLAN * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "VLCMediaThumbnailer.h" #import "VLCLibVLCBridging.h" @interface VLCMediaThumbnailer () { id __weak _delegate; VLCMedia *_media; void *_mp; CGImageRef _thumbnail; void *_data; NSTimer *_parsingTimeoutTimer; NSTimer *_thumbnailingTimeoutTimer; CGFloat _thumbnailHeight,_thumbnailWidth; float _snapshotPosition; CGFloat _effectiveThumbnailHeight,_effectiveThumbnailWidth; int _numberOfReceivedFrames; BOOL _shouldRejectFrames; void * _internalLibVLCInstance; } - (void)didFetchThumbnail; - (void)notifyDelegate; - (void)fetchThumbnail; - (void)startFetchingThumbnail; @property (readonly, assign) void *dataPointer; @property (readonly, assign) BOOL shouldRejectFrames; @end static void *lock(void *opaque, void **pixels) { VLCMediaThumbnailer *thumbnailer = (__bridge VLCMediaThumbnailer *)(opaque); *pixels = [thumbnailer dataPointer]; assert(*pixels); return NULL; } static const size_t kDefaultImageWidth = 320; static const size_t kDefaultImageHeight = 240; static const float kSnapshotPosition = 0.3; static const long long kStandardStartTime = 150000; void unlock(void *opaque, void *picture, void *const *p_pixels) { VLCMediaThumbnailer *thumbnailer = (__bridge VLCMediaThumbnailer *)(opaque); assert(!picture); assert([thumbnailer dataPointer] == *p_pixels); // We may already have a thumbnail if we are receiving picture after the first one. // Just ignore. if ([thumbnailer thumbnail] || [thumbnailer shouldRejectFrames]) return; [thumbnailer performSelectorOnMainThread:@selector(didFetchThumbnail) withObject:nil waitUntilDone:YES]; } @implementation VLCMediaThumbnailer @synthesize media=_media; @synthesize delegate=_delegate; @synthesize thumbnail=_thumbnail; @synthesize dataPointer=_data; @synthesize thumbnailWidth=_thumbnailWidth; @synthesize thumbnailHeight=_thumbnailHeight; @synthesize snapshotPosition=_snapshotPosition; @synthesize shouldRejectFrames=_shouldRejectFrames; + (VLCMediaThumbnailer *)thumbnailerWithMedia:(VLCMedia *)media andDelegate:(id)delegate { id obj = [[[self class] alloc] init]; [obj setMedia:media]; [obj setDelegate:delegate]; [obj setLibVLCinstance:[VLCLibrary sharedInstance]]; return obj; } + (VLCMediaThumbnailer *)thumbnailerWithMedia:(VLCMedia *)media delegate:(id)delegate andVLCLibrary:(VLCLibrary *)library { id obj = [[[self class] alloc] init]; [obj setMedia:media]; [obj setDelegate:delegate]; if (library) [obj setLibVLCinstance:library.instance]; else [obj setLibVLCinstance:[VLCLibrary sharedInstance]]; return obj; } - (void)dealloc { NSAssert(!_thumbnailingTimeoutTimer, @"Timer not released"); NSAssert(!_parsingTimeoutTimer, @"Timer not released"); NSAssert(!_data, @"Data not released"); NSAssert(!_mp, @"Not properly retained"); if (_thumbnail) CGImageRelease(_thumbnail); if (_internalLibVLCInstance) libvlc_release(_internalLibVLCInstance); } - (void)setLibVLCinstance:(void *)libVLCinstance { _internalLibVLCInstance = libVLCinstance; libvlc_retain(_internalLibVLCInstance); } - (void *)libVLCinstance { return _internalLibVLCInstance; } - (void)fetchThumbnail { NSAssert(!_data, @"We are already fetching a thumbnail"); if (![_media isParsed]) { [_media addObserver:self forKeyPath:@"parsed" options:0 context:NULL]; [_media synchronousParse]; NSAssert(!_parsingTimeoutTimer, @"We already have a timer around"); _parsingTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(mediaParsingTimedOut) userInfo:nil repeats:NO]; return; } [self startFetchingThumbnail]; } - (void)startFetchingThumbnail { NSArray *tracks = [_media tracksInformation]; // Find the video track NSDictionary *videoTrack = nil; for (NSDictionary *track in tracks) { NSString *type = track[VLCMediaTracksInformationType]; if ([type isEqualToString:VLCMediaTracksInformationTypeVideo]) { videoTrack = track; break; } } unsigned imageWidth = _thumbnailWidth > 0 ? _thumbnailWidth : kDefaultImageWidth; unsigned imageHeight = _thumbnailHeight > 0 ? _thumbnailHeight : kDefaultImageHeight; float snapshotPosition = _snapshotPosition > 0 ? _snapshotPosition : kSnapshotPosition; if (!videoTrack) { VKLog(@"WARNING: Can't find video track info, skipping file"); [_parsingTimeoutTimer invalidate]; _parsingTimeoutTimer = nil; [self mediaThumbnailingTimedOut]; return; } else { int videoHeight = [videoTrack[VLCMediaTracksInformationVideoHeight] intValue]; int videoWidth = [videoTrack[VLCMediaTracksInformationVideoWidth] intValue]; // Constraining to the aspect ratio of the video. double ratio; if ((double)imageWidth / imageHeight < (double)videoWidth / videoHeight) ratio = (double)imageHeight / videoHeight; else ratio = (double)imageWidth / videoWidth; int newWidth = round(videoWidth * ratio); int newHeight = round(videoHeight * ratio); imageWidth = newWidth > 0 ? newWidth : imageWidth; imageHeight = newHeight > 0 ? newHeight : imageHeight; } _numberOfReceivedFrames = 0; NSAssert(!_shouldRejectFrames, @"Are we still running?"); _effectiveThumbnailHeight = imageHeight; _effectiveThumbnailWidth = imageWidth; _data = calloc(1, imageWidth * imageHeight * 4); NSAssert(_data, @"Can't create data"); NSAssert(!_mp, @"We are already fetching a thumbnail"); _mp = libvlc_media_player_new(self.libVLCinstance); libvlc_media_add_option([_media libVLCMediaDescriptor], "no-audio"); libvlc_media_player_set_media(_mp, [_media libVLCMediaDescriptor]); libvlc_video_set_format(_mp, "RGBA", imageWidth, imageHeight, 4 * imageWidth); libvlc_video_set_callbacks(_mp, lock, unlock, NULL, (__bridge void *)(self)); if (snapshotPosition == kSnapshotPosition) { int length = _media.length.intValue; if (length < kStandardStartTime) { VKLog(@"short file detected"); if (length > 1000) { VKLog(@"attempting seek to %is", (length * 25 / 100000)); libvlc_media_add_option([_media libVLCMediaDescriptor], [[NSString stringWithFormat:@"start-time=%i", (length * 25 / 100000)] UTF8String]); } } else libvlc_media_add_option([_media libVLCMediaDescriptor], [[NSString stringWithFormat:@"start-time=%lli", (kStandardStartTime / 1000)] UTF8String]); } libvlc_media_player_play(_mp); NSAssert(!_thumbnailingTimeoutTimer, @"We already have a timer around"); _thumbnailingTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(mediaThumbnailingTimedOut) userInfo:nil repeats:NO]; } - (void)mediaParsingTimedOut { VKLog(@"WARNING: media thumbnailer media parsing timed out"); [_media removeObserver:self forKeyPath:@"parsed"]; [self startFetchingThumbnail]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == _media && [keyPath isEqualToString:@"parsed"]) { if ([_media isParsed]) { [_parsingTimeoutTimer invalidate]; _parsingTimeoutTimer = nil; [_media removeObserver:self forKeyPath:@"parsed"]; [self startFetchingThumbnail]; } return; } return [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } - (void)didFetchThumbnail { if (_shouldRejectFrames) return; // The video thread is blocking on us. Beware not to do too much work. _numberOfReceivedFrames++; float position = libvlc_media_player_get_position(_mp); long long length = libvlc_media_player_get_length(_mp); // Make sure we are getting the right frame if (position < self.snapshotPosition && _numberOfReceivedFrames < 2) { libvlc_media_player_set_position(_mp, self.snapshotPosition); return; } if ((length < kStandardStartTime * 2 && _numberOfReceivedFrames < 5) && self.snapshotPosition == kSnapshotPosition) { libvlc_media_player_set_position(_mp, kSnapshotPosition); return; } if ((position <= 0.05 && _numberOfReceivedFrames < 8) && length > 1000) { // Arbitrary choice to work around broken files. libvlc_media_player_set_position(_mp, kSnapshotPosition); return; } // it isn't always best what comes first if (_numberOfReceivedFrames < 4) return; NSAssert(_data, @"We have no data"); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); const CGFloat width = _effectiveThumbnailWidth; const CGFloat height = _effectiveThumbnailHeight; const CGFloat pitch = 4 * width; CGContextRef bitmap = CGBitmapContextCreate(_data, width, height, 8, pitch, colorSpace, kCGImageAlphaNoneSkipLast); CGColorSpaceRelease(colorSpace); NSAssert(bitmap, @"Can't create bitmap"); // Create the thumbnail image //NSAssert(!_thumbnail, @"We already have a thumbnail"); if (_thumbnail) CGImageRelease(_thumbnail); _thumbnail = CGBitmapContextCreateImage(bitmap); // Put a new context there. CGContextRelease(bitmap); // Make sure we don't block the video thread now [self performSelector:@selector(notifyDelegate) withObject:nil afterDelay:0]; } - (void)stopAsync { if (_mp) { libvlc_media_player_stop(_mp); libvlc_media_player_release(_mp); _mp = NULL; } // Now release data if (_data) free(_data); _data = NULL; _shouldRejectFrames = NO; } - (void)endThumbnailing { _shouldRejectFrames = YES; [_thumbnailingTimeoutTimer invalidate]; _thumbnailingTimeoutTimer = nil; [self performSelectorInBackground:@selector(stopAsync) withObject:nil]; } - (void)notifyDelegate { [self endThumbnailing]; // Call delegate [_delegate mediaThumbnailer:self didFinishThumbnail:_thumbnail]; } - (void)mediaThumbnailingTimedOut { VKLog(@"WARNING: media thumbnailer media thumbnailing timed out"); [self endThumbnailing]; // Call delegate [_delegate mediaThumbnailerDidTimeOut:self]; } @end Sources/VLCPlaylistDataSource.m000066400000000000000000000137751250240207200170070ustar00rootroot00000000000000/***************************************************************************** * VLCPlaylistDataSource.m: VLC.framework VLCPlaylistDataSource implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import "VLCEventManager.h" @implementation VLCPlaylistDataSource - (id)init { if (self = [super init]) { playlist = nil; videoView = nil; } return self; } - (id)initWithPlaylist:(VLCPlaylist *)aPlaylist { if (self = [super init]) { playlist = [aPlaylist retain]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(playlistDidChange:) name:VLCPlaylistItemAdded object:nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(itemDidAddSubitem:) name:VLCMediaSubItemAdded object:nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(itemDidChange:) name:VLCPlaylistItemChanged object:nil]; videoView = nil; outlineView = nil; } return self; } - (id)initWithPlaylist:(VLCPlaylist *)aPlaylist videoView:(VLCVideoView *)aVideoView; { if (self = [super init]) { playlist = [aPlaylist retain]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(playlistDidChange:) name:VLCPlaylistItemAdded object:nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(itemDidAddSubitem:) name:VLCMediaSubItemAdded object:nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(itemDidChange:) name:VLCPlaylistItemChanged object:nil]; videoView = [aVideoView retain]; /* Will be automatically set if an outline view ask us data, * be careful not to connect two outlineView to this object or this goes wrong. */ outlineView = nil; } return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; if (playlist) [playlist release]; if (videoView) [videoView release]; [super dealloc]; } - (VLCPlaylist *)playlist { return playlist; } - (VLCVideoView *)videoView { return videoView; } @end @implementation VLCPlaylistDataSource (OutlineViewDataSource) - (BOOL) outlineView: (NSOutlineView *)ov isItemExpandable: (id)item { return NO; } - (int) outlineView: (NSOutlineView *)ov numberOfChildrenOfItem:(id)item { return 0; } - (id) outlineView: (NSOutlineView *)ov child:(int)index ofItem:(id)item { return nil; } - (id) outlineView: (NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn*)col byItem:(id)item { return nil; } @end @implementation VLCPlaylistDataSource (TableViewDropping) /* Dummy implementation cause we need them */ - (int)numberOfRowsInTableView:(NSTableView *)aTableView { return 0; } - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex {return nil;} - (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(int)row proposedDropOperation:(NSTableViewDropOperation)op { return NSDragOperationEvery; /* This is for now */ } - (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id )info row:(int)row dropOperation:(NSTableViewDropOperation)operation { int i; NSArray * droppedItems = [[info draggingPasteboard] propertyListForType: NSFilenamesPboardType]; for (i = 0; i < [droppedItems count]; i++) { NSString * filename = [droppedItems objectAtIndex:i]; [[self playlist] insertMedia:[VLCMedia mediaWithURL:filename] atIndex:row+i]; } } @end @interface NSObject (UnknownBindingsObject) /* OutlineViewDataSourceDropping and bindings hack */ - (id)observedObject; @end @implementation VLCPlaylistDataSource (OutlineViewDataSourceDropping) - (BOOL)outlineView:(NSOutlineView *)aOutlineView acceptDrop:(id )info item:(id)item childIndex:(int)index { NSArray * droppedItems = [[info draggingPasteboard] propertyListForType: NSFilenamesPboardType]; VLCPlaylist * aPlaylist; int i; if (!item) item = [self playlist]; /* The root object is our playlist */ else item = [item observedObject]; if (![item isMemberOfClass:[VLCPlaylist class]]) return NO; if (index < 0) /* No precise item given, put it as the first one */ index = 0; aPlaylist = item; if (!droppedItems) { /* XXX: localization */ NSRunCriticalAlertPanelRelativeToWindow(@"Error", @"Unable to drop the provided item.", @"OK", nil, nil, [outlineView window]); return NO; } for (i = 0; i < [droppedItems count]; i++) { NSString * filename = [droppedItems objectAtIndex:i]; [aPlaylist insertMedia:[VLCMedia mediaWithURL:filename] atIndex:index+i]; } return YES; } - (NSDragOperation)outlineView:(NSOutlineView *)aOutlineView validateDrop:(id )info proposedItem:(id)item proposedChildIndex:(int)index { return NSDragOperationEvery; } @end Sources/VLCServicesDiscoverer.m000066400000000000000000000040511250240207200170270ustar00rootroot00000000000000/***************************************************************************** * VLCServicesDiscoverer.m: VLC.framework VLCMediaDiscoverer implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import #import #import #import "VLCLibrary.h" #include static VLCServicesDiscoverer * sharedDiscoverer = nil; @implementation VLCServicesDiscoverer + (id)sharedDiscoverer { if (!sharedDiscoverer) { sharedDiscoverer = [[self alloc] init]; } return sharedDiscoverer; } - (id) init { if( self = [super init] ) { services = [[NSArray arrayWithObjects: [[[VLCMediaDiscoverer alloc] initWithName:@"sap"] autorelease], [[[VLCMediaDiscoverer alloc] initWithName:@"shoutcast"] autorelease], [[[VLCMediaDiscoverer alloc] initWithName:@"shoutcasttv"] autorelease], nil] retain]; } return self; } - (NSArray *) services { return [[services copy] autorelease]; } @end Sources/VLCStreamOutput.m000066400000000000000000000217451250240207200157030ustar00rootroot00000000000000/***************************************************************************** * VLCStreamOutput.m: VLCKit.framework VLCStreamOutput implementation ***************************************************************************** * Copyright (C) 2008 Pierre d'Herbemont * Copyright (C) 2008, 2014 VLC authors and VideoLAN * Copyright (C) 2012 Brendon Justin * $Id$ * * Authors: Pierre d'Herbemont * Brendon Justin * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCStreamOutput.h" #import "VLCLibVLCBridging.h" @interface VLCStreamOutput () { NSMutableDictionary *_options; } @end @implementation VLCStreamOutput - (instancetype)initWithOptionDictionary:(NSDictionary *)dictionary { if (self = [super init]) _options = [dictionary mutableCopy]; return self; } - (NSString *)description { return [self representedLibVLCOptions]; } + (instancetype)streamOutputWithOptionDictionary:(NSDictionary *)dictionary { return [[self alloc] initWithOptionDictionary:dictionary]; } + (id)rtpBroadcastStreamOutputWithSAPAnnounce:(NSString *)announceName { return [self streamOutputWithOptionDictionary:@{ @"rtpOptions" : @{ @"muxer" : @"ts", @"access" : @"file", @"sdp" : @"sdp", @"sap" : @"sap", @"name" : [announceName copy], @"destination" : @"239.255.1.1" } }]; } + (id)rtpBroadcastStreamOutput { return [self rtpBroadcastStreamOutputWithSAPAnnounce:@"Helloworld!"]; } + (id)ipodStreamOutputWithFilePath:(NSString *)filePath { return [self streamOutputWithOptionDictionary:@{ @"transcodingOptions" : @{ @"videoCodec" : @"h264", @"videoBitrate" : @"1024", @"audioCodec" : @"mp3", @"audioBitrate" : @"128", @"channels" : @"2", @"width" : @"640", @"height" : @"480", @"audio-sync" : @"Yes" }, @"outputOptions" : @{ @"muxer" : @"mp4", @"access" : @"file", @"destination" : [[NSURL URLWithString:filePath] absoluteString] } }]; } + (id)mpeg4StreamOutputWithFilePath:(NSString *)filePath { return [self streamOutputWithOptionDictionary:@{ @"transcodingOptions" : @{ @"videoCodec" : @"mp4v", @"videoBitrate" : @"1024", @"audioCodec" : @"mp4a", @"audioBitrate" : @"192" }, @"outputOptions" : @{ @"muxer" : @"mp4", @"access" : @"file", @"destination" : [filePath copy] } }]; } + (instancetype)streamOutputWithFilePath:(NSString *)filePath { return [self streamOutputWithOptionDictionary:@{ @"outputOptions" : @{ @"muxer" : @"ps", @"access" : @"file", @"destination" : [filePath copy] } }]; } + (id)mpeg2StreamOutputWithFilePath:(NSString *)filePath; { return [self streamOutputWithOptionDictionary:@{ @"transcodingOptions" : @{ @"videoCodec" : @"mp2v", @"videoBitrate" : @"1024", @"audioCodec" : @"mpga", @"audioBitrate" : @"128", @"audio-sync" : @"Yes" }, @"outputOptions" : @{ @"muxer" : @"ps", @"access" : @"file", @"destination" : [filePath copy] } }]; } @end @implementation VLCStreamOutput (LibVLCBridge) - (NSString *)representedLibVLCOptions { NSString * representedOptions; NSMutableArray * subOptions = [NSMutableArray array]; NSMutableArray * optionsAsArray = [NSMutableArray array]; NSDictionary * transcodingOptions = _options[@"transcodingOptions"]; if( transcodingOptions ) { NSString * videoCodec = transcodingOptions[@"videoCodec"]; NSString * audioCodec = transcodingOptions[@"audioCodec"]; NSString * subtitleCodec = transcodingOptions[@"subtitleCodec"]; NSString * videoBitrate = transcodingOptions[@"videoBitrate"]; NSString * audioBitrate = transcodingOptions[@"audioBitrate"]; NSString * channels = transcodingOptions[@"channels"]; NSString * height = transcodingOptions[@"height"]; NSString * canvasHeight = transcodingOptions[@"canvasHeight"]; NSString * width = transcodingOptions[@"width"]; NSString * audioSync = transcodingOptions[@"audioSync"]; NSString * videoEncoder = transcodingOptions[@"videoEncoder"]; NSString * subtitleEncoder = transcodingOptions[@"subtitleEncoder"]; NSString * subtitleOverlay = transcodingOptions[@"subtitleOverlay"]; if( videoEncoder ) [subOptions addObject:[NSString stringWithFormat:@"venc=%@", videoEncoder]]; if( videoCodec ) [subOptions addObject:[NSString stringWithFormat:@"vcodec=%@", videoCodec]]; if( videoBitrate ) [subOptions addObject:[NSString stringWithFormat:@"vb=%@", videoBitrate]]; if( width ) [subOptions addObject:[NSString stringWithFormat:@"width=%@", width]]; if( height ) [subOptions addObject:[NSString stringWithFormat:@"height=%@", height]]; if( canvasHeight ) [subOptions addObject:[NSString stringWithFormat:@"canvas-height=%@", canvasHeight]]; if( audioCodec ) [subOptions addObject:[NSString stringWithFormat:@"acodec=%@", audioCodec]]; if( audioBitrate ) [subOptions addObject:[NSString stringWithFormat:@"ab=%@", audioBitrate]]; if( channels ) [subOptions addObject:[NSString stringWithFormat:@"channels=%@", channels]]; if( audioSync ) [subOptions addObject:@"audioSync"]; if( subtitleCodec ) [subOptions addObject:[NSString stringWithFormat:@"scodec=%@", subtitleCodec]]; if( subtitleEncoder ) [subOptions addObject:[NSString stringWithFormat:@"senc=%@", subtitleEncoder]]; if( subtitleOverlay ) [subOptions addObject:@"soverlay"]; [optionsAsArray addObject: [NSString stringWithFormat:@"#transcode{%@}", [subOptions componentsJoinedByString:@","]]]; [subOptions removeAllObjects]; } NSDictionary * outputOptions = _options[@"outputOptions"]; if( outputOptions ) { NSString * muxer = outputOptions[@"muxer"]; NSString * destination = outputOptions[@"destination"]; NSString * url = outputOptions[@"url"]; NSString * access = outputOptions[@"access"]; if( muxer ) [subOptions addObject:[NSString stringWithFormat:@"mux=%@", muxer]]; if( destination ) [subOptions addObject:[NSString stringWithFormat:@"dst=\"%@\"", [destination stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]]]; if( url ) [subOptions addObject:[NSString stringWithFormat:@"url=\"%@\"", [url stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]]]; if( access ) [subOptions addObject:[NSString stringWithFormat:@"access=%@", access]]; NSString *std = [NSString stringWithFormat:@"std{%@}", [subOptions componentsJoinedByString:@","]]; if ( !transcodingOptions ) std = [NSString stringWithFormat:@"#%@", std]; [optionsAsArray addObject:std]; [subOptions removeAllObjects]; } NSDictionary * rtpOptions = _options[@"rtpOptions"]; if( rtpOptions ) { NSString * muxer = rtpOptions[@"muxer"]; NSString * destination = rtpOptions[@"destination"]; NSString * sdp = rtpOptions[@"sdp"]; NSString * name = rtpOptions[@"name"]; NSString * sap = rtpOptions[@"sap"]; if( muxer ) [subOptions addObject:[NSString stringWithFormat:@"muxer=%@", muxer]]; if( destination ) [subOptions addObject:[NSString stringWithFormat:@"dst=%@", destination]]; if( sdp ) [subOptions addObject:[NSString stringWithFormat:@"sdp=%@", sdp]]; if( sap ) [subOptions addObject:@"sap"]; if( name ) [subOptions addObject:[NSString stringWithFormat:@"name=\"%@\"", name]]; NSString *rtp = [NSString stringWithFormat:@"#rtp{%@}", [subOptions componentsJoinedByString:@","]]; if ( !transcodingOptions ) rtp = [NSString stringWithFormat:@"#%@", rtp]; [optionsAsArray addObject:rtp]; [subOptions removeAllObjects]; } representedOptions = [optionsAsArray componentsJoinedByString:@":"]; return representedOptions; } @end Sources/VLCStreamSession.m000066400000000000000000000077121250240207200160240ustar00rootroot00000000000000/***************************************************************************** * VLCStreamSession.m: VLCKit.framework VLCStreamSession implementation ***************************************************************************** * Copyright (C) 2008 Pierre d'Herbemont * Copyright (C) 2008 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCStreamSession.h" #import "VLCLibVLCBridging.h" @interface VLCStreamSession () @property (nonatomic, readwrite) BOOL isComplete; @property (nonatomic, readwrite) NSUInteger reattemptedConnections; @end @implementation VLCStreamSession - (instancetype)init { if( self = [super init] ) { [self addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil]; } return self; } - (void)dealloc { [self removeObserver:self forKeyPath:@"state"]; } + (instancetype)streamSession { return [[self alloc] init]; } - (void)startStreaming { self.isComplete = NO; [self play]; } - (void)stopStreaming { self.isComplete = YES; [super stop]; } - (BOOL)play { NSString * libvlcArgs; if( self.drawable ) libvlcArgs = [NSString stringWithFormat:@"#duplicate{dst=display,dst=\"%@\"}",[_streamOutput representedLibVLCOptions]]; else libvlcArgs = [_streamOutput representedLibVLCOptions]; if( libvlcArgs ) { [super setMedia:[VLCMedia mediaWithMedia:self.media andLibVLCOptions:@{ @"sout" : libvlcArgs }]]; } else { [super setMedia: self.media]; } [super play]; return YES; } + (NSSet *)keyPathsForValuesAffectingDescription { return [NSSet setWithObjects:@"isCompleted", @"state", nil]; } - (NSString *)description { if ([self isComplete]) return @"Done."; if ([self state] == VLCMediaPlayerStateError) return @"Error while Converting. Open Console.app to diagnose."; return @"Converting..."; } + (NSSet *)keyPathsForValuesAffectingEncounteredError { return [NSSet setWithObjects:@"state", nil]; } - (BOOL)encounteredError; { return ([self state] == VLCMediaPlayerStateError); } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if([keyPath isEqualToString:@"state"]) { if( (([self position] == 1.0 || [self state] == VLCMediaPlayerStateEnded || ([self state] == VLCMediaPlayerStateStopped && self.media)) || [self encounteredError] ) && ![super.media subitems] ) { self.isComplete = YES; return; } if( _reattemptedConnections > 4 ) return; /* Our media has in fact gained subitems, let's change our playing media */ if( [[super.media subitems] count] > 0 ) { [self stop]; self.media = [[super.media subitems] mediaAtIndex:0]; [self play]; _reattemptedConnections++; } return; } [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } @end Sources/VLCTime.m000066400000000000000000000104571250240207200141230ustar00rootroot00000000000000/***************************************************************************** * VLCTime.m: VLCKit.framework VLCTime implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCTime.h" @implementation VLCTime /* Factories */ + (VLCTime *)nullTime { static VLCTime * nullTime = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ nullTime = [VLCTime timeWithNumber:nil]; }); return nullTime; } + (VLCTime *)timeWithNumber:(NSNumber *)aNumber { return [[VLCTime alloc] initWithNumber:aNumber]; } + (VLCTime *)timeWithInt:(int)aInt { return [[VLCTime alloc] initWithInt:aInt]; } /* Initializers */ - (instancetype)initWithNumber:(NSNumber *)aNumber { if (self = [super init]) { _value = aNumber; } return self; } - (instancetype)initWithInt:(int)aInt { if (self = [super init]) { if (aInt) _value = @(aInt); } return self; } /* NSObject Overrides */ - (NSString *)description { return self.stringValue; } - (NSNumber *)numberValue { return _value; } - (NSString *)stringValue { if (_value) { long long duration = [_value longLongValue] / 1000; long long positiveDuration = llabs(duration); if (positiveDuration > 3600) return [NSString stringWithFormat:@"%s%01ld:%02ld:%02ld", duration < 0 ? "-" : "", (long) (positiveDuration / 3600), (long)((positiveDuration / 60) % 60), (long) (positiveDuration % 60)]; else return [NSString stringWithFormat:@"%s%02ld:%02ld", duration < 0 ? "-" : "", (long)((positiveDuration / 60) % 60), (long) (positiveDuration % 60)]; } else { // Return a string that represents an undefined time. return @"--:--"; } } - (NSString *)verboseStringValue { if (_value) { long long duration = [_value longLongValue] / 1000; long long positiveDuration = llabs(duration); long hours = (long)(positiveDuration / 3600); long mins = (long)((positiveDuration / 60) % 60); long seconds = (long)(positiveDuration % 60); const char * remaining = duration < 0 ? " remaining" : ""; if (hours > 0) return [NSString stringWithFormat:@"%ld hours %ld minutes%s", hours, mins, remaining]; if (mins > 5) return [NSString stringWithFormat:@"%ld minutes%s", mins, remaining]; if (mins > 0) return [NSString stringWithFormat:@"%ld minutes %ld seconds%s", mins, seconds, remaining]; return [NSString stringWithFormat:@"%ld seconds%s", seconds, remaining]; } // Return a string that represents an undefined time. return @""; } - (NSString *)minuteStringValue { if (_value) { long long positiveDuration = llabs([_value longLongValue]); long minutes = (long)(positiveDuration / 60000); return [NSString stringWithFormat:@"%ld", minutes]; } return @""; } - (int)intValue { return [_value intValue]; } - (NSComparisonResult)compare:(VLCTime *)aTime { NSInteger a = [_value integerValue]; NSInteger b = [aTime.value integerValue]; return (a > b) ? NSOrderedDescending : (a < b) ? NSOrderedAscending : NSOrderedSame; } @end Sources/VLCVideoCommon.m000066400000000000000000000053041250240207200154370ustar00rootroot00000000000000/***************************************************************************** * VLCVideoCommon.m: VLCKit.framework VLCVideoCommon implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCVideoCommon.h" /****************************************************************************** * Implementation VLCVideoLayoutManager * * Manage the size of the video layer */ @implementation VLCVideoLayoutManager + (id)layoutManager { static id sLayoutManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sLayoutManager = [[self alloc] init]; }); return sLayoutManager; } /* CALayoutManager Implementation */ - (void)layoutSublayersOfLayer:(CALayer *)layer { /* After having done everything normally resize the vlcopengllayer */ if( [[layer sublayers] count] > 0 && [[[layer sublayers][0] name] isEqualToString:@"vlcopengllayer"]) { CALayer * videolayer = [layer sublayers][0]; CGRect bounds = layer.bounds; CGRect videoRect = bounds; CGSize original = self.originalVideoSize; if (original.height > 0 && original.width > 0) { CGFloat xRatio = CGRectGetWidth(bounds) / original.width; CGFloat yRatio = CGRectGetHeight(bounds) / original.height; CGFloat ratio = self.fillScreenEntirely ? MAX(xRatio, yRatio) : MIN(xRatio, yRatio); videoRect.size.width = ratio * original.width; videoRect.size.height = ratio * original.height; videoRect.origin.x += (CGRectGetWidth(bounds) - CGRectGetWidth(videoRect)) / 2.0; videoRect.origin.y += (CGRectGetHeight(bounds) - CGRectGetHeight(videoRect)) / 2.0; } videolayer.frame = videoRect; } } @end Sources/VLCVideoLayer.m000066400000000000000000000062421250240207200152650ustar00rootroot00000000000000/***************************************************************************** * VLCVideoLayer.m: VLCKit.framework VLCVideoLayer implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCVideoLayer.h" #import "VLCLibrary.h" #import "VLCEventManager.h" #import "VLCVideoCommon.h" /* Libvlc */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #import /****************************************************************************** * VLCVideoLayer (Private) */ @interface VLCVideoLayer () @property (nonatomic, readwrite) BOOL hasVideo; - (void)addVoutLayer:(CALayer *)aLayer; @end /****************************************************************************** * Implementation VLCVideoLayer */ @implementation VLCVideoLayer - (BOOL)fillScreen { return [self.layoutManager fillScreenEntirely]; } - (void)setFillScreen:(BOOL)fillScreen { [self.layoutManager setFillScreenEntirely:fillScreen]; [self setNeedsLayout]; } /****************************************************************************** * Implementation VLCVideoLayer (Private) */ /* This is called by the libvlc module 'opengllayer' as soon as there is one * vout available */ - (void)addVoutLayer:(CALayer *)voutLayer { [CATransaction begin]; voutLayer.name = @"vlcopengllayer"; VLCVideoLayoutManager * layoutManager = [VLCVideoLayoutManager layoutManager]; layoutManager.originalVideoSize = voutLayer.bounds.size; self.layoutManager = layoutManager; [self insertSublayer:voutLayer atIndex:0]; [self setNeedsDisplayOnBoundsChange:YES]; [CATransaction commit]; /* Trigger by hand, as it doesn't go through else. Assumed bug from Cocoa */ [self willChangeValueForKey:@"hasVideo"]; self.hasVideo = YES; [self didChangeValueForKey:@"hasVideo"]; } - (void)removeVoutLayer:(CALayer*)voutLayer { [CATransaction begin]; [voutLayer removeFromSuperlayer]; [CATransaction commit]; /* Trigger by hand, as it doesn't go through else. Assumed bug from Cocoa */ [self willChangeValueForKey:@"hasVideo"]; _hasVideo = NO; [self didChangeValueForKey:@"hasVideo"]; } @end Sources/VLCVideoView.m000066400000000000000000000073511250240207200151250ustar00rootroot00000000000000/***************************************************************************** * VLCVideoView.m: VLCKit.framework VLCVideoView implementation ***************************************************************************** * Copyright (C) 2007 Pierre d'Herbemont * Copyright (C) 2007 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #import "VLCVideoView.h" #import "VLCLibrary.h" #import "VLCEventManager.h" #import "VLCVideoCommon.h" /* Libvlc */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #import /****************************************************************************** * Soon deprecated stuff */ /* This is a forward reference to VLCOpenGLVoutView specified in minimal_macosx library. We could get rid of this, but it prevents warnings from the compiler. (Scheduled to deletion) */ @interface VLCOpenGLVoutView : NSView - (void)detachFromVout; @end /****************************************************************************** * VLCVideoView (Private) */ @interface VLCVideoView () @property (nonatomic, readwrite) BOOL hasVideo; @property (nonatomic, retain) VLCVideoLayoutManager *layoutManager; - (void)addVoutLayer:(CALayer *)aLayer; @end /****************************************************************************** * Implementation VLCVideoView */ @implementation VLCVideoView /* Initializers */ - (instancetype)initWithFrame:(NSRect)rect { if (self = [super initWithFrame:rect]) { self.backColor = [NSColor blackColor]; self.autoresizesSubviews = YES; self.layoutManager = [VLCVideoLayoutManager layoutManager]; } return self; } /* NSView Overrides */ - (void)drawRect:(NSRect)aRect { [self lockFocus]; [self.backColor set]; NSRectFill(aRect); [self unlockFocus]; } - (BOOL)isOpaque { return YES; } - (BOOL)fillScreen { return [self.layoutManager fillScreenEntirely]; } - (void)setFillScreen:(BOOL)fillScreen { [self.layoutManager setFillScreenEntirely:fillScreen]; [self.layer setNeedsLayout]; } /****************************************************************************** * Implementation VLCVideoView (Private) */ /* This is called by the libvlc module 'opengllayer' as soon as there is one * vout available */ - (void)addVoutLayer:(CALayer *)aLayer { aLayer.name = @"vlcopengllayer"; [CATransaction begin]; self.wantsLayer = YES; CALayer * rootLayer = self.layer; [self.layoutManager setOriginalVideoSize:aLayer.bounds.size]; [rootLayer setLayoutManager:self.layoutManager]; [rootLayer insertSublayer:aLayer atIndex:0]; [aLayer setNeedsDisplayOnBoundsChange:YES]; [CATransaction commit]; self.hasVideo = YES; } - (void)removeVoutLayer:(CALayer *)voutLayer { [CATransaction begin]; [voutLayer removeFromSuperlayer]; [CATransaction commit]; self.hasVideo = NO; } @end VLCKit-Info.plist000066400000000000000000000012271250240207200141140ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable Quartz CFBundleIdentifier org.videolan.vlckitframework CFBundleInfoDictionaryVersion 6.0 CFBundleName VLC CFBundlePackageType FMWK CFBundleShortVersionString 0.1 CFBundleVersion 0.1 VLCKit.xcodeproj/000077500000000000000000000000001250240207200141405ustar00rootroot00000000000000VLCKit.xcodeproj/project.pbxproj000066400000000000000000002012501250240207200172140ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXAggregateTarget section */ 6337547910ED090A0072A0D9 /* Make VLC */ = { isa = PBXAggregateTarget; buildConfigurationList = 6337548110ED093B0072A0D9 /* Build configuration list for PBXAggregateTarget "Make VLC" */; buildPhases = ( 6337548010ED091D0072A0D9 /* make */, 633754D310ED0D330072A0D9 /* install */, ); dependencies = ( CC4C58F413F539B900FB0EFC /* PBXTargetDependency */, ); name = "Make VLC"; productName = "Make VLC 2"; }; 633BD6E40D2ADF030012A314 /* Setup VLC contribs */ = { isa = PBXAggregateTarget; buildConfigurationList = 633BD6EC0D2ADF460012A314 /* Build configuration list for PBXAggregateTarget "Setup VLC contribs" */; buildPhases = ( 633BD6E30D2ADF030012A314 /* make */, ); dependencies = ( ); name = "Setup VLC contribs"; productName = "vlc-contrib"; }; 63FFDBCE0D2AE2AE0092FC96 /* Run VLC configure */ = { isa = PBXAggregateTarget; buildConfigurationList = 63FFDBD50D2AE3250092FC96 /* Build configuration list for PBXAggregateTarget "Run VLC configure" */; buildPhases = ( 631A90420D5A007D0014A2CE /* bootstrap */, 63FFDBCD0D2AE2AE0092FC96 /* configure */, ); dependencies = ( ); name = "Run VLC configure"; productName = "vlc-bootstrap"; }; CC1EA79815938D7E00C40EF9 /* Fetch libvlc */ = { isa = PBXAggregateTarget; buildConfigurationList = CC1EA79A15938D7E00C40EF9 /* Build configuration list for PBXAggregateTarget "Fetch libvlc" */; buildPhases = ( CC1EA79915938D7E00C40EF9 /* make */, ); dependencies = ( ); name = "Fetch libvlc"; productName = "vlc-contrib"; }; CC61094C112F4AB500FAFD22 /* Make VLC and VLCKit */ = { isa = PBXAggregateTarget; buildConfigurationList = CC61095D112F4AD400FAFD22 /* Build configuration list for PBXAggregateTarget "Make VLC and VLCKit" */; buildPhases = ( ); dependencies = ( CC610951112F4ABB00FAFD22 /* PBXTargetDependency */, CC610953112F4ABF00FAFD22 /* PBXTargetDependency */, ); name = "Make VLC and VLCKit"; productName = "Make VLC and VLCKit"; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 63014A7A1042ACE100534090 /* VLCMediaListPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 63014A781042ACE100534090 /* VLCMediaListPlayer.m */; }; 63014B7E1042E64A00534090 /* VLCMediaListPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 63014B7D1042E64A00534090 /* VLCMediaListPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 63098FDC110E7159005F46AE /* VLCExtensionsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63098FDA110E7159005F46AE /* VLCExtensionsManager.m */; }; 63099116110F0EC3005F46AE /* VLCExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 63099114110F0EC3005F46AE /* VLCExtension.m */; }; 6309994B110FC791005F46AE /* VLCExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 63099949110FC791005F46AE /* VLCExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6309994C110FC791005F46AE /* VLCExtensionsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6309994A110FC791005F46AE /* VLCExtensionsManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 632A0E850D3835C400AFC99B /* VLCStreamSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 632A0E830D3835C400AFC99B /* VLCStreamSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; 632A0E860D3835C400AFC99B /* VLCStreamSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 632A0E840D3835C400AFC99B /* VLCStreamSession.m */; }; 632A0EC30D38392E00AFC99B /* VLCStreamOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = 632A0EC10D38392E00AFC99B /* VLCStreamOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; 632A0EC40D38392E00AFC99B /* VLCStreamOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = 632A0EC20D38392E00AFC99B /* VLCStreamOutput.m */; }; 6341FCAF0D2C0929002A97B7 /* VLCVideoLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6341FCAE0D2C0929002A97B7 /* VLCVideoLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6341FCB10D2C0936002A97B7 /* VLCVideoLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6341FCB00D2C0936002A97B7 /* VLCVideoLayer.m */; }; 636E974E11E8DCF1002FE8A9 /* VLCMediaThumbnailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 636E974C11E8DCF1002FE8A9 /* VLCMediaThumbnailer.m */; }; 637CFB940D2D280900A041B6 /* VLCLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 637CFB930D2D280800A041B6 /* VLCLibrary.h */; settings = {ATTRIBUTES = (Public, ); }; }; 637D5ABD0CF6F2650073EA45 /* VLCMediaDiscoverer.h in Headers */ = {isa = PBXBuildFile; fileRef = 637D5ABC0CF6F2650073EA45 /* VLCMediaDiscoverer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 637D5ADC0CF6F2720073EA45 /* VLCMediaDiscoverer.m in Sources */ = {isa = PBXBuildFile; fileRef = 637D5ADB0CF6F2720073EA45 /* VLCMediaDiscoverer.m */; }; 6384FD080D0DBA20005EB1F7 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6384FD070D0DBA20005EB1F7 /* QuartzCore.framework */; }; 63D88D93124E9BF600F65FA0 /* VLCMediaThumbnailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 63D88D92124E9BF600F65FA0 /* VLCMediaThumbnailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; A7A0CEA40D2EF13000F2C039 /* VLCVideoCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A0CEA20D2EF13000F2C039 /* VLCVideoCommon.h */; }; A7A0CEA50D2EF13000F2C039 /* VLCVideoCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A0CEA30D2EF13000F2C039 /* VLCVideoCommon.m */; }; CC4C591113F53EA400FB0EFC /* VLCEventManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD3C0CAEEFF600354E6E /* VLCEventManager.m */; }; CC4C591213F53EA400FB0EFC /* VLCLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD3D0CAEEFF600354E6E /* VLCLibrary.m */; }; CC4C591313F53EA400FB0EFC /* VLCMedia.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD3E0CAEEFF600354E6E /* VLCMedia.m */; }; CC4C591413F53EA400FB0EFC /* VLCMediaLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD400CAEEFF600354E6E /* VLCMediaLibrary.m */; }; CC4C591513F53EA400FB0EFC /* VLCMediaList.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD410CAEEFF600354E6E /* VLCMediaList.m */; }; CC4C591613F53EA400FB0EFC /* VLCTime.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD440CAEEFF600354E6E /* VLCTime.m */; }; CC4C591713F53EA400FB0EFC /* VLCVideoView.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD450CAEEFF600354E6E /* VLCVideoView.m */; }; CC4C591813F53EA400FB0EFC /* VLCMediaPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = EF8BB8CF0CAFA8D80038A613 /* VLCMediaPlayer.m */; }; CC4C591913F53EA400FB0EFC /* VLCAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = EF73118F0CB5797B009473B4 /* VLCAudio.m */; }; CC4C591A13F53EA400FB0EFC /* VLCMediaDiscoverer.m in Sources */ = {isa = PBXBuildFile; fileRef = 637D5ADB0CF6F2720073EA45 /* VLCMediaDiscoverer.m */; }; CC4C591B13F53EA400FB0EFC /* VLCVideoLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6341FCB00D2C0936002A97B7 /* VLCVideoLayer.m */; }; CC4C591C13F53EA400FB0EFC /* VLCVideoCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A0CEA30D2EF13000F2C039 /* VLCVideoCommon.m */; }; CC4C591D13F53EA400FB0EFC /* VLCStreamSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 632A0E840D3835C400AFC99B /* VLCStreamSession.m */; }; CC4C591E13F53EA400FB0EFC /* VLCStreamOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = 632A0EC20D38392E00AFC99B /* VLCStreamOutput.m */; }; CC4C591F13F53EA400FB0EFC /* VLCMediaListPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 63014A781042ACE100534090 /* VLCMediaListPlayer.m */; }; CC4C592013F53EA400FB0EFC /* VLCExtensionsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63098FDA110E7159005F46AE /* VLCExtensionsManager.m */; }; CC4C592113F53EA400FB0EFC /* VLCExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 63099114110F0EC3005F46AE /* VLCExtension.m */; }; CC4C592213F53EA400FB0EFC /* VLCMediaThumbnailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 636E974C11E8DCF1002FE8A9 /* VLCMediaThumbnailer.m */; }; CC4C592413F53EA400FB0EFC /* VLCEventManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD0D0CAEEEC300354E6E /* VLCEventManager.h */; settings = {ATTRIBUTES = (); }; }; CC4C592513F53EA400FB0EFC /* VLCKit.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD120CAEEEE700354E6E /* VLCKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592613F53EA400FB0EFC /* VLCMedia.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD130CAEEEE700354E6E /* VLCMedia.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592713F53EA400FB0EFC /* VLCMediaLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD150CAEEEE700354E6E /* VLCMediaLibrary.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592813F53EA400FB0EFC /* VLCMediaList.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD160CAEEEE700354E6E /* VLCMediaList.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592913F53EA400FB0EFC /* VLCTime.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD190CAEEEE700354E6E /* VLCTime.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592A13F53EA400FB0EFC /* VLCVideoView.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD1A0CAEEEE700354E6E /* VLCVideoView.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592B13F53EA400FB0EFC /* VLCMediaPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = EF8BB8CE0CAFA8D80038A613 /* VLCMediaPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592C13F53EA400FB0EFC /* VLCAudio.h in Headers */ = {isa = PBXBuildFile; fileRef = EF73118E0CB5797B009473B4 /* VLCAudio.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592D13F53EA400FB0EFC /* VLCLibVLCBridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EFD551DC0CC6DD720074CEE1 /* VLCLibVLCBridging.h */; }; CC4C592E13F53EA400FB0EFC /* VLCMediaDiscoverer.h in Headers */ = {isa = PBXBuildFile; fileRef = 637D5ABC0CF6F2650073EA45 /* VLCMediaDiscoverer.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C592F13F53EA400FB0EFC /* VLCVideoLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6341FCAE0D2C0929002A97B7 /* VLCVideoLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593013F53EA400FB0EFC /* VLCLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 637CFB930D2D280800A041B6 /* VLCLibrary.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593113F53EA400FB0EFC /* VLCVideoCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = A7A0CEA20D2EF13000F2C039 /* VLCVideoCommon.h */; }; CC4C593213F53EA400FB0EFC /* VLCStreamSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 632A0E830D3835C400AFC99B /* VLCStreamSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593313F53EA400FB0EFC /* VLCStreamOutput.h in Headers */ = {isa = PBXBuildFile; fileRef = 632A0EC10D38392E00AFC99B /* VLCStreamOutput.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593413F53EA400FB0EFC /* VLCMediaListPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 63014B7D1042E64A00534090 /* VLCMediaListPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593513F53EA400FB0EFC /* VLCExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 63099949110FC791005F46AE /* VLCExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593613F53EA400FB0EFC /* VLCExtensionsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6309994A110FC791005F46AE /* VLCExtensionsManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593713F53EA400FB0EFC /* VLCMediaThumbnailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 63D88D92124E9BF600F65FA0 /* VLCMediaThumbnailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; CC4C593A13F53EA400FB0EFC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; }; CC4C593B13F53EA400FB0EFC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6384FD070D0DBA20005EB1F7 /* QuartzCore.framework */; }; EF7311900CB5797B009473B4 /* VLCAudio.h in Headers */ = {isa = PBXBuildFile; fileRef = EF73118E0CB5797B009473B4 /* VLCAudio.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF7311910CB5797B009473B4 /* VLCAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = EF73118F0CB5797B009473B4 /* VLCAudio.m */; }; EF78BD100CAEEEC300354E6E /* VLCEventManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD0D0CAEEEC300354E6E /* VLCEventManager.h */; settings = {ATTRIBUTES = (); }; }; EF78BD1B0CAEEEE700354E6E /* VLCKit.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD120CAEEEE700354E6E /* VLCKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF78BD1C0CAEEEE700354E6E /* VLCMedia.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD130CAEEEE700354E6E /* VLCMedia.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF78BD1E0CAEEEE700354E6E /* VLCMediaLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD150CAEEEE700354E6E /* VLCMediaLibrary.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF78BD1F0CAEEEE700354E6E /* VLCMediaList.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD160CAEEEE700354E6E /* VLCMediaList.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF78BD460CAEEFF600354E6E /* VLCEventManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD3C0CAEEFF600354E6E /* VLCEventManager.m */; }; EF78BD470CAEEFF600354E6E /* VLCLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD3D0CAEEFF600354E6E /* VLCLibrary.m */; }; EF78BD480CAEEFF600354E6E /* VLCMedia.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD3E0CAEEFF600354E6E /* VLCMedia.m */; }; EF78BD4A0CAEEFF600354E6E /* VLCMediaLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD400CAEEFF600354E6E /* VLCMediaLibrary.m */; }; EF78BD4B0CAEEFF600354E6E /* VLCMediaList.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD410CAEEFF600354E6E /* VLCMediaList.m */; }; EF78BE0F0CAF039400354E6E /* VLCTime.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD190CAEEEE700354E6E /* VLCTime.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF78BE100CAF039400354E6E /* VLCTime.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD440CAEEFF600354E6E /* VLCTime.m */; }; EF78BEF30CAF07E100354E6E /* VLCVideoView.h in Headers */ = {isa = PBXBuildFile; fileRef = EF78BD1A0CAEEEE700354E6E /* VLCVideoView.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF78BEF40CAF07E500354E6E /* VLCVideoView.m in Sources */ = {isa = PBXBuildFile; fileRef = EF78BD450CAEEFF600354E6E /* VLCVideoView.m */; }; EF8BB8D00CAFA8D80038A613 /* VLCMediaPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = EF8BB8CE0CAFA8D80038A613 /* VLCMediaPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; EF8BB8D10CAFA8D80038A613 /* VLCMediaPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = EF8BB8CF0CAFA8D80038A613 /* VLCMediaPlayer.m */; }; EFD551DD0CC6DD720074CEE1 /* VLCLibVLCBridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EFD551DC0CC6DD720074CEE1 /* VLCLibVLCBridging.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ CC1EA7A115938F2200C40EF9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = CC1EA79815938D7E00C40EF9; remoteInfo = "Fetch libvlc"; }; CC4C58F313F539B900FB0EFC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 63FFDBCE0D2AE2AE0092FC96; remoteInfo = "Run VLC configure"; }; CC4C590A13F53EA400FB0EFC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 633BD6E40D2ADF030012A314; remoteInfo = "Setup VLC contribs"; }; CC4C590C13F53EA400FB0EFC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 63FFDBCE0D2AE2AE0092FC96; remoteInfo = "Run VLC configure"; }; CC4C590E13F53EA400FB0EFC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 6337547910ED090A0072A0D9; remoteInfo = "Make VLC"; }; CC610950112F4ABB00FAFD22 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 6337547910ED090A0072A0D9; remoteInfo = "Make VLC"; }; CC610952112F4ABF00FAFD22 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; proxyType = 1; remoteGlobalIDString = 8DC2EF4F0486A6940098B216; remoteInfo = VLCKit; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 32DBCF5E0370ADEE00C91783 /* VLC_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLC_Prefix.pch; sourceTree = ""; }; 63014A781042ACE100534090 /* VLCMediaListPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMediaListPlayer.m; sourceTree = ""; }; 63014B7D1042E64A00534090 /* VLCMediaListPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaListPlayer.h; path = Public/VLCMediaListPlayer.h; sourceTree = ""; }; 63030CC70CCA652C0088ECD1 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; name = Info.plist; path = Resources/Info.plist; sourceTree = ""; }; 63098FDA110E7159005F46AE /* VLCExtensionsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCExtensionsManager.m; sourceTree = ""; }; 63099114110F0EC3005F46AE /* VLCExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCExtension.m; sourceTree = ""; }; 63099949110FC791005F46AE /* VLCExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCExtension.h; path = Public/VLCExtension.h; sourceTree = ""; }; 6309994A110FC791005F46AE /* VLCExtensionsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCExtensionsManager.h; path = Public/VLCExtensionsManager.h; sourceTree = ""; }; 632A0E830D3835C400AFC99B /* VLCStreamSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCStreamSession.h; path = Public/VLCStreamSession.h; sourceTree = ""; }; 632A0E840D3835C400AFC99B /* VLCStreamSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCStreamSession.m; sourceTree = ""; }; 632A0EC10D38392E00AFC99B /* VLCStreamOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCStreamOutput.h; path = Public/VLCStreamOutput.h; sourceTree = ""; }; 632A0EC20D38392E00AFC99B /* VLCStreamOutput.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCStreamOutput.m; sourceTree = ""; }; 633753FF10ECE1C60072A0D9 /* Configure.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = Configure.sh; sourceTree = ""; }; 634117B911D9344400FA3A70 /* MobileVLCKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MobileVLCKit.h; path = Public/MobileVLCKit.h; sourceTree = ""; }; 6341FCAE0D2C0929002A97B7 /* VLCVideoLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCVideoLayer.h; path = Public/VLCVideoLayer.h; sourceTree = ""; }; 6341FCB00D2C0936002A97B7 /* VLCVideoLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCVideoLayer.m; sourceTree = ""; }; 636E974C11E8DCF1002FE8A9 /* VLCMediaThumbnailer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMediaThumbnailer.m; sourceTree = ""; }; 637CFB930D2D280800A041B6 /* VLCLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLibrary.h; path = Public/VLCLibrary.h; sourceTree = ""; }; 637D5ABC0CF6F2650073EA45 /* VLCMediaDiscoverer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaDiscoverer.h; path = Public/VLCMediaDiscoverer.h; sourceTree = ""; }; 637D5ADB0CF6F2720073EA45 /* VLCMediaDiscoverer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMediaDiscoverer.m; sourceTree = ""; }; 6384FD070D0DBA20005EB1F7 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = ""; }; 63D88C56124E9A5100F65FA0 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; 63D88CA9124E9A8200F65FA0 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; }; 63D88D92124E9BF600F65FA0 /* VLCMediaThumbnailer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaThumbnailer.h; path = Public/VLCMediaThumbnailer.h; sourceTree = ""; }; A26DCC7314279D2400EA47A0 /* VLCKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = VLCKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A7A0CEA20D2EF13000F2C039 /* VLCVideoCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCVideoCommon.h; path = Internal/VLCVideoCommon.h; sourceTree = ""; }; A7A0CEA30D2EF13000F2C039 /* VLCVideoCommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCVideoCommon.m; sourceTree = ""; }; CC4C594013F53EA400FB0EFC /* VLCKit-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "VLCKit-Info.plist"; path = "/Users/dilaroga/dev/vlc_workspace/vlc/projects/macosx/framework/VLCKit-Info.plist"; sourceTree = ""; }; CCEC5B73114D9BE800D34AAB /* deprecated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = deprecated.h; path = ../../../include/vlc/deprecated.h; sourceTree = SOURCE_ROOT; }; CCEC5B74114D9BE800D34AAB /* libvlc_events.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_events.h; path = ../../../include/vlc/libvlc_events.h; sourceTree = SOURCE_ROOT; }; CCEC5B75114D9BE800D34AAB /* libvlc_media_discoverer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_media_discoverer.h; path = ../../../include/vlc/libvlc_media_discoverer.h; sourceTree = SOURCE_ROOT; }; CCEC5B76114D9BE800D34AAB /* libvlc_media_library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_media_library.h; path = ../../../include/vlc/libvlc_media_library.h; sourceTree = SOURCE_ROOT; }; CCEC5B77114D9BE800D34AAB /* libvlc_media_list_player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_media_list_player.h; path = ../../../include/vlc/libvlc_media_list_player.h; sourceTree = SOURCE_ROOT; }; CCEC5B78114D9BE800D34AAB /* libvlc_media_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_media_list.h; path = ../../../include/vlc/libvlc_media_list.h; sourceTree = SOURCE_ROOT; }; CCEC5B79114D9BE800D34AAB /* libvlc_media_player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_media_player.h; path = ../../../include/vlc/libvlc_media_player.h; sourceTree = SOURCE_ROOT; }; CCEC5B7A114D9BE800D34AAB /* libvlc_media.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_media.h; path = ../../../include/vlc/libvlc_media.h; sourceTree = SOURCE_ROOT; }; CCEC5B7B114D9BE800D34AAB /* libvlc_structures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_structures.h; path = ../../../include/vlc/libvlc_structures.h; sourceTree = SOURCE_ROOT; }; CCEC5B7C114D9BE800D34AAB /* libvlc_vlm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc_vlm.h; path = ../../../include/vlc/libvlc_vlm.h; sourceTree = SOURCE_ROOT; }; CCEC5B7D114D9BE800D34AAB /* libvlc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = libvlc.h; path = ../../../include/vlc/libvlc.h; sourceTree = SOURCE_ROOT; }; CCEC5B7E114D9BE800D34AAB /* vlc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vlc.h; path = ../../../include/vlc/vlc.h; sourceTree = SOURCE_ROOT; }; D2F7E79907B2D74100F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; EF73118E0CB5797B009473B4 /* VLCAudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCAudio.h; path = Public/VLCAudio.h; sourceTree = ""; }; EF73118F0CB5797B009473B4 /* VLCAudio.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCAudio.m; sourceTree = ""; }; EF78BD0D0CAEEEC300354E6E /* VLCEventManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCEventManager.h; path = Internal/VLCEventManager.h; sourceTree = ""; }; EF78BD120CAEEEE700354E6E /* VLCKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCKit.h; path = Public/VLCKit.h; sourceTree = ""; }; EF78BD130CAEEEE700354E6E /* VLCMedia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMedia.h; path = Public/VLCMedia.h; sourceTree = ""; }; EF78BD150CAEEEE700354E6E /* VLCMediaLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaLibrary.h; path = Public/VLCMediaLibrary.h; sourceTree = ""; }; EF78BD160CAEEEE700354E6E /* VLCMediaList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaList.h; path = Public/VLCMediaList.h; sourceTree = ""; }; EF78BD190CAEEEE700354E6E /* VLCTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCTime.h; path = Public/VLCTime.h; sourceTree = ""; }; EF78BD1A0CAEEEE700354E6E /* VLCVideoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCVideoView.h; path = Public/VLCVideoView.h; sourceTree = ""; }; EF78BD350CAEEFB000354E6E /* Pre-Compile.sh */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.script.sh; path = "Pre-Compile.sh"; sourceTree = ""; }; EF78BD3C0CAEEFF600354E6E /* VLCEventManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCEventManager.m; sourceTree = ""; }; EF78BD3D0CAEEFF600354E6E /* VLCLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibrary.m; sourceTree = ""; }; EF78BD3E0CAEEFF600354E6E /* VLCMedia.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMedia.m; sourceTree = ""; }; EF78BD400CAEEFF600354E6E /* VLCMediaLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMediaLibrary.m; sourceTree = ""; }; EF78BD410CAEEFF600354E6E /* VLCMediaList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMediaList.m; sourceTree = ""; }; EF78BD440CAEEFF600354E6E /* VLCTime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCTime.m; sourceTree = ""; }; EF78BD450CAEEFF600354E6E /* VLCVideoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCVideoView.m; sourceTree = ""; }; EF8BB8CE0CAFA8D80038A613 /* VLCMediaPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCMediaPlayer.h; path = Public/VLCMediaPlayer.h; sourceTree = ""; }; EF8BB8CF0CAFA8D80038A613 /* VLCMediaPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMediaPlayer.m; sourceTree = ""; }; EFD551DC0CC6DD720074CEE1 /* VLCLibVLCBridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCLibVLCBridging.h; path = Internal/VLCLibVLCBridging.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8DC2EF560486A6940098B216 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */, 6384FD080D0DBA20005EB1F7 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; CC4C593913F53EA400FB0EFC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( CC4C593A13F53EA400FB0EFC /* Cocoa.framework in Frameworks */, CC4C593B13F53EA400FB0EFC /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DFFF38A50411DB9C8B /* Products */ = { isa = PBXGroup; children = ( A26DCC7314279D2400EA47A0 /* VLCKit.framework */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* VLC */ = { isa = PBXGroup; children = ( EF78BD3B0CAEEFD000354E6E /* Headers */, 08FB77AEFE84172EC02AAC07 /* Sources */, 32C88DFF0371C24200C91783 /* Other Sources */, 089C1665FE841158C02AAC07 /* Resources */, 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 034768DFFF38A50411DB9C8B /* Products */, 63D88C56124E9A5100F65FA0 /* Quartz.framework */, 63D88CA9124E9A8200F65FA0 /* ApplicationServices.framework */, CC4C594013F53EA400FB0EFC /* VLCKit-Info.plist */, ); name = VLC; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { isa = PBXGroup; children = ( EF53DD5F0CBD7BD100D3D4D0 /* Linked Libraries */, 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, ); name = "External Frameworks and Libraries"; sourceTree = ""; }; 089C1665FE841158C02AAC07 /* Resources */ = { isa = PBXGroup; children = ( EF78BD350CAEEFB000354E6E /* Pre-Compile.sh */, 633753FF10ECE1C60072A0D9 /* Configure.sh */, 63030CC70CCA652C0088ECD1 /* Info.plist */, ); name = Resources; sourceTree = ""; }; 08FB77AEFE84172EC02AAC07 /* Sources */ = { isa = PBXGroup; children = ( EF78BD3C0CAEEFF600354E6E /* VLCEventManager.m */, EF78BD3D0CAEEFF600354E6E /* VLCLibrary.m */, EF78BD3E0CAEEFF600354E6E /* VLCMedia.m */, 637D5ADB0CF6F2720073EA45 /* VLCMediaDiscoverer.m */, EF78BD410CAEEFF600354E6E /* VLCMediaList.m */, 63014A781042ACE100534090 /* VLCMediaListPlayer.m */, EF8BB8CF0CAFA8D80038A613 /* VLCMediaPlayer.m */, 636E974C11E8DCF1002FE8A9 /* VLCMediaThumbnailer.m */, EF78BD400CAEEFF600354E6E /* VLCMediaLibrary.m */, A7A0CEA30D2EF13000F2C039 /* VLCVideoCommon.m */, 6341FCB00D2C0936002A97B7 /* VLCVideoLayer.m */, EF78BD450CAEEFF600354E6E /* VLCVideoView.m */, EF78BD440CAEEFF600354E6E /* VLCTime.m */, EF73118F0CB5797B009473B4 /* VLCAudio.m */, 63098FDA110E7159005F46AE /* VLCExtensionsManager.m */, 63099114110F0EC3005F46AE /* VLCExtension.m */, 632A0F7B0D38F78500AFC99B /* Stream */, ); path = Sources; sourceTree = ""; }; 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 6384FD070D0DBA20005EB1F7 /* QuartzCore.framework */, 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 0867D6A5FE840307C02AAC07 /* AppKit.framework */, D2F7E79907B2D74100F64583 /* CoreData.framework */, 0867D69BFE84028FC02AAC07 /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 32C88DFF0371C24200C91783 /* Other Sources */ = { isa = PBXGroup; children = ( 32DBCF5E0370ADEE00C91783 /* VLC_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; 632A0F7B0D38F78500AFC99B /* Stream */ = { isa = PBXGroup; children = ( 632A0E840D3835C400AFC99B /* VLCStreamSession.m */, 632A0EC20D38392E00AFC99B /* VLCStreamOutput.m */, ); name = Stream; sourceTree = ""; }; 632A0F7C0D38F79200AFC99B /* Stream */ = { isa = PBXGroup; children = ( 632A0E830D3835C400AFC99B /* VLCStreamSession.h */, 632A0EC10D38392E00AFC99B /* VLCStreamOutput.h */, ); name = Stream; sourceTree = ""; }; 637CFB960D2D281900A041B6 /* Internal */ = { isa = PBXGroup; children = ( EFD551DC0CC6DD720074CEE1 /* VLCLibVLCBridging.h */, EF78BD0D0CAEEEC300354E6E /* VLCEventManager.h */, A7A0CEA20D2EF13000F2C039 /* VLCVideoCommon.h */, ); name = Internal; sourceTree = ""; }; CCEC5B6C114D9BD300D34AAB /* libvlc (not distributed) */ = { isa = PBXGroup; children = ( CCEC5B73114D9BE800D34AAB /* deprecated.h */, CCEC5B74114D9BE800D34AAB /* libvlc_events.h */, CCEC5B75114D9BE800D34AAB /* libvlc_media_discoverer.h */, CCEC5B76114D9BE800D34AAB /* libvlc_media_library.h */, CCEC5B77114D9BE800D34AAB /* libvlc_media_list_player.h */, CCEC5B78114D9BE800D34AAB /* libvlc_media_list.h */, CCEC5B79114D9BE800D34AAB /* libvlc_media_player.h */, CCEC5B7A114D9BE800D34AAB /* libvlc_media.h */, CCEC5B7B114D9BE800D34AAB /* libvlc_structures.h */, CCEC5B7C114D9BE800D34AAB /* libvlc_vlm.h */, CCEC5B7D114D9BE800D34AAB /* libvlc.h */, CCEC5B7E114D9BE800D34AAB /* vlc.h */, ); name = "libvlc (not distributed)"; sourceTree = ""; }; EF53DD5F0CBD7BD100D3D4D0 /* Linked Libraries */ = { isa = PBXGroup; children = ( ); name = "Linked Libraries"; sourceTree = ""; }; EF6BC9110DA1932F00DD37EF /* Public */ = { isa = PBXGroup; children = ( 634117B911D9344400FA3A70 /* MobileVLCKit.h */, EF78BD120CAEEEE700354E6E /* VLCKit.h */, 637CFB930D2D280800A041B6 /* VLCLibrary.h */, EF78BD130CAEEEE700354E6E /* VLCMedia.h */, 637D5ABC0CF6F2650073EA45 /* VLCMediaDiscoverer.h */, EF78BD160CAEEEE700354E6E /* VLCMediaList.h */, 63014B7D1042E64A00534090 /* VLCMediaListPlayer.h */, EF8BB8CE0CAFA8D80038A613 /* VLCMediaPlayer.h */, EF78BD150CAEEEE700354E6E /* VLCMediaLibrary.h */, 63D88D92124E9BF600F65FA0 /* VLCMediaThumbnailer.h */, 6341FCAE0D2C0929002A97B7 /* VLCVideoLayer.h */, EF78BD1A0CAEEEE700354E6E /* VLCVideoView.h */, EF78BD190CAEEEE700354E6E /* VLCTime.h */, EF73118E0CB5797B009473B4 /* VLCAudio.h */, 63099949110FC791005F46AE /* VLCExtension.h */, 6309994A110FC791005F46AE /* VLCExtensionsManager.h */, 632A0F7C0D38F79200AFC99B /* Stream */, ); name = Public; sourceTree = ""; }; EF78BD3B0CAEEFD000354E6E /* Headers */ = { isa = PBXGroup; children = ( CCEC5B6C114D9BD300D34AAB /* libvlc (not distributed) */, 637CFB960D2D281900A041B6 /* Internal */, EF6BC9110DA1932F00DD37EF /* Public */, ); path = Headers; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 8DC2EF500486A6940098B216 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( EF78BD100CAEEEC300354E6E /* VLCEventManager.h in Headers */, EF78BD1B0CAEEEE700354E6E /* VLCKit.h in Headers */, EF78BD1C0CAEEEE700354E6E /* VLCMedia.h in Headers */, EF78BD1E0CAEEEE700354E6E /* VLCMediaLibrary.h in Headers */, EF78BD1F0CAEEEE700354E6E /* VLCMediaList.h in Headers */, EF78BE0F0CAF039400354E6E /* VLCTime.h in Headers */, EF78BEF30CAF07E100354E6E /* VLCVideoView.h in Headers */, EF8BB8D00CAFA8D80038A613 /* VLCMediaPlayer.h in Headers */, EF7311900CB5797B009473B4 /* VLCAudio.h in Headers */, EFD551DD0CC6DD720074CEE1 /* VLCLibVLCBridging.h in Headers */, 637D5ABD0CF6F2650073EA45 /* VLCMediaDiscoverer.h in Headers */, 6341FCAF0D2C0929002A97B7 /* VLCVideoLayer.h in Headers */, 637CFB940D2D280900A041B6 /* VLCLibrary.h in Headers */, A7A0CEA40D2EF13000F2C039 /* VLCVideoCommon.h in Headers */, 632A0E850D3835C400AFC99B /* VLCStreamSession.h in Headers */, 632A0EC30D38392E00AFC99B /* VLCStreamOutput.h in Headers */, 63D88D93124E9BF600F65FA0 /* VLCMediaThumbnailer.h in Headers */, 63014B7E1042E64A00534090 /* VLCMediaListPlayer.h in Headers */, 6309994B110FC791005F46AE /* VLCExtension.h in Headers */, 6309994C110FC791005F46AE /* VLCExtensionsManager.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; CC4C592313F53EA400FB0EFC /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( CC4C592413F53EA400FB0EFC /* VLCEventManager.h in Headers */, CC4C592513F53EA400FB0EFC /* VLCKit.h in Headers */, CC4C592613F53EA400FB0EFC /* VLCMedia.h in Headers */, CC4C592713F53EA400FB0EFC /* VLCMediaLibrary.h in Headers */, CC4C592813F53EA400FB0EFC /* VLCMediaList.h in Headers */, CC4C592913F53EA400FB0EFC /* VLCTime.h in Headers */, CC4C592A13F53EA400FB0EFC /* VLCVideoView.h in Headers */, CC4C592B13F53EA400FB0EFC /* VLCMediaPlayer.h in Headers */, CC4C592C13F53EA400FB0EFC /* VLCAudio.h in Headers */, CC4C592D13F53EA400FB0EFC /* VLCLibVLCBridging.h in Headers */, CC4C592E13F53EA400FB0EFC /* VLCMediaDiscoverer.h in Headers */, CC4C592F13F53EA400FB0EFC /* VLCVideoLayer.h in Headers */, CC4C593013F53EA400FB0EFC /* VLCLibrary.h in Headers */, CC4C593113F53EA400FB0EFC /* VLCVideoCommon.h in Headers */, CC4C593213F53EA400FB0EFC /* VLCStreamSession.h in Headers */, CC4C593313F53EA400FB0EFC /* VLCStreamOutput.h in Headers */, CC4C593713F53EA400FB0EFC /* VLCMediaThumbnailer.h in Headers */, CC4C593413F53EA400FB0EFC /* VLCMediaListPlayer.h in Headers */, CC4C593513F53EA400FB0EFC /* VLCExtension.h in Headers */, CC4C593613F53EA400FB0EFC /* VLCExtensionsManager.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 8DC2EF4F0486A6940098B216 /* Build just VLCKit */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Build just VLCKit" */; buildPhases = ( EF78BD2E0CAEEF9500354E6E /* ShellScript */, 8DC2EF540486A6940098B216 /* Sources */, 8DC2EF500486A6940098B216 /* Headers */, 8DC2EF520486A6940098B216 /* Resources */, 8DC2EF560486A6940098B216 /* Frameworks */, ); buildRules = ( ); comments = "-lvlc -lvlc-control -dylib_file @loader_path/../lib/vlc_libintl.dylib:$(TARGET_BUILD_DIR)/$(PROJECT_NAME).framework/lib/vlc_libintl.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(TARGET_BUILD_DIR)/$(PROJECT_NAME).framework/lib/libvlc.dylib"; dependencies = ( ); name = "Build just VLCKit"; productInstallPath = "$(HOME)/Library/Frameworks"; productName = VLC; productReference = A26DCC7314279D2400EA47A0 /* VLCKit.framework */; productType = "com.apple.product-type.framework"; }; CC4C590813F53EA400FB0EFC /* Build Everything */ = { isa = PBXNativeTarget; buildConfigurationList = CC4C593C13F53EA400FB0EFC /* Build configuration list for PBXNativeTarget "Build Everything" */; buildPhases = ( CC4C590F13F53EA400FB0EFC /* ShellScript */, CC4C591013F53EA400FB0EFC /* Sources */, CC4C592313F53EA400FB0EFC /* Headers */, CC4C593813F53EA400FB0EFC /* Resources */, CC4C593913F53EA400FB0EFC /* Frameworks */, ); buildRules = ( ); comments = "-lvlc -lvlc-control -dylib_file @loader_path/../lib/vlc_libintl.dylib:$(TARGET_BUILD_DIR)/$(PROJECT_NAME).framework/lib/vlc_libintl.dylib -dylib_file @loader_path/../lib/libvlc.dylib:$(TARGET_BUILD_DIR)/$(PROJECT_NAME).framework/lib/libvlc.dylib"; dependencies = ( CC1EA7A215938F2200C40EF9 /* PBXTargetDependency */, CC4C590913F53EA400FB0EFC /* PBXTargetDependency */, CC4C590B13F53EA400FB0EFC /* PBXTargetDependency */, CC4C590D13F53EA400FB0EFC /* PBXTargetDependency */, ); name = "Build Everything"; productInstallPath = "$(HOME)/Library/Frameworks"; productName = VLC; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0450; }; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "VLCKit" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 0867D691FE84028FC02AAC07 /* VLC */; productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( CC4C590813F53EA400FB0EFC /* Build Everything */, CC1EA79815938D7E00C40EF9 /* Fetch libvlc */, 633BD6E40D2ADF030012A314 /* Setup VLC contribs */, 63FFDBCE0D2AE2AE0092FC96 /* Run VLC configure */, 6337547910ED090A0072A0D9 /* Make VLC */, 8DC2EF4F0486A6940098B216 /* Build just VLCKit */, CC61094C112F4AB500FAFD22 /* Make VLC and VLCKit */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8DC2EF520486A6940098B216 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; CC4C593813F53EA400FB0EFC /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 631A90420D5A007D0014A2CE /* bootstrap */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SRCROOT)/vlc-unstable/bootstrap", ); name = bootstrap; outputPaths = ( "$(SRCROOT)/vlc-unstable/configure", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "top_srcdir=`pwd`/vlc-unstable\n\nif test \"$ACTION\" = \"clean\"\nthen\n exit 0\nfi\n\nif test \"$arch\" = \"x86_64\"; then\n export PATH=$top_srcdir/contrib/x86_64-apple-darwin10/bin:$PATH\nfi\n\nexport PATH=$top_srcdir/extras/tools/build/bin:/usr/local/bin:$PATH\n\necho $PATH\n\nif ! [ -e $top_srcdir/configure ]; then\n cd \"$top_srcdir\" && ./bootstrap\nfi"; showEnvVarsInLog = 0; }; 6337548010ED091D0072A0D9 /* make */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = make; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "NUMBER_OF_CORES=`sysctl hw.ncpu | cut -d\" \" -f2`\n\nfor arch in $ARCHS; do\n\techo \"Make [$arch]\"\n\tcd $VLC_BUILD_DIR/$arch\n\tmake -j$NUMBER_OF_CORES\ndone"; }; 633754D310ED0D330072A0D9 /* install */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( "$(SYMROOT)/vlc_build_dir/src/.lib/libvlccore.dylib", "$(SYMROOT)/vlc_build_dir/src/.lib/libvlc.dylib", "$(SYMROOT)/vlc_build_dir/bin/.lib/vlc", ); name = install; outputPaths = ( "$(SYMROOT)/vlc_build_dir/lib/libvlccore.dylib", "$(SYMROOT)/vlc_build_dir/lib/libvlc.dylib", "$(SYMROOT)/vlc_build_dir/bin/vlc", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "for arch in $ARCHS; do\n\tcd $VLC_BUILD_DIR/$arch\n\tcd src\n\techo \"Installing [$arch] libvlc, libvlccore, vlc\"\n\tmake install --quiet > /dev/null\ndone"; }; 633BD6E30D2ADF030012A314 /* make */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = make; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "if test $ACTION = \"clean\"\nthen\nmake clean\nexit 0\nfi\n\necho \"Building tools\"\necho \"\"\ncd $SOURCE_ROOT/vlc-unstable/extras/tools\n./bootstrap\nmake\n\necho \"Building a set of contribs for $ARCHS...\"\necho \"\"\n\nexport PATH=$SOURCE_ROOT/vlc-unstable/extras/tools/build/bin:$PATH\n\nfor arch in $ARCHS; do\n\tcd $SOURCE_ROOT/vlc-unstable/contrib\n\techo \"Making contribs for $arch\"\n\trm -rf vlckit-$arch\t\n\tmkdir vlckit-$arch\n\tcd vlckit-$arch\n\tif test \"$arch\" = \"x86_64\"; then\n export OSX_VERSION=10.7\nexport TRIPLET=x86_64-apple-darwin10\nelse\nexport TRIPLET=i686-apple-darwin9\nfi\n\trm -rf $TRIPLET\n\t../bootstrap --build=$TRIPLET --host=$TRIPLET\n\tmake prebuilt\ndone\n"; showEnvVarsInLog = 0; }; 63FFDBCD0D2AE2AE0092FC96 /* configure */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = configure; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "echo $ARCHS\nsh $SOURCE_ROOT/Configure.sh"; }; CC1EA79915938D7E00C40EF9 /* make */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = make; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "if ! [ -e $VLC_SRC_DIR ]; then\n git clone git://git.videolan.org/vlc.git $VLC_SRC_DIR\nelse\n echo \"VLC_SRC_DIR exists\"\nfi"; }; CC4C590F13F53EA400FB0EFC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "sh $SOURCE_ROOT/Pre-Compile.sh"; showEnvVarsInLog = 0; }; EF78BD2E0CAEEF9500354E6E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "sh $SOURCE_ROOT/Pre-Compile.sh"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8DC2EF540486A6940098B216 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( EF78BD460CAEEFF600354E6E /* VLCEventManager.m in Sources */, EF78BD470CAEEFF600354E6E /* VLCLibrary.m in Sources */, EF78BD480CAEEFF600354E6E /* VLCMedia.m in Sources */, EF78BD4A0CAEEFF600354E6E /* VLCMediaLibrary.m in Sources */, EF78BD4B0CAEEFF600354E6E /* VLCMediaList.m in Sources */, EF78BE100CAF039400354E6E /* VLCTime.m in Sources */, EF78BEF40CAF07E500354E6E /* VLCVideoView.m in Sources */, EF8BB8D10CAFA8D80038A613 /* VLCMediaPlayer.m in Sources */, EF7311910CB5797B009473B4 /* VLCAudio.m in Sources */, 637D5ADC0CF6F2720073EA45 /* VLCMediaDiscoverer.m in Sources */, 6341FCB10D2C0936002A97B7 /* VLCVideoLayer.m in Sources */, A7A0CEA50D2EF13000F2C039 /* VLCVideoCommon.m in Sources */, 632A0E860D3835C400AFC99B /* VLCStreamSession.m in Sources */, 632A0EC40D38392E00AFC99B /* VLCStreamOutput.m in Sources */, 63014A7A1042ACE100534090 /* VLCMediaListPlayer.m in Sources */, 63098FDC110E7159005F46AE /* VLCExtensionsManager.m in Sources */, 63099116110F0EC3005F46AE /* VLCExtension.m in Sources */, 636E974E11E8DCF1002FE8A9 /* VLCMediaThumbnailer.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; CC4C591013F53EA400FB0EFC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( CC4C591113F53EA400FB0EFC /* VLCEventManager.m in Sources */, CC4C591213F53EA400FB0EFC /* VLCLibrary.m in Sources */, CC4C591313F53EA400FB0EFC /* VLCMedia.m in Sources */, CC4C591413F53EA400FB0EFC /* VLCMediaLibrary.m in Sources */, CC4C591513F53EA400FB0EFC /* VLCMediaList.m in Sources */, CC4C591613F53EA400FB0EFC /* VLCTime.m in Sources */, CC4C591713F53EA400FB0EFC /* VLCVideoView.m in Sources */, CC4C591813F53EA400FB0EFC /* VLCMediaPlayer.m in Sources */, CC4C591913F53EA400FB0EFC /* VLCAudio.m in Sources */, CC4C591A13F53EA400FB0EFC /* VLCMediaDiscoverer.m in Sources */, CC4C591B13F53EA400FB0EFC /* VLCVideoLayer.m in Sources */, CC4C591C13F53EA400FB0EFC /* VLCVideoCommon.m in Sources */, CC4C591D13F53EA400FB0EFC /* VLCStreamSession.m in Sources */, CC4C591E13F53EA400FB0EFC /* VLCStreamOutput.m in Sources */, CC4C591F13F53EA400FB0EFC /* VLCMediaListPlayer.m in Sources */, CC4C592013F53EA400FB0EFC /* VLCExtensionsManager.m in Sources */, CC4C592113F53EA400FB0EFC /* VLCExtension.m in Sources */, CC4C592213F53EA400FB0EFC /* VLCMediaThumbnailer.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ CC1EA7A215938F2200C40EF9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = CC1EA79815938D7E00C40EF9 /* Fetch libvlc */; targetProxy = CC1EA7A115938F2200C40EF9 /* PBXContainerItemProxy */; }; CC4C58F413F539B900FB0EFC /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 63FFDBCE0D2AE2AE0092FC96 /* Run VLC configure */; targetProxy = CC4C58F313F539B900FB0EFC /* PBXContainerItemProxy */; }; CC4C590913F53EA400FB0EFC /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 633BD6E40D2ADF030012A314 /* Setup VLC contribs */; targetProxy = CC4C590A13F53EA400FB0EFC /* PBXContainerItemProxy */; }; CC4C590B13F53EA400FB0EFC /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 63FFDBCE0D2AE2AE0092FC96 /* Run VLC configure */; targetProxy = CC4C590C13F53EA400FB0EFC /* PBXContainerItemProxy */; }; CC4C590D13F53EA400FB0EFC /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 6337547910ED090A0072A0D9 /* Make VLC */; targetProxy = CC4C590E13F53EA400FB0EFC /* PBXContainerItemProxy */; }; CC610951112F4ABB00FAFD22 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 6337547910ED090A0072A0D9 /* Make VLC */; targetProxy = CC610950112F4ABB00FAFD22 /* PBXContainerItemProxy */; }; CC610953112F4ABF00FAFD22 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 8DC2EF4F0486A6940098B216 /* Build just VLCKit */; targetProxy = CC610952112F4ABF00FAFD22 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 1DEB91AE08733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = VLC_Prefix.pch; HEADER_SEARCH_PATHS = ( "$(VLC_SRC_DIR)/include", "Headers/**", ); INFOPLIST_FILE = Resources/Info.plist; INSTALL_PATH = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = "$(CONFIGURATION_BUILD_DIR)/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/lib"; OTHER_LDFLAGS = ( "-lvlccore", "-single_module", "-lvlc", ); PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders"; PRODUCT_MODULE_NAME = VLCKit; PRODUCT_NAME = VLCKit; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; WRAPPER_EXTENSION = framework; }; name = Debug; }; 1DEB91AF08733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = VLC_Prefix.pch; HEADER_SEARCH_PATHS = ( "$(VLC_SRC_DIR)/include", "Headers/**", ); INFOPLIST_FILE = Resources/Info.plist; INSTALL_PATH = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = "$(CONFIGURATION_BUILD_DIR)/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/lib"; OTHER_LDFLAGS = ( "-lvlccore", "-single_module", "-lvlc", ); PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders"; PRODUCT_MODULE_NAME = VLCKit; PRODUCT_NAME = VLCKit; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; WRAPPER_EXTENSION = framework; }; name = Release; }; 1DEB91B208733DA50010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( x86_64, i386, ); CLANG_ENABLE_OBJC_ARC = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; VALID_ARCHS = "i386 x86_64"; VLC_BUILD_DIR = "$(SYMROOT)/$(CONFIGURATION)/vlc_build_dir"; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Debug; }; 1DEB91B308733DA50010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( x86_64, i386, ); CLANG_ENABLE_OBJC_ARC = YES; GCC_C_LANGUAGE_STANDARD = c99; GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = NO; SDKROOT = macosx; VALID_ARCHS = "i386 x86_64"; VLC_BUILD_DIR = "$(SYMROOT)/$(CONFIGURATION)/vlc_build_dir"; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Release; }; 6337547C10ED090B0072A0D9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = VLC; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Debug; }; 6337547D10ED090B0072A0D9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = VLC; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Release; }; 633BD6E50D2ADF030012A314 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "vlc-contrib"; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Debug; }; 633BD6E60D2ADF030012A314 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "vlc-contrib"; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; ZERO_LINK = NO; }; name = Release; }; 63FFDBD00D2AE2AE0092FC96 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CC = "xcrun clang"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; CXX = "xcrun clang++"; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; OBJC = "xcrun clang"; PRODUCT_NAME = "vlc-bootstrap"; SDKROOT = macosx; VALID_ARCHS = "i386 x86_64"; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Debug; }; 63FFDBD10D2AE2AE0092FC96 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CC = "xcrun clang"; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; CXX = "xcrun clang++"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; OBJC = "xcrun clang"; PRODUCT_NAME = "vlc-bootstrap"; SDKROOT = macosx; VALID_ARCHS = "i386 x86_64"; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; ZERO_LINK = NO; }; name = Release; }; CC1EA79B15938D7E00C40EF9 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "Setup VLC contribs copy"; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Debug; }; CC1EA79C15938D7E00C40EF9 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "Setup VLC contribs copy"; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; ZERO_LINK = NO; }; name = Release; }; CC4C593D13F53EA400FB0EFC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = VLC_Prefix.pch; GCC_VERSION = ""; HEADER_SEARCH_PATHS = ( "$(VLC_SRC_DIR)/include", "Headers/**", ); INFOPLIST_FILE = "VLCKit-Info.plist"; INSTALL_PATH = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = "$(CONFIGURATION_BUILD_DIR)/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/lib"; OTHER_LDFLAGS = ( "-lvlccore", "-single_module", "-lvlc", ); PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders"; PRODUCT_MODULE_NAME = VLCKit; PRODUCT_NAME = VLCKit; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; WRAPPER_EXTENSION = framework; }; name = Debug; }; CC4C593E13F53EA400FB0EFC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = VLC_Prefix.pch; GCC_VERSION = ""; HEADER_SEARCH_PATHS = ( "$(VLC_SRC_DIR)/include", "Headers/**", ); INFOPLIST_FILE = "VLCKit-Info.plist"; INSTALL_PATH = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = "$(CONFIGURATION_BUILD_DIR)/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/lib"; OTHER_LDFLAGS = ( "-lvlccore", "-single_module", "-lvlc", ); PRIVATE_HEADERS_FOLDER_PATH = "$(CONTENTS_FOLDER_PATH)/PrivateHeaders"; PRODUCT_MODULE_NAME = VLCKit; PRODUCT_NAME = VLCKit; SCAN_ALL_SOURCE_FILES_FOR_INCLUDES = YES; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; WRAPPER_EXTENSION = framework; }; name = Release; }; CC61094D112F4AB600FAFD22 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "Make VLC and VLCKit"; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; }; name = Debug; }; CC61094E112F4AB600FAFD22 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; PRODUCT_NAME = "Make VLC and VLCKit"; SDKROOT = macosx; VLC_SRC_DIR = "$(SRCROOT)/vlc-unstable"; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Build just VLCKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB91AE08733DA50010E9CD /* Debug */, 1DEB91AF08733DA50010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "VLCKit" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB91B208733DA50010E9CD /* Debug */, 1DEB91B308733DA50010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 6337548110ED093B0072A0D9 /* Build configuration list for PBXAggregateTarget "Make VLC" */ = { isa = XCConfigurationList; buildConfigurations = ( 6337547C10ED090B0072A0D9 /* Debug */, 6337547D10ED090B0072A0D9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 633BD6EC0D2ADF460012A314 /* Build configuration list for PBXAggregateTarget "Setup VLC contribs" */ = { isa = XCConfigurationList; buildConfigurations = ( 633BD6E50D2ADF030012A314 /* Debug */, 633BD6E60D2ADF030012A314 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; 63FFDBD50D2AE3250092FC96 /* Build configuration list for PBXAggregateTarget "Run VLC configure" */ = { isa = XCConfigurationList; buildConfigurations = ( 63FFDBD00D2AE2AE0092FC96 /* Debug */, 63FFDBD10D2AE2AE0092FC96 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; CC1EA79A15938D7E00C40EF9 /* Build configuration list for PBXAggregateTarget "Fetch libvlc" */ = { isa = XCConfigurationList; buildConfigurations = ( CC1EA79B15938D7E00C40EF9 /* Debug */, CC1EA79C15938D7E00C40EF9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; CC4C593C13F53EA400FB0EFC /* Build configuration list for PBXNativeTarget "Build Everything" */ = { isa = XCConfigurationList; buildConfigurations = ( CC4C593D13F53EA400FB0EFC /* Debug */, CC4C593E13F53EA400FB0EFC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; CC61095D112F4AD400FAFD22 /* Build configuration list for PBXAggregateTarget "Make VLC and VLCKit" */ = { isa = XCConfigurationList; buildConfigurations = ( CC61094D112F4AB600FAFD22 /* Debug */, CC61094E112F4AB600FAFD22 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } VLC_Prefix.pch000066400000000000000000000012511250240207200135040ustar00rootroot00000000000000// // Prefix header for all source files of the 'VLC' target in the 'VLC' project. // #ifdef __OBJC__ # import #endif #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #ifndef NDEBUG #define VKLog(format, ...) NSLog(format, ## __VA_ARGS__) #else #define VKLog(format, ...) #endif #ifndef N_ #define N_(str) gettext_noop(str) #define gettext_noop(str) (str) #endif #ifndef NS_DESIGNATED_INITIALIZER #if __has_attribute(objc_designated_initializer) #define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) #else #define NS_DESIGNATED_INITIALIZER #endif #endif buildMobileVLCKit.sh000077500000000000000000000113561250240207200146610ustar00rootroot00000000000000#!/bin/sh # Copyright (C) Pierre d'Herbemont, 2010 # Copyright (C) Felix Paul Kühne, 2012-2013 set -e BUILD_DEVICE=yes BUILD_SIMULATOR=no BUILD_FRAMEWORK=no SDK=`xcrun --sdk iphoneos --show-sdk-version` SDK_MIN=6.1 VERBOSE=no CONFIGURATION="Release" NONETWORK=no SKIPLIBVLCCOMPILATION=no SCARY=yes TESTEDHASH=22dea4b7368 usage() { cat << EOF usage: $0 [-s] [-v] [-k sdk] OPTIONS -k Specify which sdk to use (see 'xcodebuild -showsdks', current: ${SDK}) -v Be more verbose -s Build for simulator -f Build framework for device and simulator -d Enable Debug -n Skip script steps requiring network interaction -l Skip libvlc compilation -w Build a limited stack of non-scary libraries only EOF } spushd() { pushd "$1" 2>&1> /dev/null } spopd() { popd 2>&1> /dev/null } info() { local green="\033[1;32m" local normal="\033[0m" echo "[${green}info${normal}] $1" } buildxcodeproj() { local target="$2" if [ "x$target" = "x" ]; then target="$1" fi info "Building $1 ($target, ${CONFIGURATION})" local defs="$GCC_PREPROCESSOR_DEFINITIONS" if [ "$SCARY" = "no" ]; then defs="$defs NOSCARYCODECS" fi xcodebuild -project "$1.xcodeproj" \ -target "$target" \ -sdk $PLATFORM$SDK \ -configuration ${CONFIGURATION} \ IPHONEOS_DEPLOYMENT_TARGET=${SDK_MIN} \ GCC_PREPROCESSOR_DEFINITIONS="$defs" \ > ${out} } while getopts "hvwsfdnlk:" OPTION do case $OPTION in h) usage exit 1 ;; v) VERBOSE=yes ;; s) BUILD_DEVICE=no BUILD_SIMULATOR=yes BUILD_FRAMEWORK=no ;; f) BUILD_DEVICE=yes BUILD_SIMULATOR=yes BUILD_FRAMEWORK=yes ;; d) CONFIGURATION="Debug" ;; w) SCARY="no" ;; n) NONETWORK=yes ;; l) SKIPLIBVLCCOMPILATION=yes ;; k) SDK=$OPTARG ;; ?) usage exit 1 ;; esac done shift $(($OPTIND - 1)) out="/dev/null" if [ "$VERBOSE" = "yes" ]; then out="/dev/stdout" fi if [ "x$1" != "x" ]; then usage exit 1 fi # Get root dir spushd . aspen_root_dir=`pwd` spopd info "Preparing build dirs" mkdir -p MobileVLCKit/ImportedSources spushd MobileVLCKit/ImportedSources if [ "$NONETWORK" != "yes" ]; then if ! [ -e vlc ]; then git clone git://git.videolan.org/vlc/vlc-2.2.git vlc info "Applying patches to vlc-2.2.git" cd vlc git checkout -B localBranch ${TESTEDHASH} git branch --set-upstream-to=origin/master localBranch git am ../../patches/*.patch if [ $? -ne 0 ]; then git am --abort info "Applying the patches failed, aborting git-am" exit 1 fi cd .. else cd vlc git reset --hard ${TESTEDHASH} git am ../../patches/*.patch cd .. fi fi spopd # # Build time # buildMobileKit() { PLATFORM="$1" info "Building for $PLATFORM" spushd MobileVLCKit/ImportedSources if [ "$SKIPLIBVLCCOMPILATION" != "yes" ]; then spushd vlc/extras/package/ios info "Building vlc" args="" if [ "$VERBOSE" = "yes" ]; then args="${args} -v" fi if [ "$CONFIGURATION" = "Debug" ]; then args="${args} -d" fi if [ "$SCARY" = "no" ]; then args="${args} -w" fi if [ "$PLATFORM" = "iphonesimulator" ]; then args="${args} -s" ./build.sh -a i386 ${args} -k "${SDK}" && ./build.sh -a x86_64 ${args} -k "${SDK}" else ./build.sh -a armv7 ${args} -k "${SDK}" && ./build.sh -a armv7s ${args} -k "${SDK}" && ./build.sh -a arm64 ${args} -k "${SDK}" fi spopd fi spopd # MobileVLCKit/ImportedSources buildxcodeproj MobileVLCKit "Aggregate static plugins" buildxcodeproj MobileVLCKit "MobileVLCKit" info "Build for $PLATFORM completed" } if [ "$BUILD_DEVICE" != "no" ]; then buildMobileKit iphoneos fi if [ "$BUILD_SIMULATOR" != "no" ]; then buildMobileKit iphonesimulator fi if [ "$BUILD_FRAMEWORK" != "no" ]; then info "Building MobileVLCKit.framework" # Assumes both platforms were built currently spushd build rm -rf MobileVLCKit.framework && \ mkdir MobileVLCKit.framework && \ lipo -create Release-iphoneos/libMobileVLCKit.a \ Release-iphonesimulator/libMobileVLCKit.a \ -o MobileVLCKit.framework/MobileVLCKit && \ chmod a+x MobileVLCKit.framework/MobileVLCKit && \ cp -pr Release-iphoneos/include/MobileVLCKit MobileVLCKit.framework/Headers spopd # build info "Build of MobileVLCKit.framework completed" fi