libvlcpp | branch: master | Hugo Beauzée-Luyssen <[email protected]> | Wed May 13 18:34:37 2015 +0200| [a9da24aa387eeef8302f27b7aa680ef9c5ebd967] | committer: Hugo Beauzée-Luyssen
Add an imem/libvlc_media_new_callbacks example > http://git.videolan.org/gitweb.cgi/libvlcpp.git/?a=commit;h=a9da24aa387eeef8302f27b7aa680ef9c5ebd967 --- examples/CMakeLists.txt | 1 + examples/imem/CMakeLists.txt | 6 +++ examples/imem/imem.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 122fa9a..30eab5f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1 +1,2 @@ subdirs(helloworld) +subdirs(imem) diff --git a/examples/imem/CMakeLists.txt b/examples/imem/CMakeLists.txt new file mode 100644 index 0000000..b0a33f1 --- /dev/null +++ b/examples/imem/CMakeLists.txt @@ -0,0 +1,6 @@ +project(imem) + +add_executable(${PROJECT_NAME} + imem.cpp +) +target_link_libraries( ${PROJECT_NAME} ${LIBVLC_LIBRARY} ${LIBVLCCORE_LIBRARY} ) diff --git a/examples/imem/imem.cpp b/examples/imem/imem.cpp new file mode 100644 index 0000000..21c1f82 --- /dev/null +++ b/examples/imem/imem.cpp @@ -0,0 +1,86 @@ +#include "vlcpp/vlc.hpp" +#include <thread> +#include <cstring> +#include <cstdio> +#include <iostream> + +struct ImemOpaque +{ + FILE* file; + std::string path; +}; + +int main(int ac, char**av) +{ + if (ac < 3) + { + std::cerr << "usage: " << av[0] << " <file to play> <another file to play>" << std::endl; + return 1; + } + auto instance = VLC::Instance(0, nullptr); + auto dummyOpaque = new ImemOpaque{}; + dummyOpaque->path = av[1]; + auto imemMedia = VLC::Media( instance, + // Open + [dummyOpaque]( void*, void** opaque, uint64_t* p_size ) -> int { + dummyOpaque->file = fopen( dummyOpaque->path.c_str(), "rb" ); + *opaque = dummyOpaque; + fseek(dummyOpaque->file, 0, SEEK_END); + *p_size = ftell( dummyOpaque->file ); + rewind( dummyOpaque->file ); + return 0; + }, + // Read: + []( void* opaque, unsigned char* buf, size_t size ) -> ssize_t { + auto context = reinterpret_cast<ImemOpaque*>( opaque ); + auto res = fread( buf, 1, size, context->file ); + if ( res == 0 ) + return feof( context->file ) != 0 ? 0 : -1; + return res; + }, + []( void* opaque, uint64_t seek ) -> int { + auto context = reinterpret_cast<ImemOpaque*>( opaque ); + if ( fseek( context->file, seek, SEEK_SET ) < 0 ) + return -1; + return 0; + }, + []( void* opaque ) { + auto context = reinterpret_cast<ImemOpaque*>( opaque ); + fclose( context->file ); + }); + + auto opaque2 = new ImemOpaque{}; + opaque2->file = fopen( av[2], "rb" ); + + // Do not use a user defined opaque + // This is mostly meant to test that our nullptr overload are functionnal + auto imemMedia2 = VLC::Media( instance, + nullptr, + [opaque2]( void* opaque, unsigned char* buf, size_t size ) -> ssize_t { + assert( opaque == nullptr ); + auto res = fread( buf, 1, size, opaque2->file ); + if ( res == 0 ) + return feof( opaque2->file ) != 0 ? 0 : -1; + return res; + }, + [opaque2]( void*, uint64_t offset ) { + if ( fseek( opaque2->file, offset, SEEK_CUR ) < -1 ) + return -1; + return 0; + }, nullptr ); + + auto mp = VLC::MediaPlayer( imemMedia ); + mp.play(); + + auto mp2 = VLC::MediaPlayer( imemMedia2 ); + mp2.play(); + + std::this_thread::sleep_for( std::chrono::seconds( 10 ) ); + + mp.stop(); + mp2.stop(); + + delete dummyOpaque; + fclose(opaque2->file); + delete opaque2; +} _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
