summaryrefslogtreecommitdiff
path: root/libs/pbd
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-10-02 20:40:44 +0200
committerRobin Gareus <robin@gareus.org>2017-10-03 02:22:42 +0200
commitdf83c0381e126f17d59039ab8b61789bfe27a79f (patch)
tree9ee98b2ce0d50aeee2545346956a511582e6dbf1 /libs/pbd
parent86d3735ea89504dfb280a6a435794383af482841 (diff)
Prepare support for compression levels (archive + flac)
Diffstat (limited to 'libs/pbd')
-rw-r--r--libs/pbd/file_archive.cc29
-rw-r--r--libs/pbd/pbd/file_archive.h13
2 files changed, 36 insertions, 6 deletions
diff --git a/libs/pbd/file_archive.cc b/libs/pbd/file_archive.cc
index 95cdbf61cf..ccc19c0541 100644
--- a/libs/pbd/file_archive.cc
+++ b/libs/pbd/file_archive.cc
@@ -16,6 +16,11 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#ifndef NDEBUG
+#include <iostream>
+#include <iomanip>
+#endif
+
#include <stdlib.h>
#include <string.h>
#include <cstdio>
@@ -337,7 +342,7 @@ FileArchive::do_extract (struct archive* a)
int
-FileArchive::create (const std::string& srcdir)
+FileArchive::create (const std::string& srcdir, CompressionLevel compression_level)
{
if (_req.is_remote ()) {
return -1;
@@ -357,11 +362,11 @@ FileArchive::create (const std::string& srcdir)
filemap[*f] = f->substr (p_len);
}
- return create (filemap);
+ return create (filemap, compression_level);
}
int
-FileArchive::create (const std::map<std::string, std::string>& filemap)
+FileArchive::create (const std::map<std::string, std::string>& filemap, CompressionLevel compression_level)
{
struct archive *a;
struct archive_entry *entry;
@@ -385,10 +390,21 @@ FileArchive::create (const std::map<std::string, std::string>& filemap)
a = archive_write_new ();
archive_write_set_format_pax_restricted (a);
- archive_write_add_filter_lzma (a);
+
+ if (compression_level != CompressNone) {
+ archive_write_add_filter_lzma (a);
+ char buf[48];
+ sprintf (buf, "lzma:compression-level=%u,lzma:threads=0", (uint32_t) compression_level);
+ archive_write_set_options (a, buf);
+ }
+
archive_write_open_filename (a, _req.url);
entry = archive_entry_new ();
+#ifndef NDEBUG
+ const int64_t archive_start_time = g_get_monotonic_time();
+#endif
+
for (std::map<std::string, std::string>::const_iterator f = filemap.begin (); f != filemap.end (); ++f) {
char buf[8192];
const char* filepath = f->first.c_str ();
@@ -433,5 +449,10 @@ FileArchive::create (const std::map<std::string, std::string>& filemap)
archive_write_close (a);
archive_write_free (a);
+#ifndef NDEBUG
+ const int64_t elapsed_time_us = g_get_monotonic_time() - archive_start_time;
+ std::cerr << "archived in " << std::fixed << std::setprecision (2) << elapsed_time_us / 1000000. << " sec\n";
+#endif
+
return 0;
}
diff --git a/libs/pbd/pbd/file_archive.h b/libs/pbd/pbd/file_archive.h
index 3708f3bbf4..3ef1d93ee0 100644
--- a/libs/pbd/pbd/file_archive.h
+++ b/libs/pbd/pbd/file_archive.h
@@ -38,8 +38,17 @@ class LIBPBD_API FileArchive
int inflate (const std::string& destdir);
std::vector<std::string> contents ();
- int create (const std::string& srcdir);
- int create (const std::map <std::string, std::string>& filemap);
+ /* these are mapped to libarchive's lzmaz
+ * compression level 0..9
+ */
+ enum CompressionLevel {
+ CompressNone = -1,
+ CompressFast = 0,
+ CompressGood = 6
+ };
+
+ int create (const std::string& srcdir, CompressionLevel compression_level = CompressGood);
+ int create (const std::map <std::string, std::string>& filemap, CompressionLevel compression_level = CompressGood);
PBD::Signal2<void, size_t, size_t> progress; // TODO