f << "audio_channels " << audio_channels << "\n";
f << "audio_sample_rate " << audio_sample_rate << "\n";
f << "audio_sample_format " << audio_sample_format_to_string (audio_sample_format) << "\n";
+ f << "content_digest " << content_digest << "\n";
}
/** Read state from a key / value pair.
audio_sample_rate = atoi (v.c_str ());
} else if (k == "audio_sample_format") {
audio_sample_format = audio_sample_format_from_string (v);
+ } else if (k == "content_digest") {
+ content_digest = v;
+ }
+
+ /* Itsy bitsy hack: compute digest here if don't have one (for backwards compatibility) */
+ if (content_digest.empty() && !content.empty()) {
+ content_digest = md5_digest (content_path ());
}
}
FilmState::thumb_file_for_frame (int n) const
{
stringstream s;
- s << dir ("thumbs") << "/";
s.width (8);
s << setfill('0') << n << ".tiff";
- return s.str ();
+
+ filesystem::path p;
+ p /= dir ("thumbs");
+ p /= s.str ();
+
+ return p.string ();
}
string
FilmState::dir (string d) const
{
- stringstream s;
- s << directory << "/" << d;
- filesystem::create_directories (s.str ());
- return s.str ();
+ filesystem::path p;
+ p /= directory;
+ p /= d;
+ filesystem::create_directories (p);
+ return p.string ();
}
/** Given a file or directory name, return its full path within the Film's directory */
string
FilmState::file (string f) const
{
- stringstream s;
- s << directory << "/" << f;
- return s.str ();
+ filesystem::path p;
+ p /= directory;
+ p /= f;
+ return p.string ();
}
string
return VIDEO;
}
+
+/** @return Number of bytes per sample of a single channel */
+int
+FilmState::bytes_per_sample () const
+{
+ switch (audio_sample_format) {
+ case AV_SAMPLE_FMT_S16:
+ return 2;
+ default:
+ assert (false);
+ }
+
+ assert (false);
+ return 0;
+}