FFmpegEncoder encoder (film, job, "build/test/ffmpeg_encoder_basic_test_mixdown.mp4", FFmpegEncoder::FORMAT_H264, true);
encoder.go ();
- check_file ("build/test/ffmpeg_encoder_basic_test_mixdown.mp4", "test/data/ffmpeg_encoder_basic_test_mixdown.mp4");
+ /* Skip the first video packet when checking as it contains x264 options which can vary between machines
+ (e.g. number of threads used for encoding).
+ */
+ check_ffmpeg ("build/test/ffmpeg_encoder_basic_test_mixdown.mp4", "test/data/ffmpeg_encoder_basic_test_mixdown.mp4", 0);
}
#include <sndfile.h>
#include <libxml++/libxml++.h>
#include <Magick++.h>
+extern "C" {
+#include <libavformat/avformat.h>
+}
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE dcpomatic_test
#include <boost/test/unit_test.hpp>
Magick::Image m (image->size().width, image->size().height, format.c_str(), CharPixel, (void *) image->data()[0]);
m.write (file.string ());
}
+
+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);
+ }
+}
extern void check_mxf_audio_file (boost::filesystem::path ref, boost::filesystem::path check);
extern void check_xml (boost::filesystem::path, boost::filesystem::path, std::list<std::string>);
extern void check_file (boost::filesystem::path, boost::filesystem::path);
+extern void check_ffmpeg (boost::filesystem::path, boost::filesystem::path, int skip_packet_stream);
extern void check_image (boost::filesystem::path, boost::filesystem::path);
extern boost::filesystem::path test_film_dir (std::string);
extern void write_image (boost::shared_ptr<const Image> image, boost::filesystem::path file, std::string format);