diff --git a/.travis.yml b/.travis.yml index e1e8ad5d..eb5b6eb5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ env: global: - - AVTRANSCODER_BUILD=${TRAVIS_BUILD_DIR}/build - - AVTRANSCODER_INSTALL=${TRAVIS_BUILD_DIR}/install - - J='-j3' + - AVTRANSCODER_BUILD=${TRAVIS_BUILD_DIR}/build-avtranscoder + - AVTRANSCODER_INSTALL=${TRAVIS_BUILD_DIR}/install-avtranscoder + - DEPENDENCY_INSTALL=${TRAVIS_BUILD_DIR}/install-dependency + - CI_NODE_TOTAL=2 matrix: - DEPENDENCY_MODE=libav - DEPENDENCY_MODE=ffmpeg @@ -28,21 +29,39 @@ before_script: - ./tools/travis.gcc.install.coverage.sh # install avtranscoder dependencies - - if [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./tools/travis.linux.install.deps.sh; fi - - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then ./tools/travis.osx.install.deps.sh; fi + - if [ ${TRAVIS_OS_NAME} = "linux" ]; then ./tools/travis.linux.install.deps.sh; fi + - if [ ${TRAVIS_OS_NAME} = "osx" ]; then ./tools/travis.osx.install.deps.sh; fi script: - # Build + # build - mkdir -p ${AVTRANSCODER_BUILD} - cd ${AVTRANSCODER_BUILD} - - cmake .. -DCMAKE_INSTALL_PREFIX=${AVTRANSCODER_INSTALL} -DCMAKE_BUILD_TYPE=Release -DAVTRANSCODER_PYTHON_VERSION_OF_BINDING=2.7 -DAVTRANSCODER_COVERAGE=True - - make $J install + - cmake .. -DCMAKE_INSTALL_PREFIX=${AVTRANSCODER_INSTALL} -DCMAKE_PREFIX_PATH=${DEPENDENCY_INSTALL} -DCMAKE_BUILD_TYPE=Release -DAVTRANSCODER_PYTHON_VERSION_OF_BINDING=2.7 -DAVTRANSCODER_COVERAGE=True + - make -j${CI_NODE_TOTAL} + - make install - # Launch tests - - if [ "${DEPENDENCY_MODE}" = "ffmpeg" ]; then ./../tools/travis.python.nosetests.sh; fi + # launch tests + - if [ ${DEPENDENCY_MODE} = "ffmpeg" ]; then ./../tools/travis.python.nosetests.sh; fi after_success: - cd ${TRAVIS_BUILD_DIR} # generate coverage for coveralls - - if [ "${CC}" = "gcc" ]; then ./tools/travis.gcc.generate.coverage.sh; fi + - if [ ${CC} = "gcc" ]; then ./tools/travis.gcc.generate.coverage.sh; fi + +before_deploy: + # create archive + - cd ${TRAVIS_BUILD_DIR} + - tar -cvzf avtranscoder-${TRAVIS_OS_NAME}-${CC}-${DEPENDENCY_MODE}.tgz ${DEPENDENCY_INSTALL} ${AVTRANSCODER_INSTALL} + +deploy: + # if the commit is tagged, deploy using github release service + provider: releases + api_key: + secure: ${GITHUB_RELEASE_API_KEY} + file: avtranscoder-${TRAVIS_OS_NAME}-${CC}-${DEPENDENCY_MODE}.tgz + skip_cleanup: true + on: + tags: true + condition: ${TRAVIS_OS_NAME} = "linux" + diff --git a/CMakeLists.txt b/CMakeLists.txt index aecf6b5c..66c79f55 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ project(AvTranscoder) # Set AvTranscoder versions set(AVTRANSCODER_VERSION_MAJOR "0") set(AVTRANSCODER_VERSION_MINOR "5") -set(AVTRANSCODER_VERSION_MICRO "6") +set(AVTRANSCODER_VERSION_MICRO "7") set(AVTRANSCODER_VERSION ${AVTRANSCODER_VERSION_MAJOR}.${AVTRANSCODER_VERSION_MINOR}.${AVTRANSCODER_VERSION_MICRO}) # Define AvTranscoder versions @@ -19,6 +19,9 @@ add_definitions(-DAVTRANSCODER_DEFAULT_AVPROFILES="${CMAKE_INSTALL_PREFIX}/share # Diplay commands being ran by CMake set(CMAKE_VERBOSE_MAKEFILE OFF) +# The install rule does not depend on all, i.e. everything will not be built before installing +set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY TRUE) + # CPP flags on debug / release mode if(MSVC) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") diff --git a/README.md b/README.md index aa6bc5cd..58703ec1 100644 --- a/README.md +++ b/README.md @@ -21,35 +21,7 @@ See [**COPYING.md**](COPYING.md) See [**INSTALL.md**](INSTALL.md) #### How to use -Check out applications contained in the project to see examples of how to use the library in C++, Java or Python. - -To encode, avTranscoder manipulates profiles. -A profile is a text file which discribes, with a set of key-value, what we want as output for the format, the video, or the audio. -You can create your own profiles and export a variable called ```AVPROFILES``` to indicate the path to them. - -The minimum format profile is: -``` -avProfileName=profileName -avProfileLongName=profileLongName -avProfileType=avProfileTypeFormat -format=formatName -``` - -The minimum video profile is: -``` -avProfileName=profileName -avProfileLongName=profileLongName -avProfileType=avProfileTypeVideo -codec=codecName -``` - -The minimum audio profile is: -``` -avProfileName=profileName -avProfileLongName=profileLongName -avProfileType=avProfileTypeAudio -codec=codecName -``` +See [**USAGE.md**](USAGE.md) #### Tests diff --git a/USAGE.md b/USAGE.md new file mode 100644 index 00000000..050c5a5c --- /dev/null +++ b/USAGE.md @@ -0,0 +1,62 @@ +# How to use avTranscoder + +Check out applications contained in the project to see examples of how to use the library in C++, Java or Python. + +#### In C++ +Set environment: +``` +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/ffmpeg/lib:/path/to/avtranscoder/lib +export PATH=$PATH:/path/to/avtranscoder/bin +``` + +#### In Java +Add argument to the JVM: +``` +-Djava.library.path=/path/to/avtranscoder/lib/java +``` +Set environment: +``` +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/ffmpeg/lib +``` + +#### In Python +Set environment: +``` +export PYTHONPATH=$PYTHONPATH:/path/to/avtranscoder/lib/python/site-packages/ +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/ffmpeg/lib +``` + +#### Use profiles +To wrap/unwrap/encode/decode, avTranscoder manipulates profiles. +A profile is a set of key-value given as parameters to the InputFile(unwrap), the OutputFile(wrap), the Video/AudioDecoder(decode) or the Video/AudioEncoder(encode). +There are two ways to manipulate profiles: +* create profiles inside your code, by instanciate ```Map``` structures. +* create profiles outside your code, by create text files. +To indicate the path to the text files, export environment variable: +``` +export AVPROFILES=/path/to/profiles +``` + +The minimum format profile (wrap/unwrap) is: +``` +avProfileName=profileName +avProfileLongName=profileLongName +avProfileType=avProfileTypeFormat +format=formatName +``` + +The minimum video profile (encode/decode) is: +``` +avProfileName=profileName +avProfileLongName=profileLongName +avProfileType=avProfileTypeVideo +codec=codecName +``` + +The minimum audio profile (encode/decode) is: +``` +avProfileName=profileName +avProfileLongName=profileLongName +avProfileType=avProfileTypeAudio +codec=codecName +``` diff --git a/app/avInfo/CMakeLists.txt b/app/avInfo/CMakeLists.txt index bbbabc86..7d1a1e7d 100644 --- a/app/avInfo/CMakeLists.txt +++ b/app/avInfo/CMakeLists.txt @@ -20,6 +20,7 @@ install( FILES ${BINARY_FILES} PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE DESTINATION "bin/" + OPTIONAL ) install( diff --git a/app/avMeta/CMakeLists.txt b/app/avMeta/CMakeLists.txt index bbb739b0..b2c3e19d 100644 --- a/app/avMeta/CMakeLists.txt +++ b/app/avMeta/CMakeLists.txt @@ -20,6 +20,7 @@ install( FILES ${BINARY_FILES} PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE DESTINATION "bin/" + OPTIONAL ) install( diff --git a/app/avPlay/AvReader.cpp b/app/avPlay/AvReader.cpp index f51039e3..3febbebe 100644 --- a/app/avPlay/AvReader.cpp +++ b/app/avPlay/AvReader.cpp @@ -17,7 +17,7 @@ AvReader::AvReader( const std::string& filename ) _inputFile.activateStream( _videoStream ); _inputVideo = new avtranscoder::VideoDecoder( _inputFile.getStream( _videoStream ) ); - _inputVideo->setup(); + _inputVideo->setupDecoder(); _sourceImage = new avtranscoder::VideoFrame( _inputFile.getStream( _videoStream ).getVideoCodec().getVideoFrameDesc() ); diff --git a/app/avPlay/CMakeLists.txt b/app/avPlay/CMakeLists.txt index 4b7bb1c0..f9aff95e 100644 --- a/app/avPlay/CMakeLists.txt +++ b/app/avPlay/CMakeLists.txt @@ -42,6 +42,7 @@ install( FILES ${BINARY_FILES} PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE DESTINATION "bin/" + OPTIONAL ) install( diff --git a/app/avProcessor/CMakeLists.txt b/app/avProcessor/CMakeLists.txt index c31d56ed..871d2609 100644 --- a/app/avProcessor/CMakeLists.txt +++ b/app/avProcessor/CMakeLists.txt @@ -20,6 +20,7 @@ install( FILES ${BINARY_FILES} PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE DESTINATION "bin/" + OPTIONAL ) install( diff --git a/app/pyProcessor/pyprocessor.py b/app/pyProcessor/pyprocessor.py index f2c9f567..e9eaca96 100644 --- a/app/pyProcessor/pyprocessor.py +++ b/app/pyProcessor/pyprocessor.py @@ -1,4 +1,5 @@ -import sys +#!/usr/bin/env python + import argparse # python2.7+ from pyAvTranscoder import avtranscoder as av diff --git a/app/pyThumbnail/pythumbnail.py b/app/pyThumbnail/pythumbnail.py index afd9148d..a22338d0 100644 --- a/app/pyThumbnail/pythumbnail.py +++ b/app/pyThumbnail/pythumbnail.py @@ -1,23 +1,56 @@ -import argparse # python2.7+ +#!/usr/bin/env python from pyAvTranscoder import avtranscoder as av -# Create command-line interface -parser = argparse.ArgumentParser( - prog='pythumbnail', - description='''Generate jpeg thumbnail from video/image.''', -) - -# requirements -parser.add_argument('inputFileName', help='It could be any media file with at least one video stream (video, image...). Support file without extension.') -# options -parser.add_argument("-o", "--outputFile", dest="outputFileName", default="thumbnail.jpg", help="Set the output filename (thumbnail.jpg by default). Must be with jpg extension!") -parser.add_argument("-t", "--time", dest="time", type=float, default=0, help="Set time (in seconds) of where to seek in the video stream to generate the thumbnail (0 by default).") -parser.add_argument("-f", "--frame", dest="frame", type=int, default=0, help="Set time (in frames) of where to seek in the video stream to generate the thumbnail (0 by default). Warning: priority to frame if user indicates both frame and time!") -parser.add_argument("-w", "--width", dest="width", type=int, default=0, help="Override the width of the thumbnail (same as input by default).") -parser.add_argument("-he", "--height", dest="height", type=int, default=0, help="Override the height of the thumbnail (same as input by default).") -# Parse command-line -args = parser.parse_args() + +# Get command line arguments +args = [] +try: + # python2.7+ + import argparse + + # Create command-line interface + parser = argparse.ArgumentParser( + prog='pythumbnail', + description='''Generate jpeg thumbnail from video/image.''', + ) + + # requirements + parser.add_argument('inputFileName', help='It could be any media file with at least one video stream (video, image...). Support file without extension.') + # options + parser.add_argument("-o", "--outputFile", dest="outputFileName", default="thumbnail.jpg", help="Set the output filename (thumbnail.jpg by default). Must be with jpg extension!") + parser.add_argument("-t", "--time", dest="time", type=float, default=0, help="Set time (in seconds) of where to seek in the video stream to generate the thumbnail (0 by default).") + parser.add_argument("-f", "--frame", dest="frame", type=int, default=0, help="Set time (in frames) of where to seek in the video stream to generate the thumbnail (0 by default). Warning: priority to frame if user indicates both frame and time!") + parser.add_argument("-w", "--width", dest="width", type=int, default=0, help="Override the width of the thumbnail (same as input by default).") + parser.add_argument("-he", "--height", dest="height", type=int, default=0, help="Override the height of the thumbnail (same as input by default).") + # Parse command-line + args = parser.parse_args() + +except ImportError: + import optparse + + # Create command-line interface + parser = optparse.OptionParser( + usage='usage: %prog -i -t|-f