From 495d8fd309acdb9da14ebced0716ef3dd4376d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Thu, 31 Oct 2024 13:58:35 +0100 Subject: [PATCH 1/7] Rename FFMpeg3 classes to FFmpeg prior to FFmpeg v4 update --- Library/TeamTalkLib/avstream/AVFCapture.h | 2 +- Library/TeamTalkLib/avstream/AVFVideoInput.h | 2 +- .../TeamTalkLib/avstream/AudioResampler.cpp | 2 +- .../{FFMpeg3Capture.h => FFMpegCapture.h} | 8 +++--- ...FFMpeg3Streamer.cpp => FFMpegStreamer.cpp} | 6 ++--- .../{FFMpeg3Streamer.h => FFMpegStreamer.h} | 0 .../{FFMpeg3Capture.cpp => FFmpegCapture.cpp} | 26 +++++++++---------- ...Mpeg3Resampler.cpp => FFmpegResampler.cpp} | 4 +-- .../{FFMpeg3Resampler.h => FFmpegResampler.h} | 0 .../TeamTalkLib/avstream/MediaStreamer.cpp | 2 +- Library/TeamTalkLib/avstream/V4L2Capture.h | 4 +-- Library/TeamTalkLib/build/avstream.cmake | 16 ++++++------ Library/TeamTalkLib/test/CatchDefault.cpp | 2 +- .../TeamTalkCatchQT/TeamTalkCatchQT.pro | 4 +-- 14 files changed, 39 insertions(+), 39 deletions(-) rename Library/TeamTalkLib/avstream/{FFMpeg3Capture.h => FFMpegCapture.h} (94%) rename Library/TeamTalkLib/avstream/{FFMpeg3Streamer.cpp => FFMpegStreamer.cpp} (99%) rename Library/TeamTalkLib/avstream/{FFMpeg3Streamer.h => FFMpegStreamer.h} (100%) rename Library/TeamTalkLib/avstream/{FFMpeg3Capture.cpp => FFmpegCapture.cpp} (75%) rename Library/TeamTalkLib/avstream/{FFMpeg3Resampler.cpp => FFmpegResampler.cpp} (96%) rename Library/TeamTalkLib/avstream/{FFMpeg3Resampler.h => FFmpegResampler.h} (100%) diff --git a/Library/TeamTalkLib/avstream/AVFCapture.h b/Library/TeamTalkLib/avstream/AVFCapture.h index 028360fb8e..efa8c8ac73 100644 --- a/Library/TeamTalkLib/avstream/AVFCapture.h +++ b/Library/TeamTalkLib/avstream/AVFCapture.h @@ -28,7 +28,7 @@ namespace vidcap { - class AVFCapture : public FFMpeg3Capture + class AVFCapture : public FFmpegCapture { protected: ffmpegvideoinput_t createStreamer(const VidCapDevice& viddevice, diff --git a/Library/TeamTalkLib/avstream/AVFVideoInput.h b/Library/TeamTalkLib/avstream/AVFVideoInput.h index 14b8f0d4c6..97324a321f 100644 --- a/Library/TeamTalkLib/avstream/AVFVideoInput.h +++ b/Library/TeamTalkLib/avstream/AVFVideoInput.h @@ -21,7 +21,7 @@ * */ -#include "FFMpeg3Capture.h" +#include "FFmpegCapture.h" namespace vidcap { diff --git a/Library/TeamTalkLib/avstream/AudioResampler.cpp b/Library/TeamTalkLib/avstream/AudioResampler.cpp index f1a32c5526..67657268b2 100644 --- a/Library/TeamTalkLib/avstream/AudioResampler.cpp +++ b/Library/TeamTalkLib/avstream/AudioResampler.cpp @@ -30,7 +30,7 @@ #if defined(ENABLE_DMORESAMPLER) #include "DMOResampler.h" #elif defined(ENABLE_FFMPEG3) -#include "FFMpeg3Resampler.h" +#include "FFmpegResampler.h" #endif #include diff --git a/Library/TeamTalkLib/avstream/FFMpeg3Capture.h b/Library/TeamTalkLib/avstream/FFMpegCapture.h similarity index 94% rename from Library/TeamTalkLib/avstream/FFMpeg3Capture.h rename to Library/TeamTalkLib/avstream/FFMpegCapture.h index 9f2ded34f4..f9c54c0954 100644 --- a/Library/TeamTalkLib/avstream/FFMpeg3Capture.h +++ b/Library/TeamTalkLib/avstream/FFMpegCapture.h @@ -25,7 +25,7 @@ #define FFMPEG3CAPTURE_H #include "VideoCapture.h" -#include "FFMpeg3Streamer.h" +#include "FFmpegStreamer.h" #include #include @@ -48,7 +48,7 @@ namespace vidcap { typedef std::unique_ptr ffmpegvideoinput_t; - class FFMpeg3Capture : public VideoCapture + class FFmpegCapture : public VideoCapture { protected: virtual ffmpegvideoinput_t createStreamer(const VidCapDevice& viddevice, @@ -57,8 +57,8 @@ namespace vidcap { VideoCaptureCallback m_callback; public: - FFMpeg3Capture(); - virtual ~FFMpeg3Capture(); + FFmpegCapture(); + virtual ~FFmpegCapture(); // VideoCapture interface bool InitVideoCapture(const ACE_TString& deviceid, diff --git a/Library/TeamTalkLib/avstream/FFMpeg3Streamer.cpp b/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp similarity index 99% rename from Library/TeamTalkLib/avstream/FFMpeg3Streamer.cpp rename to Library/TeamTalkLib/avstream/FFMpegStreamer.cpp index 5bab3d563e..d19c4d0468 100644 --- a/Library/TeamTalkLib/avstream/FFMpeg3Streamer.cpp +++ b/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp @@ -21,7 +21,7 @@ * */ -#include "FFMpeg3Streamer.h" +#include "FFmpegStreamer.h" #include #include @@ -328,7 +328,7 @@ void FFMpegStreamer::Run() InitBuffers(); //wait for start signal - MYTRACE(ACE_TEXT("FFMpeg3 waiting to start streaming: %s\n"), m_media_in.filename.c_str()); + MYTRACE(ACE_TEXT("FFmpeg waiting to start streaming: %s\n"), m_media_in.filename.c_str()); m_run.get(start); if(!start) goto fail; @@ -528,7 +528,7 @@ void FFMpegStreamer::Run() if (m_statuscallback && !m_stop) m_statuscallback(m_media_in, MEDIASTREAM_FINISHED); - MYTRACE(ACE_TEXT("FFMpeg3 finished streaming: %s\n"), m_media_in.filename.c_str()); + MYTRACE(ACE_TEXT("FFmpeg finished streaming: %s\n"), m_media_in.filename.c_str()); goto end; fail: diff --git a/Library/TeamTalkLib/avstream/FFMpeg3Streamer.h b/Library/TeamTalkLib/avstream/FFMpegStreamer.h similarity index 100% rename from Library/TeamTalkLib/avstream/FFMpeg3Streamer.h rename to Library/TeamTalkLib/avstream/FFMpegStreamer.h diff --git a/Library/TeamTalkLib/avstream/FFMpeg3Capture.cpp b/Library/TeamTalkLib/avstream/FFmpegCapture.cpp similarity index 75% rename from Library/TeamTalkLib/avstream/FFMpeg3Capture.cpp rename to Library/TeamTalkLib/avstream/FFmpegCapture.cpp index 8d785d69c9..a4f057bcca 100644 --- a/Library/TeamTalkLib/avstream/FFMpeg3Capture.cpp +++ b/Library/TeamTalkLib/avstream/FFmpegCapture.cpp @@ -21,7 +21,7 @@ * */ -#include "FFMpeg3Capture.h" +#include "FFmpegCapture.h" #include #include @@ -37,16 +37,16 @@ FFMpegVideoInput::FFMpegVideoInput(const VidCapDevice& viddevice, } -FFMpeg3Capture::FFMpeg3Capture() +FFmpegCapture::FFmpegCapture() { InitAVConv(); } -FFMpeg3Capture::~FFMpeg3Capture() +FFmpegCapture::~FFmpegCapture() { } -bool FFMpeg3Capture::InitVideoCapture(const ACE_TString& deviceid, +bool FFmpegCapture::InitVideoCapture(const ACE_TString& deviceid, const media::VideoFormat& vidfmt) { vidcap_devices_t devs = GetDevices(); @@ -60,9 +60,9 @@ bool FFMpeg3Capture::InitVideoCapture(const ACE_TString& deviceid, ffmpegvideoinput_t streamer = createStreamer(dev, vidfmt); assert(streamer.get()); - streamer->RegisterVideoCallback(std::bind(&FFMpeg3Capture::MediaStreamVideoCallback, + streamer->RegisterVideoCallback(std::bind(&FFmpegCapture::MediaStreamVideoCallback, this, _1, _2), true); - streamer->RegisterStatusCallback(std::bind(&FFMpeg3Capture::MediaStreamStatusCallback, + streamer->RegisterStatusCallback(std::bind(&FFmpegCapture::MediaStreamStatusCallback, this, _1, _2), true); if (!streamer->Open()) return false; @@ -72,7 +72,7 @@ bool FFMpeg3Capture::InitVideoCapture(const ACE_TString& deviceid, return true; } -bool FFMpeg3Capture::StartVideoCapture() +bool FFmpegCapture::StartVideoCapture() { if (!m_videoinput) return false; @@ -86,20 +86,20 @@ bool FFMpeg3Capture::StartVideoCapture() return true; } -void FFMpeg3Capture::StopVideoCapture() +void FFmpegCapture::StopVideoCapture() { m_videoinput.reset(); m_callback = {}; } -media::VideoFormat FFMpeg3Capture::GetVideoCaptureFormat() +media::VideoFormat FFmpegCapture::GetVideoCaptureFormat() { if (m_videoinput) return m_videoinput->GetVideoFormat(); return media::VideoFormat(); } -bool FFMpeg3Capture::RegisterVideoFormat(VideoCaptureCallback callback, media::FourCC fcc) +bool FFmpegCapture::RegisterVideoFormat(VideoCaptureCallback callback, media::FourCC fcc) { if (m_videoinput && m_videoinput->GetVideoFormat().fourcc == fcc) { @@ -109,7 +109,7 @@ bool FFMpeg3Capture::RegisterVideoFormat(VideoCaptureCallback callback, media::F return false; } -void FFMpeg3Capture::UnregisterVideoFormat(media::FourCC fcc) +void FFmpegCapture::UnregisterVideoFormat(media::FourCC fcc) { if (m_videoinput && m_videoinput->GetVideoFormat().fourcc == fcc) { @@ -117,7 +117,7 @@ void FFMpeg3Capture::UnregisterVideoFormat(media::FourCC fcc) } } -bool FFMpeg3Capture::MediaStreamVideoCallback(media::VideoFrame& video_frame, +bool FFmpegCapture::MediaStreamVideoCallback(media::VideoFrame& video_frame, ACE_Message_Block* mb_video) { assert(m_videoinput.get()); @@ -128,7 +128,7 @@ bool FFMpeg3Capture::MediaStreamVideoCallback(media::VideoFrame& video_frame, return false; } -void FFMpeg3Capture::MediaStreamStatusCallback(const MediaFileProp& /*mfp*/, +void FFmpegCapture::MediaStreamStatusCallback(const MediaFileProp& /*mfp*/, MediaStreamStatus /*status*/) { } diff --git a/Library/TeamTalkLib/avstream/FFMpeg3Resampler.cpp b/Library/TeamTalkLib/avstream/FFmpegResampler.cpp similarity index 96% rename from Library/TeamTalkLib/avstream/FFMpeg3Resampler.cpp rename to Library/TeamTalkLib/avstream/FFmpegResampler.cpp index 4963a9e48e..e90c1c90bf 100644 --- a/Library/TeamTalkLib/avstream/FFMpeg3Resampler.cpp +++ b/Library/TeamTalkLib/avstream/FFmpegResampler.cpp @@ -21,10 +21,10 @@ * */ -#include "FFMpeg3Resampler.h" +#include "FFmpegResampler.h" #include -#include "FFMpeg3Streamer.h" // need InitAVConv() +#include "FFmpegStreamer.h" // need InitAVConv() extern "C" { #include diff --git a/Library/TeamTalkLib/avstream/FFMpeg3Resampler.h b/Library/TeamTalkLib/avstream/FFmpegResampler.h similarity index 100% rename from Library/TeamTalkLib/avstream/FFMpeg3Resampler.h rename to Library/TeamTalkLib/avstream/FFmpegResampler.h diff --git a/Library/TeamTalkLib/avstream/MediaStreamer.cpp b/Library/TeamTalkLib/avstream/MediaStreamer.cpp index 2cc37cb75c..80e08e583f 100644 --- a/Library/TeamTalkLib/avstream/MediaStreamer.cpp +++ b/Library/TeamTalkLib/avstream/MediaStreamer.cpp @@ -32,7 +32,7 @@ #endif /* ENABLE_DSHOW */ #if defined(ENABLE_FFMPEG3) -#include "FFMpeg3Streamer.h" +#include "FFmpegStreamer.h" #endif /* ENABLE_FFMPEG3*/ #if defined(ENABLE_OPUSTOOLS) && defined(ENABLE_OPUS) diff --git a/Library/TeamTalkLib/avstream/V4L2Capture.h b/Library/TeamTalkLib/avstream/V4L2Capture.h index 87e67cf75c..fbf4ed6267 100644 --- a/Library/TeamTalkLib/avstream/V4L2Capture.h +++ b/Library/TeamTalkLib/avstream/V4L2Capture.h @@ -24,11 +24,11 @@ #if !defined(V4L2CAPTURE_H) #define V4L2CAPTURE_H -#include "FFMpeg3Capture.h" +#include "FFmpegCapture.h" namespace vidcap { - class V4L2Capture : public FFMpeg3Capture + class V4L2Capture : public FFmpegCapture { protected: diff --git a/Library/TeamTalkLib/build/avstream.cmake b/Library/TeamTalkLib/build/avstream.cmake index f5aa1a3874..64ed771fcb 100644 --- a/Library/TeamTalkLib/build/avstream.cmake +++ b/Library/TeamTalkLib/build/avstream.cmake @@ -24,17 +24,17 @@ if (FEATURE_FFMPEG) list (APPEND AVSTREAM_COMPILE_FLAGS -DENABLE_FFMPEG3 ${FFMPEG_COMPILE_FLAGS}) list (APPEND AVSTREAM_LINK_FLAGS ${FFMPEG_LINK_FLAGS}) - list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Streamer.cpp) - list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Resampler.cpp) - list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Streamer.h) - list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Resampler.h) + list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFmpegStreamer.cpp) + list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFmpegResampler.cpp) + list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFmpegStreamer.h) + list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFmpegResampler.h) if (FEATURE_V4L2) list (APPEND AVSTREAM_COMPILE_FLAGS -DENABLE_V4L2) - list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Capture.cpp) + list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFmpegCapture.cpp) list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/VideoCapture.cpp) list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/V4L2Capture.cpp) - list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Capture.h) + list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFmpegCapture.h) list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/VideoCapture.h) list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/V4L2Capture.h) endif() @@ -43,11 +43,11 @@ if (FEATURE_FFMPEG) list (APPEND AVSTREAM_COMPILE_FLAGS -DENABLE_AVF) list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/AVFCapture.mm) list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/AVFVideoInput.cpp) - list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Capture.cpp) + list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/FFmpegCapture.cpp) list (APPEND AVSTREAM_SOURCES ${TEAMTALKLIB_ROOT}/avstream/VideoCapture.cpp) list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/AVFCapture.h) list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/AVFVideoInput.h) - list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFMpeg3Capture.h) + list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/FFmpegCapture.h) list (APPEND AVSTREAM_HEADERS ${TEAMTALKLIB_ROOT}/avstream/VideoCapture.h) endif() endif() diff --git a/Library/TeamTalkLib/test/CatchDefault.cpp b/Library/TeamTalkLib/test/CatchDefault.cpp index 0c19beeccd..a4481c8208 100644 --- a/Library/TeamTalkLib/test/CatchDefault.cpp +++ b/Library/TeamTalkLib/test/CatchDefault.cpp @@ -63,7 +63,7 @@ #include #if defined(ENABLE_FFMPEG3) -#include +#include #endif #if defined (ENABLE_PORTAUDIO) diff --git a/Library/TeamTalkLib/test/catchqt/TeamTalkCatchQT/TeamTalkCatchQT.pro b/Library/TeamTalkLib/test/catchqt/TeamTalkCatchQT/TeamTalkCatchQT.pro index 5d493d62cb..72f4c0d6bb 100644 --- a/Library/TeamTalkLib/test/catchqt/TeamTalkCatchQT/TeamTalkCatchQT.pro +++ b/Library/TeamTalkLib/test/catchqt/TeamTalkCatchQT/TeamTalkCatchQT.pro @@ -109,8 +109,8 @@ SOURCES += main.cpp \ $$TEAMTALKLIB_ROOT/avstream/AudioInputStreamer.cpp \ $$TEAMTALKLIB_ROOT/avstream/SpeexPreprocess.cpp \ $$TEAMTALKLIB_ROOT/avstream/SpeexResampler.cpp \ - $$TEAMTALKLIB_ROOT/avstream/FFMpeg3Streamer.cpp \ - $$TEAMTALKLIB_ROOT/avstream/FFMpeg3Resampler.cpp \ + $$TEAMTALKLIB_ROOT/avstream/FFmpegStreamer.cpp \ + $$TEAMTALKLIB_ROOT/avstream/FFmpegResampler.cpp \ $$TEAMTALKLIB_ROOT/avstream/WebRTCPreprocess.cpp \ $$TEAMTALKLIB_ROOT/avstream/WebRTCPreprocess.h \ $$TEAMTALKLIB_ROOT/avstream/OpusFileStreamer.cpp \ From 773ead5f955163b5bba1f39c9db3a01b2a66cadf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Wed, 30 Oct 2024 08:41:47 +0100 Subject: [PATCH 2/7] Change CMAKE_OSX_DEPLOYMENT_TARGET from 10.9 to 10.13 FFmpeg with video optimizations requires 10.13 as minimum. Qt TeamTalk anyway requires macOS Big Sur (11). --- Library/TeamTalkLib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/TeamTalkLib/CMakeLists.txt b/Library/TeamTalkLib/CMakeLists.txt index 4b5091c0a4..449719b8e7 100644 --- a/Library/TeamTalkLib/CMakeLists.txt +++ b/Library/TeamTalkLib/CMakeLists.txt @@ -47,7 +47,7 @@ endif() if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if (NOT CMAKE_OSX_DEPLOYMENT_TARGET) - set (CMAKE_OSX_DEPLOYMENT_TARGET 10.9) + set (CMAKE_OSX_DEPLOYMENT_TARGET 10.13) message(WARNING "No deployment target specified. Defaulting to ${CMAKE_OSX_DEPLOYMENT_TARGET}") endif() From 8765d09c7cbade7b4528509c2e2bf5493061b1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Thu, 31 Oct 2024 11:03:36 +0100 Subject: [PATCH 3/7] Change CMAKE_OSX_DEPLOYMENT_TARGET on iOS from 7.0 to 8.0 This is due to FFmpeg v4 update. --- Library/TeamTalkLib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/TeamTalkLib/CMakeLists.txt b/Library/TeamTalkLib/CMakeLists.txt index 449719b8e7..ddf4f2e591 100644 --- a/Library/TeamTalkLib/CMakeLists.txt +++ b/Library/TeamTalkLib/CMakeLists.txt @@ -59,7 +59,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") elseif (${CMAKE_SYSTEM_NAME} MATCHES "iOS") if (NOT CMAKE_OSX_DEPLOYMENT_TARGET) - set (CMAKE_OSX_DEPLOYMENT_TARGET 7.0) + set (CMAKE_OSX_DEPLOYMENT_TARGET 8.0) message(WARNING "No deployment target specified. Defaulting to ${CMAKE_OSX_DEPLOYMENT_TARGET}") endif() list (APPEND COMPILE_FLAGS -fembed-bitcode) From 41aa23ed8cf31c340561d41a85548bcce697d62c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Wed, 30 Oct 2024 09:04:16 +0100 Subject: [PATCH 4/7] Change to FFmpeg v4.0 Add VideoToolBox dependency to macOS. AudioToolBox was already there but is not introduced before FFmpeg v4.0. Update GNU assembler for FFmpeg v4.0. --- .../TeamTalkLib/avstream/FFMpegStreamer.cpp | 10 +- .../TeamTalkLib/build/ffmpeg/CMakeLists.txt | 102 ++++++++++++------ 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp b/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp index d19c4d0468..dd5047122d 100644 --- a/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp +++ b/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp @@ -39,7 +39,7 @@ extern "C" { #include #include #include -#include +#include #include #include #include @@ -694,8 +694,8 @@ AVFilterGraph* createAudioFilterGraph(AVFormatContext *fmt_ctx, //init filters AVFilterGraph *filter_graph = NULL; - AVFilter *abuffersrc = avfilter_get_by_name("abuffer"); - AVFilter *abuffersink = avfilter_get_by_name("abuffersink"); + const AVFilter *abuffersrc = avfilter_get_by_name("abuffer"); + const AVFilter *abuffersink = avfilter_get_by_name("abuffersink"); AVFilterInOut *outputs = avfilter_inout_alloc(); //TODO: Free?? AVFilterInOut *inputs = avfilter_inout_alloc(); //TODO: Free?? const enum AVSampleFormat out_sample_fmts[] = { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }; @@ -812,8 +812,8 @@ AVFilterGraph* createVideoFilterGraph(AVFormatContext *fmt_ctx, AVFilterGraph *filter_graph; char args[512]; int ret; - AVFilter *buffersrc = avfilter_get_by_name("buffer"); - AVFilter *buffersink = avfilter_get_by_name("buffersink"); + const AVFilter *buffersrc = avfilter_get_by_name("buffer"); + const AVFilter *buffersink = avfilter_get_by_name("buffersink"); AVFilterInOut *outputs = avfilter_inout_alloc(); AVFilterInOut *inputs = avfilter_inout_alloc(); const enum AVPixelFormat pix_fmts[] = { output_pixfmt, AV_PIX_FMT_NONE }; diff --git a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt index c5f620527e..d6ac17b9f2 100644 --- a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt +++ b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt @@ -14,26 +14,38 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-arm64-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n3.4.13 + GIT_TAG n4.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-arm64 INSTALL_DIR ${TOOLCHAIN_INSTALL_PREFIX_FFMPEG}-arm64 - PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0001-Fix-signature-of-read_probe-AVProbeData-p-in-libavfo.patch - COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0002-Fix-int-vs.-ptrdiff_t-signature-for-weight_h264_pixe.patch - CONFIGURE_COMMAND export PKG_CONFIG_PATH=${OPENSSL_DIR}/lib/pkgconfig && - /configure --prefix= --disable-iconv - --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes - --disable-libxcb-shape --disable-securetransport - --disable-schannel --disable-xlib --disable-jack + CONFIGURE_COMMAND export PKG_CONFIG_PATH=${OPENSSL_DIR}/lib/pkgconfig && /configure + --prefix= + # External libraries: + --disable-iconv + --disable-libxcb + --disable-libxcb-shape + --disable-libxcb-shm + --disable-libxcb-xfixes --disable-lzma + --disable-schannel + --disable-sdl2 + --disable-securetransport + --disable-xlib + --enable-openssl + # Programs/docs + --disable-doc + --disable-programs + # Compile options (yasm does not work for arm64) + --disable-asm + --disable-optimizations + --disable-stripping + --enable-debug=3 --extra-cflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ arm64 --extra-cxxflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ arm64 --extra-ldexeflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ arm64 - --disable-videotoolbox --disable-sdl2 --pkg-config-flags=--static - --enable-debug=3 --disable-optimizations --disable-stripping --enable-openssl - --enable-cross-compile --target-os=darwin --arch=arm64 --disable-asm - # Seems --arch=arm64 has no effect and '-arch arm64' has to be applied + --pkg-config-flags=--static + --enable-cross-compile --target-os=darwin --arch=arm64 BUILD_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} INSTALL_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} install BUILD_BYPRODUCTS /lib/libavdevice.a @@ -49,24 +61,36 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-intel-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n3.4.13 + GIT_TAG n4.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-intel INSTALL_DIR ${TOOLCHAIN_INSTALL_PREFIX_FFMPEG}-intel - PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0001-Fix-signature-of-read_probe-AVProbeData-p-in-libavfo.patch - COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0002-Fix-int-vs.-ptrdiff_t-signature-for-weight_h264_pixe.patch - CONFIGURE_COMMAND export PKG_CONFIG_PATH=${OPENSSL_DIR}/lib/pkgconfig && - /configure --prefix= --disable-iconv - --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes - --disable-libxcb-shape --disable-securetransport - --disable-schannel --disable-xlib --disable-jack + CONFIGURE_COMMAND export PKG_CONFIG_PATH=${OPENSSL_DIR}/lib/pkgconfig && /configure + --prefix= + # External libraries: + --disable-iconv + --disable-libxcb + --disable-libxcb-shape + --disable-libxcb-shm + --disable-libxcb-xfixes --disable-lzma + --disable-schannel + --disable-sdl2 + --disable-securetransport + --disable-xlib + --enable-openssl + # Programs/docs + --disable-doc + --disable-programs + # Compile options + --disable-optimizations + --disable-stripping + --enable-debug=3 --extra-cflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ x86_64 --extra-cxxflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ x86_64 --extra-ldexeflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ x86_64 - --disable-videotoolbox --disable-sdl2 --pkg-config-flags=--static - --enable-debug=3 --disable-optimizations --disable-stripping --enable-openssl + --pkg-config-flags=--static --enable-cross-compile --target-os=darwin --arch=x86_64 BUILD_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} INSTALL_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} install @@ -126,6 +150,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") find_library(QUARTZCORE_LIBRARY QuartzCore) find_library(BZ2_LIBRARY bz2) find_library (AUDIOTOOLBOX_LIBRARY AudioToolBox) + find_library (VIDEOTOOLBOX_LIBRARY VideoToolBox) set (FFMPEG_LINK ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${COREMEDIA_LIBRARY} @@ -134,7 +159,8 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ${VIDEODECODEACCELERATION_LIBRARY} ${QUARTZCORE_LIBRARY} ${BZ2_LIBRARY} - ${AUDIOTOOLBOX_LIBRARY}) + ${AUDIOTOOLBOX_LIBRARY} + ${VIDEOTOOLBOX_LIBRARY}) add_library(ffmpeg-avdevice STATIC IMPORTED GLOBAL) if (TOOLCHAIN_BUILD_EXTERNALPROJECTS) @@ -200,7 +226,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "iOS") if (TOOLCHAIN_BUILD_EXTERNALPROJECTS) ExternalProject_Add(gas-preprocessor GIT_REPOSITORY https://github.com/FFmpeg/gas-preprocessor - GIT_TAG cbe8847 + GIT_TAG 7380ac2 UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/gas-preprocessor INSTALL_DIR "" @@ -244,13 +270,11 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "iOS") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n3.4.13 + GIT_TAG n4.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg INSTALL_DIR ${TOOLCHAIN_INSTALL_PREFIX_FFMPEG} - PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0001-Fix-signature-of-read_probe-AVProbeData-p-in-libavfo.patch - COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0002-Fix-int-vs.-ptrdiff_t-signature-for-weight_h264_pixe.patch CONFIGURE_COMMAND /configure --prefix= ${FFMPEG_CFG_FLAGS} BUILD_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} INSTALL_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} install @@ -332,16 +356,20 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") if (TOOLCHAIN_BUILD_EXTERNALPROJECTS) ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n3.4.13 + GIT_TAG n4.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg INSTALL_DIR ${TOOLCHAIN_INSTALL_PREFIX_FFMPEG} - PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0001-Fix-signature-of-read_probe-AVProbeData-p-in-libavfo.patch - COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0002-Fix-int-vs.-ptrdiff_t-signature-for-weight_h264_pixe.patch CONFIGURE_COMMAND /configure --prefix= - --enable-pic --enable-openssl --disable-jack + # External libraries: --disable-libxcb + --enable-openssl + # Programs/docs + --disable-doc + --disable-programs + # Compile options + --enable-pic BUILD_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} INSTALL_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} install BUILD_BYPRODUCTS /lib/libavdevice.a @@ -485,16 +513,20 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Android") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n3.4.13 + GIT_TAG n4.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg INSTALL_DIR ${TOOLCHAIN_INSTALL_PREFIX_FFMPEG} - PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0001-Fix-signature-of-read_probe-AVProbeData-p-in-libavfo.patch - COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0002-Fix-int-vs.-ptrdiff_t-signature-for-weight_h264_pixe.patch CONFIGURE_COMMAND ${FFMPEG_EXPORT} && /configure ${FFMPEG_CFG} --prefix= + # External libraries: + --disable-indev=v4l2 + # Programs/docs + --disable-doc + --disable-programs + # Compile options + --enable-pic --enable-cross-compile --sysroot=${CMAKE_SYSROOT} --target-os=android - --enable-pic --disable-doc --disable-programs --disable-indev=v4l2 BUILD_COMMAND ${FFMPEG_EXPORT} && make ${TOOLCHAIN_BUILD_MAKEJOBS} INSTALL_COMMAND ${FFMPEG_EXPORT} && make ${TOOLCHAIN_BUILD_MAKEJOBS} install BUILD_BYPRODUCTS /lib/libavdevice.a From fb6f17d7d16a7a3d0e9e0ad4bf32a69b96623e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Wed, 30 Oct 2024 09:04:16 +0100 Subject: [PATCH 5/7] Change to FFmpeg v4.3.8 --- Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt index d6ac17b9f2..ee67434d5d 100644 --- a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt +++ b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt @@ -14,7 +14,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-arm64-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.0 + GIT_TAG n4.3.8 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-arm64 @@ -61,7 +61,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-intel-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.0 + GIT_TAG n4.3.8 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-intel @@ -270,7 +270,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "iOS") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.0 + GIT_TAG n4.3.8 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg @@ -356,7 +356,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") if (TOOLCHAIN_BUILD_EXTERNALPROJECTS) ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.0 + GIT_TAG n4.3.8 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg @@ -513,7 +513,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Android") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.0 + GIT_TAG n4.3.8 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg From 0e5b0eb3c3e491f6c9dbb261b13dadcbe09f5ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Wed, 30 Oct 2024 22:45:33 +0100 Subject: [PATCH 6/7] Change to FFmpeg v5.0 --- .../TeamTalkLib/avstream/AVFVideoInput.cpp | 7 +- Library/TeamTalkLib/avstream/AVFVideoInput.h | 6 +- Library/TeamTalkLib/avstream/FFMpegCapture.h | 9 +- .../TeamTalkLib/avstream/FFMpegStreamer.cpp | 153 ++++++++++++------ Library/TeamTalkLib/avstream/FFMpegStreamer.h | 8 +- Library/TeamTalkLib/avstream/V4L2Capture.cpp | 4 +- Library/TeamTalkLib/avstream/V4L2Capture.h | 3 +- .../TeamTalkLib/build/ffmpeg/CMakeLists.txt | 22 +-- 8 files changed, 129 insertions(+), 83 deletions(-) diff --git a/Library/TeamTalkLib/avstream/AVFVideoInput.cpp b/Library/TeamTalkLib/avstream/AVFVideoInput.cpp index 78c3dfabde..d6492d3c4d 100644 --- a/Library/TeamTalkLib/avstream/AVFVideoInput.cpp +++ b/Library/TeamTalkLib/avstream/AVFVideoInput.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2005-2018, BearWare.dk - * + * * Contact Information: * * Bjoern D. Rasmussen @@ -32,7 +32,7 @@ extern "C" { using namespace vidcap; -bool AVFVideoInput::SetupInput(AVInputFormat *iformat, +bool AVFVideoInput::SetupInput(const AVInputFormat *iformat, AVDictionary *options, AVFormatContext*& fmt_ctx, AVCodecContext*& aud_dec_ctx, @@ -42,7 +42,7 @@ bool AVFVideoInput::SetupInput(AVInputFormat *iformat, { auto vidfmt = GetMediaOutput().video; - + iformat = av_find_input_format(m_dev.api.c_str()); int fps = 1; if (vidfmt.fps_denominator) @@ -67,4 +67,3 @@ bool AVFVideoInput::SetupInput(AVInputFormat *iformat, audio_stream_index, video_stream_index); } - diff --git a/Library/TeamTalkLib/avstream/AVFVideoInput.h b/Library/TeamTalkLib/avstream/AVFVideoInput.h index 97324a321f..d461db9919 100644 --- a/Library/TeamTalkLib/avstream/AVFVideoInput.h +++ b/Library/TeamTalkLib/avstream/AVFVideoInput.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2005-2018, BearWare.dk - * + * * Contact Information: * * Bjoern D. Rasmussen @@ -32,9 +32,9 @@ namespace vidcap { const media::VideoFormat& fmt) : FFMpegVideoInput(viddevice, fmt) { } - + // FFMpegStreamer override - bool SetupInput(struct AVInputFormat *iformat, + bool SetupInput(const struct AVInputFormat *iformat, struct AVDictionary *options, struct AVFormatContext*& fmt_ctx, struct AVCodecContext*& aud_dec_ctx, diff --git a/Library/TeamTalkLib/avstream/FFMpegCapture.h b/Library/TeamTalkLib/avstream/FFMpegCapture.h index f9c54c0954..040e336b44 100644 --- a/Library/TeamTalkLib/avstream/FFMpegCapture.h +++ b/Library/TeamTalkLib/avstream/FFMpegCapture.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2005-2018, BearWare.dk - * + * * Contact Information: * * Bjoern D. Rasmussen @@ -55,7 +55,7 @@ namespace vidcap { const media::VideoFormat& fmt) = 0; ffmpegvideoinput_t m_videoinput; VideoCaptureCallback m_callback; - + public: FFmpegCapture(); virtual ~FFmpegCapture(); @@ -63,7 +63,7 @@ namespace vidcap { // VideoCapture interface bool InitVideoCapture(const ACE_TString& deviceid, const media::VideoFormat& vidfmt); - + bool StartVideoCapture(); void StopVideoCapture(); @@ -72,7 +72,7 @@ namespace vidcap { bool RegisterVideoFormat(VideoCaptureCallback callback, media::FourCC fcc); void UnregisterVideoFormat(media::FourCC fcc); - + // MediaStreamListener interface bool MediaStreamVideoCallback(media::VideoFrame& video_frame, ACE_Message_Block* mb_video); @@ -84,4 +84,3 @@ namespace vidcap { } #endif - diff --git a/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp b/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp index dd5047122d..5bbbfca854 100644 --- a/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp +++ b/Library/TeamTalkLib/avstream/FFMpegStreamer.cpp @@ -1,6 +1,6 @@ /* * Copyright (c) 2005-2018, BearWare.dk - * + * * Contact Information: * * Bjoern D. Rasmussen @@ -35,14 +35,15 @@ // FFMpeg type collides with AVFoundation, so keep in cpp file extern "C" { -#include #include #include -#include #include #include #include +#include +#include #include +#include } #define DEBUG_FFMPEG 0 @@ -60,21 +61,19 @@ void InitAVConv() if (!ready) { -#if defined(_DEBUG) && DEBUG_FFMPEG +#if DEBUG_FFMPEG av_log_set_level(AV_LOG_MAX_OFFSET); #else av_log_set_level(AV_LOG_QUIET); #endif avdevice_register_all(); - av_register_all(); - avfilter_register_all(); ready = true; } } } bool OpenInput(const ACE_TString& filename, - AVInputFormat *iformat, + const AVInputFormat *iformat, AVDictionary *options, AVFormatContext*& fmt_ctx, AVCodecContext*& aud_dec_ctx, @@ -82,14 +81,14 @@ bool OpenInput(const ACE_TString& filename, int& audio_stream_index, int& video_stream_index) { - AVCodec *aud_dec, *vid_dec; + const AVCodec *aud_dec, *vid_dec; if (avformat_open_input(&fmt_ctx, filename.c_str(), iformat, &options) < 0) { MYTRACE(ACE_TEXT("FFMpeg opened %s\n"), filename.c_str()); goto cleanup; } - + if (avformat_find_stream_info(fmt_ctx, NULL) < 0) { MYTRACE(ACE_TEXT("FFMpeg found stream info\n")); @@ -97,27 +96,60 @@ bool OpenInput(const ACE_TString& filename, } /* select the audio stream */ - audio_stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, + audio_stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, &aud_dec, 0); if (audio_stream_index >= 0) { - aud_dec_ctx = fmt_ctx->streams[audio_stream_index]->codec; - /* init the audio decoder */ - if (avcodec_open2(aud_dec_ctx, aud_dec, NULL) < 0) { + const AVCodecParameters* audparms = fmt_ctx->streams[audio_stream_index]->codecpar; + const AVCodec *audcodec = avcodec_find_decoder(audparms->codec_id); + if (audcodec) + { + aud_dec_ctx = avcodec_alloc_context3(audcodec); + /* transfer audio codec parameters to context */ + if (avcodec_parameters_to_context(aud_dec_ctx, audparms) < 0) + { + MYTRACE(ACE_TEXT("Failed to transfer audio codec properties to decoder context\n")); + audio_stream_index = -1; + } + /* init the audio decoder */ + else if (avcodec_open2(aud_dec_ctx, aud_dec, NULL) < 0) + { + MYTRACE(ACE_TEXT("Failed to open FFmpeg audio decoder\n")); + audio_stream_index = -1; + } + } + else + { audio_stream_index = -1; } } /* select the video stream */ - video_stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, + video_stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &vid_dec, 0); if (video_stream_index >= 0) { - vid_dec_ctx = fmt_ctx->streams[video_stream_index]->codec; - - /* init the video decoder */ - if (avcodec_open2(vid_dec_ctx, vid_dec, NULL) < 0) { + const AVCodecParameters* vidparms = fmt_ctx->streams[video_stream_index]->codecpar; + const AVCodec *vidcodec = avcodec_find_decoder(vidparms->codec_id); + if (vidcodec) + { + vid_dec_ctx = avcodec_alloc_context3(vidcodec); + /* transfer video codec parameters to context */ + if (avcodec_parameters_to_context(vid_dec_ctx, vidparms) < 0) + { + MYTRACE(ACE_TEXT("Failed to transfer video codec properties to decoder context\n")); + video_stream_index = -1; + } + /* init the video decoder */ + else if (avcodec_open2(vid_dec_ctx, vid_dec, NULL) < 0) + { + video_stream_index = -1; + } + } + else + { video_stream_index = -1; } + } @@ -152,7 +184,7 @@ AVFilterGraph* createVideoFilterGraph(AVFormatContext *fmt_ctx, AVPixelFormat output_pixfmt); void FillMediaFileProp(AVFormatContext *fmt_ctx, - AVCodecContext *aud_dec_ctx, + AVCodecContext *aud_dec_ctx, AVCodecContext *vid_dec_ctx, MediaFileProp& out_prop) { @@ -196,7 +228,7 @@ bool GetAVMediaFileProp(const ACE_TString& filename, MediaFileProp& out_prop) AVCodecContext *aud_dec_ctx = NULL, *vid_dec_ctx = NULL; int audio_stream_index = -1, video_stream_index = -1; - if(!OpenInput(filename, NULL, NULL, fmt_ctx, aud_dec_ctx, vid_dec_ctx, + if(!OpenInput(filename, NULL, NULL, fmt_ctx, aud_dec_ctx, vid_dec_ctx, audio_stream_index, video_stream_index)) return false; @@ -227,7 +259,7 @@ FFMpegStreamer::~FFMpegStreamer() MYTRACE(ACE_TEXT("~FFMpegStreamer()\n")); } -bool FFMpegStreamer::SetupInput(AVInputFormat *iformat, +bool FFMpegStreamer::SetupInput(const AVInputFormat *iformat, AVDictionary *options, AVFormatContext*& fmt_ctx, AVCodecContext*& aud_dec_ctx, @@ -258,7 +290,7 @@ void FFMpegStreamer::Run() int ret; bool start = false; - if(!SetupInput(in_fmt, options, fmt_ctx, aud_dec_ctx, vid_dec_ctx, + if(!SetupInput(in_fmt, options, fmt_ctx, aud_dec_ctx, vid_dec_ctx, audio_stream_index, video_stream_index)) { MYTRACE("Failed to setup input: %s\n", m_media_in.filename.c_str()); @@ -295,7 +327,7 @@ void FFMpegStreamer::Run() audio_stream_index = -1; //disable audio processing m_media_out.audio = media::AudioFormat(); } - + if (m_media_out.video.fourcc != media::FOURCC_NONE && video_stream_index >= 0) { video_filter_graph = createVideoFilterGraph(fmt_ctx, vid_dec_ctx, @@ -326,7 +358,7 @@ void FFMpegStreamer::Run() m_open.set(true); InitBuffers(); - + //wait for start signal MYTRACE(ACE_TEXT("FFmpeg waiting to start streaming: %s\n"), m_media_in.filename.c_str()); m_run.get(start); @@ -336,7 +368,7 @@ void FFMpegStreamer::Run() MediaStreamStatus status; ACE_UINT32 start_time, start_offset, totalpausetime; int64_t curaudiotime, curvideotime; - + status = MEDIASTREAM_STARTED; start_time = GETTIMESTAMP(); start_offset = MEDIASTREAMER_OFFSET_IGNORE; @@ -345,7 +377,6 @@ void FFMpegStreamer::Run() /* read all packets */ AVPacket packet; - int got_frame; while (!m_stop) { @@ -359,7 +390,7 @@ void FFMpegStreamer::Run() if (start_offset != MEDIASTREAMER_OFFSET_IGNORE) m_media_in.elapsed_ms += start_offset; - + // check if we should pause if (m_pause) { @@ -389,13 +420,13 @@ void FFMpegStreamer::Run() offset_sec /= 1000.0; bool success = true; - + if (audio_stream_index >= 0) { auto aud_stream = fmt_ctx->streams[audio_stream_index]; double curaudio_sec = curaudiotime / 1000.0; double difftime_sec = (offset_sec > curaudio_sec)? offset_sec - curaudio_sec : curaudio_sec - offset_sec; - + if (av_seek_frame(fmt_ctx, audio_stream_index, difftime_sec / av_q2d(aud_stream->time_base), (offset_sec > curaudio_sec? 0 : AVSEEK_FLAG_BACKWARD)) < 0) { @@ -413,7 +444,7 @@ void FFMpegStreamer::Run() auto vid_stream = fmt_ctx->streams[video_stream_index]; double curvideo_sec = curvideotime / 1000.0; double difftime_sec = (offset_sec > curvideo_sec)? offset_sec - curvideo_sec : curvideo_sec - offset_sec; - + if (av_seek_frame(fmt_ctx, video_stream_index, difftime_sec / av_q2d(vid_stream->time_base), (offset_sec > curvideo_sec? 0 : AVSEEK_FLAG_BACKWARD)) < 0) { @@ -433,13 +464,13 @@ void FFMpegStreamer::Run() start_time = GETTIMESTAMP(); totalpausetime = 0; start_offset = MEDIASTREAMER_OFFSET_IGNORE; - + ClearBuffers(); status = MEDIASTREAM_STARTED; } } - + if (status != MEDIASTREAM_NONE) { if (m_statuscallback) @@ -447,21 +478,21 @@ void FFMpegStreamer::Run() status = MEDIASTREAM_NONE; } - + if (av_read_frame(fmt_ctx, &packet) < 0) break; if (packet.stream_index == audio_stream_index) { - got_frame = 0; - ret = avcodec_decode_audio4(aud_dec_ctx, aud_frame, &got_frame, &packet); + ret = avcodec_send_packet(aud_dec_ctx, &packet); if (ret < 0) { MYTRACE(ACE_TEXT("Error decoding audio\n")); continue; } - if (got_frame) + ret = avcodec_receive_frame(aud_dec_ctx, aud_frame); + if (ret == 0) { // cout << "Audio frame " << n_audframe++ << " at time " << (tm * av_q2d(aud_time_base)) << endl; @@ -478,18 +509,27 @@ void FFMpegStreamer::Run() { goto fail; } - } // got_frame + } + else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + { + MYTRACE(ACE_TEXT("Cannot decode audio frame\n")); + } + else + { + MYTRACE(ACE_TEXT("Error decoding audio stream.\n")); + // should we just exit? + } } else if(packet.stream_index == video_stream_index) { - got_frame = 0; - ret = avcodec_decode_video2(vid_dec_ctx, vid_frame, &got_frame, &packet); + ret = avcodec_send_packet(vid_dec_ctx, &packet); if (ret < 0) { MYTRACE(ACE_TEXT("Error decoding video\n")); break; } - if (got_frame) + ret = avcodec_receive_frame(vid_dec_ctx, vid_frame); + if (ret == 0) { // vid_frame->pts = av_frame_get_best_effort_timestamp(vid_frame); @@ -500,15 +540,24 @@ void FFMpegStreamer::Run() break; } - curvideotime = ProcessVideoBuffer(vid_buffersink_ctx, filt_frame, + curvideotime = ProcessVideoBuffer(vid_buffersink_ctx, filt_frame, fmt_ctx->streams[video_stream_index], start_time, start_offset); if (curvideotime < 0) { goto fail; } - - } // got_frame + + } + else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + { + MYTRACE(ACE_TEXT("Cannot decode video frame\n")); + } + else + { + MYTRACE(ACE_TEXT("Error decoding video stream.\n")); + // should we just exit? + } } // stream index av_packet_unref(&packet); @@ -570,11 +619,11 @@ int64_t FFMpegStreamer::ProcessAudioBuffer(AVFilterContext* aud_buffersink_ctx, int ret = av_buffersink_get_frame(aud_buffersink_ctx, filt_frame); if(ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) return 0; - + if(ret < 0) return -1; - int64_t frame_tm = av_frame_get_best_effort_timestamp(filt_frame); + int64_t frame_tm = filt_frame->best_effort_timestamp; double frame_sec = frame_tm * av_q2d(aud_stream->time_base); // initial frame may be -0.000072 MYTRACE_COND(frame_sec < 0., ACE_TEXT("Audio frame time is less than 0: %g\n"), frame_sec); @@ -600,7 +649,7 @@ int64_t FFMpegStreamer::ProcessAudioBuffer(AVFilterContext* aud_buffersink_ctx, assert(m_media_out.audio.channels == n_channels); media_frame.inputfmt = m_media_out.audio; QueueAudio(media_frame); - + av_frame_unref(filt_frame); return frame_timestamp; @@ -622,7 +671,7 @@ int64_t FFMpegStreamer::ProcessVideoBuffer(AVFilterContext* vid_buffersink_ctx, if (ret < 0) return -1; - int64_t frame_tm = av_frame_get_best_effort_timestamp(filt_frame); + int64_t frame_tm = filt_frame->best_effort_timestamp; double frame_sec = frame_tm * av_q2d(vid_stream->time_base); MYTRACE_COND(frame_sec < 0., ACE_TEXT("Video frame time is less than 0: %g\n"), frame_sec); frame_sec = std::max(0., frame_sec); @@ -673,7 +722,7 @@ int64_t FFMpegStreamer::ProcessVideoBuffer(AVFilterContext* vid_buffersink_ctx, assert(filt_frame->width == m_media_in.video.width); assert(filt_frame->height == m_media_in.video.height); - + QueueVideo(media_frame); av_frame_unref(filt_frame); @@ -699,13 +748,14 @@ AVFilterGraph* createAudioFilterGraph(AVFormatContext *fmt_ctx, AVFilterInOut *outputs = avfilter_inout_alloc(); //TODO: Free?? AVFilterInOut *inputs = avfilter_inout_alloc(); //TODO: Free?? const enum AVSampleFormat out_sample_fmts[] = { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }; - int64_t out_channel_layouts[] = { (out_channels==1?AV_CH_LAYOUT_MONO:AV_CH_LAYOUT_STEREO), -1 }; + int64_t out_channel_layouts[] = { -1, -1 }; int out_sample_rates[] = { out_samplerate, -1 }; const AVFilterLink *outlink; - AVRational time_base = fmt_ctx->streams[audio_stream_index]->time_base; char args[512]; char filter_descr[100]; int ret; + AVRational time_base = fmt_ctx->streams[audio_stream_index]->time_base; + out_channel_layouts[0] = (out_channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO); filter_graph = avfilter_graph_alloc(); @@ -797,7 +847,7 @@ AVFilterGraph* createAudioFilterGraph(AVFormatContext *fmt_ctx, // avfilter_inout_free(&inputs); // avfilter_inout_free(&outputs); - return filter_graph; + return filter_graph; } @@ -886,4 +936,3 @@ AVFilterGraph* createVideoFilterGraph(AVFormatContext *fmt_ctx, return filter_graph; } - diff --git a/Library/TeamTalkLib/avstream/FFMpegStreamer.h b/Library/TeamTalkLib/avstream/FFMpegStreamer.h index 8c58781f42..c5ab82614f 100644 --- a/Library/TeamTalkLib/avstream/FFMpegStreamer.h +++ b/Library/TeamTalkLib/avstream/FFMpegStreamer.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2005-2018, BearWare.dk - * + * * Contact Information: * * Bjoern D. Rasmussen @@ -43,11 +43,11 @@ class FFMpegStreamer : public MediaFileStreamer public: FFMpegStreamer(const ACE_TString& filename, const MediaStreamOutput& out_prop); virtual ~FFMpegStreamer(); - + virtual bool IsSystemTime() const { return false; } protected: - virtual bool SetupInput(struct AVInputFormat *iformat, + virtual bool SetupInput(const struct AVInputFormat *iformat, struct AVDictionary *options, struct AVFormatContext*& fmt_ctx, struct AVCodecContext*& aud_dec_ctx, @@ -71,7 +71,7 @@ class FFMpegStreamer : public MediaFileStreamer }; bool OpenInput(const ACE_TString& filename, - AVInputFormat *iformat, + const AVInputFormat *iformat, AVDictionary *options, AVFormatContext*& fmt_ctx, AVCodecContext*& aud_dec_ctx, diff --git a/Library/TeamTalkLib/avstream/V4L2Capture.cpp b/Library/TeamTalkLib/avstream/V4L2Capture.cpp index c49fbc6cbc..86eab4dd90 100644 --- a/Library/TeamTalkLib/avstream/V4L2Capture.cpp +++ b/Library/TeamTalkLib/avstream/V4L2Capture.cpp @@ -51,7 +51,7 @@ class V4L2Input : public FFMpegVideoInput : FFMpegVideoInput(viddevice, fmt) { } // FFMpegStreamer override - bool SetupInput(AVInputFormat *iformat, + bool SetupInput(const AVInputFormat *iformat, AVDictionary *options, AVFormatContext*& fmt_ctx, AVCodecContext*& aud_dec_ctx, @@ -113,7 +113,7 @@ vidcap_devices_t V4L2Capture::GetDevices() { vidcap_devices_t devs; - AVInputFormat* in_fmt = av_input_video_device_next(NULL), *indev_fmt = NULL; + const AVInputFormat* in_fmt = av_input_video_device_next(NULL), *indev_fmt = NULL; while(in_fmt) { if (av_match_name("v4l2", in_fmt->name)) { indev_fmt = in_fmt; diff --git a/Library/TeamTalkLib/avstream/V4L2Capture.h b/Library/TeamTalkLib/avstream/V4L2Capture.h index fbf4ed6267..050b72baa3 100644 --- a/Library/TeamTalkLib/avstream/V4L2Capture.h +++ b/Library/TeamTalkLib/avstream/V4L2Capture.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2005-2018, BearWare.dk - * + * * Contact Information: * * Bjoern D. Rasmussen @@ -45,4 +45,3 @@ namespace vidcap { } #endif - diff --git a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt index ee67434d5d..3fe6986f7b 100644 --- a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt +++ b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt @@ -14,7 +14,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-arm64-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.3.8 + GIT_TAG n5.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-arm64 @@ -41,9 +41,9 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") --disable-optimizations --disable-stripping --enable-debug=3 - --extra-cflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ arm64 - --extra-cxxflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ arm64 - --extra-ldexeflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ arm64 + --extra-cflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} + --extra-cxxflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} + --extra-ldexeflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} --pkg-config-flags=--static --enable-cross-compile --target-os=darwin --arch=arm64 BUILD_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} @@ -61,7 +61,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-intel-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.3.8 + GIT_TAG n5.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-intel @@ -87,9 +87,9 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") --disable-optimizations --disable-stripping --enable-debug=3 - --extra-cflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ x86_64 - --extra-cxxflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ x86_64 - --extra-ldexeflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}\ -arch\ x86_64 + --extra-cflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} + --extra-cxxflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} + --extra-ldexeflags=-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} --pkg-config-flags=--static --enable-cross-compile --target-os=darwin --arch=x86_64 BUILD_COMMAND make ${TOOLCHAIN_BUILD_MAKEJOBS} @@ -270,7 +270,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "iOS") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.3.8 + GIT_TAG n5.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg @@ -356,7 +356,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") if (TOOLCHAIN_BUILD_EXTERNALPROJECTS) ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.3.8 + GIT_TAG n5.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg @@ -513,7 +513,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Android") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n4.3.8 + GIT_TAG n5.0 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg From c74c94e770e34a9bfce97d2d98fed990a4762299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Wed, 30 Oct 2024 08:41:47 +0100 Subject: [PATCH 7/7] Change to FFmpeg v6.1.2 --- Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt index 3fe6986f7b..cc753548df 100644 --- a/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt +++ b/Library/TeamTalkLib/build/ffmpeg/CMakeLists.txt @@ -14,7 +14,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-arm64-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n5.0 + GIT_TAG n6.1.2 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-arm64 @@ -61,7 +61,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ExternalProject_Add(ffmpeg-intel-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n5.0 + GIT_TAG n6.1.2 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg-intel @@ -270,7 +270,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "iOS") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n5.0 + GIT_TAG n6.1.2 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg @@ -356,7 +356,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") if (TOOLCHAIN_BUILD_EXTERNALPROJECTS) ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n5.0 + GIT_TAG n6.1.2 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg @@ -513,7 +513,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Android") ExternalProject_Add(ffmpeg-src GIT_REPOSITORY https://github.com/FFmpeg/FFmpeg - GIT_TAG n5.0 + GIT_TAG n6.1.2 GIT_SHALLOW TRUE UPDATE_COMMAND "" PREFIX ${TOOLCHAIN_BUILD_PREFIX}/ffmpeg