Recherche avancée

Médias (91)

Autres articles (103)

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

  • Websites made ​​with MediaSPIP

    2 mai 2011, par

    This page lists some websites based on MediaSPIP.

  • Creating farms of unique websites

    13 avril 2011, par

    MediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
    This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...)

Sur d’autres sites (9237)

  • How do I use the Windows version of gstreamer and wireshark to take a .pcap file and extract H.264 from RTP ?

    5 mars 2015, par user1118047

    I have a pcap file containing a capture of RTP with H.264 video and SIP with SDP. I would like to be able to extract the video from the RTP stream and save it to a file. (h264video.mkv or something similar)

    I have started looking at gstreamer as a possible solution for this but I’m having trouble troubleshooting any of the output I receive from the program.

    gst-launch -v     filesrc location=testh264.rtp    
    ! application/x-rtp,media=video,clock-rate=90000,payload=123,encoding-name=H264    
    ! rtph264depay                  
    ! ffdec_h264                    
    ! xvimagesink

    Here is an example of something I’ve tried but I’m not able to get through rtph264depay because the file I’m sending is of invalid format. What can I do to extract the h264 payload from my pcap file for usage with gstreamer/rtph264depay ?

  • Build libaacplus 2.0.2 for ios

    23 mai 2013, par Javan

    Does anyone build libaacplus2.0.2(Download here) successed for iOS ? I want ffmpeg support that.It cast me one day to build that, but failed.

    This is libaacplus2.0.2/autogen.sh, It was edited, just let it create configure file :

    #!/bin/sh
    # Run this to set up the build system: configure, makefiles, etc.
    # (based on the version in enlightenment's cvs)

    package="libaacplus"

    srcdir=`dirname $0`
    test -z "$srcdir" && srcdir=.

    cd "$srcdir"
    DIE=0

    (autoheader --version) < /dev/null > /dev/null 2>&1 || {
       echo
       echo "You must have autoconf installed to compile $package."
       echo "Download the appropriate package for your distribution,"
       echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
       DIE=1
    }

    (autoreconf --version) < /dev/null > /dev/null 2>&1 || {
       echo
       echo "You must have autoreconf installed to compile $package."
       echo "Download the appropriate package for your distribution,"
       echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
       DIE=1
    }

    (automake --version) < /dev/null > /dev/null 2>&1 || {
       echo
       echo "You must have automake installed to compile $package."
       echo "Download the appropriate package for your system,"
       echo "or get the source from one of the GNU ftp sites"
       echo "listed in http://www.gnu.org/order/ftp.html"
       DIE=1
    }

    if test "$DIE" -eq 1; then
       exit 1
    fi

    if test -z "$*"; then
       echo "I am going to run ./configure with no arguments - if you wish "
       echo "to pass any to it, please specify them on the $0 command line."
    fi

    echo "Generating configuration files for $package, please wait...."

    echo "  aclocal $ACLOCAL_FLAGS"
    aclocal $ACLOCAL_FLAGS
    echo "  autoheader"
    autoheader
    echo "  libtoolize --automake"
    libtoolize --automake
    echo "  automake --add-missing $AUTOMAKE_FLAGS"
    automake --add-missing $AUTOMAKE_FLAGS
    echo "  autoreconf"
    autoreconf

    #$srcdir/configure "$@" && echo

    After run the autogen.sh script :

    ./autogen.sh

    the configure file has been created in the same path, them i re-compressed the libaacplus folder named with "libaacplus-2.0.2.tar.gz". Bellow is build script(build-libaacplus.sh) wrote by me :

    #!/bin/bash

    SRC_PACK='libaacplus-2.0.2.tar.gz'

    SRC_ROOT=`pwd`/libaacplus-2.0.2
    BUILD_PATH=`pwd`/build

    DEVELOPER_ROOT='/Applications/Xcode.app/Contents/Developer'
    IOS_VERSION='6.1'
    #CC="$DEVELOPER_ROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang"

    CPU_CORE_COUNT=`sysctl -n machdep.cpu.core_count` #Check cpu core number
    MAKE_JOBS=$CPU_CORE_COUNT+1

    function build_with_args() {
       local arch=$1
       local platform=$2
       local host=$3
       local cc=$4
       local build=$5
       local cpp=$6
       local ios_dev_root="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer"
       local sys_root="$ios_dev_root/SDKs/iPhone$platform$IOS_VERSION.sdk"

       if [ -d $SRC_ROOT ]; then
           echo "Cleaning $SRC_ROOT ..."
           rm -rf $SRC_ROOT    
           echo "Clean $SRC_ROOT completed!"
       fi

       echo "Decompressing $SRC_PACK ..."
       tar -xzf $SRC_PACK
       echo "Decompress $SRC_PACK completed!"

       cd $SRC_ROOT

       export PATH="$ios_dev_root/usr/bin:$DEVELOPER_ROOT/usr/bin:$PATH"
       export CC=$cc
       export CFLAGS="-I$sys_root/usr/include"
       export LDFLAGS="--sysroot=$sys_root -L$sys_root/usr/lib/ -L$sys_root/usr/lib/system"
       export CPPFLAGS=$CFLAGS
       export CPP=$cpp
       export TARGET=$build

       ./configure \
       --prefix="$BUILD_PATH/$arch" \
       --host=$host \
       --build=$build \
       --with-sysroot=$sys_root \
       --enable-shared \
       --enable-static

       echo "Building for $arch ..."

    #   make -j$MAKE_JOBS
       make install
       make clean

       echo "Build for $arch completed!"

       cd -
    }

    function build_armv7() {
       local platform='OS'
       local bin_path="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer/usr/bin"
       build_with_args \
           'armv7' \
           "$platform" \
           'arm' \
           "$bin_path/arm-apple-darwin10-llvm-gcc-4.2" \
           'arm-apple-darwin10' \
           "$bin_path/arm-apple-darwin10-llvm-g++-4.2"
    }

    function build_armv7s() {
       local platform='OS'
       local bin_path="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer/usr/bin"
       build_with_args \
           'armv7s' \
           "$platform" \
           'arm' \
           "$bin_path/arm-apple-darwin10-llvm-gcc-4.2" \
           'arm-apple-darwin10' \
           "$bin_path/arm-apple-darwin10-llvm-g++-4.2"
    }

    function build_i386() {
       local platform='Simulator'
       local bin_path="$DEVELOPER_ROOT/Platforms/iPhone$platform.platform/Developer/usr/bin"
       build_with_args \
           'i386' \
           "$platform" \
           'i386' \
           "$bin_path/i686-apple-darwin11-llvm-gcc-4.2" \
           'i686-apple-darwin11' \
           "$bin_path/i686-apple-darwin11-llvm-g++-4.2"


    }

    if [ -d $BUILD_PATH ]; then
       echo "Cleaning $BUILD_PATH..."
       rm -rf $BUILD_PATH
    fi

    build_armv7
    #build_armv7s
    #build_i386

    echo '>>>>>>>>>>>>>>>>>All completed!<<<<<<<<<<<<<<'

    It failed again and again. Run script->failed->see config.log->modify->Run script ...

    I don't know what should I can do. Someone can help me ? Thanks a lot !
    The last config.log content is bellow :

    This file contains any messages produced by compilers while
    running configure, to aid debugging if configure makes a mistake.

    It was created by libaacplus configure 2.0.2, which was
    generated by GNU Autoconf 2.65.  Invocation command line was

     $ ./configure --prefix=/Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/build/armv7 --host=arm --build=arm-apple-darwin10 --with-sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk --enable-shared --enable-static

    ## --------- ##
    ## Platform. ##
    ## --------- ##

    hostname = JieMacBookPro.local
    uname -m = x86_64
    uname -r = 11.4.2
    uname -s = Darwin
    uname -v = Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64

    /usr/bin/uname -p = i386
    /bin/uname -X     = unknown

    /bin/arch              = unknown
    /usr/bin/arch -k       = unknown
    /usr/convex/getsysinfo = unknown
    /usr/bin/hostinfo      = Mach kernel version:
        Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64
    Kernel configured for up to 4 processors.
    2 processors are physically available.
    4 processors are logically available.
    Processor type: i486 (Intel 80486)
    Processors active: 0 1 2 3
    Primary memory available: 4.00 gigabytes
    Default processor set: 127 tasks, 619 threads, 4 processors
    Load average: 0.97, Mach factor: 3.02
    /bin/machine           = unknown
    /usr/bin/oslevel       = unknown
    /bin/universe          = unknown

    PATH: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin
    PATH: /Applications/Xcode.app/Contents/Developer/usr/bin
    PATH: /opt/local/bin
    PATH: /opt/local/sbin
    PATH: /usr/bin
    PATH: /bin
    PATH: /usr/sbin
    PATH: /sbin
    PATH: /usr/local/bin
    PATH: /usr/X11/bin
    PATH: /Library/StartupItems/MySQLCOM
    PATH: /usr/local/mysql/bin


    ## ----------- ##
    ## Core tests. ##
    ## ----------- ##

    configure:2378: checking for a BSD-compatible install
    configure:2446: result: /usr/bin/install -c
    configure:2457: checking whether build environment is sane
    configure:2512: result: yes
    configure:2571: checking for arm-strip
    configure:2601: result: no
    configure:2611: checking for strip
    configure:2627: found /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/strip
    configure:2638: result: strip
    configure:2650: WARNING: using cross tools not prefixed with host triplet
    configure:2663: checking for a thread-safe mkdir -p
    configure:2702: result: ./install-sh -c -d
    configure:2715: checking for gawk
    configure:2745: result: no
    configure:2715: checking for mawk
    configure:2745: result: no
    configure:2715: checking for nawk
    configure:2745: result: no
    configure:2715: checking for awk
    configure:2731: found /usr/bin/awk
    configure:2742: result: awk
    configure:2753: checking whether make sets $(MAKE)
    configure:2775: result: yes
    configure:2868: checking for arm-gcc
    configure:2895: result: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    configure:3164: checking for C compiler version
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 --version >&5
    arm-apple-darwin10-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2410.2.00)
    Copyright (C) 2007 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    configure:3184: $? = 0
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -v >&5
    Using built-in specs.
    Target: arm-apple-darwin10
    Configured with: /private/var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2410.2~111/src/configure --enable-checking --enable-werror --prefix=/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --disable-tls --build=i686-apple-darwin10 --enable-llvm=/private/var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2410.2~111/dst-llvmCore/Developer/usr/local --program-prefix=arm-apple-darwin10- --host=x86_64-apple-darwin10 --target=arm-apple-darwin10 --with-gxx-include-dir=/usr/include/c++/4.2.1 --with-build-sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.Internal.sdk
    Thread model: posix
    gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2410.2.00)
    configure:3184: $? = 0
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -V >&5
    arm-apple-darwin10-llvm-gcc-4.2: '-V' option must have argument
    configure:3184: $? = 1
    configure:3173: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -qversion >&5
    arm-apple-darwin10-llvm-gcc-4.2: no input files
    configure:3184: $? = 1
    configure:3204: checking whether the C compiler works
    configure:3226: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system conftest.c  >&5
    configure:3230: $? = 0
    configure:3279: result: yes
    configure:3282: checking for C compiler default output file name
    configure:3284: result: a.out
    configure:3290: checking for suffix of executables
    configure:3297: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -o conftest -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system conftest.c  >&5
    configure:3301: $? = 0
    configure:3323: result:
    configure:3345: checking whether we are cross compiling
    configure:3383: result: yes
    configure:3388: checking for suffix of object files
    configure:3410: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&5
    configure:3414: $? = 0
    configure:3435: result: o
    configure:3439: checking whether we are using the GNU C compiler
    configure:3458: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&5
    configure:3458: $? = 0
    configure:3467: result: yes
    configure:3476: checking whether /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 accepts -g
    configure:3496: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c -g -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&5
    configure:3496: $? = 0
    configure:3537: result: yes
    configure:3554: checking for /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 option to accept ISO C89
    configure:3618: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2  -c -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c >&5
    configure:3618: $? = 0
    configure:3631: result: none needed
    configure:3662: checking for style of include used by make
    configure:3690: result: GNU
    configure:3716: checking dependency style of /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    configure:3827: result: gcc3
    configure:3843: checking whether /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 and cc understand -c and -o together
    configure:3874: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c conftest.c -o conftest2.o >&5
    configure:3878: $? = 0
    configure:3884: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -c conftest.c -o conftest2.o >&5
    configure:3888: $? = 0
    configure:3899: cc -c conftest.c >&5
    configure:3903: $? = 0
    configure:3911: cc -c conftest.c -o conftest2.o >&5
    configure:3915: $? = 0
    configure:3921: cc -c conftest.c -o conftest2.o >&5
    configure:3925: $? = 0
    configure:3943: result: yes
    configure:3973: checking how to run the C preprocessor
    configure:4043: result: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
    configure:4063: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c
    conftest.c:16: error: 'Syntax' does not name a type
    configure:4063: $? = 1
    configure: failed program was:
    | /* confdefs.h */
    | #define PACKAGE_NAME "libaacplus"
    | #define PACKAGE_TARNAME "libaacplus"
    | #define PACKAGE_VERSION "2.0.2"
    | #define PACKAGE_STRING "libaacplus 2.0.2"
    | #define PACKAGE_BUGREPORT "Sergiy Guriev <piratfm@ua.fm>"
    | #define PACKAGE_URL ""
    | #define PACKAGE "libaacplus"
    | #define VERSION "2.0.2"
    | /* end confdefs.h.  */
    | #ifdef __STDC__
    | # include
    | #else
    | # include
    | #endif
    |            Syntax error
    configure:4063: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2 -I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include conftest.c
    conftest.c:16: error: 'Syntax' does not name a type
    configure:4063: $? = 1
    configure: failed program was:
    | /* confdefs.h */
    | #define PACKAGE_NAME "libaacplus"
    | #define PACKAGE_TARNAME "libaacplus"
    | #define PACKAGE_VERSION "2.0.2"
    | #define PACKAGE_STRING "libaacplus 2.0.2"
    | #define PACKAGE_BUGREPORT "Sergiy Guriev <piratfm@ua.fm>"
    | #define PACKAGE_URL ""
    | #define PACKAGE "libaacplus"
    | #define VERSION "2.0.2"
    | /* end confdefs.h.  */
    | #ifdef __STDC__
    | # include
    | #else
    | # include
    | #endif
    |            Syntax error
    configure:4093: error: in `/Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2':
    configure:4096: error: C preprocessor "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2" fails sanity check
    See `config.log' for more details.

    ## ---------------- ##
    ## Cache variables. ##
    ## ---------------- ##

    ac_cv_c_compiler_gnu=yes
    ac_cv_env_CC_set=set
    ac_cv_env_CC_value=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    ac_cv_env_CFLAGS_set=set
    ac_cv_env_CFLAGS_value=-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include
    ac_cv_env_CPPFLAGS_set=set
    ac_cv_env_CPPFLAGS_value=-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include
    ac_cv_env_CPP_set=set
    ac_cv_env_CPP_value=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
    ac_cv_env_LDFLAGS_set=set
    ac_cv_env_LDFLAGS_value='--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system'
    ac_cv_env_LIBS_set=
    ac_cv_env_LIBS_value=
    ac_cv_env_build_alias_set=set
    ac_cv_env_build_alias_value=arm-apple-darwin10
    ac_cv_env_host_alias_set=set
    ac_cv_env_host_alias_value=arm
    ac_cv_env_target_alias_set=
    ac_cv_env_target_alias_value=
    ac_cv_objext=o
    ac_cv_path_install='/usr/bin/install -c'
    ac_cv_prog_AWK=awk
    ac_cv_prog_CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
    ac_cv_prog_CPP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2
    ac_cv_prog_ac_ct_STRIP=strip
    ac_cv_prog_cc__Applications_Xcode_app_Contents_Developer_Platforms_iPhoneOS_platform_Developer_usr_bin_arm_apple_darwin10_llvm_gcc_4_2_c_o=yes
    ac_cv_prog_cc_c89=
    ac_cv_prog_cc_g=yes
    ac_cv_prog_make_make_set=yes
    am_cv_CC_dependencies_compiler_type=gcc3

    ## ----------------- ##
    ## Output variables. ##
    ## ----------------- ##

    AACPLUS_CFLAGS=''
    AACPLUS_CPPFLAGS=''
    AACPLUS_LIBS=''
    AACPLUS_REQUIRES=''
    ACLOCAL='${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run aclocal-1.12'
    AMDEPBACKSLASH='\'
    AMDEP_FALSE='#'
    AMDEP_TRUE=''
    AMTAR='$${TAR-tar}'
    AR=''
    AS=''
    ASH=''
    AUTOCONF='${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run autoconf'
    AUTOHEADER='${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run autoheader'
    AUTOMAKE='${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run automake-1.12'
    AWK='awk'
    BASH='/bin/sh'
    CC='/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2'
    CCDEPMODE='depmode=gcc3'
    CFLAGS='-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include'
    CPP='/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-g++-4.2'
    CPPFLAGS='-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include'
    CYGPATH_W='echo'
    DEBUG=''
    DEFS=''
    DEPDIR='.deps'
    DLLTOOL=''
    DOWNLOADER_PROG=''
    DOWNLOADER_PROG_CMD=''
    DSYMUTIL=''
    DUMPBIN=''
    ECHO_C='\c'
    ECHO_N=''
    ECHO_T=''
    EGREP=''
    EXEEXT=''
    FFTW3_CFLAGS=''
    FFTW3_INCFLAGS=''
    FFTW3_LDFLAGS=''
    FFTW3_LIB=''
    FGREP=''
    GREP=''
    HAVE_PKGCONFIG_FALSE=''
    HAVE_PKGCONFIG_TRUE=''
    INSTALL_DATA='${INSTALL} -m 644'
    INSTALL_PROGRAM='${INSTALL}'
    INSTALL_SCRIPT='${INSTALL}'
    INSTALL_STRIP_PROGRAM='$(install_sh) -c -s'
    LD=''
    LDFLAGS='--sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/ -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system'
    LIBOBJS=''
    LIBS=''
    LIBTOOL=''
    LIBTOOL_DEPS=''
    LIPO=''
    LN_S=''
    LTLIBOBJS=''
    MAKEINFO='${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/missing --run makeinfo'
    MANIFEST_TOOL=''
    MKDIR_P='./install-sh -c -d'
    NM=''
    NMEDIT=''
    OBJDUMP=''
    OBJEXT='o'
    OPT=''
    OTOOL64=''
    OTOOL=''
    PACKAGE='libaacplus'
    PACKAGE_BUGREPORT='Sergiy Guriev <piratfm@ua.fm>'
    PACKAGE_NAME='libaacplus'
    PACKAGE_STRING='libaacplus 2.0.2'
    PACKAGE_TARNAME='libaacplus'
    PACKAGE_URL=''
    PACKAGE_VERSION='2.0.2'
    PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL=''
    PATCH=''
    PATH_SEPARATOR=':'
    PKGCONFIG=''
    PROFILE=''
    RANLIB=''
    SED=''
    SET_MAKE=''
    SHELL='/bin/sh'
    STRIP='strip'
    UNZIP=''
    VERSION='2.0.2'
    ac_ct_AR=''
    ac_ct_CC=''
    ac_ct_DUMPBIN=''
    am__EXEEXT_FALSE=''
    am__EXEEXT_TRUE=''
    am__fastdepCC_FALSE='#'
    am__fastdepCC_TRUE=''
    am__include='include'
    am__isrc=''
    am__leading_dot='.'
    am__nodep='_no'
    am__quote=''
    am__tar='$${TAR-tar} chof - "$$tardir"'
    am__untar='$${TAR-tar} xf -'
    bindir='${exec_prefix}/bin'
    build='arm-apple-darwin10'
    build_alias='arm-apple-darwin10'
    build_cpu=''
    build_os=''
    build_vendor=''
    datadir='${datarootdir}'
    datarootdir='${prefix}/share'
    docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
    dvidir='${docdir}'
    exec_prefix='NONE'
    host='arm'
    host_alias='arm'
    host_cpu=''
    host_os=''
    host_vendor=''
    htmldir='${docdir}'
    includedir='${prefix}/include'
    infodir='${datarootdir}/info'
    install_sh='${SHELL} /Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/libaacplus-2.0.2/install-sh'
    libdir='${exec_prefix}/lib'
    libexecdir='${exec_prefix}/libexec'
    localedir='${datarootdir}/locale'
    localstatedir='${prefix}/var'
    mandir='${datarootdir}/man'
    mkdir_p='$(top_builddir)/./install-sh -c -d'
    oldincludedir='/usr/include'
    pdfdir='${docdir}'
    prefix='/Users/md313/Documents/Developer/OpenSource/ffmpef4ios-build-scripts/external-libs/build/armv7'
    program_transform_name='s,x,x,'
    psdir='${docdir}'
    sbindir='${exec_prefix}/sbin'
    sharedstatedir='${prefix}/com'
    sysconfdir='${prefix}/etc'
    target_alias=''

    ## ----------- ##
    ## confdefs.h. ##
    ## ----------- ##

    /* confdefs.h */
    #define PACKAGE_NAME "libaacplus"
    #define PACKAGE_TARNAME "libaacplus"
    #define PACKAGE_VERSION "2.0.2"
    #define PACKAGE_STRING "libaacplus 2.0.2"
    #define PACKAGE_BUGREPORT "Sergiy Guriev <piratfm@ua.fm>"
    #define PACKAGE_URL ""
    #define PACKAGE "libaacplus"
    #define VERSION "2.0.2"

    configure: exit 1
  • Developing A Shader-Based Video Codec

    22 juin 2013, par Multimedia Mike — Outlandish Brainstorms

    Early last month, this thing called ORBX.js was in the news. It ostensibly has something to do with streaming video and codec technology, which naturally catches my interest. The hype was kicked off by Mozilla honcho Brendan Eich when he posted an article asserting that HD video decoding could be entirely performed in JavaScript. We’ve seen this kind of thing before using Broadway– an H.264 decoder implemented entirely in JS. But that exposes some very obvious limitations (notably CPU usage).

    But this new video codec promises 1080p HD playback directly in JavaScript which is a lofty claim. How could it possibly do this ? I got the impression that performance was achieved using WebGL, an extension which allows JavaScript access to accelerated 3D graphics hardware. Browsing through the conversations surrounding the ORBX.js announcement, I found this confirmation from Eich himself :

    You’re right that WebGL does heavy lifting.

    As of this writing, ORBX.js remains some kind of private tech demo. If there were a public demo available, it would necessarily be easy to reverse engineer the downloadable JavaScript decoder.

    But the announcement was enough to make me wonder how it could be possible to create a video codec which effectively leverages 3D hardware.

    Prior Art
    In theorizing about this, it continually occurs to me that I can’t possibly be the first person to attempt to do this (or the ORBX.js people, for that matter). In googling on the matter, I found various forums and Q&A posts where people asked if it were possible to, e.g., accelerate JPEG decoding and presentation using 3D hardware, with no answers. I also found a blog post which describes a plan to use 3D hardware to accelerate VP8 video decoding. It was a project done under the banner of Google’s Summer of Code in 2011, though I’m not sure which open source group mentored the effort. The project did not end up producing the shader-based VP8 codec originally chartered but mentions that “The ‘client side’ of the VP8 VDPAU implementation is working and is currently being reviewed by the libvdpau maintainers.” I’m not sure what that means. Perhaps it includes modifications to the public API that supports VP8, but is waiting for the underlying hardware to actually implement VP8 decoding blocks in hardware.

    What’s So Hard About This ?
    Video decoding is a computationally intensive task. GPUs are known to be really awesome at chewing through computationally intensive tasks. So why aren’t GPUs a natural fit for decoding video codecs ?

    Generally, it boils down to parallelism, or lack of opportunities thereof. GPUs are really good at doing the exact same operations over lots of data at once. The problem is that decoding compressed video usually requires multiple phases that cannot be parallelized, and the individual phases often cannot be parallelized. In strictly mathematical terms, a compressed data stream will need to be decoded by applying a function f(x) over each data element, x0 .. xn. However, the function relies on having applied the function to the previous data element, i.e. :

    f(xn) = f(f(xn-1))
    

    What happens when you try to parallelize such an algorithm ? Temporal rifts in the space/time continuum, if you’re in a Star Trek episode. If you’re in the real world, you’ll get incorrect, unusuable data as the parallel computation is seeded with a bunch of invalid data at multiple points (which is illustrated in some of the pictures in the aforementioned blog post about accelerated VP8).

    Example : JPEG
    Let’s take a very general look at the various stages involved in decoding the ubiquitous JPEG format :


    High level JPEG decoding flow

    What are the opportunities to parallelize these various phases ?

    • Huffman decoding (run length decoding and zig-zag reordering is assumed to be rolled into this phase) : not many opportunities for parallelizing the various Huffman formats out there, including this one. Decoding most Huffman streams is necessarily a sequential operation. I once hypothesized that it would be possible to engineer a codec to achieve some parallelism during the entropy decoding phase, and later found that On2′s VP8 codec employs the scheme. However, such a scheme is unlikely to break down to such a fine level that WebGL would require.
    • Reverse DC prediction : JPEG — and many other codecs — doesn’t store full DC coefficients. It stores differences in successive DC coefficients. Reversing this process can’t be parallelized. See the discussion in the previous section.
    • Dequantize coefficients : This could be very parallelized. It should be noted that software decoders often don’t dequantize all coefficients. Many coefficients are 0 and it’s a waste of a multiplication operation to dequantize. Thus, this phase is sometimes rolled into the Huffman decoding phase.
    • Invert discrete cosine transform : This seems like it could be highly parallelizable. I will be exploring this further in this post.
    • Convert YUV -> RGB for final display : This is a well-established use case for 3D acceleration.

    Crash Course in 3D Shaders and Humility
    So I wanted to see if I could accelerate some parts of JPEG decoding using something called shaders. I made an effort to understand 3D programming and its associated math throughout the 1990s but 3D technology left me behind a very long time ago while I got mixed up in this multimedia stuff. So I plowed through a few books concerning WebGL (thanks to my new Safari Books Online subscription). After I learned enough about WebGL/JS to be dangerous and just enough about shader programming to be absolutely lethal, I set out to try my hand at optimizing IDCT using shaders.

    Here’s my extremely high level (and probably hopelessly naive) view of the modern GPU shader programming model :


    Basic WebGL rendering pipeline

    The WebGL program written in JavaScript drives the show. It sends a set of vertices into the WebGL system and each vertex is processed through a vertex shader. Then, each pixel that falls within a set of vertices is sent through a fragment shader to compute the final pixel attributes (R, G, B, and alpha value). Another consideration is textures : This is data that the program uploads to GPU memory which can be accessed programmatically by the shaders).

    These shaders (vertex and fragment) are key to the GPU’s programmability. How are they programmed ? Using a special C-like shading language. Thought I : “C-like language ? I know C ! I should be able to master this in short order !” So I charged forward with my assumptions and proceeded to get smacked down repeatedly by the overall programming paradigm. I came to recognize this as a variation of the scientific method : Develop a hypothesis– in my case, a mental model of how the system works ; develop an experiment (short program) to prove or disprove the model ; realize something fundamental that I was overlooking ; formulate new hypothesis and repeat.

    First Approach : Vertex Workhorse
    My first pitch goes like this :

    • Upload DCT coefficients to GPU memory in the form of textures
    • Program a vertex mesh that encapsulates 16×16 macroblocks
    • Distribute the IDCT effort among multiple vertex shaders
    • Pass transformed Y, U, and V blocks to fragment shader which will convert the samples to RGB

    So the idea is that decoding of 16×16 macroblocks is parallelized. A macroblock embodies 6 blocks :


    JPEG macroblocks

    It would be nice to process one of these 6 blocks in each vertex. But that means drawing a square with 6 vertices. How do you do that ? I eventually realized that drawing a square with 6 vertices is the recommended method for drawing a square on 3D hardware. Using 2 triangles, each with 3 vertices (0, 1, 2 ; 3, 4, 5) :


    2 triangles make a square

    A vertex shader knows which (x, y) coordinates it has been assigned, so it could figure out which sections of coefficients it needs to access within the textures. But how would a vertex shader know which of the 6 blocks it should process ? Solution : Misappropriate the vertex’s z coordinate. It’s not used for anything else in this case.

    So I set all of that up. Then I hit a new roadblock : How to get the reconstructed Y, U, and V samples transported to the fragment shader ? I have found that communicating between shaders is quite difficult. Texture memory ? WebGL doesn’t allow shaders to write back to texture memory ; shaders can only read it. The standard way to communicate data from a vertex shader to a fragment shader is to declare variables as “varying”. Up until this point, I knew about varying variables but there was something I didn’t quite understand about them and it nagged at me : If 3 different executions of a vertex shader set 3 different values to a varying variable, what value is passed to the fragment shader ?

    It turns out that the varying variable varies, which means that the GPU passes interpolated values to each fragment shader invocation. This completely destroys this idea.

    Second Idea : Vertex Workhorse, Take 2
    The revised pitch is to work around the interpolation issue by just having each vertex shader invocation performs all 6 block transforms. That seems like a lot of redundant. However, I figured out that I can draw a square with only 4 vertices by arranging them in an ‘N’ pattern and asking WebGL to draw a TRIANGLE_STRIP instead of TRIANGLES. Now it’s only doing the 4x the extra work, and not 6x. GPUs are supposed to be great at this type of work, so it shouldn’t matter, right ?

    I wired up an experiment and then ran into a new problem : While I was able to transform a block (or at least pretend to), and load up a varying array (that wouldn’t vary since all vertex shaders wrote the same values) to transmit to the fragment shader, the fragment shader can’t access specific values within the varying block. To clarify, a WebGL shader can use a constant value — or a value that can be evaluated as a constant at compile time — to index into arrays ; a WebGL shader can not compute an index into an array. Per my reading, this is a WebGL security consideration and the limitation may not be present in other OpenGL(-ES) implementations.

    Not Giving Up Yet : Choking The Fragment Shader
    You might want to be sitting down for this pitch :

    • Vertex shader only interpolates texture coordinates to transmit to fragment shader
    • Fragment shader performs IDCT for a single Y sample, U sample, and V sample
    • Fragment shader converts YUV -> RGB

    Seems straightforward enough. However, that step concerning IDCT for Y, U, and V entails a gargantuan number of operations. When computing the IDCT for an entire block of samples, it’s possible to leverage a lot of redundancy in the math which equates to far fewer overall operations. If you absolutely have to compute each sample individually, for an 8×8 block, that requires 64 multiplication/accumulation (MAC) operations per sample. For 3 color planes, and including a few extra multiplications involved in the RGB conversion, that tallies up to about 200 MACs per pixel. Then there’s the fact that this approach means a 4x redundant operations on the color planes.

    It’s crazy, but I just want to see if it can be done. My approach is to pre-compute a pile of IDCT constants in the JavaScript and transmit them to the fragment shader via uniform variables. For a first order optimization, the IDCT constants are formatted as 4-element vectors. This allows computing 16 dot products rather than 64 individual multiplication/addition operations. Ideally, GPU hardware executes the dot products faster (and there is also the possibility of lining these calculations up as matrices).

    I can report that I actually got a sample correctly transformed using this approach. Just one sample, through. Then I ran into some new problems :

    Problem #1 : Computing sample #1 vs. sample #0 requires a different table of 64 IDCT constants. Okay, so create a long table of 64 * 64 IDCT constants. However, this suffers from the same problem as seen in the previous approach : I can’t dynamically compute the index into this array. What’s the alternative ? Maintain 64 separate named arrays and implement 64 branches, when branching of any kind is ill-advised in shader programming to begin with ? I started to go down this path until I ran into…

    Problem #2 : Shaders can only be so large. 64 * 64 floats (4 bytes each) requires 16 kbytes of data and this well exceeds the amount of shader storage that I can assume is allowed. That brings this path of exploration to a screeching halt.

    Further Brainstorming
    I suppose I could forgo pre-computing the constants and directly compute the IDCT for each sample which would entail lots more multiplications as well as 128 cosine calculations per sample (384 considering all 3 color planes). I’m a little stuck with the transform idea right now. Maybe there are some other transforms I could try.

    Another idea would be vector quantization. What little ORBX.js literature is available indicates that there is a method to allow real-time streaming but that it requires GPU assistance to yield enough horsepower to make it feasible. When I think of such severe asymmetry between compression and decompression, my mind drifts towards VQ algorithms. As I come to understand the benefits and limitations of GPU acceleration, I think I can envision a way that something similar to SVQ1, with its copious, hierarchical vector tables stored as textures, could be implemented using shaders.

    So far, this all pertains to intra-coded video frames. What about opportunities for inter-coded frames ? The only approach that I can envision here is to use WebGL’s readPixels() function to fetch the rasterized frame out of the GPU, and then upload it again as a new texture which a new frame processing pipeline could reference. Whether this idea is plausible would require some profiling.

    Using interframes in such a manner seems to imply that the entire codec would need to operate in RGB space and not YUV.

    Conclusions
    The people behind ORBX.js have apparently figured out a way to create a shader-based video codec. I have yet to even begin to reason out a plausible approach. However, I’m glad I did this exercise since I have finally broken through my ignorance regarding modern GPU shader programming. It’s nice to have a topic like multimedia that allows me a jumping-off point to explore other areas.