Skip to content

Instantly share code, notes, and snippets.

@tmm1
Last active July 17, 2019 18:03
Show Gist options
  • Save tmm1/280f11b9c252cec87167c4bd406b508c to your computer and use it in GitHub Desktop.
Save tmm1/280f11b9c252cec87167c4bd406b508c to your computer and use it in GitHub Desktop.
diff --git a/SynoBuildConf/abiconfig b/SynoBuildConf/abiconfig
new file mode 100644
index 0000000000..70e02a72b5
--- /dev/null
+++ b/SynoBuildConf/abiconfig
@@ -0,0 +1,4 @@
+{
+ "skip_including": ["d3d11va.h", "dxva2.h", "qsv.h", "vda.h", "vdpau.h", "xvmc.h"],
+ "defines": "#define __STDC_CONSTANT_MACROS"
+}
diff --git a/SynoBuildConf/build b/SynoBuildConf/build
new file mode 100644
index 0000000000..b2b571e726
--- /dev/null
+++ b/SynoBuildConf/build
@@ -0,0 +1,130 @@
+#!/bin/bash
+# Copyright (c) 2000-2015 Synology Inc. All rights reserved.
+
+case ${MakeClean} in
+ [Yy][Ee][Ss])
+ if [ -f config.mak ]; then
+ make distclean
+ fi
+ ;;
+esac
+
+case ${CleanOnly} in
+ [Yy][Ee][Ss])
+ return
+ ;;
+esac
+
+CONFIGURE="./configure.syno"
+case "$PLATFORM_FAMILY" in
+ SYNOPLAT_F_I686|SYNOPLAT_F_X86_64)
+ arch="i686"
+ ;;
+ SYNOPLAT_F_PPC)
+ arch="powerpc"
+ BIG_ENDIAN="yes"
+ ;;
+ SYNOPLAT_F_ARMV5|SYNOPLAT_F_ARMV7)
+ arch="arm"
+ ;;
+ SYNOPLAT_F_ARMV8)
+ arch="arm64"
+ ;;
+ *)
+ SkipThisProject
+ return
+ ;;
+esac
+
+EVANSPORT_INC="-I${SysRootInclude}/intelce-utilities -I${SysRootInclude}/intelce-utilities/linux_user"
+EVANSPORT_LIB="-L${SysRootLib}/intelce-utilities -Wl,-rpath-link=${SysRootLib}/intelce-utilities"
+
+JSONC_INC=$(pkg-config --cflags json-c)
+JSONC_LIB=$(pkg-config --libs json-c)
+
+CFLAGS="${CFLAGS} -DSYNO_DSM"
+
+COMMON_CONFIG="
+ --prefix=/usr
+ --incdir=\${prefix}/include/ffmpeg
+ --arch=${arch}
+ --target-os=linux
+ --cross-prefix=${ToolChainPrefix}
+ --enable-cross-compile
+ --enable-optimizations
+ --enable-pic
+ --enable-gpl
+ --enable-shared
+ --disable-static
+ --enable-version3
+ --enable-nonfree
+ --enable-libfaac
+ --enable-encoders
+ --enable-pthreads
+ --disable-bzlib --disable-protocol=rtp --disable-muxer=image2 --disable-muxer=image2pipe
+ --disable-swscale-alpha
+ --disable-ffserver
+ --disable-ffplay
+ --disable-devices
+ --disable-bzlib
+ --disable-altivec
+ --enable-libopencore-amrnb
+ --enable-libopencore-amrwb
+ --enable-libmp3lame
+ --disable-vaapi
+ --disable-decoder=amrnb
+ --disable-encoder=zmbv
+ --disable-encoder=dca
+ --disable-encoder=ac3
+ --disable-encoder=ac3_fixed
+ --disable-encoder=eac3
+ --disable-decoder=dca
+ --disable-decoder=eac3
+ --disable-decoder=truehd
+ --cc=${CC}
+ "
+
+if checkPlatformFunction SYNO_PLAT_NEON_LIBSWSCALE; then
+ # for alpine neon libswscale patch
+ export EXPORT_BUILD_TARGET="ALPINE"
+fi
+
+if checkPlatformFunction SYNO_FEA_FFMPEG_SMD; then
+ # for evansport platform
+ # add -DSYNO_EVANSPORT for header files in intelce-utilities
+ env CC=${CC} \
+ CFLAGS="${CFLAGS} ${EVANSPORT_INC} ${JSONC_INC} -DSYNO_ENABLE_SMD -DSYNO_EVANSPORT" \
+ LDFLAGS="${LDFLAGS} ${EVANSPORT_LIB}" \
+ CHECK_CFLAG="gnu99" \
+ EVANSPORT_LIB="${EVANSPORT_LIB}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-yasm \
+ --enable-libx264 \
+ --enable-encoder=libx264 \
+ --enable-libh264_smd \
+ --enable-smd \
+ --disable-filter=hqdn3d \
+ --extra-libs="-lgdl -losal -lpal -lsven -lismd_core -lismd_audio -lismd_viddec -lismd_videnc -lismd_vidpproc -lplatform_config -lffmpeg_plugin ${JSONC_LIB}"
+elif checkPlatformFunction SYNO_FEA_FFMPEG_ENABLE_X264; then
+ # for x86_64, alpine
+ env CC=${CC} \
+ CFLAGS="${CFLAGS}" \
+ LDFLAGS="${LDFLAGS}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-yasm \
+ --enable-libx264 \
+ --enable-encoder=libx264
+else
+ env CC=${CC} \
+ CFLAGS="${CFLAGS}" \
+ LDFLAGS="${LDFLAGS}" \
+ bigendian_platform="${BIG_ENDIAN}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG}
+fi
+
+make ${MAKE_FLAGS}
+make tools/qt-faststart ${MAKE_FLAGS}
+# vim:ft=sh
diff --git a/SynoBuildConf/build-virtual-media-server b/SynoBuildConf/build-virtual-media-server
new file mode 100755
index 0000000000..b629df93b6
--- /dev/null
+++ b/SynoBuildConf/build-virtual-media-server
@@ -0,0 +1,164 @@
+#!/bin/bash
+# Copyright (c) 2000-2013 Synology Inc. All rights reserved.
+
+case ${MakeClean} in
+ [Yy][Ee][Ss])
+ if [ -f config.mak ]; then
+ make distclean
+ fi
+ ;;
+esac
+
+case ${CleanOnly} in
+ [Yy][Ee][Ss])
+ return
+ ;;
+esac
+
+CONFIGURE="./configure.syno"
+case "$BUILD_TARGET" in
+ X64|BROMOLOW|CEDARVIEW|EVANSPORT|AVOTON|DOCKERX64|BROMOLOWESM|BRASWELL|APOLLOLAKE|GRANTLEY|BROADWELL|KVMX64|DENVERTON|BROADWELLNK|PURLEY|COFFEELAKE)
+ arch="i686"
+ ;;
+ PPC_QORIQ|PPC_853X)
+ arch="powerpc"
+ BIG_ENDIAN="yes"
+ ;;
+ ALPINE)
+ arch="armv7"
+ ALPINE_EXTRA_CFLAGS="-DSYNO_PLAT_NEON_LIBSWSCALE -I${SysRootPrefix}/pkg/include"
+ ALPINE_EXTRA_LDFLAGS="-L${SysRootPrefix}/pkg/lib"
+ ;;
+ MARVELL_ARMADA370|MARVELL_ARMADA375|MARVELL_ARMADAXP|MARVELL_ARMADA38X|MINDSPEED_COMCERTO2K|BROADCOM_NORTHSTARPLUS|STM_MONACO|HISILICON_HI3535|HISILICON_HI3536)
+ arch="armv7"
+ ;;
+ REALTEK_RTD1296|MARVELL_ARMADA37XX)
+ arch="aarch64"
+ ;;
+ MARVELL_88F6281)
+ arch="arm"
+ ;;
+ *)
+ echo "This platform($BUILD_TARGET) is not supported yet."
+ return
+ ;;
+esac
+
+STANDALONE="FALSE"
+
+JSONC_INC=$(pkg-config --cflags json-c)
+JSONC_LIB=$(pkg-config --libs json-c)
+
+if [ "TRUE" = "${STANDALONE}" ]; then
+ CUSTOM_CONFIG="
+ --disable-shared
+ --enable-static
+ "
+ CUSTOM_CFLAGS="-DSTANDALONE"
+else
+ CUSTOM_CONFIG="
+ --enable-shared
+ --disable-static
+ "
+ CUSTOM_CFLAGS=""
+fi
+
+COMMON_RPATH="-Wl,-rpath=/var/packages/MediaServer/target/lib/ffmpeg -Wl,-rpath=/var/packages/MediaServer/target/lib"
+CFLAGS="${CFLAGS} ${CUSTOM_CFLAGS} -DSYNO_MEDIASERVER"
+LDFLAGS="${LDFLAGS} ${COMMON_RPATH}"
+
+COMMON_CONFIG="
+ --prefix=/usr/pkg
+ --incdir=\${prefix}/include/ffmpeg
+ --arch=${arch}
+ --target-os=linux
+ --cross-prefix=${ToolChainPrefix}
+ --enable-cross-compile
+ --enable-optimizations
+ --enable-pic
+ --enable-gpl
+ --enable-version3
+ --enable-nonfree
+ --enable-libfaac
+ --enable-encoders
+ --enable-pthreads
+ --disable-muxer=image2 --disable-muxer=image2pipe
+ --disable-swscale-alpha
+ --disable-ffplay
+ --disable-doc
+ --disable-devices
+ --disable-bzlib
+ --disable-altivec
+ --enable-libopencore-amrnb
+ --enable-libopencore-amrwb
+ --enable-libmp3lame
+ --disable-decoder=amrnb
+ --disable-encoder=zmbv
+ --cc=${CC}
+ ${CUSTOM_CONFIG}
+ "
+
+export EXPORT_BUILD_TARGET="${BUILD_TARGET}"
+
+if [ "i686" = "${arch}" -a "EVANSPORT" = "${BUILD_TARGET}" ]; then
+
+EVANSPORT_INC="-I${SysRootInclude}/intelce-utilities -I${SysRootInclude}/intelce-utilities/linux_user"
+EVANSPORT_LDFLAGS="-L${SysRootLib}/intelce-utilities"
+EVANSPORT_RPATH_LINK="-Wl,-rpath-link=${SysRootLib}/intelce-utilities"
+
+# for evansport platform
+# add -DSYNO_EVANSPORT for header files in intelce-utilities
+
+env CC=${CC} \
+ CFLAGS="${CFLAGS} ${EVANSPORT_INC} ${JSONC_INC} -DSYNO_ENABLE_SMD -DSYNO_EVANSPORT" \
+ LDFLAGS="${LDFLAGS} ${EVANSPORT_LDFLAGS} ${EVANSPORT_RPATH_LINK}" \
+ CHECK_CFLAG="gnu99" \
+ EVANSPORT_LIB="${EVANSPORT_RPATH_LINK}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-yasm \
+ --enable-libx264 \
+ --enable-encoder=libx264 \
+ --enable-libh264_smd \
+ --enable-smd \
+ --disable-filter=hqdn3d \
+ --extra-libs="${JSONC_LIB} -lgdl -losal -lpal -lsven -lismd_core -lismd_audio -lismd_viddec -lismd_videnc -lismd_vidpproc -lplatform_config -lffmpeg_plugin"
+
+elif [ "i686" = "${arch}" -o "ALPINE" = "${BUILD_TARGET}" ]; then
+env CC=${CC} \
+ CFLAGS="${CFLAGS} ${ALPINE_EXTRA_CFLAGS}" \
+ LDFLAGS="${LDFLAGS} ${ALPINE_EXTRA_LDFLAGS}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-yasm \
+ --enable-libx264 \
+ --enable-encoder=libx264
+
+#support floating point platform with lame
+elif [ "powerpc" = "${arch}" -o "armv7" = "${arch}" -o "aarch64" = "${arch}" ]; then
+env CC=${CC} \
+ CFLAGS="${CFLAGS}" \
+ LDFLAGS="${LDFLAGS}" \
+ bigendian_platform="${BIG_ENDIAN}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-libfdk-aac
+
+#only support fixed point platform with shine
+elif [ "arm" = "${arch}" ]; then
+env CC=${CC} \
+ CFLAGS="${CFLAGS}" \
+ LDFLAGS="${LDFLAGS}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-libshine \
+ --enable-libfdk-aac
+
+else
+ echo "This platform($BUILD_TARGET) is not supported yet."
+ return
+fi
+
+make ${MAKE_FLAGS}
+make tools/qt-faststart ${MAKE_FLAGS}
+# vim:ft=sh
diff --git a/SynoBuildConf/build-virtual-mplayer2 b/SynoBuildConf/build-virtual-mplayer2
new file mode 100755
index 0000000000..94bcca96ce
--- /dev/null
+++ b/SynoBuildConf/build-virtual-mplayer2
@@ -0,0 +1,110 @@
+#!/bin/bash
+# Copyright (c) 2000-2015 Synology Inc. All rights reserved.
+
+case ${MakeClean} in
+ [Yy][Ee][Ss])
+ if [ -f config.mak ]; then
+ make distclean
+ fi
+ ;;
+esac
+
+case ${CleanOnly} in
+ [Yy][Ee][Ss])
+ return
+ ;;
+esac
+
+CONFIGURE="./configure.syno"
+case "$BUILD_TARGET" in
+ X64|BROMOLOW|CEDARVIEW|EVANSPORT|GRANTLEY|BRASWELL|APOLLOLAKE|BROADWELL|AVOTON|KVMX64|DENVERTON|BROADWELLNK|PURLEY|COFFEELAKE)
+ arch="i686"
+ ;;
+ PPC_QORIQ)
+ arch="powerpc"
+ BIG_ENDIAN="yes"
+ ;;
+ PPC_853X|PPC_854X)
+ arch="powerpc"
+ BIG_ENDIAN="yes"
+ # let 853x use mp3float to decode mp3, to avoid Audio Station bug #1134
+ extra_config="--disable-decoder=mp3"
+ ;;
+ MARVELL_ARMADA370|MARVELL_ARMADAXP|MARVELL_ARMADA375|MARVELL_ARMADA38X)
+ arch="armada"
+ ;;
+ ALPINE)
+ ALPINE_EXTRA_CFLAGS="-DSYNO_PLAT_NEON_LIBSWSCALE"
+ arch="arm"
+ ;;
+ REALTEK_RTD1296|MARVELL_ARMADA37XX)
+ arch="aarch64"
+ ;;
+ MINDSPEED_COMCERTO2K|BROADCOM_NORTHSTARPLUS|STM_MONACO|HISILICON_HI3535|HISILICON_HI3536)
+ arch="arm"
+ ;;
+ MARVELL_88F6281)
+ arch="arm"
+ ;;
+ TI_816X)
+ arch="arm"
+ ;;
+ *)
+ echo "This platform($BUILD_TARGET) is not supported yet. Error me!!"
+ return
+ ;;
+esac
+
+COMMON_INC=""
+COMMON_LIB=""
+
+COMMON_CONFIG="
+ --arch=${arch}
+ --target-os=linux
+ --cross-prefix=${ToolChainPrefix}
+ --enable-cross-compile
+ --enable-optimizations
+ --enable-pic
+ --enable-shared
+ --disable-static
+ --enable-version3
+ --enable-encoders
+ --enable-pthreads
+ --enable-libmp3lame
+ --enable-libsoxr
+ --disable-swscale-alpha
+ --disable-postproc
+ --disable-ffserver
+ --disable-ffplay
+ --disable-bzlib
+ --disable-altivec
+ --disable-decoder=amrnb
+ --disable-indev=alsa
+ --disable-outdev=alsa
+ --disable-encoder=zmbv
+ --disable-encoder=dca
+ --disable-encoder=ac3
+ --disable-encoder=ac3_fixed
+ --disable-encoder=eac3
+ --disable-decoder=dca
+ --disable-decoder=eac3
+ --disable-decoder=truehd
+ --enable-avresample
+ --disable-doc
+ "
+
+export EXPORT_BUILD_TARGET="${BUILD_TARGET}"
+
+env CC=${CC} \
+ CFLAGS="${CFLAGS} ${ALPINE_EXTRA_CFLAGS} -DSYNO_AUDIOSTATION" \
+ CHECK_CFLAG="gnu99" \
+ LDFLAGS="${LDFLAGS} \
+ -Wl,-rpath,/var/packages/AudioStation/target/lib/ffmpeg \
+ -Wl,-rpath,/var/packages/AudioStation/target/lib" \
+ bigendian_platform="${BIG_ENDIAN}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ ${extra_config}
+
+make ${MAKE_FLAGS}
+# vim:ft=sh
diff --git a/SynoBuildConf/build-virtual-video-station b/SynoBuildConf/build-virtual-video-station
new file mode 100755
index 0000000000..f1887fe92a
--- /dev/null
+++ b/SynoBuildConf/build-virtual-video-station
@@ -0,0 +1,165 @@
+#!/bin/bash
+# Copyright (c) 2000-2013 Synology Inc. All rights reserved.
+
+case ${MakeClean} in
+ [Yy][Ee][Ss])
+ if [ -f config.mak ]; then
+ make distclean
+ fi
+ ;;
+esac
+
+case ${CleanOnly} in
+ [Yy][Ee][Ss])
+ return
+ ;;
+esac
+
+CONFIGURE="./configure.syno"
+case "$BUILD_TARGET" in
+ X64|BROMOLOW|CEDARVIEW|EVANSPORT|AVOTON|DOCKERX64|BROMOLOWESM|BRASWELL|APOLLOLAKE|GRANTLEY|BROADWELL|KVMX64|DENVERTON|BROADWELLNK|PURLEY|COFFEELAKE)
+ arch="i686"
+ ;;
+ PPC_QORIQ|PPC_853X)
+ arch="powerpc"
+ BIG_ENDIAN="yes"
+ ;;
+ ALPINE)
+ arch="armv7"
+ ALPINE_EXTRA_CFLAGS="-DSYNO_PLAT_NEON_LIBSWSCALE -I${SysRootPrefix}/pkg/include"
+ ALPINE_EXTRA_LDFLAGS="-L${SysRootPrefix}/pkg/lib"
+ ;;
+ MARVELL_ARMADA370|MARVELL_ARMADA375|MARVELL_ARMADAXP|MARVELL_ARMADA38X|MINDSPEED_COMCERTO2K|BROADCOM_NORTHSTARPLUS|STM_MONACO|HISILICON_HI3535|HISILICON_HI3536)
+ arch="armv7"
+ ;;
+ REALTEK_RTD1296|MARVELL_ARMADA37XX)
+ arch="aarch64"
+ ;;
+ MARVELL_88F6281)
+ arch="arm"
+ ;;
+ *)
+ echo "This platform($BUILD_TARGET) is not supported yet."
+ return
+ ;;
+esac
+
+STANDALONE="FALSE"
+
+JSONC_INC=$(pkg-config --cflags json-c)
+JSONC_LIB=$(pkg-config --libs json-c)
+
+if [ "TRUE" = "${STANDALONE}" ]; then
+ CUSTOM_CONFIG="
+ --disable-shared
+ --enable-static
+ "
+ CUSTOM_CFLAGS="-DSTANDALONE"
+else
+ CUSTOM_CONFIG="
+ --enable-shared
+ --disable-static
+ "
+ CUSTOM_CFLAGS=""
+fi
+
+COMMON_RPATH="-Wl,-rpath=/var/packages/VideoStation/target/lib/ffmpeg -Wl,-rpath=/var/packages/VideoStation/target/lib"
+CFLAGS="${CFLAGS} ${CUSTOM_CFLAGS} -DSYNO_VIDEOSTATION"
+LDFLAGS="${LDFLAGS} ${COMMON_RPATH}"
+
+COMMON_CONFIG="
+ --prefix=/usr/pkg
+ --incdir=\${prefix}/include/ffmpeg
+ --arch=${arch}
+ --target-os=linux
+ --cross-prefix=${ToolChainPrefix}
+ --enable-cross-compile
+ --enable-optimizations
+ --enable-pic
+ --enable-gpl
+ --enable-version3
+ --enable-nonfree
+ --enable-libfaac
+ --enable-encoders
+ --enable-pthreads
+ --disable-muxer=image2 --disable-muxer=image2pipe
+ --disable-swscale-alpha
+ --disable-ffplay
+ --disable-ffserver
+ --disable-doc
+ --disable-devices
+ --disable-bzlib
+ --disable-altivec
+ --enable-libopencore-amrnb
+ --enable-libopencore-amrwb
+ --enable-libmp3lame
+ --disable-decoder=amrnb
+ --disable-encoder=zmbv
+ --cc=${CC}
+ ${CUSTOM_CONFIG}
+ "
+
+export EXPORT_BUILD_TARGET="${BUILD_TARGET}"
+
+if [ "i686" = "${arch}" -a "EVANSPORT" = "${BUILD_TARGET}" ]; then
+
+EVANSPORT_INC="-I${SysRootInclude}/intelce-utilities -I${SysRootInclude}/intelce-utilities/linux_user"
+EVANSPORT_LDFLAGS="-L${SysRootLib}/intelce-utilities"
+EVANSPORT_RPATH_LINK="-Wl,-rpath-link=${SysRootLib}/intelce-utilities"
+
+# for evansport platform
+# add -DSYNO_EVANSPORT for header files in intelce-utilities
+
+env CC=${CC} \
+ CFLAGS="${CFLAGS} ${EVANSPORT_INC} ${JSONC_INC} -DSYNO_ENABLE_SMD -DSYNO_EVANSPORT" \
+ LDFLAGS="${LDFLAGS} ${EVANSPORT_LDFLAGS} ${EVANSPORT_RPATH_LINK}" \
+ CHECK_CFLAG="gnu99" \
+ EVANSPORT_LIB="${EVANSPORT_RPATH_LINK}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-yasm \
+ --enable-libx264 \
+ --enable-encoder=libx264 \
+ --enable-libh264_smd \
+ --enable-smd \
+ --disable-filter=hqdn3d \
+ --extra-libs="${JSONC_LIB} -lgdl -losal -lpal -lsven -lismd_core -lismd_audio -lismd_viddec -lismd_videnc -lismd_vidpproc -lplatform_config -lffmpeg_plugin"
+
+elif [ "i686" = "${arch}" -o "ALPINE" = "${BUILD_TARGET}" ]; then
+env CC=${CC} \
+ CFLAGS="${CFLAGS} ${ALPINE_EXTRA_CFLAGS}" \
+ LDFLAGS="${LDFLAGS} ${ALPINE_EXTRA_LDFLAGS}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-yasm \
+ --enable-libx264 \
+ --enable-encoder=libx264
+
+#support floating point platform with lame
+elif [ "powerpc" = "${arch}" -o "armv7" = "${arch}" -o "aarch64" = "${arch}" ]; then
+env CC=${CC} \
+ CFLAGS="${CFLAGS}" \
+ LDFLAGS="${LDFLAGS}" \
+ bigendian_platform="${BIG_ENDIAN}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-libfdk-aac
+
+#only support fixed point platform with shine
+elif [ "arm" = "${arch}" ]; then
+env CC=${CC} \
+ CFLAGS="${CFLAGS}" \
+ LDFLAGS="${LDFLAGS}" \
+ ${CONFIGURE} \
+ ${COMMON_CONFIG} \
+ --enable-libshine \
+ --enable-libfdk-aac
+
+else
+ echo "This platform($BUILD_TARGET) is not supported yet."
+ return
+fi
+
+make ${MAKE_FLAGS}
+make tools/qt-faststart ${MAKE_FLAGS}
+# vim:ft=sh
diff --git a/SynoBuildConf/depends b/SynoBuildConf/depends
new file mode 100644
index 0000000000..928b66dbc1
--- /dev/null
+++ b/SynoBuildConf/depends
@@ -0,0 +1,10 @@
+[BuildDependent-Tag]
+opencore-amr-0.1.2
+xz-5.x
+intelce-utilities
+json-c-0.x
+zlib-1.x
+lame-3.99.x
+faac-1.28
+x264
+
diff --git a/SynoBuildConf/depends-virtual-media-server b/SynoBuildConf/depends-virtual-media-server
new file mode 100755
index 0000000000..b63acaefc5
--- /dev/null
+++ b/SynoBuildConf/depends-virtual-media-server
@@ -0,0 +1,20 @@
+[BuildDependent]
+libshine-3.0.x
+fdk-aac-0.1.x
+x264-virtual-media-server
+
+[BuildDependent-Tag]
+opencore-amr-0.1.2
+xz-5.x
+intelce-utilities
+json-c-0.x
+zlib-1.x
+lame-3.99.x
+faac-1.28
+
+[ReferenceOnly-Tag]
+
+[ReferenceOnly]
+
+[default]
+all="6.0"
diff --git a/SynoBuildConf/depends-virtual-mplayer2 b/SynoBuildConf/depends-virtual-mplayer2
new file mode 100755
index 0000000000..a050cea864
--- /dev/null
+++ b/SynoBuildConf/depends-virtual-mplayer2
@@ -0,0 +1,11 @@
+[BuildDependent]
+soxr
+
+[BuildDependent-Tag]
+
+[ReferenceOnly-Tag]
+
+[ReferenceOnly]
+
+[default]
+all="6.0"
diff --git a/SynoBuildConf/depends-virtual-video-station b/SynoBuildConf/depends-virtual-video-station
new file mode 100755
index 0000000000..6f40bd495f
--- /dev/null
+++ b/SynoBuildConf/depends-virtual-video-station
@@ -0,0 +1,20 @@
+[BuildDependent]
+libshine-3.0.x
+fdk-aac-0.1.x
+x264-virtual-video-station
+
+[BuildDependent-Tag]
+opencore-amr-0.1.2
+xz-5.x
+intelce-utilities
+json-c-0.x
+zlib-1.x
+lame-3.99.x
+faac-1.28
+
+[ReferenceOnly-Tag]
+
+[ReferenceOnly]
+
+[default]
+all="6.0"
diff --git a/SynoBuildConf/error-virtual-media-server b/SynoBuildConf/error-virtual-media-server
new file mode 100644
index 0000000000..3525a4713b
--- /dev/null
+++ b/SynoBuildConf/error-virtual-media-server
@@ -0,0 +1,3 @@
+{
+ "Error": ["OS_INFO"]
+}
diff --git a/SynoBuildConf/error-virtual-video-station b/SynoBuildConf/error-virtual-video-station
new file mode 100644
index 0000000000..3525a4713b
--- /dev/null
+++ b/SynoBuildConf/error-virtual-video-station
@@ -0,0 +1,3 @@
+{
+ "Error": ["OS_INFO"]
+}
diff --git a/SynoBuildConf/install b/SynoBuildConf/install
new file mode 100644
index 0000000000..c8761311cd
--- /dev/null
+++ b/SynoBuildConf/install
@@ -0,0 +1,31 @@
+#!/bin/bash
+# Copyright (c) 2000-2015 Synology Inc. All rights reserved.
+
+INSTALL_DIRS="
+ /lib
+ /usr/bin
+"
+INSTALL_LIB="
+ ./libavcodec/libavcodec.so.56
+ ./libavdevice/libavdevice.so.56
+ ./libavfilter/libavfilter.so.5
+ ./libavformat/libavformat.so.56
+ ./libavutil/libavutil.so.54
+ ./libpostproc/libpostproc.so.53
+ ./libswresample/libswresample.so.1
+ ./libswscale/libswscale.so.3
+"
+INSTALL_USR_BIN="
+ ./tools/qt-faststart
+"
+DoInstall
+
+# to avoid SynoInstall strip check lead to error
+# install ffmpeg_g when DEBUG
+if [ "x$NOSTRIP" != "xNOSTRIP" ]; then
+ InstallFiles "/usr/bin" 755 ffmpeg
+else
+ InstallFiles "/usr/bin" 755 ffmpeg_g
+fi
+
+# vim:ft=sh
diff --git a/SynoBuildConf/install-dev b/SynoBuildConf/install-dev
new file mode 100644
index 0000000000..45f4195424
--- /dev/null
+++ b/SynoBuildConf/install-dev
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright (c) 2000-2015 Synology Inc. All rights reserved.
+
+case ${CleanOnly} in
+ [Yy][Ee][Ss])
+ return
+ ;;
+esac
+
+FFMEPG_INCLUDE="$DebDevDir$SynoIncludeDir/ffmpeg"
+[ -d $FFMEPG_INCLUDE ] || install -d $FFMEPG_INCLUDE
+install -m 644 synoconfig.h "$FFMEPG_INCLUDE"
+
+make DESTDIR=$DebDevDir install
+
+# Remove document
+rm -rf "$DebDevDir${SynoDir}/share"
+rm -rf "$DebDevDir${SynoDir}/bin"
+
+# vim:ft=sh
diff --git a/SynoBuildConf/install-dev-virtual-media-server b/SynoBuildConf/install-dev-virtual-media-server
new file mode 100755
index 0000000000..16bf3da105
--- /dev/null
+++ b/SynoBuildConf/install-dev-virtual-media-server
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright (c) 2000-2013 Synology Inc. All rights reserved.
+
+case ${CleanOnly} in
+ [Yy][Ee][Ss])
+ return
+ ;;
+esac
+
+SynoPkgDir="/usr/pkg"
+FFMEPG_INCLUDE="$DebDevDir$SynoPkgDir/include/ffmpeg"
+[ -d $FFMEPG_INCLUDE ] || install -d $FFMEPG_INCLUDE
+install -m 644 synoconfig.h "$FFMEPG_INCLUDE"
+
+make DESTDIR=$DebDevDir install
+# Remove document
+rm -rf "$DebDevDir${SynoPkgDir}/share"
+rm -rf "$DebDevDir${SynoPkgDir}/bin"
+
+# vim:ft=sh
diff --git a/SynoBuildConf/install-dev-virtual-video-station b/SynoBuildConf/install-dev-virtual-video-station
new file mode 100755
index 0000000000..16bf3da105
--- /dev/null
+++ b/SynoBuildConf/install-dev-virtual-video-station
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright (c) 2000-2013 Synology Inc. All rights reserved.
+
+case ${CleanOnly} in
+ [Yy][Ee][Ss])
+ return
+ ;;
+esac
+
+SynoPkgDir="/usr/pkg"
+FFMEPG_INCLUDE="$DebDevDir$SynoPkgDir/include/ffmpeg"
+[ -d $FFMEPG_INCLUDE ] || install -d $FFMEPG_INCLUDE
+install -m 644 synoconfig.h "$FFMEPG_INCLUDE"
+
+make DESTDIR=$DebDevDir install
+# Remove document
+rm -rf "$DebDevDir${SynoPkgDir}/share"
+rm -rf "$DebDevDir${SynoPkgDir}/bin"
+
+# vim:ft=sh
diff --git a/SynoBuildConf/install-virtual-media-server b/SynoBuildConf/install-virtual-media-server
new file mode 100755
index 0000000000..7ef6aec144
--- /dev/null
+++ b/SynoBuildConf/install-virtual-media-server
@@ -0,0 +1,50 @@
+#!/bin/bash
+# Copyright (c) 2000-2012 Synology Inc. All rights reserved.
+libshine="libshine-3.0.x"
+libfdkaac="fdk-aac-0.1.x"
+
+case "$BUILD_TARGET" in
+ X64|BROMOLOW|CEDARVIEW|EVANSPORT|AVOTON|DOCKERX64|GRANTLEY|BRASWELL|APOLLOLAKE|BROADWELL|KVMX64|ALPINE|DENVERTON|BROADWELLNK|PURLEY|COFFEELAKE)
+ IncludeProjects=""
+ ;;
+ PPC_853X|PPC_QORIQ| \
+ MARVELL_88F6281|MARVELL_ARMADAXP|MARVELL_ARMADA370|MARVELL_ARMADA375|MARVELL_ARMADA38X|REALTEK_RTD1296|\
+ MINDSPEED_COMCERTO2K|BROADCOM_NORTHSTARPLUS|STM_MONACO|HISILICON_HI3536|MARVELL_ARMADA37XX)
+ IncludeProjects="${libshine} ${libfdkaac}"
+ ;;
+ *)
+ echo "This platform($BUILD_TARGET) is not supported yet."
+ exit 1
+ ;;
+esac
+
+# install related projects
+for prj in $IncludeProjects; do
+ env INST_DIR="$INST_DIR" \
+ $ScriptsDir/SynoInstall --single ${prj}
+done
+
+# install ffmpeg project
+InstallPreparePkgDir $INST_DIR "lib/ffmpeg"
+InstallPreparePkgDir $INST_DIR "bin"
+
+LibList=(
+ libavcodec/libavcodec.so.56
+ libavdevice/libavdevice.so.56
+ libavfilter/libavfilter.so.5
+ libavformat/libavformat.so.56
+ libavutil/libavutil.so.54
+ libpostproc/libpostproc.so.53
+ libswresample/libswresample.so.1
+ libswscale/libswscale.so.3
+ )
+
+LibNum=${#LibList[@]}
+
+for (( i=0 ; i < $LibNum ; i++ ))
+do
+ echo "install ${LibList[$i]}"
+ InstallPkgFiles $INST_DIR "lib/ffmpeg" 644 ${LibList[$i]}
+done
+
+InstallPkgFiles $INST_DIR "bin" 755 "ffmpeg ffserver ffprobe"
diff --git a/SynoBuildConf/install-virtual-mplayer2 b/SynoBuildConf/install-virtual-mplayer2
new file mode 100755
index 0000000000..5e984171af
--- /dev/null
+++ b/SynoBuildConf/install-virtual-mplayer2
@@ -0,0 +1,30 @@
+#!/bin/bash
+# Copyright (c) 2000-2012 Synology Inc. All rights reserved.
+
+INST_DIR="/tmp/_audiostation"
+
+InstallPreparePkgDir $INST_DIR "lib/ffmpeg"
+InstallPreparePkgDir $INST_DIR "bin"
+
+LibList=(
+ libavcodec/libavcodec.so.56
+ libavdevice/libavdevice.so.56
+ libavfilter/libavfilter.so.5
+ libavformat/libavformat.so.56
+ libavutil/libavutil.so.54
+ libswresample/libswresample.so.1
+ libswscale/libswscale.so.3
+ libavresample/libavresample.so.2
+ )
+
+LibNum=${#LibList[@]}
+
+for (( i=0 ; i < $LibNum ; i++ ))
+do
+echo "install ${LibList[$i]}"
+InstallPkgFiles $INST_DIR "lib/ffmpeg" 644 ${LibList[$i]}
+done
+
+InstallPkgFiles $INST_DIR "bin" 755 "ffmpeg"
+
+DoInstall
diff --git a/SynoBuildConf/install-virtual-video-station b/SynoBuildConf/install-virtual-video-station
new file mode 100755
index 0000000000..aa753c4f02
--- /dev/null
+++ b/SynoBuildConf/install-virtual-video-station
@@ -0,0 +1,50 @@
+#!/bin/bash
+# Copyright (c) 2000-2012 Synology Inc. All rights reserved.
+libshine="libshine-3.0.x"
+libfdkaac="fdk-aac-0.1.x"
+
+case "$BUILD_TARGET" in
+ X64|BROMOLOW|CEDARVIEW|EVANSPORT|AVOTON|DOCKERX64|GRANTLEY|BRASWELL|APOLLOLAKE|BROADWELL|KVMX64|ALPINE|DENVERTON|BROADWELLNK|PURLEY|COFFEELAKE)
+ IncludeProjects=""
+ ;;
+ PPC_853X|PPC_QORIQ| \
+ MARVELL_88F6281|MARVELL_ARMADAXP|MARVELL_ARMADA370|MARVELL_ARMADA375|MARVELL_ARMADA38X|REALTEK_RTD1296|\
+ MINDSPEED_COMCERTO2K|BROADCOM_NORTHSTARPLUS|STM_MONACO|HISILICON_HI3536|MARVELL_ARMADA37XX)
+ IncludeProjects="${libshine} ${libfdkaac}"
+ ;;
+ *)
+ echo "This platform($BUILD_TARGET) is not supported yet."
+ exit 1
+ ;;
+esac
+
+# install related projects
+for prj in $IncludeProjects; do
+ env INST_DIR="$INST_DIR" \
+ $ScriptsDir/SynoInstall --single ${prj}
+done
+
+# install ffmpeg project
+InstallPreparePkgDir $INST_DIR "lib/ffmpeg"
+InstallPreparePkgDir $INST_DIR "bin"
+
+LibList=(
+ libavcodec/libavcodec.so.56
+ libavdevice/libavdevice.so.56
+ libavfilter/libavfilter.so.5
+ libavformat/libavformat.so.56
+ libavutil/libavutil.so.54
+ libpostproc/libpostproc.so.53
+ libswresample/libswresample.so.1
+ libswscale/libswscale.so.3
+ )
+
+LibNum=${#LibList[@]}
+
+for (( i=0 ; i < $LibNum ; i++ ))
+do
+ echo "install ${LibList[$i]}"
+ InstallPkgFiles $INST_DIR "lib/ffmpeg" 644 ${LibList[$i]}
+done
+
+InstallPkgFiles $INST_DIR "bin" 755 "ffmpeg ffprobe"
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000000..860487ca19
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+2.7.1
diff --git a/configure b/configure
index 3960b735c1..0a4efb8a8e 100755
--- a/configure
+++ b/configure
@@ -281,6 +281,7 @@ External library support:
--enable-x11grab enable X11 grabbing (legacy) [no]
--disable-xlib disable xlib [autodetect]
--disable-zlib disable zlib [autodetect]
+ --enable-smd enable hardware decoding[disables software decoding]
Toolchain options:
--arch=ARCH select architecture [$arch]
@@ -419,7 +420,7 @@ log(){
log_file(){
log BEGIN $1
- pr -n -t $1 >> $logfile
+# pr -n -t $1 >> $logfile
log END $1
}
@@ -1412,6 +1413,7 @@ EXTERNAL_LIBRARY_LIST="
libwavpack
libwebp
libx264
+ libh264_smd
libx265
libxavs
libxcb
@@ -1433,6 +1435,7 @@ EXTERNAL_LIBRARY_LIST="
x11grab
xlib
zlib
+ smd
"
DOCUMENT_LIST="
@@ -2476,6 +2479,7 @@ libwavpack_encoder_deps="libwavpack"
libwebp_encoder_deps="libwebp"
libwebp_anim_encoder_deps="libwebp"
libx264_encoder_deps="libx264"
+libh264_smd_encoder_deps="libh264_smd"
libx264rgb_encoder_deps="libx264"
libx264rgb_encoder_select="libx264_encoder"
libx265_encoder_deps="libx265"
@@ -2965,7 +2969,7 @@ print_3_columns() {
show_list() {
suffix=_$1
shift
- echo $* | sed s/$suffix//g | print_3_columns
+# echo $* | sed s/$suffix//g | print_3_columns
exit 0
}
@@ -3549,14 +3553,14 @@ probe_cc(){
_type=pathscale
_ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
_depflags='-MMD -MF $(@:.o=.d) -MT $@'
- _cflags_speed='-O2'
+ _cflags_speed='-O3'
_cflags_size='-Os'
_flags_filter='filter_out -Wdisabled-optimization'
elif $_cc -v 2>&1 | grep -q Open64; then
_type=open64
_ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
_depflags='-MMD -MF $(@:.o=.d) -MT $@'
- _cflags_speed='-O2'
+ _cflags_speed='-O3'
_cflags_size='-Os'
_flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
elif $_cc -V 2>&1 | grep -q Portland; then
@@ -4096,7 +4100,13 @@ fi
add_cppflags -D_ISOC99_SOURCE
add_cxxflags -D__STDC_CONSTANT_MACROS
-check_cflags -std=c99
+
+if [ "${CHECK_CFLAG}" = gnu99 ]; then
+ check_cflags -std=gnu99
+else
+ check_cflags -std=c99
+fi
+
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
#include <stdlib.h>
EOF
@@ -4605,7 +4615,9 @@ EOF
check_cc <<EOF || die "endian test failed"
unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF
-od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
+if [ "yes" = "$bigendian_platform" ]; then
+ enable bigendian
+fi
if ! enabled ppc64 || enabled bigendian; then
disable vsx
@@ -5122,7 +5134,7 @@ enabled libpulse && require_pkg_config libpulse pulse/pulseaudio.h pa_c
enabled libquvi && require_pkg_config libquvi quvi/quvi.h quvi_init
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
-enabled libshine && require_pkg_config shine shine/layer3.h shine_encode_buffer
+enabled libshine && require shine shine/layer3.h shine_encode_buffer -lm -lshine
enabled libsmbclient && { use_pkg_config smbclient libsmbclient.h smbc_init ||
require smbclient libsmbclient.h smbc_init -lsmbclient; }
enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr
@@ -5152,6 +5164,7 @@ enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFil
enabled libwebp && {
enabled libwebp_encoder && require_pkg_config "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion
enabled libwebp_anim_encoder && { use_pkg_config "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit || disable libwebp_anim_encoder; } }
+enabled libh264_smd && require libffmpeg_plugin libffmpeg_plugin/ismd_ffmpeg_video_enc.h ismd_ffmpeg_video_encoder_dequeue -lffmpeg_plugin
enabled libx264 && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode ||
{ require libx264 x264.h x264_encoder_encode -lx264 &&
warn "using libx264 without pkg-config"; } } &&
@@ -5512,7 +5525,7 @@ elif enabled gcc; then
check_cflags -Werror=implicit-function-declaration
check_cflags -Werror=missing-prototypes
check_cflags -Werror=return-type
- check_cflags -Werror=vla
+# check_cflags -Werror=vla
check_cflags -Wformat
check_cflags -fdiagnostics-color=auto
enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
@@ -5779,7 +5792,7 @@ echo
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
echo "Enabled ${type}s:"
eval list=\$$(toupper $type)_LIST
- print_enabled '_*' $list | print_3_columns
+# print_enabled '_*' $list | print_3_columns
echo
done
@@ -6041,7 +6054,7 @@ Version: $version
Requires: $(enabled shared || echo $requires)
Requires.private: $(enabled shared && echo $requires)
Conflicts:
-Libs: -L\${libdir} $(enabled rpath && echo "-Wl,-rpath,\${libdir}") -l${shortname} $(enabled shared || echo $libs)
+Libs: -L\${libdir} ${EVANSPORT_LIB} $(enabled rpath && echo "-Wl,-rpath,\${libdir}") -l${shortname} $(enabled shared || echo $libs)
Libs.private: $(enabled shared && echo $libs)
Cflags: -I\${includedir}
EOF
diff --git a/ffmpeg.c b/ffmpeg.c
index f5029987ad..46ea2358dd 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -104,6 +104,87 @@
#include "libavutil/avassert.h"
+#include "synoconfig.h"
+
+#ifdef SYNO_EVANSPORT_SMD
+//smd headers
+#include "osal_type.h"
+#include "ismd_vidpproc.h"
+#include "libffmpeg_plugin/ismd_ffmpeg_util.h"
+#include "libffmpeg_plugin/ismd_ffmpeg_video_dec.h"
+#include "libffmpeg_plugin/ismd_ffmpeg_video_enc.h"
+#include "libffmpeg_plugin/ismd_ffmpeg_bitstream.h"
+
+#include "libavcodec/ismd_ffmpeg_audio_util.h"
+#include "libavformat/avformat.h"
+#include "libavcodec/h264_smd.h"
+#include "libavcodec/vc1.h"
+#include "libavcodec/avcodec.h"
+#include "libavcodec/syno_trans_loading.h"
+#if CONFIG_LIBX264_ENCODER
+#include <x264.h>
+#endif
+
+typedef struct X264Context {
+ AVClass *class;
+#if CONFIG_LIBX264_ENCODER
+ x264_param_t params;
+ x264_t *enc;
+ x264_picture_t pic;
+#endif
+ uint8_t *sei;
+ int sei_size;
+ char *preset;
+ char *tune;
+ char *profile;
+ char *level;
+ int fastfirstpass;
+ char *wpredp;
+ char *x264opts;
+ float crf;
+ float crf_max;
+ int cqp;
+ int aq_mode;
+ float aq_strength;
+ char *psy_rd;
+ int psy;
+ int rc_lookahead;
+ int weightp;
+ int weightb;
+ int ssim;
+ int intra_refresh;
+ int bluray_compat;
+ int b_bias;
+ int b_pyramid;
+ int mixed_refs;
+ int dct8x8;
+ int fast_pskip;
+ int aud;
+ int mbtree;
+ char *deblock;
+ float cplxblur;
+ char *partitions;
+ int direct_pred;
+ int slice_max_size;
+ char *stats;
+ int nal_hrd;
+ int avcintra_class;
+ char *x264_params;
+#ifdef SYNO_EVANSPORT_FLV_EXTRADATA
+ bool dont_free_extradata;
+#endif
+} X264Context;
+
+static viddec_struct_t vid_dec;
+static videnc_struct_t vid_enc;
+bool smd_video_pipeline = false;
+int smd_frame_rate;
+static ismd_codec_type_t get_smd_codec_id(enum AVCodecID ffmpeg_codec_id);
+bool first_read_pts = true;
+int64_t last_pts = -1;
+//smd end
+#endif
+
const char program_name[] = "ffmpeg";
const int program_birth_year = 2000;
@@ -426,12 +507,27 @@ const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
static void ffmpeg_cleanup(int ret)
{
int i, j;
+#ifdef SYNO_EVANSPORT_SMD
+ ismd_result_t ret_val = ISMD_ERROR_UNSPECIFIED;
+#endif
if (do_benchmark) {
int maxrss = getmaxrss() / 1024;
printf("bench: maxrss=%ikB\n", maxrss);
}
+#ifdef SYNO_EVANSPORT_SMD
+ /**************** smd code *******************/
+ synoRemovePID(getpid());
+ if(smd_video_pipeline)
+ {
+ ret_val = ismd_ffmpeg_free_vid_enc_res(&vid_enc);
+ if(ret_val != ISMD_SUCCESS)
+ av_log(NULL,AV_LOG_ERROR,"could not free video encoder resources\n");
+ }
+ /**************** smd code end*******************/
+#endif
+
for (i = 0; i < nb_filtergraphs; i++) {
FilterGraph *fg = filtergraphs[i];
avfilter_graph_free(&fg->graph);
@@ -1018,6 +1114,12 @@ static void do_video_out(AVFormatContext *s,
}
ost->last_droped = nb_frames == nb0_frames && next_picture;
+#ifdef SYNO_EVANSPORT_SMD
+ if (smd_video_pipeline) {
+ nb_frames = 1;
+ }
+#endif
+
/* duplicates frame if needed */
for (i = 0; i < nb_frames; i++) {
AVFrame *in_picture;
@@ -1061,6 +1163,10 @@ static void do_video_out(AVFormatContext *s,
int got_packet, forced_keyframe = 0;
double pts_time;
+#ifdef SYNO_EVANSPORT_SMD
+ if(!smd_video_pipeline)
+ {
+#endif
if (enc->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME) &&
ost->top_field_first >= 0)
in_picture->top_field_first = !!ost->top_field_first;
@@ -1127,6 +1233,123 @@ static void do_video_out(AVFormatContext *s,
ret = avcodec_encode_video2(enc, &pkt, in_picture, &got_packet);
update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
+
+#ifdef SYNO_EVANSPORT_SMD
+ } else {
+ unsigned long fps_num;
+ unsigned long fps_den;
+ unsigned long macroblock_per_sec;
+ unsigned long max_macroblock_per_sec;
+ char* level;
+ bool override;
+ double temp_num;
+ int pkt_size;
+ X264Context *x4 = enc->priv_data;
+ smd_h264_picture_t pic_out;
+ got_packet = 0;
+ ret = 0;
+
+ if ((pkt_size = syno_ismd_ffmpeg_video_encoder_get_first_node_size(&vid_enc)) < 0) {
+ av_log(NULL, AV_LOG_FATAL, "ismd_ffmpeg_video_encoder_dequeue_size_syno\n");
+ exit_program(1);
+ }
+ if (pkt_size > 0) {
+ if (syno_alloc_packet(&pkt, pkt_size) < 0) {
+ av_log(NULL, AV_LOG_FATAL, "syno_alloc_packet error at encoder SMD\n");
+ exit_program(1);
+ }
+ ret = ismd_ffmpeg_video_encoder_dequeue(pkt.data, &pic_out,&vid_enc);
+ if (ret != pkt_size) {
+ av_log(NULL, AV_LOG_FATAL, "ismd_ffmpeg_video_encoder_dequeue size not conform\n");
+ }
+ memset(pkt.data + pkt.size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+ }
+
+ if(ret > 0)
+ {
+ if (enable_dtv_smd) {
+ enc->coded_frame->pts = av_rescale_q(pic_out.i_pts, AV_TIME_BASE_Q, enc->time_base);
+ if (AV_NOPTS_VALUE != enc->coded_frame->pts) {
+ pkt.pts= enc->coded_frame->pts;
+ }
+ } else {
+ //TODO call just once
+ ismd_result_t ret_smd = ismd_viddec_get_frame_rate(vid_dec.viddec_handle, &fps_num, &fps_den, &override);
+ if (ret_smd == ISMD_SUCCESS)
+ {
+ temp_num = 90000/(double)fps_num;
+ smd_frame_rate = temp_num*fps_den;//smd clock resuolution is 90000 ticks
+ macroblock_per_sec = ((enc->width*enc->height)/256) *(fps_num/fps_den);
+ if(!x4->level)
+ level = "4.1";
+ else
+ level = x4->level;
+ max_macroblock_per_sec = ismd_ffmpeg_max_macroblock(level);
+ if(macroblock_per_sec > max_macroblock_per_sec)
+ {
+ av_log(enc,AV_LOG_INFO,"macroblocks_per_sec requested %ld\n",macroblock_per_sec);
+ av_log(enc,AV_LOG_INFO,"max macroblocks_per_sec suppored for level %s are %ld\n",level,max_macroblock_per_sec);
+ av_log(enc,AV_LOG_INFO,"please try transcoding to lower resolution\n");
+ exit_program(1);
+ }
+ }
+
+ enc->coded_frame->pts = pic_out.i_pts/smd_frame_rate;
+ if (AV_NOPTS_VALUE != enc->coded_frame->pts) {
+ pkt.pts= enc->coded_frame->pts;
+ if (ist) {
+ pkt.pts += av_rescale_q(input_files[ist->file_index]->first_pts, AV_TIME_BASE_Q, enc->time_base);
+ }
+ }
+ }
+
+ switch (pic_out.i_type)
+ {
+ case SLICE_P:
+ av_log(NULL,AV_LOG_DEBUG,"\n********returning pict type AV_PICTURE_TYPE_P\n");
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_P;
+ break;
+ case SLICE_B:
+ av_log(NULL,AV_LOG_DEBUG,"\n********returning pict type AV_PICTURE_TYPE_B\n");
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_B;
+ break;
+ case SLICE_I:
+ av_log(NULL,AV_LOG_DEBUG,"\n********returning pict type AV_PICTURE_TYPE_I\n");
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_I;
+ break;
+ default:
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_NONE;
+ av_log(NULL,AV_LOG_DEBUG,"\n********ERROR invalid picture type ************\n");
+
+ }
+ enc->coded_frame->key_frame = pic_out.b_keyframe;
+ if (pic_out.b_keyframe) {
+ pkt.flags |= AV_PKT_FLAG_KEY;
+ }
+ if (enable_dtv_smd) {
+ // enable dtv_smd flag, every frame is carryed the same timestamp from input file
+ // on hardware pipeline mode. But we encounter problem of non monotonically increasing
+ // timestamp. min_heap is reorder frame and filter some abnormal frame.
+ ret = syno_smd_push_heap(&pkt);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_FATAL, "syno_smd_push_heap failed\n");
+ exit_program(1);
+ }
+ if (0 == syno_smd_get_heap(&pkt, 0)) {
+ if (last_pts >= pkt.pts) {
+ av_free_packet(&pkt);
+ } else {
+ last_pts = pkt.pts;
+ got_packet = 1;
+ }
+ }
+ } else {
+ got_packet = 1;
+ }
+ }
+ }
+#endif
+
if (ret < 0) {
av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
exit_program(1);
@@ -1631,6 +1854,9 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
static void flush_encoders(void)
{
int i, ret;
+#ifdef SYNO_EVANSPORT_SMD
+ InputStream *ist = NULL;
+#endif
for (i = 0; i < nb_output_streams; i++) {
OutputStream *ost = output_streams[i];
@@ -1656,6 +1882,9 @@ static void flush_encoders(void)
desc = "Audio";
break;
case AVMEDIA_TYPE_VIDEO:
+#ifdef SYNO_EVANSPORT_SMD
+ usleep(1000);
+#endif
encode = avcodec_encode_video2;
desc = "Video";
break;
@@ -1671,9 +1900,111 @@ static void flush_encoders(void)
pkt.data = NULL;
pkt.size = 0;
+#ifdef SYNO_EVANSPORT_SMD
+ if (!smd_video_pipeline || AVMEDIA_TYPE_VIDEO != ost->st->codec->codec_type ) {
+#endif
update_benchmark(NULL);
ret = encode(enc, &pkt, NULL, &got_packet);
update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
+#ifdef SYNO_EVANSPORT_SMD
+ } else {
+ unsigned long fps_num;
+ unsigned long fps_den;
+ bool override;
+ double temp_num;
+ int pkt_size;
+ smd_h264_picture_t pic_out;
+ ret = 0;
+
+ if ((pkt_size = syno_ismd_ffmpeg_video_encoder_get_first_node_size(&vid_enc)) < 0) {
+ av_log(NULL, AV_LOG_FATAL, "ismd_ffmpeg_video_encoder_dequeue_size_syno\n");
+ exit_program(1);
+ }
+ if (pkt_size > 0) {
+ if (syno_alloc_packet(&pkt, pkt_size) < 0) {
+ av_log(NULL, AV_LOG_FATAL, "syno_alloc_packet error at encoder SMD\n");
+ exit_program(1);
+ }
+ ret = ismd_ffmpeg_video_encoder_dequeue(pkt.data, &pic_out,&vid_enc);
+ if (ret != pkt_size) {
+ av_log(NULL, AV_LOG_FATAL, "ismd_ffmpeg_video_encoder_dequeue size not conform\n");
+ }
+ memset(pkt.data + pkt.size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
+ }
+
+ if(ret > 0)
+ {
+ if (enable_dtv_smd) {
+ enc->coded_frame->pts = av_rescale_q(pic_out.i_pts, AV_TIME_BASE_Q, enc->time_base);
+ if (AV_NOPTS_VALUE != enc->coded_frame->pts) {
+ pkt.pts= enc->coded_frame->pts;
+ }
+ } else {
+ //TODO call just once
+ ismd_result_t ret_smd = ismd_viddec_get_frame_rate(vid_dec.viddec_handle, &fps_num, &fps_den, &override);//this actually returns fps
+ if (ret_smd == ISMD_SUCCESS)
+ {
+ temp_num = 90000/(double)fps_num;
+ smd_frame_rate = temp_num*fps_den;//smd clock resuolution is 90000 ticks
+ }
+ av_log(NULL,AV_LOG_DEBUG,"\n********pts from encoder %lld\n",pic_out.i_pts);
+
+ enc->coded_frame->pts = pic_out.i_pts/smd_frame_rate;
+ if (AV_NOPTS_VALUE != enc->coded_frame->pts) {
+ pkt.pts= enc->coded_frame->pts;
+ if (ost->source_index >= 0)
+ ist = input_streams[ost->source_index];
+ if (ist) {
+ pkt.pts += av_rescale_q(input_files[ist->file_index]->first_pts, AV_TIME_BASE_Q, enc->time_base);
+ }
+ }
+ }
+
+ switch (pic_out.i_type)
+ {
+ case SLICE_P:
+ av_log(NULL,AV_LOG_DEBUG,"\n*******returning pict type AV_PICTURE_TYPE_P\n");
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_P;
+ break;
+ case SLICE_B:
+ av_log(NULL,AV_LOG_DEBUG,"\n*****returning pict type AV_PICTURE_TYPE_B\n");
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_B;
+ break;
+ case SLICE_I:
+ av_log(NULL,AV_LOG_DEBUG,"\n******returning pict type AV_PICTURE_TYPE_I\n");
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_I;
+ break;
+ default:
+ enc->coded_frame->pict_type = AV_PICTURE_TYPE_NONE;
+ av_log(NULL,AV_LOG_DEBUG,"\n*****ERROR invalid picture type ************\n");
+
+ }
+ enc->coded_frame->key_frame = pic_out.b_keyframe;
+ if (pic_out.b_keyframe) {
+ pkt.flags |= AV_PKT_FLAG_KEY;
+ }
+
+ if (enable_dtv_smd) {
+ //TODO we should care about flush heap buffer
+ ret = syno_smd_push_heap(&pkt);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_FATAL, "syno_smd_push_heap failed\n");
+ exit_program(1);
+ }
+ if (0 == syno_smd_get_heap(&pkt, 1)) {
+ if (last_pts >= pkt.pts) {
+ av_free_packet(&pkt);
+ } else {
+ last_pts = pkt.pts;
+ got_packet = 1;
+ }
+ }
+ } else {
+ got_packet = 1;
+ }
+ }
+ }
+#endif
if (ret < 0) {
av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
exit_program(1);
@@ -1681,6 +2012,9 @@ static void flush_encoders(void)
if (ost->logfile && enc->stats_out) {
fprintf(ost->logfile, "%s", enc->stats_out);
}
+#ifdef SYNO_EVANSPORT_SMD
+ if(!smd_video_pipeline) {
+#endif
if (!got_packet) {
stop_encoding = 1;
break;
@@ -1692,6 +2026,21 @@ static void flush_encoders(void)
av_packet_rescale_ts(&pkt, enc->time_base, ost->st->time_base);
pkt_size = pkt.size;
write_frame(os, &pkt, ost);
+#ifdef SYNO_EVANSPORT_SMD
+ } else {
+ if ((ret <= 0) && (vid_enc.eos_received)) {
+ stop_encoding = 1;
+ break;
+ }
+ if (ret >0) {
+ if (pkt.pts != AV_NOPTS_VALUE)
+ pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
+ if (pkt.dts != AV_NOPTS_VALUE)
+ pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
+ write_frame(os, &pkt, ost);
+ }
+ }
+#endif
if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) {
do_video_stats(ost, pkt_size);
}
@@ -1979,6 +2328,29 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
{
+#ifdef SYNO_EVANSPORT_SMD
+ /********************* smd implementation *****************/
+ const uint8_t *buf = pkt->data;
+ int buf_size = pkt->size;
+ uint8_t* buf_with_start_code = NULL;
+ int new_buf_size = buf_size;
+ uint8_t* sps_pps_buf =NULL;
+ AVCodecContext *avctx = ist->dec_ctx;
+
+ ismd_buffer_handle_t ismd_buf = -1;
+ ismd_result_t result = ISMD_SUCCESS;
+ int sps_pps_buf_size =0;
+ bool first_time =true;
+ unsigned char pSeqHeaderRbdu[8];
+ unsigned char SPMP_PESpacket_PayloadFormatHeader[16];
+ int size_SPMP_PESpacket_PayloadFormatHeader;
+ int max_bufsize =0;
+ ismd_codec_type_t smd_codec;
+ H264Context *h;
+ VC1Context *v;
+ /********************* end *****************/
+#endif
+
AVFrame *decoded_frame, *f;
int i, ret = 0, err = 0, resample_changed;
int64_t best_effort_timestamp;
@@ -1991,6 +2363,10 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
decoded_frame = ist->decoded_frame;
pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
+#ifdef SYNO_EVANSPORT_SMD
+ if(!smd_video_pipeline)
+ {
+#endif
update_benchmark(NULL);
ret = avcodec_decode_video2(ist->dec_ctx,
decoded_frame, got_output, pkt);
@@ -2116,6 +2492,251 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
}
}
+#ifdef SYNO_EVANSPORT_SMD
+ } else {
+ int64_t pts;
+ ret = pkt->size;
+ if (pkt->pts != AV_NOPTS_VALUE) {
+ pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
+ } else {
+ pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
+ }
+ /******************** write data to decoder input port *******************/
+ smd_codec = get_smd_codec_id(ist->st->codec->codec_id);
+// av_log(NULL,AV_LOG_DEBUG,"\nin transcode_video smd_codec %d\n",smd_codec);
+ switch (smd_codec)
+ {
+ //no special handling is required for mpeg2 mpeg4
+ //we are not supporting msmpeg4
+ case ISMD_CODEC_TYPE_MPEG2:
+ case ISMD_CODEC_TYPE_MPEG4:
+ av_log(NULL, AV_LOG_DEBUG, "\n********* in ISMD_CODEC_TYPE_MPEG2/ISMD_CODEC_TYPE_MPEG4 case **************\n");
+ av_log(NULL, AV_LOG_DEBUG, "\navctx->extradata_size %d\n",avctx->extradata_size);
+ //send headers before first packet
+ if((vid_dec.send_sps_pps) && (avctx->extradata_size > 0))
+ {
+ if ((result = ismd_buffer_alloc(CHUNK_SIZE, &ismd_buf)) == ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_DEBUG,"\n********* sending extradata size %d ********\n",avctx->extradata_size);
+ if (enable_dtv_smd) {
+ result = syno_ismd_ffmpeg_fill_viddec_buffer(avctx->extradata, ismd_buf,avctx->extradata_size, pts);
+ } else {
+ result = ismd_ffmpeg_fill_viddec_buffer(avctx->extradata, ismd_buf,avctx->extradata_size);
+ }
+ if (result == ISMD_SUCCESS)
+ {
+ // decode it asynchronously
+ if ((result = ismd_ffmpeg_decoder_port_write(&vid_dec,ismd_buf)) != ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_ERROR,"error: unable to decode smd_buffers11 [%d]\n", result);
+ }
+ }
+ }
+ else
+ {
+ av_log(NULL, AV_LOG_INFO,"error: unable to allocate buffer in decode_frame111 [%d]\n", result);
+ }
+ vid_dec.send_sps_pps = false;
+ }
+ //Mpeg1Context *s = avctx->priv_data;
+ buf_with_start_code = buf;//format is not avc1 so coming buffer is in Byte-stream format.no conversion required
+ if (enable_dtv_smd) {
+ syno_ismd_ffmpeg_decode_vid_buf(&vid_dec, buf_with_start_code, new_buf_size, pts);
+ } else {
+ ismd_ffmpeg_decode_vid_buf(&vid_dec, buf_with_start_code, new_buf_size);
+ }
+ break;
+ case ISMD_CODEC_TYPE_H264:
+ h = avctx->priv_data;
+ if(buf_size > 4)
+ {
+ if(h->is_avc)
+ {
+ buf_with_start_code = av_malloc(pkt->size);//allocate memory for new buffer
+ if(buf_with_start_code == NULL)
+ {
+ av_log(NULL,AV_LOG_ERROR,"\ncould not allocate memory for new buffer \n");
+ assert(0);
+ }
+ if((vid_dec.send_sps_pps) && avctx->extradata_size > 0 && avctx->extradata)
+ {
+ sps_pps_buf_size = ismd_ffmpeg_h264_viddec_extract_sps_pps(avctx->extradata,avctx->extradata_size, &sps_pps_buf);
+ }
+
+ new_buf_size = ismd_ffmpeg_unit_to_byte_stream(&buf_with_start_code, buf, pkt->size, h->nal_length_size);
+ }
+ else
+ {
+ buf_with_start_code = buf;//format is not avc1 so coming buffer is in Byte-stream format.no conversion required
+ }
+ }
+
+ /******************** write sps/pps buffer for avc1 at decoder i/p port ************************************************/
+ if((vid_dec.send_sps_pps) && h->is_avc)
+ {
+ if ((result = ismd_buffer_alloc(CHUNK_SIZE, &ismd_buf)) == ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_DEBUG,"\n********* sending sps pps buffer write size %d ********\n",sps_pps_buf_size);
+ if (enable_dtv_smd) {
+ result = syno_ismd_ffmpeg_fill_viddec_buffer(sps_pps_buf, ismd_buf, sps_pps_buf_size, pts);
+ } else {
+ result = ismd_ffmpeg_fill_viddec_buffer(sps_pps_buf, ismd_buf, sps_pps_buf_size);
+ }
+ if (result == ISMD_SUCCESS)
+ {
+ // decode it asynchronously
+ if ((result = ismd_ffmpeg_decoder_port_write(&vid_dec,ismd_buf)) != ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_ERROR,"error: unable to decode smd_buffers11 [%d]\n", result);
+ }
+ }
+ }
+ else
+ {
+ av_log(NULL, AV_LOG_INFO,"error: unable to allocate buffer in decode_frame111 [%d]\n", result);
+ }
+ vid_dec.send_sps_pps = false;
+ }
+ /******************** write nal data of slice data at decoder i/p port ************************************************/
+ if (enable_dtv_smd) {
+ syno_ismd_ffmpeg_decode_vid_buf(&vid_dec, buf_with_start_code, new_buf_size, pts);
+ } else {
+ ismd_ffmpeg_decode_vid_buf(&vid_dec, buf_with_start_code, new_buf_size);
+ }
+
+ if((h->is_avc)&& buf_with_start_code)
+ {
+ av_free(buf_with_start_code);
+ buf_with_start_code = NULL;
+ }
+ break;
+ case ISMD_CODEC_TYPE_VC1:
+ v = avctx->priv_data;
+ if (first_time && (buf_size >= 4)&& (!IS_MARKER(AV_RB32(buf)))) /*frame starts with marker and needs to be parsed */
+ {
+ vid_dec.vc1_without_start_code = true;//not compatible with smd
+ first_time = false;
+
+ }
+ if(vid_dec.vc1_without_start_code)
+ {
+ //write sps to decoder port first this comes out-of-band in wvc1
+ if((vid_dec.send_sps_pps) && avctx->extradata_size > 0 && avctx->extradata)
+ {
+ uint8_t* seq_header_buf = av_malloc(16);//TODO free buffer
+ switch (v->profile)
+ {
+ case PROFILE_ADVANCED:
+ if ((result = ismd_buffer_alloc(CHUNK_SIZE, &ismd_buf)) == ISMD_SUCCESS)
+ {
+ if (enable_dtv_smd) {
+ result = syno_ismd_ffmpeg_fill_viddec_buffer(avctx->extradata+1, ismd_buf, avctx->extradata_size-1, pts);
+ } else {
+ result = ismd_ffmpeg_fill_viddec_buffer(avctx->extradata+1, ismd_buf, avctx->extradata_size-1);
+ }
+ if (result == ISMD_SUCCESS)
+ {
+ // decode it asynchronously
+ if ((result = ismd_ffmpeg_decoder_port_write(&vid_dec,ismd_buf)) != ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_ERROR,"error: unable to decode smd_buffers [%d]\n", result);
+ }
+ }
+ }
+ break;
+ case PROFILE_SIMPLE:
+ case PROFILE_MAIN:
+ size_SPMP_PESpacket_PayloadFormatHeader = ismd_ffmpeg_vc1_viddec_SPMP_PESpacket_PayloadFormatHeader (pSeqHeaderRbdu, SPMP_PESpacket_PayloadFormatHeader, avctx->extradata, avctx->extradata_size, avctx->width, avctx->height);
+
+ if ((result = ismd_buffer_alloc(CHUNK_SIZE, &ismd_buf)) == ISMD_SUCCESS)
+ {
+ if (enable_dtv_smd) {
+ result = syno_ismd_ffmpeg_fill_viddec_buffer(SPMP_PESpacket_PayloadFormatHeader, ismd_buf, size_SPMP_PESpacket_PayloadFormatHeader, pts);
+ } else {
+ result = ismd_ffmpeg_fill_viddec_buffer(SPMP_PESpacket_PayloadFormatHeader, ismd_buf, size_SPMP_PESpacket_PayloadFormatHeader);
+ }
+ if (result == ISMD_SUCCESS)
+ {
+ // decode it asynchronously
+ if ((result = ismd_ffmpeg_decoder_port_write(&vid_dec,ismd_buf)) != ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_ERROR,"error: unable to decode smd_buffers [%d]\n", result);
+ }
+ }
+ }
+ break;
+ }
+ vid_dec.send_sps_pps = false;
+ av_free(seq_header_buf);
+ }
+
+ //need to insert start code
+ switch (v->profile)
+ {
+ case PROFILE_ADVANCED:
+ //insert start code
+ av_log(NULL, AV_LOG_DEBUG, "\n***start code not found*** profile %d PROFILE_ADVANCED %d\n",v->profile,PROFILE_ADVANCED);
+ buf_with_start_code = av_malloc(4 + buf_size);//TODO free memory
+
+ new_buf_size = ismd_ffmpeg_vc1_viddec_convert_AP(buf_with_start_code, buf, buf_size);
+
+ break;
+ case PROFILE_SIMPLE:
+ case PROFILE_MAIN:
+ // Calculate maximum buffer size, make room for encapsulation
+ // SMPTE-421M-FDSI doc, Annex-E
+ max_bufsize = ( (pkt->size + 3 ) / 3 ) * 4;
+ buf_with_start_code = av_malloc(max_bufsize);
+ av_log(NULL, AV_LOG_DEBUG, "\n* pkt size %d max_bufsize %d*\n",pkt->size,max_bufsize);
+
+ new_buf_size = ismd_ffmpeg_vc1_viddec_convert_SPMP(buf_with_start_code, pkt->data, pkt->size, max_bufsize);
+
+ break;
+ }
+
+ }
+ else
+ buf_with_start_code = buf;
+ /*********** write buffer data ************************/
+ if (enable_dtv_smd) {
+ syno_ismd_ffmpeg_decode_vid_buf(&vid_dec, buf_with_start_code, new_buf_size, pts);
+ } else {
+ ismd_ffmpeg_decode_vid_buf(&vid_dec, buf_with_start_code, new_buf_size);
+ }
+
+ if((vid_dec.vc1_without_start_code)&& buf_with_start_code)
+ {
+ av_free(buf_with_start_code);
+ }
+
+ break;
+ default:
+ av_log(NULL,AV_LOG_ERROR,"\n********smd can't handle this codec***********\n");
+ return -1;
+ }
+
+ if(vid_dec.eos_written)
+ *got_output = 0;
+ if (!*got_output || ret < 0) {
+ if (!pkt->size) {
+ for (i = 0; i < ist->nb_filters; i++)
+ av_buffersrc_add_ref(ist->filters[i]->filter, NULL, 0);
+ }
+ }
+
+ pkt->size = 0;
+
+ //rate_emu_sleep(ist);
+ for (i = 0; i < nb_output_streams; i++) {
+ OutputStream *ost = output_streams[i];
+
+ if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
+ continue;
+ do_video_out(output_files[ost->file_index]->ctx, ost, decoded_frame, 0);
+ }
+ }
+#endif
+
fail:
av_frame_unref(ist->filter_frame);
av_frame_unref(decoded_frame);
@@ -2221,7 +2842,12 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt)
}
// while we have more to decode or while the decoder did output something on EOF
+#ifdef SYNO_EVANSPORT_SMD
+ //to resolve ctrl-C issue
+ while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && (got_output >0)))) {
+#else
while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
+#endif
int duration;
handle_eof:
@@ -2555,6 +3181,48 @@ static void report_new_stream(int input_index, AVPacket *pkt)
file->nb_streams_warn = pkt->stream_index + 1;
}
+#ifdef SYNO_EVANSPORT_SMD
+static ismd_codec_type_t get_smd_codec_id(enum AVCodecID ffmpeg_codec_id)
+{
+ switch (ffmpeg_codec_id)
+ {
+ case AV_CODEC_ID_MPEG2VIDEO_SYNO:
+ return ISMD_CODEC_TYPE_MPEG2;
+ case AV_CODEC_ID_H264_SYNO:
+ return ISMD_CODEC_TYPE_H264;
+ case AV_CODEC_ID_VC1_SYNO:
+ case AV_CODEC_ID_WMV3_SYNO:
+ return ISMD_CODEC_TYPE_VC1;
+ case AV_CODEC_ID_MPEG4_SYNO:
+ return ISMD_CODEC_TYPE_MPEG4;
+ default:
+ return ISMD_CODEC_TYPE_INVALID;
+ }
+}
+#endif
+
+#ifdef SYNO_EVANSPORT_HANDBRAKE_MP4
+static int IsFileEncodeByHandBrake()
+{
+ int i;
+ AVDictionaryEntry *tag = NULL;
+
+ for (i = 0; i < nb_input_files; i++) {
+ InputFile *ifile = input_files[i];
+ if (0 != strcmp(ifile->ctx->iformat->name, "mov,mp4,m4a,3gp,3g2,mj2")) {
+ continue;
+ }
+ while ((tag = av_dict_get(ifile->ctx->metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) {
+ if (0 == strncmp(tag->key, "encoder", 7) && 0 == strncmp(tag->value, "HandBrake", 9)) {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+
static void set_encoder_id(OutputFile *of, OutputStream *ost)
{
AVDictionaryEntry *e;
@@ -2598,6 +3266,14 @@ static void set_encoder_id(OutputFile *of, OutputStream *ost)
static int transcode_init(void)
{
+#ifdef SYNO_EVANSPORT_SMD
+ /************** smd implementation ***********/
+ ismd_result_t result = ISMD_ERROR_UNSPECIFIED;
+ char *hw_decoder_name;
+ ismd_codec_type_t smd_codec;
+ /************** end ***********/
+#endif
+
int ret = 0, i, j, k;
AVFormatContext *oc;
OutputStream *ost;
@@ -3256,6 +3932,102 @@ static int transcode_init(void)
transcode_init_done = 1;
+#ifdef SYNO_EVANSPORT_SMD
+ /******************************* create smd video pipeline here ********************/
+ for (i = 0; i < nb_output_streams; i++)
+ {
+ AVCodecContext *codec = NULL;
+ ost = output_streams[i];
+ codec = ost->st->codec;
+
+ if (codec->codec_id == AV_CODEC_ID_H264)
+ break;
+ }
+ //don't create pipeline in case of stream copy
+ if(!ost->stream_copy)
+ {
+ AVCodecContext *icodec = NULL;
+ AVCodecContext *codec = NULL;
+ codec = ost->enc_ctx;
+ av_log(NULL, AV_LOG_DEBUG,"\n**** encoder codec id **** %d width %d height %d aspect num %d den %d\n", codec->codec_id,codec->width,codec->height,codec->sample_aspect_ratio.num,codec->sample_aspect_ratio.den);
+
+ for (i = 0; i < nb_input_streams; i++)
+ {
+ ist = input_streams[i];
+ icodec = ist->st->codec;
+ av_log(NULL,AV_LOG_DEBUG,"\nicodec->codec_id %d\n",icodec->codec_id);
+ if(icodec->codec_type == AVMEDIA_TYPE_VIDEO)
+ {
+ //set up video decoder
+ if(((icodec->codec_id == AV_CODEC_ID_MPEG2VIDEO_SYNO) || (icodec->codec_id == AV_CODEC_ID_H264_SYNO) ||\
+ (icodec->codec_id == AV_CODEC_ID_VC1_SYNO) ||(icodec->codec_id == AV_CODEC_ID_WMV3_SYNO)||\
+ (icodec->codec_id == AV_CODEC_ID_MPEG4_SYNO)) && \
+ ((codec->codec_id == AV_CODEC_ID_H264) && (0 == strcmp(codec->codec->name, "h264_smd"))))
+ {
+ av_log(NULL,AV_LOG_DEBUG,"\npipeline check successful\n");
+ bool smd_video_available = ismd_ffmpeg_is_video_enc_avail();
+ if(!smd_video_available)
+ {
+#if CONFIG_LIBX264_ENCODER
+ av_log( NULL, AV_LOG_INFO, "\nVideo hardware encoder not available for encoding.Falling back to software\n");
+ return 0;
+#else
+ av_log( NULL, AV_LOG_ERROR, "\nVideo hardware encoder not available for encoding. and software fallback not possible\n");
+ return -1;
+#endif
+ }
+
+ smd_codec = get_smd_codec_id(icodec->codec_id);
+ hw_decoder_name = ismd_ffmpeg_enum_to_string(smd_codec);
+ av_log(NULL, AV_LOG_DEBUG,"\n**** About to open stream for decoding with codec type **** %d smd_codec %d \n", icodec->codec_id, smd_codec);
+ if ((result = ismd_viddec_open(smd_codec, &vid_dec.viddec_handle) != ISMD_SUCCESS))
+ {
+ av_log(NULL, AV_LOG_ERROR,"\n ismd_viddec_open : failed error %d\n",result);
+ return -1;
+ }
+ }
+ }
+ }
+ if(ISMD_SUCCESS == result)
+ {
+#ifdef SYNO_EVANSPORT_HANDBRAKE_MP4
+ if (IsFileEncodeByHandBrake()) {
+ enable_dtv_smd = 1;
+ }
+#endif
+ if (ost->encoding_needed)
+ {
+ //close H.264 smd encoder because transcoding will be done through pipeline
+#ifdef SYNO_EVANSPORT_FLV_EXTRADATA
+ X264Context *x4 = ost->enc_ctx->priv_data;
+ x4->dont_free_extradata = true;
+#endif
+ ost->enc_ctx->codec->close(ost->enc_ctx);
+#ifdef SYNO_EVANSPORT_FLV_EXTRADATA
+ x4->dont_free_extradata = false;
+#endif
+ ost->enc_ctx->coded_frame = av_frame_alloc();
+ if (!ost->enc_ctx->coded_frame)
+ return AVERROR(ENOMEM);
+ }
+ result = ismd_ffmpeg_create_video_pipeline(codec , &vid_dec , &vid_enc, enable_dtv_smd);
+ if (result != ISMD_SUCCESS)
+ {
+ av_log(NULL,AV_LOG_ERROR,"\n FAILURE: could not start video pipeline error: %d\n",result);
+ return -1;
+ }
+ if (!synoAddPID(getpid())) {
+ av_log(NULL, AV_LOG_ERROR, "Syno check hardware transcode falied\n");
+ return -1;
+ }
+ av_log(NULL, AV_LOG_DEBUG, "\nvideo pipeline created successfully\n");
+ av_log( NULL, AV_LOG_INFO, "****** Using SMD H/W %s Decoder and H/W H.264 Encoder(Pipelined Mode)*******\n",hw_decoder_name);
+ smd_video_pipeline = true;
+ }
+ }
+ /******************************* end ********************/
+#endif
+
return 0;
}
@@ -3747,6 +4519,23 @@ static int process_input(int file_index)
}
}
+#ifdef SYNO_EVANSPORT_SMD
+ if (first_read_pts && AVMEDIA_TYPE_VIDEO == ist->st->codec->codec_type &&
+ (AV_CODEC_ID_H264_SYNO != ist->st->codec->codec_id || AV_PKT_FLAG_KEY & pkt.flags)) {
+ if (AV_NOPTS_VALUE != pkt.pts) {
+ first_read_pts = false;
+ ifile->first_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
+ av_log(NULL, AV_LOG_DEBUG, "first_pts %s pts_time %s frome pts\n"
+ , av_ts2str(ifile->first_pts), av_ts2timestr(ifile->first_pts, &AV_TIME_BASE_Q));
+ } else if (AV_NOPTS_VALUE != pkt.dts){
+ first_read_pts = false;
+ ifile->first_pts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q)+1;
+ av_log(NULL, AV_LOG_DEBUG, "first_pts %s pts_time %s frome dts\n"
+ , av_ts2str(ifile->first_pts), av_ts2timestr(ifile->first_pts, &AV_TIME_BASE_Q));
+ }
+ }
+#endif
+
if (pkt.dts != AV_NOPTS_VALUE)
ifile->last_ts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
diff --git a/ffmpeg.h b/ffmpeg.h
index 7fd129a283..f03f1deb64 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -48,6 +48,8 @@
#include "libswresample/swresample.h"
+#include "synoconfig.h"
+
#define VSYNC_AUTO -1
#define VSYNC_PASSTHROUGH 0
#define VSYNC_CFR 1
@@ -341,6 +343,9 @@ typedef struct InputFile {
int ist_index; /* index of first stream in input_streams */
int64_t input_ts_offset;
int64_t ts_offset;
+#ifdef SYNO_EVANSPORT_SMD
+ int64_t first_pts; /* remember first video pts for handle resume problem on VideoStation */
+#endif
int64_t last_ts;
int64_t start_time; /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */
int seek_timestamp;
@@ -506,6 +511,9 @@ extern int print_stats;
extern int qp_hist;
extern int stdin_interaction;
extern int frame_bits_per_raw_sample;
+// SYNO_EVANSPORT_DTV_SMD_AVSYNC
+extern int enable_dtv_smd;
+// SYNO_EVANSPORT_DTV_SMD_AVSYNC
extern AVIOContext *progress_avio;
extern float max_error_rate;
extern int vdpau_api_ver;
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 79cb5caa34..b465eaad3d 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -41,6 +41,12 @@
#include "libavutil/pixdesc.h"
#include "libavutil/pixfmt.h"
+#include "synoconfig.h"
+
+#ifdef SYNO_DTV_SKIP_UNKNOWN_TRACK
+#include <strings.h>
+#endif
+
#define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
{\
int i, ret;\
@@ -102,7 +108,18 @@ int qp_hist = 0;
int stdin_interaction = 1;
int frame_bits_per_raw_sample = 0;
float max_error_rate = 2.0/3;
-
+// SYNO_EVANSPORT_DTV_SMD_AVSYNC
+int enable_dtv_smd = 0;
+// SYNO_EVANSPORT_DTV_SMD_AVSYNC
+#ifdef SYNO_DTV_SKIP_UNKNOWN_TRACK
+int dtv_skip_unknown = 0;
+#endif
+#ifdef SYNO_DTV_SKIP_VISUAL_IMPAIRED_TRACK
+int dtv_skip_visual_impaired = 0;
+#endif
+#ifdef SYNO_DTV_SKIP_TELETEXT
+int dtv_skip_teletext = 0;
+#endif
static int intra_only = 0;
static int file_overwrite = 0;
@@ -114,6 +131,10 @@ static int input_stream_potentially_available = 0;
static int ignore_unknown_streams = 0;
static int copy_unknown_streams = 0;
+#ifdef SYNO_EVANSPORT_AUTO_HW_DECODER
+static int auto_detect_HWdecoder = 0;
+#endif
+
static void uninit_options(OptionsContext *o)
{
const OptionDef *po = options;
@@ -294,6 +315,33 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
*p == ':' ? p + 1 : p) <= 0)
continue;
+#ifdef SYNO_DTV_SKIP_UNKNOWN_TRACK
+ if (dtv_skip_unknown) {
+ char buf[256];
+ AVStream *st = input_files[file_idx]->ctx->streams[i];
+ avcodec_string(buf, sizeof(buf), st->codec, 0);
+ if (!strncasecmp(buf, "unknown", 7)) {
+ continue;
+ }
+ if (strstr(buf, "0 channels") != NULL) {
+ continue;
+ }
+ }
+#endif
+#ifdef SYNO_DTV_SKIP_VISUAL_IMPAIRED_TRACK
+ if (dtv_skip_visual_impaired) {
+ AVStream *st = input_files[file_idx]->ctx->streams[i];
+ if (st->disposition & AV_DISPOSITION_VISUAL_IMPAIRED) {
+ continue;
+ }
+ }
+#endif
+#ifdef SYNO_DTV_SKIP_TELETEXT
+ if (dtv_skip_teletext &&
+ AV_CODEC_ID_DVB_TELETEXT == input_files[file_idx]->ctx->streams[i]->codec->codec_id) {
+ continue;
+ }
+#endif
GROW_ARRAY(o->stream_maps, o->nb_stream_maps);
m = &o->stream_maps[o->nb_stream_maps - 1];
@@ -561,6 +609,88 @@ static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int e
return codec;
}
+#ifdef SYNO_SKIP_DISABLED_AUDIO_STREAM
+static int IsAudioCopyStream(OptionsContext *o, AVFormatContext *oc)
+{
+ int ret = 0;
+ char *audio_codec_name = NULL;
+
+ MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, oc, "a");
+
+ if (audio_codec_name && 0 == strcmp(audio_codec_name, "copy")) {
+ ret = 1;
+ }
+
+ return ret;
+}
+
+static int IsSkipAudioStream(const InputStream *ist, OptionsContext *o, AVFormatContext *oc)
+{
+ if (ist->st->codec->codec_id == AV_CODEC_ID_DTS
+ || ist->st->codec->codec_id == AV_CODEC_ID_EAC3
+ || ist->st->codec->codec_id == AV_CODEC_ID_TRUEHD)
+ {
+ // if not stream copy
+ if (!IsAudioCopyStream(o, oc)) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+#endif
+
+#ifdef SYNO_EVANSPORT_AUTO_HW_DECODER
+static AVCodec *choose_decoder_smd(OptionsContext *o, AVFormatContext *s, AVStream *st)
+{
+ char *codec_name = NULL;
+ AVCodec *result_codec;
+ enum AVCodecID smd_codecID;
+
+ MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
+ if (codec_name) {
+ AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
+ st->codec->codec_id = codec->id;
+ result_codec = codec;
+ } else {
+ result_codec = avcodec_find_decoder(st->codec->codec_id);
+ }
+
+ if (!result_codec || !auto_detect_HWdecoder) {
+ return result_codec;
+ }
+
+ switch (result_codec->id) {
+ case AV_CODEC_ID_H264:
+ if (FF_PROFILE_H264_HIGH_10 == st->codec->profile || FF_PROFILE_H264_HIGH_10_INTRA == st->codec->profile) {
+ return result_codec;
+ }
+ smd_codecID = AV_CODEC_ID_H264_SYNO;
+ break;
+ case AV_CODEC_ID_MPEG2VIDEO:
+ smd_codecID = AV_CODEC_ID_MPEG2VIDEO_SYNO;
+ break;
+ case AV_CODEC_ID_VC1:
+ smd_codecID = AV_CODEC_ID_VC1_SYNO;
+ break;
+ case AV_CODEC_ID_WMV3:
+ smd_codecID = AV_CODEC_ID_WMV3_SYNO;
+ break;
+ case AV_CODEC_ID_MPEG4:
+ smd_codecID = AV_CODEC_ID_MPEG4_SYNO;
+ break;
+ default:
+ smd_codecID = AV_CODEC_ID_NONE;
+ }
+ if (AV_CODEC_ID_NONE != smd_codecID) {
+ result_codec = avcodec_find_decoder(smd_codecID);
+ st->codec->codec_id = result_codec->id;
+ }
+
+ return result_codec;
+}
+#endif
+
static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
{
char *codec_name = NULL;
@@ -615,7 +745,12 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
st->codec->codec_tag = tag;
}
+#ifdef SYNO_EVANSPORT_AUTO_HW_DECODER
+ ist->dec = choose_decoder_smd(o, ic, st);
+#else
ist->dec = choose_decoder(o, ic, st);
+#endif
+
ist->decoder_opts = filter_codec_opts(o->g->codec_opts, ist->st->codec->codec_id, ic, st, ist->dec);
ist->reinit_filters = -1;
@@ -1937,6 +2072,12 @@ static int open_output_file(OptionsContext *o, const char *filename)
int channels = 0, idx = -1;
for (i = 0; i < nb_input_streams; i++) {
ist = input_streams[i];
+#ifdef SYNO_SKIP_DISABLED_AUDIO_STREAM
+ if (IsSkipAudioStream(ist, o, oc)) {
+ // if not stream copy
+ continue;
+ }
+#endif
if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
ist->st->codec->channels > channels) {
channels = ist->st->codec->channels;
@@ -2025,6 +2166,12 @@ loop_end:
continue;
if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
continue;
+#ifdef SYNO_SKIP_DISABLED_AUDIO_STREAM
+ if (IsSkipAudioStream(ist, o, oc)) {
+ // if not stream copy
+ continue;
+ }
+#endif
switch (ist->st->codec->codec_type) {
case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
@@ -2878,6 +3025,27 @@ static int opt_progress(void *optctx, const char *opt, const char *arg)
const OptionDef options[] = {
/* main options */
#include "cmdutils_common_opts.h"
+#ifdef SYNO_EVANSPORT_AUTO_HW_DECODER
+ { "prefer_smd", OPT_BOOL, { &auto_detect_HWdecoder },
+ "enable auto detect Hardware decoder" },
+#endif
+#ifdef SYNO_EVANSPORT_DTV_SMD_AVSYNC
+ { "dtv_smd", OPT_BOOL, { &enable_dtv_smd},
+ "enable passthough timestamp in hardware pipeline mode" },
+#endif
+#ifdef SYNO_DTV_SKIP_UNKNOWN_TRACK
+ { "dtv_skip_unknown", OPT_BOOL, { &dtv_skip_unknown},
+ "skip unknown codec track during dtv streaming" },
+#endif
+#ifdef SYNO_DTV_SKIP_VISUAL_IMPAIRED_TRACK
+ { "dtv_skip_visual_impaired", OPT_BOOL, { &dtv_skip_visual_impaired },
+ "skip visual impaired track during dtv streaming" },
+#endif
+#ifdef SYNO_DTV_SKIP_TELETEXT
+ { "dtv_skip_teletext", OPT_BOOL, { &dtv_skip_teletext },
+ "skip subtitle streams in teletext codec during dtv streaming" },
+#endif
+
{ "f", HAS_ARG | OPT_STRING | OPT_OFFSET |
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(format) },
"force format", "fmt" },
diff --git a/ffserver.c b/ffserver.c
index 2b19bba9ba..da48630c60 100644
--- a/ffserver.c
+++ b/ffserver.c
@@ -71,6 +71,8 @@
#include "cmdutils.h"
#include "ffserver_config.h"
+#include "synoconfig.h"
+
const char program_name[] = "ffserver";
const int program_birth_year = 2000;
@@ -2574,8 +2576,10 @@ static int http_receive_data(HTTPContext *c)
} else if (c->buffer_ptr - c->buffer >= 2 &&
!memcmp(c->buffer_ptr - 1, "\r\n", 2)) {
c->chunk_size = strtol(c->buffer, 0, 16);
- if (c->chunk_size == 0) // end of stream
+ if (c->chunk_size <= 0) { // end of stream or invalid chunk size
+ c->chunk_size = 0;
goto fail;
+ }
c->buffer_ptr = c->buffer;
break;
} else if (++loop_run > 10) {
@@ -2598,6 +2602,7 @@ static int http_receive_data(HTTPContext *c)
/* end of connection : close it */
goto fail;
else {
+ av_assert0(len <= c->chunk_size);
c->chunk_size -= len;
c->buffer_ptr += len;
c->data_count += len;
@@ -3425,9 +3430,11 @@ static int add_av_stream(FFServerStream *feed, AVStream *st)
switch(av->codec_type) {
case AVMEDIA_TYPE_AUDIO:
+#ifndef SYNO_FFSERVER_MULTIPLE_AUDIO_TRACK
if (av1->channels == av->channels &&
av1->sample_rate == av->sample_rate)
return i;
+#endif
break;
case AVMEDIA_TYPE_VIDEO:
if (av1->width == av->width &&
diff --git a/ffserver_config.c b/ffserver_config.c
index 06bd8ac44a..83785ec6ad 100644
--- a/ffserver_config.c
+++ b/ffserver_config.c
@@ -31,6 +31,8 @@
#include "cmdutils.h"
#include "ffserver_config.h"
+#include "synoconfig.h"
+
#define MAX_CHILD_ARGS 64
static int ffserver_save_avoption(const char *opt, const char *arg, int type,
@@ -797,6 +799,9 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
char arg[1024], arg2[1024];
FFServerStream *stream;
int val;
+#ifdef SYNO_FFSERVER_MULTIPLE_AUDIO_TRACK
+ int num_audio_track = 1;
+#endif
av_assert0(pstream);
stream = *pstream;
@@ -1086,6 +1091,11 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
config->no_video = 1;
} else if (!av_strcasecmp(cmd, "NoAudio")) {
config->no_audio = 1;
+#ifdef SYNO_FFSERVER_MULTIPLE_AUDIO_TRACK
+ } else if (!av_strcasecmp(cmd, "SynoNumAudioTrack")) {
+ ffserver_get_arg(arg, sizeof(arg), p);
+ num_audio_track = atoi(arg);
+#endif
} else if (!av_strcasecmp(cmd, "ACL")) {
ffserver_parse_acl_row(stream, NULL, NULL, *p, config->filename,
config->line_num);
@@ -1120,8 +1130,15 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
config->dummy_actx->codec_id = config->guessed_audio_codec_id;
if (!config->no_audio &&
config->dummy_actx->codec_id != AV_CODEC_ID_NONE) {
+#ifdef SYNO_FFSERVER_MULTIPLE_AUDIO_TRACK
+ for (int i = 0; i < num_audio_track; i ++) {
+ AVCodecContext *audio_enc = avcodec_alloc_context3(avcodec_find_encoder(config->dummy_actx->codec_id));
+ add_codec(stream, audio_enc, config);
+ }
+#else
AVCodecContext *audio_enc = avcodec_alloc_context3(avcodec_find_encoder(config->dummy_actx->codec_id));
add_codec(stream, audio_enc, config);
+#endif
}
if (config->dummy_vctx->codec_id == AV_CODEC_ID_NONE)
config->dummy_vctx->codec_id = config->guessed_video_codec_id;
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index bfd6425fd5..c7bcc28745 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -37,6 +37,12 @@ OBJS = allcodecs.o \
vorbis_parser.o \
xiph.o \
+ifdef CONFIG_SMD
+OBJS += ismd_ffmpeg_audio_util.o
+OBJS += syno_trans_loading.o
+endif
+OBJS += synog1codecpatent.o
+
# subsystems
OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o
OBJS-$(CONFIG_AC3DSP) += ac3dsp.o
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index 622cc5c087..7312cb63c8 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -113,6 +113,9 @@
# include "mips/aacdec_mips.h"
#endif
+#include "synoconfig.h"
+#include "synog1codecpatent.h"
+
static VLC vlc_scalefactors;
static VLC vlc_spectral[11];
@@ -1098,6 +1101,12 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
+#ifdef SYNO_CODEC_PATENT_G1
+ if (0 != ActivateCodec("aac_dec")) {
+ return -1;
+ }
+#endif
+
if (avctx->extradata_size > 0) {
if ((ret = decode_audio_specific_config(ac, ac->avctx, &ac->oc[1].m4ac,
avctx->extradata,
diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
index 897c3a10df..9b96ca7f43 100644
--- a/libavcodec/aacenc.c
+++ b/libavcodec/aacenc.c
@@ -45,6 +45,9 @@
#include "psymodel.h"
+#include "synoconfig.h"
+#include "synog1codecpatent.h"
+
#define AAC_MAX_CHANNELS 6
#define ERROR_IF(cond, ...) \
@@ -764,6 +767,12 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
uint8_t grouping[AAC_MAX_CHANNELS];
int lengths[2];
+#ifdef SYNO_CODEC_PATENT_G1
+ if (0 != ActivateCodec("aac_enc")) {
+ return -1;
+ }
+#endif
+
avctx->frame_size = 1024;
for (i = 0; i < 16; i++)
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index ce977467f9..ea48a5e0d3 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -28,6 +28,8 @@
#include "avcodec.h"
#include "version.h"
+#include "synoconfig.h"
+
#define REGISTER_HWACCEL(X, x) \
{ \
extern AVHWAccel ff_##x##_hwaccel; \
@@ -175,6 +177,9 @@ void avcodec_register_all(void)
REGISTER_ENCDEC (H263, h263);
REGISTER_DECODER(H263I, h263i);
REGISTER_ENCDEC (H263P, h263p);
+#ifdef SYNO_EVANSPORT_SMD
+ REGISTER_DECODER(H264, h264_smd);
+#endif
REGISTER_DECODER(H264, h264);
REGISTER_DECODER(H264_CRYSTALHD, h264_crystalhd);
REGISTER_DECODER(H264_MMAL, h264_mmal);
@@ -212,7 +217,13 @@ void avcodec_register_all(void)
REGISTER_DECODER(MPEG_XVMC, mpeg_xvmc);
#endif /* FF_API_XVMC */
REGISTER_ENCDEC (MPEG1VIDEO, mpeg1video);
+#ifdef SYNO_EVANSPORT_SMD
+ REGISTER_DECODER(MPEG2VIDEO, mpeg2video_smd);
+#endif
REGISTER_ENCDEC (MPEG2VIDEO, mpeg2video);
+#ifdef SYNO_EVANSPORT_SMD
+ REGISTER_DECODER(MPEG4, mpeg4_smd);
+#endif
REGISTER_ENCDEC (MPEG4, mpeg4);
REGISTER_DECODER(MPEG4_CRYSTALHD, mpeg4_crystalhd);
REGISTER_DECODER(MPEG4_VDPAU, mpeg4_vdpau);
@@ -296,6 +307,9 @@ void avcodec_register_all(void)
REGISTER_ENCDEC (V410, v410);
REGISTER_DECODER(VB, vb);
REGISTER_DECODER(VBLE, vble);
+#ifdef SYNO_EVANSPORT_SMD
+ REGISTER_DECODER(VC1, vc1_smd);
+#endif
REGISTER_DECODER(VC1, vc1);
REGISTER_DECODER(VC1_CRYSTALHD, vc1_crystalhd);
REGISTER_DECODER(VC1_VDPAU, vc1_vdpau);
@@ -315,6 +329,9 @@ void avcodec_register_all(void)
REGISTER_DECODER(WEBP, webp);
REGISTER_ENCDEC (WMV1, wmv1);
REGISTER_ENCDEC (WMV2, wmv2);
+#ifdef SYNO_EVANSPORT_SMD
+ REGISTER_DECODER(WMV3, wmv3_smd);
+#endif
REGISTER_DECODER(WMV3, wmv3);
REGISTER_DECODER(WMV3_CRYSTALHD, wmv3_crystalhd);
REGISTER_DECODER(WMV3_VDPAU, wmv3_vdpau);
@@ -545,6 +562,9 @@ void avcodec_register_all(void)
REGISTER_ENCODER(LIBWAVPACK, libwavpack);
REGISTER_ENCODER(LIBWEBP_ANIM, libwebp_anim); /* preferred over libwebp */
REGISTER_ENCODER(LIBWEBP, libwebp);
+#ifdef SYNO_EVANSPORT_SMD
+ REGISTER_ENCODER(H264_SMD, h264_smd);
+#endif
REGISTER_ENCODER(LIBX264, libx264);
REGISTER_ENCODER(LIBX264RGB, libx264rgb);
REGISTER_ENCODER(LIBX265, libx265);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 4aeb57aed4..b3cd447ed2 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -42,6 +42,8 @@
#include "version.h"
+#include "synoconfig.h"
+
/**
* @defgroup libavc Encoding/Decoding Library
* @{
@@ -294,6 +296,14 @@ enum AVCodecID {
AV_CODEC_ID_TDSC,
AV_CODEC_ID_HQ_HQA,
+#ifdef SYNO_EVANSPORT_SMD
+ AV_CODEC_ID_H264_SYNO,
+ AV_CODEC_ID_MPEG2VIDEO_SYNO,
+ AV_CODEC_ID_VC1_SYNO,
+ AV_CODEC_ID_WMV3_SYNO,
+ AV_CODEC_ID_MPEG4_SYNO,
+#endif
+
AV_CODEC_ID_BRENDER_PIX= MKBETAG('B','P','I','X'),
AV_CODEC_ID_Y41P = MKBETAG('Y','4','1','P'),
AV_CODEC_ID_ESCAPE130 = MKBETAG('E','1','3','0'),
@@ -3701,6 +3711,10 @@ void avcodec_free_frame(AVFrame **frame);
*/
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
+#ifdef SYNO_EVANSPORT_SMD
+int syno_alloc_packet(AVPacket *avpkt, int size);
+#endif
+
/**
* Close a given AVCodecContext and free all the data associated with it
* (but not the AVCodecContext itself).
diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
index c1694f3383..7704e4db4a 100644
--- a/libavcodec/codec_desc.c
+++ b/libavcodec/codec_desc.c
@@ -26,6 +26,8 @@
#include "avcodec.h"
#include "version.h"
+#include "synoconfig.h"
+
#define MT(...) (const char *const[]){ __VA_ARGS__, NULL }
static const AVCodecDescriptor codec_descriptors[] = {
@@ -1252,6 +1254,43 @@ static const AVCodecDescriptor codec_descriptors[] = {
.long_name = NULL_IF_CONFIG_SMALL("Canopus HQ/HQA"),
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY,
},
+#ifdef SYNO_EVANSPORT_SMD
+ {
+ .id = AV_CODEC_ID_WMV3_SYNO,
+ .type = AVMEDIA_TYPE_VIDEO,
+ .name = "wmv3_smd",
+ .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Hardware(SMD) Decoder"),
+ .props = AV_CODEC_PROP_LOSSY,
+ },
+ {
+ .id = AV_CODEC_ID_VC1_SYNO,
+ .type = AVMEDIA_TYPE_VIDEO,
+ .name = "vc1_smd",
+ .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1 Hardware(SMD) Decoder"),
+ .props = AV_CODEC_PROP_LOSSY,
+ },
+ {
+ .id = AV_CODEC_ID_MPEG2VIDEO_SYNO,
+ .type = AVMEDIA_TYPE_VIDEO,
+ .name = "mpeg2video_smd",
+ .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 video Hardware(SMD) Decoder"),
+ .props = AV_CODEC_PROP_LOSSY,
+ },
+ {
+ .id = AV_CODEC_ID_MPEG4_SYNO,
+ .type = AVMEDIA_TYPE_VIDEO,
+ .name = "mpeg4_smd",
+ .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Hardware(SMD) Decoder"),
+ .props = AV_CODEC_PROP_LOSSY,
+ },
+ {
+ .id = AV_CODEC_ID_H264_SYNO,
+ .type = AVMEDIA_TYPE_VIDEO,
+ .name = "h264_smd",
+ .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 Hardware(SMD) Decoder"),
+ .props = AV_CODEC_PROP_LOSSY | AV_CODEC_PROP_LOSSLESS,
+ },
+#endif
/* image codecs */
{
diff --git a/libavcodec/dvbsub.c b/libavcodec/dvbsub.c
index dd84a07664..4102087311 100644
--- a/libavcodec/dvbsub.c
+++ b/libavcodec/dvbsub.c
@@ -22,6 +22,8 @@
#include "bytestream.h"
#include "libavutil/colorspace.h"
+#include "synoconfig.h"
+
typedef struct DVBSubtitleContext {
int object_version;
} DVBSubtitleContext;
@@ -261,6 +263,10 @@ static int encode_dvb_subtitles(DVBSubtitleContext *s,
if (h->num_rects && !h->rects)
return -1;
+#ifndef SYNO_DTV_MPEGTS_DVBSUB_ENCODING
+ *q++ = 0x00; /* subtitle_stream_id */
+#endif
+
/* page composition segment */
*q++ = 0x0f; /* sync_byte */
@@ -435,6 +441,10 @@ static int encode_dvb_subtitles(DVBSubtitleContext *s,
bytestream_put_be16(&pseg_len, q - pseg_len - 2);
+#ifndef SYNO_DTV_MPEGTS_DVBSUB_ENCODING
+ *q++ = 0xff; /* end of PES data */
+#endif
+
s->object_version = (s->object_version + 1) & 0xf;
return q - outbuf;
}
diff --git a/libavcodec/h263.h b/libavcodec/h263.h
index 1f954cdf6f..77248a7788 100644
--- a/libavcodec/h263.h
+++ b/libavcodec/h263.h
@@ -26,6 +26,8 @@
#include "mpegvideo.h"
#include "rl.h"
+#include "synoconfig.h"
+
#if !FF_API_ASPECT_EXTENDED
#define FF_ASPECT_EXTENDED 15
#endif
@@ -77,13 +79,20 @@ extern uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
extern const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[];
-
int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code);
av_const int ff_h263_aspect_to_info(AVRational aspect);
int ff_h263_decode_init(AVCodecContext *avctx);
+#ifdef SYNO_EVANSPORT_SMD
+int ff_h263_decode_init_smd(AVCodecContext *avctx);
+#endif
int ff_h263_decode_frame(AVCodecContext *avctx,
void *data, int *got_frame,
AVPacket *avpkt);
+#ifdef SYNO_EVANSPORT_SMD
+int ff_h263_decode_frame_smd(AVCodecContext *avctx,
+ void *data, int *data_size,
+ AVPacket *avpkt);
+#endif
int ff_h263_decode_end(AVCodecContext *avctx);
void ff_h263_encode_mb(MpegEncContext *s,
int16_t block[6][64],
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 15f073ae66..efa533574e 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -45,6 +45,16 @@
#include "thread.h"
#include "wmv2.h"
+#include "synoconfig.h"
+
+#ifdef SYNO_EVANSPORT_SMD
+#include "libffmpeg_plugin/ismd_ffmpeg_util.h"
+#include "libffmpeg_plugin/ismd_ffmpeg_video_dec.h"
+#include "libavformat/avformat.h"
+static viddec_struct_t smd_mpeg4_vid_dec;
+bool smd_mpeg4_vid_dec_available = false;
+#endif
+
static enum AVPixelFormat h263_get_format(AVCodecContext *avctx)
{
if (avctx->codec->id == AV_CODEC_ID_MSS2)
@@ -84,6 +94,10 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
break;
case AV_CODEC_ID_MPEG4:
break;
+#ifdef SYNO_EVANSPORT_SMD
+ case AV_CODEC_ID_MPEG4_SYNO:
+ break;
+#endif
case AV_CODEC_ID_MSMPEG4V1:
s->h263_pred = 1;
s->msmpeg4_version = 1;
@@ -106,6 +120,10 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
break;
case AV_CODEC_ID_VC1:
case AV_CODEC_ID_WMV3:
+#ifdef SYNO_EVANSPORT_SMD
+ case AV_CODEC_ID_VC1_SYNO:
+ case AV_CODEC_ID_WMV3_SYNO:
+#endif
case AV_CODEC_ID_VC1IMAGE:
case AV_CODEC_ID_WMV3IMAGE:
case AV_CODEC_ID_MSS2:
@@ -130,9 +148,15 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
s->ehc_mode = 1;
/* for h263, we allocate the images after having read the header */
+#ifdef SYNO_EVANSPORT_SMD
+ if (avctx->codec->id != AV_CODEC_ID_H263 &&
+ avctx->codec->id != AV_CODEC_ID_H263P &&
+ (avctx->codec->id != AV_CODEC_ID_MPEG4 && avctx->codec->id != AV_CODEC_ID_MPEG4_SYNO)) {
+#else
if (avctx->codec->id != AV_CODEC_ID_H263 &&
avctx->codec->id != AV_CODEC_ID_H263P &&
avctx->codec->id != AV_CODEC_ID_MPEG4) {
+#endif
avctx->pix_fmt = h263_get_format(avctx);
ff_mpv_idct_init(s);
if ((ret = ff_mpv_common_init(s)) < 0)
@@ -146,11 +170,60 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
return 0;
}
+#ifdef SYNO_EVANSPORT_SMD
+av_cold int ff_h263_decode_init_smd(AVCodecContext *avctx)
+{
+ ismd_result_t ret_val = ISMD_ERROR_UNSPECIFIED;
+ if((avctx->codec_id == AV_CODEC_ID_MSMPEG4V1) || (avctx->codec_id == AV_CODEC_ID_MSMPEG4V2) || (avctx->codec_id == AV_CODEC_ID_MSMPEG4V3))
+ {
+ av_log(NULL,AV_LOG_INFO,"\nThis video format is not supported by smd.Falling back to software\n");
+ return 0;
+ }
+
+ smd_mpeg4_vid_dec.codec = ISMD_CODEC_TYPE_MPEG4;
+ // 1. Setup a single stream
+ ret_val = ismd_ffmpeg_setup_viddec_stream(&smd_mpeg4_vid_dec);
+ if(ISMD_SUCCESS == ret_val)
+ {
+ // 2. Start the stream
+ ret_val = ismd_ffmpeg_start_viddec_stream(&smd_mpeg4_vid_dec);
+ }
+ if(ret_val != ISMD_SUCCESS)
+ {
+ av_log(avctx,AV_LOG_INFO,"\nMPEG2 Hardware video decoder not available.Falling Back to software.\n");
+ av_log(avctx,AV_LOG_INFO,"\nMPEG2 can't fall back to software.\n");
+ return -1;
+ }
+ else
+ {
+ av_log(avctx,AV_LOG_INFO,"\n******************Using MPEG4 Hardware video decoder**************\n");
+ smd_mpeg4_vid_dec_available = true;
+ smd_mpeg4_vid_dec.y_mem = NULL;
+ smd_mpeg4_vid_dec.u_mem = NULL;
+ smd_mpeg4_vid_dec.v_mem = NULL;
+ smd_mpeg4_vid_dec.send_sps_pps = true;
+ }
+ return 0;
+}
+#endif
+
av_cold int ff_h263_decode_end(AVCodecContext *avctx)
{
+#ifdef SYNO_EVANSPORT_SMD
+ ismd_result_t ret_val = ISMD_ERROR_UNSPECIFIED;
+#endif
MpegEncContext *s = avctx->priv_data;
ff_mpv_common_end(s);
+#ifdef SYNO_EVANSPORT_SMD
+ if(smd_mpeg4_vid_dec_available)
+ {
+ ret_val = ismd_ffmpeg_free_vid_dec_res(&smd_mpeg4_vid_dec);
+ if(ret_val != ISMD_SUCCESS)
+ av_log(avctx,AV_LOG_ERROR,"could not free video decoder resources\n");
+ }
+ smd_mpeg4_vid_dec_available = false;
+#endif
return 0;
}
@@ -716,6 +789,80 @@ frame_end:
return get_consumed_bytes(s, buf_size);
}
+#ifdef SYNO_EVANSPORT_SMD
+int ff_h263_decode_frame_smd(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
+{
+ ismd_result_t ret_val = ISMD_ERROR_UNSPECIFIED;
+ ismd_result_t result = ISMD_ERROR_UNSPECIFIED;
+ ismd_buffer_handle_t ismd_buf = -1;
+ const uint8_t *buf = avpkt->data;
+ int buf_size = avpkt->size;
+ AVFrame *pict = data;
+
+ int got_frame = 0;
+ smd_video_frame decoded_frame;
+ struct timespec ts;
+
+ if(smd_mpeg4_vid_dec_available)
+ {
+ //send headers before first packet
+ if((smd_mpeg4_vid_dec.send_sps_pps) && (avctx->extradata_size > 0))
+ {
+ if ((result = ismd_buffer_alloc(CHUNK_SIZE, &ismd_buf)) == ISMD_SUCCESS)
+ {
+ if ((result = ismd_ffmpeg_fill_viddec_buffer(avctx->extradata, ismd_buf,avctx->extradata_size)) == ISMD_SUCCESS)
+ {
+ // decode it asynchronously
+ if ((result = ismd_ffmpeg_decoder_port_write(&smd_mpeg4_vid_dec,ismd_buf)) != ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_ERROR,"error: unable to decode smd_buffers11 [%d]\n", result);
+ }
+ }
+ }
+ else
+ {
+ av_log(NULL, AV_LOG_INFO,"error: unable to allocate buffer in decode_frame111 [%d]\n", result);
+ }
+ smd_mpeg4_vid_dec.send_sps_pps = false;
+ }
+
+ ret_val = ismd_ffmpeg_decode_vid_buf(&smd_mpeg4_vid_dec, buf, buf_size);
+ if(ret_val != ISMD_SUCCESS)
+ {
+ av_log(avctx,AV_LOG_ERROR,"\nismd_ffmpeg_decode_buf failed error:%d buf_size %d\n",ret_val,buf_size);
+ return -1;
+ }
+ ts.tv_sec = 0;
+ ts.tv_nsec = 10;
+ nanosleep (&ts, NULL);
+
+ ismd_ffmpeg_get_decoded_data(&decoded_frame, &smd_mpeg4_vid_dec, &got_frame);
+ if(got_frame)
+ {
+ *data_size = sizeof(AVFrame);
+ avctx->width = decoded_frame.width;
+ avctx->height = decoded_frame.height;
+ avctx->pix_fmt = PIX_FMT_YUV420P;
+
+ pict->pkt_pts = AV_NOPTS_VALUE;
+ pict->pts = AV_NOPTS_VALUE ;
+ pict->data[0] = (uint8_t*)decoded_frame.y_mem;
+ pict->data[1] = (uint8_t*)decoded_frame.u_mem;
+ pict->data[2] = (uint8_t*)decoded_frame.v_mem;
+ pict->linesize[0] = decoded_frame.linesize_y;
+ pict->linesize[1] = decoded_frame.linesize_u;
+ pict->linesize[2] = decoded_frame.linesize_v;
+
+ }
+ return buf_size;
+ }
+ else
+ {
+ return ff_h263_decode_frame(avctx, data, data_size, avpkt);
+ }
+}
+#endif
+
const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = {
#if CONFIG_H263_VAAPI_HWACCEL || CONFIG_MPEG4_VAAPI_HWACCEL
AV_PIX_FMT_VAAPI_VLD,
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 9a002142cc..b73d84d488 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -51,6 +51,17 @@
#include "thread.h"
#include "vdpau_compat.h"
+#include "synoconfig.h"
+#include "synog1codecpatent.h"
+
+#ifdef SYNO_EVANSPORT_SMD
+#include "libffmpeg_plugin/ismd_ffmpeg_util.h"
+#include "libffmpeg_plugin/ismd_ffmpeg_video_dec.h"
+#include "libavformat/avformat.h"
+static viddec_struct_t smd_h264_vid_dec;
+bool smd_h264_vid_dec_available = false;
+#endif
+
const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 };
int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx)
@@ -646,6 +657,12 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
H264Context *h = avctx->priv_data;
int ret;
+#ifdef SYNO_CODEC_PATENT_G1
+ if (0 != ActivateCodec("h264_dec")) {
+ return -1;
+ }
+#endif
+
ret = h264_init_context(avctx, h);
if (ret < 0)
return ret;
@@ -658,7 +675,11 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
ff_init_cabac_states();
+#ifdef SYNO_EVANSPORT_SMD
+ if (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_H264_SYNO) {
+#else
if (avctx->codec_id == AV_CODEC_ID_H264) {
+#endif
if (avctx->ticks_per_frame == 1) {
if(h->avctx->time_base.den < INT_MAX/2) {
h->avctx->time_base.den *= 2;
@@ -698,6 +719,41 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
return 0;
}
+#ifdef SYNO_EVANSPORT_SMD
+static av_cold int ff_h264_decode_init_smd(AVCodecContext *avctx){
+ ismd_result_t ret_val = ISMD_ERROR_UNSPECIFIED;
+ int result;
+ result = ff_h264_decode_init(avctx);
+
+ /********************* SMD code *******************/
+ smd_h264_vid_dec.codec = ISMD_CODEC_TYPE_H264;
+ // 1. Setup a single stream
+ ret_val = ismd_ffmpeg_setup_viddec_stream(&smd_h264_vid_dec);
+ if(ISMD_SUCCESS == ret_val)
+ {
+ // 2. Start the stream
+ ret_val = ismd_ffmpeg_start_viddec_stream(&smd_h264_vid_dec);
+ }
+ if(ret_val != ISMD_SUCCESS)
+ {
+ av_log(avctx,AV_LOG_INFO,"\nH.264 Hardware video decoder not available.\n");
+ av_log(avctx,AV_LOG_INFO,"\nH.264 can't fall back to software.\n");
+ result = -1;
+ }
+ else
+ {
+ av_log(avctx,AV_LOG_INFO,"\n******************Using H.264 Hardware video decoder**************\n");
+ smd_h264_vid_dec_available = true;
+ smd_h264_vid_dec.y_mem = NULL;
+ smd_h264_vid_dec.u_mem = NULL;
+ smd_h264_vid_dec.v_mem = NULL;
+ smd_h264_vid_dec.send_sps_pps = true;
+ }
+ return result;
+ /********************** SMD END *********************/
+}
+#endif
+
static int decode_init_thread_copy(AVCodecContext *avctx)
{
H264Context *h = avctx->priv_data;
@@ -1848,6 +1904,129 @@ static int h264_decode_frame(AVCodecContext *avctx, void *data,
return get_consumed_bytes(buf_index, buf_size);
}
+#ifdef SYNO_EVANSPORT_SMD
+static int h264_decode_frame_smd(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
+{
+ ismd_result_t ret_val = ISMD_ERROR_UNSPECIFIED;
+ const uint8_t *buf = avpkt->data;
+ int buf_size = avpkt->size;
+ H264Context *h = avctx->priv_data;
+ AVFrame *pict = data;
+ uint8_t* buf_with_start_code =NULL;
+ int new_buf_size = buf_size;
+ uint8_t* sps_pps_buf =NULL;
+ /**************************** SMD **********************************/
+ ismd_buffer_handle_t ismd_buf = -1;
+ int sps_pps_buf_size =0;
+ ismd_result_t result = ISMD_SUCCESS;
+ int got_frame = 0;
+ smd_video_frame decoded_frame;
+ struct timespec ts;
+ if(smd_h264_vid_dec_available)
+ {
+ if(buf_size > 4)
+ {
+ if(h->is_avc)
+ {
+ av_log(NULL,AV_LOG_DEBUG,"\nh.264 content is in avc1 format\n");
+ //in most of the cases h->nal_length_size is 4.This fields contains
+ //total length of the following nal unit.
+ //start code length is also 4 so you don't need
+ //to allocate buffer more than avpkt->size because you can write insert
+ //start code in place of h->nal_length_size field
+ //but this may not work when h->nal_length_size is 2 which is very rare
+
+ buf_with_start_code = av_malloc(avpkt->size);//allocate memory for new buffer
+ if(buf_with_start_code == NULL)
+ {
+ av_log(NULL,AV_LOG_ERROR,"\ncould not allocate memory for new buffer \n");
+ assert(0);
+ }
+ if((smd_h264_vid_dec.send_sps_pps) && avctx->extradata_size > 0 && avctx->extradata)
+ {
+ sps_pps_buf_size = ismd_ffmpeg_h264_viddec_extract_sps_pps(avctx->extradata,avctx->extradata_size, &sps_pps_buf);
+ }
+
+ new_buf_size = ismd_ffmpeg_unit_to_byte_stream(&buf_with_start_code, buf, avpkt->size, h->nal_length_size);
+ }
+ else
+ {
+ buf_with_start_code = buf;//incoming buffer is in Byte-stream format.no conversion req.
+ }
+ }
+ /*********** write sps/pps buffer for avc1 at decoder i/p port*********************/
+ //send sps pps before first packet
+ if((smd_h264_vid_dec.send_sps_pps) && h->is_avc)
+ {
+ if ((result = ismd_buffer_alloc(CHUNK_SIZE, &ismd_buf)) == ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_DEBUG,"\n********* sending sps pps buffer write size %d ********\n",sps_pps_buf_size);
+ av_log(NULL,AV_LOG_DEBUG,"\n sps_pps_buf %p\n",sps_pps_buf);
+ if ((result = ismd_ffmpeg_fill_viddec_buffer(sps_pps_buf, ismd_buf,sps_pps_buf_size)) == ISMD_SUCCESS)
+ {
+ // decode it asynchronously
+ if ((result = ismd_ffmpeg_decoder_port_write(&smd_h264_vid_dec,ismd_buf)) != ISMD_SUCCESS)
+ {
+ av_log(NULL, AV_LOG_ERROR,"error: unable to decode smd_buffers11 [%d]\n", result);
+ }
+
+ }
+ }
+ else
+ {
+ av_log(NULL, AV_LOG_INFO,"error: unable to allocate buffer in decode_frame111 [%d]\n", result);
+ }
+ smd_h264_vid_dec.send_sps_pps = false;
+ }
+
+ ret_val = ismd_ffmpeg_decode_vid_buf(&smd_h264_vid_dec, buf_with_start_code, new_buf_size);
+ if(ret_val != ISMD_SUCCESS)
+ {
+ av_log(avctx,AV_LOG_ERROR,"\nismd_ffmpeg_decode_vid_buf failed error:%d \n",ret_val);
+ return -1;
+ }
+
+ if((h->is_avc)&& buf_with_start_code)
+ {
+ av_free(buf_with_start_code);
+ buf_with_start_code = NULL;
+ }
+
+ /**************** SMD port Read **********************/
+ ts.tv_sec = 0;
+ ts.tv_nsec = 10;
+ nanosleep (&ts, NULL);
+
+ ismd_ffmpeg_get_decoded_data(&decoded_frame, &smd_h264_vid_dec, &got_frame);
+
+ if(got_frame)
+ {
+ av_log(NULL,AV_LOG_DEBUG,"\n$$$$$$ width %d height %d linesize[0] %d linesize[1] %d linesize[2] %d\n",decoded_frame.width,decoded_frame.height,decoded_frame.linesize_y,decoded_frame.linesize_u,decoded_frame.linesize_v);
+ *data_size = sizeof(AVFrame);
+ avctx->width = decoded_frame.width;
+ avctx->height = decoded_frame.height;
+ avctx->pix_fmt = PIX_FMT_YUV420P;
+
+ pict->pkt_pts = AV_NOPTS_VALUE;
+ pict->pts = AV_NOPTS_VALUE ;
+ pict->data[0] = (uint8_t*)decoded_frame.y_mem;
+ pict->data[1] = (uint8_t*)decoded_frame.u_mem;
+ pict->data[2] = (uint8_t*)decoded_frame.v_mem;
+ pict->linesize[0] = decoded_frame.linesize_y;
+ pict->linesize[1] = decoded_frame.linesize_u;
+ pict->linesize[2] = decoded_frame.linesize_v;
+ }
+
+ /********************** SMD port read END ************************************/
+ return buf_size;
+ }
+ else
+ {
+ return h264_decode_frame(avctx, data, data_size, avpkt);
+ }
+}
+#endif
+
av_cold void ff_h264_free_context(H264Context *h)
{
int i;
@@ -1876,6 +2055,9 @@ av_cold void ff_h264_free_context(H264Context *h)
static av_cold int h264_decode_end(AVCodecContext *avctx)
{
+#ifdef SYNO_EVANSPORT_SMD
+ ismd_result_t ret_val = ISMD_ERROR_UNSPECIFIED;
+#endif
H264Context *h = avctx->priv_data;
ff_h264_remove_all_refs(h);
@@ -1886,6 +2068,16 @@ static av_cold int h264_decode_end(AVCodecContext *avctx)
ff_h264_unref_picture(h, &h->last_pic_for_ec);
av_frame_free(&h->last_pic_for_ec.f);
+#ifdef SYNO_EVANSPORT_SMD
+ if(smd_h264_vid_dec_available)
+ {
+ ret_val = ismd_ffmpeg_free_vid_dec_res(&smd_h264_vid_dec);
+ if(ret_val != ISMD_SUCCESS)
+ av_log(avctx,AV_LOG_ERROR,"could not free video decoder resources\n");
+ }
+ smd_h264_vid_dec_available = false;
+#endif
+
return 0;
}
@@ -1898,6 +2090,14 @@ static const AVOption h264_options[] = {
{ NULL },
};
+#ifdef SYNO_EVANSPORT_SMD
+static const AVOption h264_options_smd[] = {
+ {"is_avc", "is avc", offsetof(H264Context, is_avc), FF_OPT_TYPE_INT, {.i64 = 0}, 0, 1, 0},
+ {"nal_length_size", "nal_length_size", offsetof(H264Context, nal_length_size), FF_OPT_TYPE_INT, {.i64 = 0}, 0, 4, 0},