summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO18
-rw-r--r--.gitignore1
-rw-r--r--PKGBUILD28
-rw-r--r--fix_ffmpeg5.patch159
-rw-r--r--fix_operator_ambiguity.patch352
-rw-r--r--fix_throw_specifications.patch24
-rw-r--r--inc_boost_header.patch116
7 files changed, 685 insertions, 13 deletions
diff --git a/.SRCINFO b/.SRCINFO
index b0391fbf1fe7..2c94ed8a4913 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,15 +1,15 @@
# Generated by mksrcinfo v8
-# Sat Mar 4 05:37:53 UTC 2017
+# Thu Nov 9 06:16:16 UTC 2023
pkgbase = bombono-dvd
pkgdesc = DVD authoring program with nice and clean GUI
pkgver = 1.2.4
- pkgrel = 2
- url = http://www.bombono.org
+ pkgrel = 9
+ url = https://bombono.com/
install = bombono-dvd.install
arch = i686
arch = x86_64
license = GPL
- makedepends = scons
+ makedepends = scons2
depends = gtk2
depends = gtkmm
depends = mjpegtools
@@ -24,20 +24,28 @@ pkgbase = bombono-dvd
depends = cdrkit
optdepends = gvfs: web browser integration
conflicts = bombono-dvd-git
- source = https://github.com/muravjov/bombono-dvd/archive/1.2.4.tar.gz
+ source = https://github.com/bombono-dvd/bombono-dvd/archive/refs/tags/1.2.4.tar.gz
source = fix_ffmpeg_codecid.patch
source = fix_ptr2bool_cast.patch
source = fix_c++11_literal_warnings.patch
source = autoptr2uniqueptr.patch
+ source = inc_boost_header.patch
source = fix_deprecated_boost_api.patch
+ source = fix_throw_specifications.patch
+ source = fix_operator_ambiguity.patch
source = fix_ffmpeg30.patch
+ source = fix_ffmpeg5.patch
sha256sums = 4f8c882a0c359ca8c182a627885c64aa271820eead2f9a64b34f1625c3b0a9d7
sha256sums = 63e47ffb812acb33a4d1f5d7f421eb2ccdf3ee1ce1b7f75267c32079dbc9dea1
sha256sums = b0ff83b2fad27e39dfd77d12e00c25e554fe86ee1894c2f8fbe1915a2c46dd88
sha256sums = 28be98eb36eb6422717df7048c8ee74927495e7d7829e17cb54d746befc238c4
sha256sums = 4c29e9b19ba3bcf8c42c46aaea6c1411580629e581307a91f4d085fcdaa6eab6
+ sha256sums = 49f61bb2db0498440ec8926c17a88a993081a583337f41c0d9fd8f1b11b0b0ac
sha256sums = a69f51f9d5bd6ebe26c13abeece9de012d110dcec944c76efbab59b6bc0ef915
+ sha256sums = 72b3d6c76cbf98fb9287f7ee5b7a57b6febe2a635d50758c2451e376e3e6ca02
+ sha256sums = 9d56f7d16c55a506b092dbec00789e4767963d6202d3d92b79ad389393d43c69
sha256sums = f6fd3a309987ac08b6f70132686c5a06bc7496fb6e1097539d6348f558d09502
+ sha256sums = bab551ef9733eb67c1e036becec0600c31479fbdf49f6e3b4380efdcbdae726c
pkgname = bombono-dvd
diff --git a/.gitignore b/.gitignore
index b101a9aeac20..3b71fba5add5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
bombono-dvd-*.tar.bz2
+*.pkg.tar.zst
*.pkg.tar.xz
*.tar.gz
pkg/
diff --git a/PKGBUILD b/PKGBUILD
index e797a494ccba..4019446b26bf 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -3,31 +3,39 @@
pkgname=bombono-dvd
pkgver=1.2.4
-pkgrel=2
+pkgrel=9
pkgdesc="DVD authoring program with nice and clean GUI"
arch=('i686' 'x86_64')
-url="http://www.bombono.org"
+url="https://bombono.com/"
license=('GPL')
depends=('gtk2' 'gtkmm' 'mjpegtools' 'ffmpeg' 'libdvdread' 'dvdauthor' \
'dvd+rw-tools' 'twolame' 'libxml++2.6' 'boost' 'enca' 'cdrkit')
-makedepends=('scons')
+makedepends=('scons2')
optdepends=('gvfs: web browser integration')
conflicts=('bombono-dvd-git')
-source=("https://github.com/muravjov/${pkgname}/archive/${pkgver}.tar.gz"
+source=("https://github.com/${pkgname}/${pkgname}/archive/refs/tags/${pkgver}.tar.gz"
"fix_ffmpeg_codecid.patch"
"fix_ptr2bool_cast.patch"
"fix_c++11_literal_warnings.patch"
"autoptr2uniqueptr.patch"
+ "inc_boost_header.patch"
"fix_deprecated_boost_api.patch"
- "fix_ffmpeg30.patch")
+ "fix_throw_specifications.patch"
+ "fix_operator_ambiguity.patch"
+ "fix_ffmpeg30.patch"
+ "fix_ffmpeg5.patch")
install=bombono-dvd.install
sha256sums=('4f8c882a0c359ca8c182a627885c64aa271820eead2f9a64b34f1625c3b0a9d7'
'63e47ffb812acb33a4d1f5d7f421eb2ccdf3ee1ce1b7f75267c32079dbc9dea1'
'b0ff83b2fad27e39dfd77d12e00c25e554fe86ee1894c2f8fbe1915a2c46dd88'
'28be98eb36eb6422717df7048c8ee74927495e7d7829e17cb54d746befc238c4'
'4c29e9b19ba3bcf8c42c46aaea6c1411580629e581307a91f4d085fcdaa6eab6'
+ '49f61bb2db0498440ec8926c17a88a993081a583337f41c0d9fd8f1b11b0b0ac'
'a69f51f9d5bd6ebe26c13abeece9de012d110dcec944c76efbab59b6bc0ef915'
- 'f6fd3a309987ac08b6f70132686c5a06bc7496fb6e1097539d6348f558d09502')
+ '72b3d6c76cbf98fb9287f7ee5b7a57b6febe2a635d50758c2451e376e3e6ca02'
+ '9d56f7d16c55a506b092dbec00789e4767963d6202d3d92b79ad389393d43c69'
+ 'f6fd3a309987ac08b6f70132686c5a06bc7496fb6e1097539d6348f558d09502'
+ 'bab551ef9733eb67c1e036becec0600c31479fbdf49f6e3b4380efdcbdae726c')
prepare() {
cd "${pkgname}-${pkgver}"
@@ -37,6 +45,10 @@ prepare() {
patch -Np1 -i "${srcdir}/autoptr2uniqueptr.patch"
patch -Np1 -i "${srcdir}/fix_deprecated_boost_api.patch"
patch -Np1 -i "${srcdir}/fix_ffmpeg30.patch"
+ patch -Np1 -i "${srcdir}/fix_throw_specifications.patch"
+ patch -Np1 -i "${srcdir}/fix_operator_ambiguity.patch"
+ patch -Np1 -i "${srcdir}/inc_boost_header.patch"
+ patch -Np1 -i "${srcdir}/fix_ffmpeg5.patch"
# python2 fix
for file in $(find . -name '*.py' -print); do
sed -i 's_#!.*/usr/bin/python_#!/usr/bin/python2_' $file
@@ -59,12 +71,12 @@ prepare() {
build() {
cd "${pkgname}-${pkgver}"
- scons PREFIX="/usr" DESTDIR="$pkgdir" CPPFLAGS="-std=c++14 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_FILESYSTEM_NO_DEPRECATED -DBOOST_FILESYSTEM_VERSION=3" USE_EXT_BOOST=1
+ scons2 PREFIX="/usr" DESTDIR="$pkgdir" CPPFLAGS="-std=c++14 -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_FILESYSTEM_NO_DEPRECATED -DBOOST_FILESYSTEM_VERSION=3" USE_EXT_BOOST=1
}
package() {
cd "${pkgname}-${pkgver}"
- scons PREFIX="/usr" DESTDIR="$pkgdir" install
+ scons2 PREFIX="/usr" DESTDIR="$pkgdir" install
}
diff --git a/fix_ffmpeg5.patch b/fix_ffmpeg5.patch
new file mode 100644
index 000000000000..371afa0388b2
--- /dev/null
+++ b/fix_ffmpeg5.patch
@@ -0,0 +1,159 @@
+diff -ruN old/src/mgui/ffviewer.cpp new/src/mgui/ffviewer.cpp
+--- old/src/mgui/ffviewer.cpp 2022-08-26 15:51:35.995797128 +0430
++++ new/src/mgui/ffviewer.cpp 2022-08-26 15:56:06.538840475 +0430
+@@ -37,6 +37,7 @@
+ #endif
+
+ C_LINKAGE_BEGIN
++#include <libavcodec/avcodec.h>
+ #include <libavutil/imgutils.h>
+ C_LINKAGE_END
+
+@@ -111,7 +112,7 @@
+
+ AVCodecContext* GetVideoCtx(FFData& ffv)
+ {
+- return VideoStream(ffv)->codec;
++ return ffv.videoCtx;
+ }
+
+ static bool IsValidRational(const AVRational& r)
+@@ -294,6 +295,7 @@
+ #else
+ av_close_input_file(ffi.iCtx);
+ #endif
++ avcodec_free_context(&ffi.videoCtx);
+ ffi.iCtx = 0;
+ }
+ }
+@@ -437,8 +439,6 @@
+ {
+ std::string& err_str = diag.errStr;
+
+- av_register_all();
+-
+ ASSERT( !ffi.IsOpened() );
+ bool res = false;
+
+@@ -508,14 +508,14 @@
+ for( int i=0; i < (int)ic->nb_streams; i++ )
+ {
+ AVStream* strm = ic->streams[i];
+- AVCodecContext* avctx = strm->codec;
+- if( SetIndex(video_idx, i, avctx->codec_type == AVMEDIA_TYPE_VIDEO) )
++ AVCodecParameters* avcp = strm->codecpar;
++ if( SetIndex(video_idx, i, avcp->codec_type == AVMEDIA_TYPE_VIDEO) )
+ ;
+ else
+ // для демиксера имеет значение только NONE и ALL
+ strm->discard = AVDISCARD_ALL;
+
+- SetIndex(audio_idx, i, avctx->codec_type == AVMEDIA_TYPE_AUDIO);
++ SetIndex(audio_idx, i, avcp->codec_type == AVMEDIA_TYPE_AUDIO);
+ }
+
+ if( video_idx == -1 )
+@@ -562,23 +562,29 @@
+ }
+
+ // открытие кодека
+- AVCodecContext* dec = ic->streams[video_idx]->codec;
+- // для H.264 и плохих TS
+- dec->strict_std_compliance = FF_COMPLIANCE_STRICT;
++ AVCodecParameters* decp = ic->streams[video_idx]->codecpar;
+
+ // Chromium зачем-то выставляет явно, но такие значения уже по умолчанию
+ //dec->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK;
+ //dec->error_recognition = FF_ER_CAREFUL;
+
+- std::string tag_str = CodecID2Str(dec->codec_id);
++ std::string tag_str = CodecID2Str(decp->codec_id);
+ // AVCodec - это одиночка, а AVCodecContext - состояние для него
+ // в соответ. потоке контейнера
+- AVCodec* codec = avcodec_find_decoder(dec->codec_id);
++ const AVCodec* codec = avcodec_find_decoder(decp->codec_id);
+ if( !codec )
+ {
+ err_str = BF_("No decoder found for the stream: %1%") % tag_str % bf::stop;
+ return false;
+ }
++ AVCodecContext *dec;
++ ffi.videoCtx = dec = avcodec_alloc_context3(codec);
++ if( avcodec_parameters_to_context(dec, decp) < 0 )
++ {
++ err_str = _("Can't copy codec parameters");
++ return false;
++ }
++ dec->strict_std_compliance = FF_COMPLIANCE_STRICT;
+
+ // :TRICKY: вся полезна инфо о дорожке, включая размеры видео, реально парсится
+ // в av_find_stream_info(), а в avcodec_open() - кодек только привязывается к
+@@ -824,7 +830,15 @@
+ pkt->data = 0;
+ pkt->size = 0;
+ }
+- int av_res = avcodec_decode_video2(GetVideoCtx(ffv), &picture, &got_picture, pkt);
++ int av_res = avcodec_send_packet(GetVideoCtx(ffv), pkt);
++ if( av_res >= 0 )
++ {
++ av_res = avcodec_receive_frame(GetVideoCtx(ffv), &picture);
++ if( av_res >= 0 )
++ {
++ got_picture = 1;
++ }
++ }
+ #else
+ const uint8_t* buf = 0;
+ int buf_sz = 0;
+@@ -870,7 +884,8 @@
+ // в идеале длительность уже была рассчитана в предыдущем pkt->duration;
+ // пока же сделаем копипаст как в ffmpeg.c - см. особенности ffmpeg (compute_pkt_fields())
+ AVStream* st = VideoStream(ffv);
+- int ticks = st->parser ? st->parser->repeat_pict + 1 : dec->ticks_per_frame ;
++ AVCodecParserContext *pctx = av_stream_get_parser(st);
++ int ticks = pctx ? pctx->repeat_pict + 1 : dec->ticks_per_frame;
+ next_pts += VideoFrameLength(dec, ticks);
+ }
+
+@@ -1082,7 +1097,7 @@
+ // переход по позиции не работает для avi, mkv - см. особенности ffmpeg
+ // однако для без-заголовочных демиксеров (MPEG-PS, MPEG-TS) требуется
+
+- typedef std::map<std::string, AVInputFormat*> Map;
++ typedef std::map<std::string, const AVInputFormat*> Map;
+ static Map map;
+ if( map.empty() )
+ {
+diff -ruN old/src/mgui/ffviewer.h new/src/mgui/ffviewer.h
+--- old/src/mgui/ffviewer.h 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mgui/ffviewer.h 2022-08-26 16:00:47.375606645 +0430
+@@ -53,6 +53,7 @@
+ //
+ typedef FFViewer VideoViewer;
+
++struct AVCodecContext;
+ struct FFData;
+ double FrameFPS(FFData& ffv);
+ double Duration(FFData& ffv);
+@@ -70,6 +71,7 @@
+ struct FFData: public boost::noncopyable
+ {
+ AVFormatContext* iCtx;
++ AVCodecContext* videoCtx;
+ int videoIdx;
+ Point vidSz; // первоначальный размер
+
+diff -ruN old/src/mgui/project/media-browser.cpp new/src/mgui/project/media-browser.cpp
+--- old/src/mgui/project/media-browser.cpp 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mgui/project/media-browser.cpp 2022-08-26 15:56:06.538840475 +0430
+@@ -240,8 +240,8 @@
+ a_cnt = 0;
+ for( int i=0; i < (int)ic->nb_streams; i++ )
+ {
+- AVCodecContext* avctx = ic->streams[i]->codec;
+- if( avctx->codec_type == AVMEDIA_TYPE_AUDIO )
++ AVCodecParameters* avp = ic->streams[i]->codecpar;
++ if( avp->codec_type == AVMEDIA_TYPE_AUDIO )
+ a_cnt++;
+ }
+
diff --git a/fix_operator_ambiguity.patch b/fix_operator_ambiguity.patch
new file mode 100644
index 000000000000..5fcfaf04667c
--- /dev/null
+++ b/fix_operator_ambiguity.patch
@@ -0,0 +1,352 @@
+diff -ruN old/src/mbase/project/serialization.h new/src/mbase/project/serialization.h
+--- old/src/mbase/project/serialization.h 2017-06-01 13:54:44.086895687 +0430
++++ new/src/mbase/project/serialization.h 2017-06-01 14:09:16.523275880 +0430
+@@ -75,7 +75,9 @@
+ template<typename T>
+ std::string MakeString(const T& t)
+ {
+- return (str::stream() << t).str();
++ str::stream ss;
++ ss << t;
++ return ss.str();
+ }
+
+ template<typename T>
+diff -ruN old/src/mgui/dvdimport.cpp new/src/mgui/dvdimport.cpp
+--- old/src/mgui/dvdimport.cpp 2017-06-01 13:54:44.086895687 +0430
++++ new/src/mgui/dvdimport.cpp 2017-06-01 14:06:42.488114237 +0430
+@@ -211,10 +211,11 @@
+ row[VF().selState] = false;
+ row[VF().name] = VobFName(vob.pos);
+ row[VF().thumbnail] = vob.aspect == af4_3 ? pix4_3 : pix16_9;
+- std::string desc = (str::stream(Mpeg::SecToHMS(vob.tmLen, true)) << ", "
+- << vob.sz.x << "x" << vob.sz.y << ", "
+- << (vob.aspect == af4_3 ? "4:3" : "16:9") << ", "
+- << std::fixed << std::setprecision(2) << vob.Count()/512. << " " << _("MB")).str();
++ str::stream ss (Mpeg::SecToHMS(vob.tmLen, true));
++ ss << ", " << vob.sz.x << "x" << vob.sz.y << ", "
++ << (vob.aspect == af4_3 ? "4:3" : "16:9") << ", "
++ << std::fixed << std::setprecision(2) << vob.Count()/512. << " " << _("MB");
++ std::string desc = ss.str();
+ row[VF().desc] = desc;
+ }
+ CompleteSelection(id, false);
+diff -ruN old/src/mbase/project/media.cpp new/src/mbase/project/media.cpp
+--- old/src/mbase/project/media.cpp 2017-06-01 14:25:09.492134844 +0430
++++ new/src/mbase/project/media.cpp 2017-06-01 14:37:53.196336367 +0430
+@@ -58,7 +58,9 @@
+
+ std::string MakeAutoName(const std::string& str, int old_sz)
+ {
+- return (str::stream() << str << " " << old_sz+1).str();
++ str::stream ss;
++ ss << str << " " << old_sz+1;
++ return ss.str();
+ }
+
+ void VideoMD::AddChapter(ChapterItem chp)
+diff -ruN old/src/mbase/project/menu.cpp new/src/mbase/project/menu.cpp
+--- old/src/mbase/project/menu.cpp 2017-06-01 14:25:09.495468141 +0430
++++ new/src/mbase/project/menu.cpp 2017-06-01 14:39:42.004331141 +0430
+@@ -166,7 +166,9 @@
+ static std::string MakeObjectPath(int idx, const char* type)
+ {
+ ASSERT( idx != NO_HNDL );
+- return (str::stream() << type << "." << idx).str();
++ str::stream ss;
++ ss << type << "." << idx;
++ return ss.str();
+ }
+
+ std::string GetMediaRef(MediaItem mi)
+@@ -197,7 +199,9 @@
+ void RefMaker::Visit(VideoChapterMD& obj)
+ {
+ refStr = GetMediaRef(obj.owner);
+- refStr += (str::stream() << "." << ChapterPosInt(&obj)).str();
++ str::stream ss;
++ ss << "." << ChapterPosInt(&obj);
++ refStr += ss.str();
+ }
+
+ std::string Media2Ref(MediaItem mi)
+@@ -233,8 +237,9 @@
+
+ std::string ThrowBadIndex(const char* prefix, int idx)
+ {
+- throw std::runtime_error(
+- (str::stream() << prefix << idx).str() );
++ str::stream ss;
++ ss << prefix << idx;
++ throw std::runtime_error(ss.str());
+ }
+
+ MediaItem TryGetMedia(int idx)
+diff -ruN old/src/mbase/project/srl-common.cpp new/src/mbase/project/srl-common.cpp
+--- old/src/mbase/project/srl-common.cpp 2017-06-01 14:25:09.495468141 +0430
++++ new/src/mbase/project/srl-common.cpp 2017-06-01 14:40:56.524722225 +0430
+@@ -36,10 +36,12 @@
+ std::string ToString(const RGBA::Pixel& pxl)
+ {
+ using Mpeg::set_hms;
+- return (str::stream("#") << std::hex
+- << set_hms() << (int)pxl.red
+- << set_hms() << (int)pxl.green
+- << set_hms() << (int)pxl.blue << (int)pxl.alpha).str();
++ str::stream ss ("#");
++ ss << std::hex
++ << set_hms() << (int)pxl.red
++ << set_hms() << (int)pxl.green
++ << set_hms() << (int)pxl.blue << (int)pxl.alpha;
++ return ss.str();
+ }
+
+ // как pango_color_parse()
+diff -ruN old/src/mgui/author/render.cpp new/src/mgui/author/render.cpp
+--- old/src/mgui/author/render.cpp 2017-06-01 14:25:09.498801438 +0430
++++ new/src/mgui/author/render.cpp 2017-06-01 14:28:08.901379890 +0430
+@@ -1307,7 +1307,9 @@
+
+ bool RenderMainPicture(const std::string& out_dir, Menu mn, int i)
+ {
+- Author::Info((str::stream() << "Rendering menu \"" << mn->mdName << "\" ...").str());
++ str::stream ss;
++ ss << "Rendering menu \"" << mn->mdName << "\" ...";
++ Author::Info(ss.str());
+ const std::string mn_dir = MakeMenuPath(out_dir, mn, i);
+
+ if( IsMotion(mn) )
+diff -ruN old/src/mgui/author/script.cpp new/src/mgui/author/script.cpp
+--- old/src/mgui/author/script.cpp 2017-06-01 14:25:09.498801438 +0430
++++ new/src/mgui/author/script.cpp 2017-06-01 14:31:23.248978018 +0430
+@@ -130,7 +130,9 @@
+ {
+ VideoItem vi = IsVideo(mi);
+ ASSERT( vi );
+- str = (str::stream() << "title " << GetAuthorNumber(vi)).str();
++ str::stream ss;
++ ss << "title " << GetAuthorNumber(vi);
++ str = ss.str();
+ }
+ return str;
+ }
+@@ -179,7 +181,9 @@
+ // Потому: для удоства пользователей даем создавать нулевую главу, разрешая это здесь
+ // (однако доп. нулевые главы будут приводить к ошибке Cannot jump to chapter N ... only M exist)
+ int c_num = ChapterPosInt(&obj) + (owner->List()[0]->chpTime ? 2 : 1) ;
+- res = (str::stream() << "jump title " << v_num << " chapter " << c_num << ";").str();
++ str::stream ss;
++ ss << "jump title " << v_num << " chapter " << c_num << ";";
++ res = ss.str();
+ }
+
+ static std::string MakeButtonJump(MediaItem mi, bool vts_domain)
+@@ -204,7 +208,9 @@
+ if( !fs::native(name) )
+ name = "Menu";
+
+- std::string fname = (str::stream() << idx+1 << "." << name).str();
++ str::stream ss;
++ ss << idx+1 << "." << name;
++ std::string fname = ss.str();
+ return cnv_from_utf8 ? ConvertPathFromUtf8(fname) : fname ;
+ }
+
+@@ -626,7 +632,9 @@
+ void AuthorSectionInfo(const std::string& str)
+ {
+ Author::Info("\n#", false);
+- Author::Info((str::stream() << "# " << str).str(), false);
++ str::stream ss;
++ ss << "# " << str;
++ Author::Info(ss.str(), false);
+ Author::Info("#\n", false);
+ }
+
+@@ -1082,7 +1090,9 @@
+
+ static void AuthorImpl(const std::string& out_dir)
+ {
+- AuthorSectionInfo((str::stream() << "Build DVD-Video in folder: " << out_dir).str());
++ str::stream ss;
++ ss << "Build DVD-Video in folder: " << out_dir;
++ AuthorSectionInfo(ss.str());
+ IteratePendingEvents();
+
+ IndexVideosForAuthoring();
+diff -ruN old/src/mgui/project/add.cpp new/src/mgui/project/add.cpp
+--- old/src/mgui/project/add.cpp 2017-06-01 14:25:09.498801438 +0430
++++ new/src/mgui/project/add.cpp 2017-06-01 14:33:26.303387642 +0430
+@@ -86,7 +86,9 @@
+
+ static std::string FpsToStr(const Point& frate)
+ {
+- return (str::stream() << (double)frate.x/frate.y).str();
++ str::stream ss;
++ ss << (double)frate.x/frate.y;
++ return ss.str();
+ }
+
+ static std::string TVTypeStr(bool is_ntsc)
+@@ -163,7 +165,9 @@
+ // *
+ bool is_aspect_ok = vid.sarCode == af4_3 || vid.sarCode == af16_9;
+ Point aspect = vid.SizeAspect();
+- std::string aspect_str = (str::stream() << aspect.x << ':' << aspect.y).str();
++ str::stream ss;
++ ss << aspect.x << ':' << aspect.y;
++ std::string aspect_str = ss.str();
+ SetImportError(ed, is_aspect_ok,
+ std::string(_("Aspect ratio")) + ": \t" + MarkError(aspect_str, is_aspect_ok),
+ BF_(Descriptions[2]) % tv_type % bf::stop);
+diff -ruN old/src/mgui/sdk/cairo_utils.cpp new/src/mgui/sdk/cairo_utils.cpp
+--- old/src/mgui/sdk/cairo_utils.cpp 2017-06-01 14:25:09.498801438 +0430
++++ new/src/mgui/sdk/cairo_utils.cpp 2017-06-01 14:35:20.831246046 +0430
+@@ -27,6 +27,8 @@
+ std::string MakeSVGFilename(const char* prefix)
+ {
+ static int idx = 1;
+- return (str::stream() << prefix << "-" << Mpeg::set_hms() << idx++ << ".svg" ).str();
++ str::stream ss;
++ ss << prefix << "-" << Mpeg::set_hms() << idx++ << ".svg";
++ return ss.str();
+ }
+
+diff -ruN old/src/mgui/timeline/layout.cpp new/src/mgui/timeline/layout.cpp
+--- old/src/mgui/timeline/layout.cpp 2017-06-01 14:25:09.502134734 +0430
++++ new/src/mgui/timeline/layout.cpp 2017-06-01 14:36:36.152095784 +0430
+@@ -600,8 +600,10 @@
+ void FramesToTime(std::string& str, int cnt, double fps)
+ {
+ time4_t t4 = FramesToTime(cnt, fps);
+- str = (str::stream() << Mpeg::set_hms() << t4.hh << ":" << Mpeg::set_hms() << t4.mm << ":"
+- << Mpeg::set_hms() << t4.ss << ";" << Mpeg::set_hms() << t4.ff).str();
++ str::stream ss;
++ ss << Mpeg::set_hms() << t4.hh << ":" << Mpeg::set_hms() << t4.mm << ":"
++ << Mpeg::set_hms() << t4.ss << ";" << Mpeg::set_hms() << t4.ff;
++ str = ss.str();
+ }
+
+ } // namespace TimeLine
+diff -ruN old/src/mgui/win_utils.cpp new/src/mgui/win_utils.cpp
+--- old/src/mgui/win_utils.cpp 2017-06-01 14:25:09.498801438 +0430
++++ new/src/mgui/win_utils.cpp 2017-06-01 14:26:50.898112082 +0430
+@@ -132,7 +132,9 @@
+
+ std::string ColorToString(const unsigned int rgba)
+ {
+- return (str::stream() << std::hex << (rgba >> 8)).str();
++ str::stream ss;
++ ss << std::hex << (rgba >> 8);
++ return ss.str();
+ }
+
+ CR::Color GetBGColor(Gtk::Widget& wdg)
+diff -ruN old/src/mdemux/dvdread.cpp new/src/mdemux/dvdread.cpp
+--- old/src/mdemux/dvdread.cpp 2017-06-01 14:48:30.110355679 +0430
++++ new/src/mdemux/dvdread.cpp 2017-06-01 14:50:50.141065674 +0430
+@@ -35,8 +35,10 @@
+ std::string VobFName(VobPos& pos, const std::string& suffix)
+ {
+ using Mpeg::set_hms;
+- return (str::stream("Video") << set_hms() << int(pos.Vts())
+- << "-" << set_hms() << pos.VobId() << suffix << ".vob").str();
++ str::stream ss ("Video");
++ ss << set_hms() << int(pos.Vts())
++ << "-" << set_hms() << pos.VobId() << suffix << ".vob";
++ return ss.str();
+ }
+
+ typedef boost::function<void(int, double)> VobTimeFnr;
+@@ -282,9 +284,11 @@
+ static void TryDVDReadBlocks(dvd_file_t* file, int off, size_t cnt, char* buf)
+ {
+ int real_cnt = DVDReadBlocks(file, off, cnt, (unsigned char*)buf);
+- if( (int)cnt != real_cnt )
+- throw std::runtime_error( (str::stream() << real_cnt <<
+- " != DVDReadBlocks(" << cnt << ")").str() );
++ if( (int)cnt != real_cnt ) {
++ str::stream ss;
++ ss << real_cnt << " != DVDReadBlocks(" << cnt << ")";
++ throw std::runtime_error( ss.str() );
++ }
+ }
+
+ // размер буфера должен соответствовать читаемому диапазону
+diff -ruN old/src/mdemux/mpeg2demux.cpp new/src/mdemux/mpeg2demux.cpp
+--- old/src/mdemux/mpeg2demux.cpp 2017-06-01 14:48:30.110355679 +0430
++++ new/src/mdemux/mpeg2demux.cpp 2017-06-01 14:55:35.784165916 +0430
+@@ -71,7 +71,9 @@
+
+ static std::string MakePESKey(int id, const char* ext)
+ {
+- return (str::stream() << id << "." << ext).str();
++ str::stream ss;
++ ss << id << "." << ext;
++ return ss.str();
+ }
+
+ static bool ReadPart(io::stream& strm, uint8_t* buf, int sz, int& len)
+@@ -110,7 +112,9 @@
+ ASSERT(0);
+ }
+
+- std::string header_str = (str::stream() << sample_rate << ":" << channels << ":" << bps << ".lpcm").str();
++ str::stream ss;
++ ss << sample_rate << ":" << channels << ":" << bps << ".lpcm";
++ std::string header_str = ss.str();
+ return MakePESKey(track, header_str.c_str());
+ }
+
+diff -ruN old/src/mdemux/seek.cpp new/src/mdemux/seek.cpp
+--- old/src/mdemux/seek.cpp 2017-06-01 14:48:30.110355679 +0430
++++ new/src/mdemux/seek.cpp 2017-06-01 14:52:09.669280234 +0430
+@@ -37,8 +37,10 @@
+ int hh = min / 60;
+ int mm = min - hh*60;
+
+- return (str::stream() << set_hms() << hh << ":"
+- << set_hms() << mm << ":" << set_hms() << ss).str();
++ str::stream strss;
++ strss << set_hms() << hh << ":"
++ << set_hms() << mm << ":" << set_hms() << ss;
++ return strss.str();
+ }
+
+ bool MediaInfo::InitBegin(VideoLine& vl)
+diff -ruN old/src/mlib/sdk/misc.cpp new/src/mlib/sdk/misc.cpp
+--- old/src/mlib/sdk/misc.cpp 2017-06-01 14:48:30.120355606 +0430
++++ new/src/mlib/sdk/misc.cpp 2017-06-01 14:53:25.504549937 +0430
+@@ -173,12 +173,16 @@
+ std::string Double2Str(double val)
+ {
+ //return boost::format("%1%") % val % bf::stop;
+- return (str::stream() << val).str();
++ str::stream ss;
++ ss << val;
++ return ss.str();
+ }
+
+ std::string Int2Str(int val)
+ {
+- return (str::stream() << val).str();
++ str::stream ss;
++ ss << val;
++ return ss.str();
+ }
+
+ static bool ICaseMatch(const std::string& str, const std::string& pat_str)
+diff -ruN old/src/mlib/sdk/system.cpp new/src/mlib/sdk/system.cpp
+--- old/src/mlib/sdk/system.cpp 2017-06-01 14:48:30.120355606 +0430
++++ new/src/mlib/sdk/system.cpp 2017-06-01 14:54:13.980777662 +0430
+@@ -28,7 +28,9 @@
+ int GetMemSize()
+ {
+ pid_t pid = getpid();
+- std::string str = (str::stream() << "/proc/" << pid << "/statm").str();
++ str::stream ss;
++ ss << "/proc/" << pid << "/statm";
++ std::string str = ss.str();
+
+ io::stream strm(str.c_str(), iof::in);
+ int mem;
diff --git a/fix_throw_specifications.patch b/fix_throw_specifications.patch
new file mode 100644
index 000000000000..f2f4c40d4f30
--- /dev/null
+++ b/fix_throw_specifications.patch
@@ -0,0 +1,24 @@
+diff -ruN old/src/mbase/project/table.h new/src/mbase/project/table.h
+--- old/src/mbase/project/table.h 2017-06-01 13:54:44.086895687 +0430
++++ new/src/mbase/project/table.h 2017-06-01 13:55:58.089107253 +0430
+@@ -128,7 +128,7 @@
+ void ClearSettings();
+
+ void Load(const std::string& fname,
+- const std::string& cur_dir = std::string()) throw (std::exception);
++ const std::string& cur_dir = std::string());
+ bool Save();
+
+ bool SaveAs(const std::string& fname,
+diff -ruN old/src/mbase/project/srl-db.cpp new/src/mbase/project/srl-db.cpp
+--- old/src/mbase/project/srl-db.cpp 2017-06-01 14:25:09.495468141 +0430
++++ new/src/mbase/project/srl-db.cpp 2017-06-01 14:41:49.699901753 +0430
+@@ -102,7 +102,7 @@
+ }
+
+ void ADatabase::Load(const std::string& fname,
+- const std::string& cur_dir) throw (std::exception)
++ const std::string& cur_dir)
+ {
+ try
+ {
diff --git a/inc_boost_header.patch b/inc_boost_header.patch
new file mode 100644
index 000000000000..74a0387ec06e
--- /dev/null
+++ b/inc_boost_header.patch
@@ -0,0 +1,116 @@
+diff -ruN old/src/mbase/project/table.cpp new/src/mbase/project/table.cpp
+--- old/src/mbase/project/table.cpp 2022-02-04 22:35:45.903951084 +0330
++++ new/src/mbase/project/table.cpp 2022-02-04 22:33:44.542891731 +0330
+@@ -29,6 +29,7 @@
+ #include "theme.h"
+
+ #include <mbase/resources.h>
++#include <boost/filesystem/directory.hpp>
+
+
+ const char* APROJECT_VERSION = "1.2.4";
+diff -ruN old/src/mgui/editor/toolbar.cpp new/src/mgui/editor/toolbar.cpp
+--- old/src/mgui/editor/toolbar.cpp 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mgui/editor/toolbar.cpp 2022-02-04 22:33:44.542891731 +0330
+@@ -45,6 +45,8 @@
+ #include <mlib/sdk/logger.h>
+ #include <mlib/range/enumerate.h>
+
++#include <boost/filesystem/directory.hpp>
++
+ namespace Editor
+ {
+
+diff -ruN old/src/mgui/project/mconstructor.cpp new/src/mgui/project/mconstructor.cpp
+--- old/src/mgui/project/mconstructor.cpp 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mgui/project/mconstructor.cpp 2022-02-04 22:33:44.542891731 +0330
+@@ -52,6 +52,8 @@
+ // COPY_N_PASTE_ETALON из go-file.c, проект Gnumeric, http://projects.gnome.org/gnumeric/
+ //
+
++#include <boost/filesystem/directory.hpp>
++
+ #ifndef GOFFICE_WITH_GNOME
+ static char *
+ check_program (char const *prog)
+diff -ruN old/src/mlib/filesystem.cpp new/src/mlib/filesystem.cpp
+--- old/src/mlib/filesystem.cpp 2022-02-04 22:35:45.907284447 +0330
++++ new/src/mlib/filesystem.cpp 2022-02-04 22:33:44.542891731 +0330
+@@ -30,6 +30,7 @@
+ #if BOOST_MINOR_VERSION >= 51
+ #define BOOST_FS_3 boost::filesystem
+ #include <boost/filesystem/path_traits.hpp> // boost::filesystem::convert()
++#include <boost/filesystem/directory.hpp>
+ #else
+ #define BOOST_FS_3 boost::filesystem3
+ #include <boost/filesystem/v3/path_traits.hpp>
+diff -ruN old/src/mlib/read_stream.h new/src/mlib/read_stream.h
+--- old/src/mlib/read_stream.h 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mlib/read_stream.h 2022-02-04 22:33:44.542891731 +0330
+@@ -22,6 +22,8 @@
+ #ifndef __MLIB_READ_STREAM_H__
+ #define __MLIB_READ_STREAM_H__
+
++#include <boost/mpl/bool.hpp>
++
+ #include "stream.h"
+ #include "filesystem.h"
+
+diff -ruN old/src/mlib/regex.cpp new/src/mlib/regex.cpp
+--- old/src/mlib/regex.cpp 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mlib/regex.cpp 2022-02-04 22:33:44.542891731 +0330
+@@ -22,7 +22,7 @@
+ #include "regex.h"
+ #include "string.h"
+
+-#include <boost/regex.hpp>
++#include <boost/regex/v4/regex.hpp>
+
+ namespace re
+ {
+diff -ruN old/src/mlib/regex.h new/src/mlib/regex.h
+--- old/src/mlib/regex.h 2022-02-04 22:35:35.320525320 +0330
++++ new/src/mlib/regex.h 2022-02-04 22:34:29.913287618 +0330
+@@ -27,6 +27,7 @@
+ #include <boost/regex/v4/regbase.hpp>
+ #include <boost/regex/v4/match_flags.hpp>
+
++#include <boost/mpl/bool.hpp>
+ #include <mlib/ptr.h>
+
+ #include <string>
+diff -ruN old/src/mlib/sdk/bfs.h new/src/mlib/sdk/bfs.h
+--- old/src/mlib/sdk/bfs.h 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mlib/sdk/bfs.h 2022-02-04 22:33:44.542891731 +0330
+@@ -7,6 +7,7 @@
+ //#define BOOST_FILESYSTEM_NO_DEPRECATED
+
+ #include <boost/filesystem/path.hpp>
++#include <boost/filesystem/exception.hpp>
+ #include <boost/filesystem/operations.hpp>
+ #include <boost/filesystem/convenience.hpp> // fs::create_directories()
+
+diff -ruN old/src/mlib/tech.h new/src/mlib/tech.h
+--- old/src/mlib/tech.h 2016-04-10 15:15:39.000000000 +0430
++++ new/src/mlib/tech.h 2022-02-04 22:33:44.542891731 +0330
+@@ -26,7 +26,7 @@
+ // Технические вещи
+ //
+ #include <boost/current_function.hpp> // для BOOST_CURRENT_FUNCTION
+-#include <boost/detail/endian.hpp> // для BOOST_XXX_ENDIAN
++#include <boost/predef/other/endian.h> // BOOST_ENDIAN_*_BYTE
+ #include <boost/version.hpp> // для BOOST_MINOR_VERSION
+
+ // для С-шного кода в С++
+@@ -78,9 +78,9 @@
+ long line, const char* function);
+
+ // endianness
+-#if defined(BOOST_BIG_ENDIAN)
++#if defined(BOOST_ENDIAN_BIG_BYTE)
+ # define HAS_BIG_ENDIAN
+-#elif defined(BOOST_LITTLE_ENDIAN)
++#elif defined(BOOST_ENDIAN_LITTLE_BYTE)
+ # define HAS_LITTLE_ENDIAN
+ #else
+ # error mlib/tech.h: unknown endianness (legacy PDP arch?)