#include "md5_digester.h"
#include "audio_processor.h"
#include "safe_stringstream.h"
+#include "compose.hpp"
#include <dcp/util.h>
-#include <dcp/signer.h>
+#include <dcp/picture_asset.h>
+#include <dcp/sound_asset.h>
+#include <dcp/subtitle_asset.h>
+extern "C" {
+#include <libavfilter/avfilter.h>
+#include <libavcodec/avcodec.h>
+}
+#include <curl/curl.h>
#include <glib.h>
#include <pangomm/init.h>
#include <boost/algorithm/string.hpp>
-#include <boost/bind.hpp>
-#include <boost/lambda/lambda.hpp>
#include <boost/thread.hpp>
#include <boost/filesystem.hpp>
#ifdef DCPOMATIC_WINDOWS
addr2line (void const * const addr)
{
char addr2line_cmd[512] = { 0 };
- sprintf (addr2line_cmd, "addr2line -f -p -e %.256s %p > %s", program_name.c_str(), addr, backtrace_file.string().c_str());
+ sprintf (addr2line_cmd, "addr2line -f -p -e %.256s %p > %s", program_name.c_str(), addr, backtrace_file.string().c_str());
return system(addr2line_cmd);
}
FILE* f = fopen_boost (backtrace_file, "w");
fprintf (f, "C-style exception %d\n", info->ExceptionRecord->ExceptionCode);
fclose(f);
-
+
if (info->ExceptionRecord->ExceptionCode != EXCEPTION_STACK_OVERFLOW) {
CONTEXT* context = info->ContextRecord;
SymInitialize (GetCurrentProcess (), 0, true);
-
+
STACKFRAME frame = { 0 };
-
+
/* setup initial stack frame */
#if _WIN64
frame.AddrPC.Offset = context->Rip;
frame.AddrStack.Offset = context->Rsp;
frame.AddrFrame.Offset = context->Rbp;
-#else
+#else
frame.AddrPC.Offset = context->Eip;
frame.AddrStack.Offset = context->Esp;
frame.AddrFrame.Offset = context->Ebp;
frame.AddrPC.Mode = AddrModeFlat;
frame.AddrStack.Mode = AddrModeFlat;
frame.AddrFrame.Mode = AddrModeFlat;
-
+
while (
StackWalk (
IMAGE_FILE_MACHINE_I386,
addr2line((void *) frame.AddrPC.Offset);
}
} else {
-#ifdef _WIN64
+#ifdef _WIN64
addr2line ((void *) info->ContextRecord->Rip);
-#else
+#else
addr2line ((void *) info->ContextRecord->Eip);
-#endif
+#endif
}
-
+
return EXCEPTION_CONTINUE_SEARCH;
}
#endif
<< e.what() << std::endl;
}
catch (...) {
- std::cerr << __FUNCTION__ << " caught unknown/unhandled exception."
+ std::cerr << __FUNCTION__ << " caught unknown/unhandled exception."
<< std::endl;
}
abort();
}
-/** Call the required functions to set up DCP-o-matic's static arrays, etc.
- * Must be called from the UI thread, if there is one.
- */
void
-dcpomatic_setup ()
+dcpomatic_setup_path_encoding ()
{
#ifdef DCPOMATIC_WINDOWS
- boost::filesystem::path p = g_get_user_config_dir ();
- p /= "backtrace.txt";
- set_backtrace_file (p);
- SetUnhandledExceptionFilter(exception_handler);
-
/* Dark voodoo which, I think, gets boost::filesystem::path to
correctly convert UTF-8 strings to paths, and also paths
back to UTF-8 strings (on path::string()).
*/
std::locale::global (boost::locale::generator().generate (""));
boost::filesystem::path::imbue (std::locale ());
-#endif
-
+#endif
+}
+
+/** Call the required functions to set up DCP-o-matic's static arrays, etc.
+ * Must be called from the UI thread, if there is one.
+ */
+void
+dcpomatic_setup ()
+{
+#ifdef DCPOMATIC_WINDOWS
+ boost::filesystem::path p = g_get_user_config_dir ();
+ p /= "backtrace.txt";
+ set_backtrace_file (p);
+ SetUnhandledExceptionFilter(exception_handler);
+#endif
+
avfilter_register_all ();
#ifdef DCPOMATIC_OSX
Pango::init ();
dcp::init ();
-
+
Ratio::setup_ratios ();
+ PresetColourConversion::setup_colour_conversion_presets ();
VideoContentScale::setup_scales ();
DCPContentType::setup_dcp_content_types ();
Filter::setup_filters ();
CinemaSoundProcessor::setup_cinema_sound_processors ();
AudioProcessor::setup_audio_processors ();
+ curl_global_init (CURL_GLOBAL_ALL);
+
ui_thread = boost::this_thread::get_id ();
}
}
setlocale (LC_ALL, "");
- textdomain ("libdcpomatic");
+ textdomain ("libdcpomatic2");
+ /* This sets up the locale to be used by lexical_cast (and probably other stuff);
+ used by e.g. the audio gain calculator dialogue where we lexical_cast floating
+ point values.
+ */
+ std::locale::global (std::locale (""));
#if defined(DCPOMATIC_WINDOWS) || defined(DCPOMATIC_OSX)
- bindtextdomain ("libdcpomatic", mo_path().string().c_str());
- bind_textdomain_codeset ("libdcpomatic", "UTF8");
-#endif
+ bindtextdomain ("libdcpomatic2", mo_path().string().c_str());
+ bind_textdomain_codeset ("libdcpomatic2", "UTF8");
+#endif
#ifdef DCPOMATIC_LINUX
- bindtextdomain ("libdcpomatic", POSIX_LOCALE_PREFIX);
+ bindtextdomain ("libdcpomatic2", LINUX_LOCALE_PREFIX);
#endif
}
fclose (f);
--i;
- }
+ }
digester.add (buffer.get(), size - to_do);
return digester.get ();
}
-/** @param An arbitrary audio frame rate.
- * @return The appropriate DCP-approved frame rate (48kHz or 96kHz).
- */
-int
-dcp_audio_frame_rate (int fs)
-{
- if (fs <= 48000) {
- return 48000;
- }
-
- return 96000;
-}
-
/** Round a number up to the nearest multiple of another number.
* @param c Index.
* @param s Array of numbers to round, indexed by c.
return a - (a % t);
}
-/** @param n A number.
- * @param r Rounding `boundary' (must be a power of 2)
- * @return n rounded to the nearest r
- */
-int
-round_to (float n, int r)
-{
- DCPOMATIC_ASSERT (r == 1 || r == 2 || r == 4);
- return int (n + float(r) / 2) &~ (r - 1);
-}
-
/** Trip an assert if the caller is not in the UI thread */
void
ensure_ui_thread ()
string
audio_channel_name (int c)
{
- DCPOMATIC_ASSERT (MAX_DCP_AUDIO_CHANNELS == 12);
+ DCPOMATIC_ASSERT (MAX_DCP_AUDIO_CHANNELS == 16);
/// TRANSLATORS: these are the names of audio channels; Lfe (sub) is the low-frequency
/// enhancement channel (sub-woofer). HI is the hearing-impaired audio track and
_("Right centre"),
_("Left rear surround"),
_("Right rear surround"),
+ _("D-BOX primary"),
+ _("D-BOX secondary"),
+ _("Unused"),
+ _("Unused")
};
return channels[c];
bool
valid_image_file (boost::filesystem::path f)
{
+ if (boost::starts_with (f.leaf().string(), "._")) {
+ return false;
+ }
+
string ext = f.extension().string();
transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
return (
ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" ||
ext == ".png" || ext == ".bmp" || ext == ".tga" || ext == ".dpx" ||
- ext == ".j2c" || ext == ".j2k"
+ ext == ".j2c" || ext == ".j2k" || ext == ".jp2"
);
}
{
string ext = f.extension().string();
transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
- return (ext == ".j2k" || ext == ".j2c");
+ return (ext == ".j2k" || ext == ".j2c" || ext == ".jp2");
}
string
}
dcp::Size
-fit_ratio_within (float ratio, dcp::Size full_frame, int round)
+fit_ratio_within (float ratio, dcp::Size full_frame)
{
if (ratio < full_frame.ratio ()) {
- return dcp::Size (round_to (full_frame.height * ratio, round), full_frame.height);
+ return dcp::Size (lrintf (full_frame.height * ratio), full_frame.height);
}
-
- return dcp::Size (full_frame.width, round_to (full_frame.width / ratio, round));
+
+ return dcp::Size (full_frame.width, lrintf (full_frame.width / ratio));
}
void *
}
return p;
}
-
-ContentTimePeriod
-subtitle_period (AVSubtitle const & sub)
-{
- ContentTime const packet_time = ContentTime::from_seconds (static_cast<double> (sub.pts) / AV_TIME_BASE);
-
- ContentTimePeriod period (
- packet_time + ContentTime::from_seconds (sub.start_display_time / 1e3),
- packet_time + ContentTime::from_seconds (sub.end_display_time / 1e3)
- );
-
- return period;
-}
map<string, string>
split_get_request (string url)
KEY,
VALUE
} state = AWAITING_QUESTION_MARK;
-
+
map<string, string> r;
string k;
string v;
return r;
}
-long
-frame_info_position (int frame, Eyes eyes)
-{
- static int const info_size = 48;
-
- switch (eyes) {
- case EYES_BOTH:
- return frame * info_size;
- case EYES_LEFT:
- return frame * info_size * 2;
- case EYES_RIGHT:
- return frame * info_size * 2 + info_size;
- default:
- DCPOMATIC_ASSERT (false);
- }
-
- DCPOMATIC_ASSERT (false);
-}
-
-dcp::FrameInfo
-read_frame_info (FILE* file, int frame, Eyes eyes)
+string
+video_asset_filename (shared_ptr<dcp::PictureAsset> asset)
{
- dcp::FrameInfo info;
- dcpomatic_fseek (file, frame_info_position (frame, eyes), SEEK_SET);
- fread (&info.offset, sizeof (info.offset), 1, file);
- fread (&info.size, sizeof (info.size), 1, file);
-
- char hash_buffer[33];
- fread (hash_buffer, 1, 32, file);
- hash_buffer[32] = '\0';
- info.hash = hash_buffer;
-
- return info;
+ return "j2c_" + asset->id() + ".mxf";
}
-void
-write_frame_info (FILE* file, int frame, Eyes eyes, dcp::FrameInfo info)
+string
+audio_asset_filename (shared_ptr<dcp::SoundAsset> asset)
{
- dcpomatic_fseek (file, frame_info_position (frame, eyes), SEEK_SET);
- fwrite (&info.offset, sizeof (info.offset), 1, file);
- fwrite (&info.size, sizeof (info.size), 1, file);
- fwrite (info.hash.c_str(), 1, info.hash.size(), file);
+ return "pcm_" + asset->id() + ".mxf";
}