Last active
July 17, 2019 18:03
-
-
Save tmm1/280f11b9c252cec87167c4bd406b508c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}, | |