+
+class Reader
+{
+public:
+ Reader (boost::filesystem::path file)
+ {
+ format_context = avformat_alloc_context ();
+ BOOST_REQUIRE (format_context);
+ BOOST_REQUIRE (avformat_open_input (&format_context, file.string().c_str(), 0, 0) >= 0);
+ BOOST_REQUIRE (avformat_find_stream_info (format_context, 0) >= 0);
+ }
+
+ ~Reader ()
+ {
+ avformat_close_input (&format_context);
+ }
+
+ AVFormatContext* format_context;
+};
+
+
+void
+check_ffmpeg (boost::filesystem::path ref, boost::filesystem::path check, int skip_packet_stream)
+{
+ Reader ref_r (ref);
+ Reader check_r (check);
+
+ BOOST_REQUIRE_EQUAL (ref_r.format_context->nb_streams, check_r.format_context->nb_streams);
+
+ AVPacket ref_p;
+ AVPacket check_p;
+
+ bool skipped = false;
+
+ while (true) {
+ int p = av_read_frame (ref_r.format_context, &ref_p);
+ int q = av_read_frame (check_r.format_context, &check_p);
+ if (ref_p.stream_index == skip_packet_stream && check_p.stream_index == skip_packet_stream && !skipped) {
+ skipped = true;
+ continue;
+ }
+ BOOST_REQUIRE_EQUAL (p, q);
+ BOOST_REQUIRE (p == 0 || p == AVERROR_EOF);
+ if (p == AVERROR_EOF) {
+ break;
+ }
+
+ BOOST_REQUIRE_EQUAL (ref_p.buf->size, check_p.buf->size);
+ BOOST_REQUIRE_EQUAL (memcmp (ref_p.buf->data, check_p.buf->data, ref_p.buf->size), 0);
+ }
+}
+
+void
+check_one_frame (boost::filesystem::path dcp_dir, int64_t index, boost::filesystem::path ref)
+{
+ dcp::DCP dcp (dcp_dir);
+ dcp.read ();
+ shared_ptr<dcp::MonoPictureAsset> asset = dynamic_pointer_cast<dcp::MonoPictureAsset> (dcp.cpls().front()->reels().front()->main_picture()->asset());
+ BOOST_REQUIRE (asset);
+ shared_ptr<const dcp::MonoPictureFrame> frame = asset->start_read()->get_frame(index);
+
+ boost::uintmax_t const ref_size = boost::filesystem::file_size(ref);
+ BOOST_CHECK_EQUAL (frame->j2k_size(), ref_size);
+
+ FILE* ref_file = fopen_boost(ref, "rb");
+ BOOST_REQUIRE (ref_file);
+
+ uint8_t* ref_data = new uint8_t[ref_size];
+ fread (ref_data, ref_size, 1, ref_file);
+ fclose (ref_file);
+
+ BOOST_CHECK (memcmp(ref_data, frame->j2k_data(), ref_size) == 0);
+ delete[] ref_data;
+}
+
+boost::filesystem::path
+dcp_file (shared_ptr<const Film> film, string prefix)
+{
+ boost::filesystem::directory_iterator i = boost::filesystem::directory_iterator (film->dir(film->dcp_name()));
+ while (i != boost::filesystem::directory_iterator() && !boost::algorithm::starts_with (i->path().leaf().string(), prefix)) {
+ ++i;
+ }
+
+ BOOST_REQUIRE (i != boost::filesystem::directory_iterator());
+ return i->path();
+}