X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=test%2Ftest.cc;h=f1fd40fb791597c4bf5da7e960a05b523b5878cb;hp=fd9c6941be30e4aac818a3debf3f2b6706df865b;hb=dc5e11944a30a9d381dc0e67cf657c5f2cb65845;hpb=2c43d6e1068704cc4f4d6383217ed9a1a07bb67d diff --git a/test/test.cc b/test/test.cc index fd9c6941b..f1fd40fb7 100644 --- a/test/test.cc +++ b/test/test.cc @@ -715,15 +715,13 @@ png_error_fn (png_structp, char const * message) void write_image (shared_ptr image, boost::filesystem::path file) { - int png_color_type = 0; + int png_color_type = PNG_COLOR_TYPE_RGB; int bits_per_pixel = 0; switch (image->pixel_format()) { case AV_PIX_FMT_RGB24: - png_color_type = PNG_COLOR_TYPE_RGB; bits_per_pixel = 8; break; case AV_PIX_FMT_XYZ12LE: - png_color_type = PNG_COLOR_TYPE_RGB; bits_per_pixel = 16; break; default: @@ -743,9 +741,40 @@ write_image (shared_ptr image, boost::filesystem::path file) png_set_IHDR (png_ptr, info_ptr, image->size().width, image->size().height, bits_per_pixel, png_color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - png_byte ** row_pointers = reinterpret_cast(png_malloc(png_ptr, image->size().height * sizeof(png_byte *))); - for (int i = 0; i < image->size().height; ++i) { - row_pointers[i] = (png_byte *) (image->data()[0] + i * image->stride()[0]); + auto const width = image->size().width; + auto const height = image->size().height; + auto const stride = image->stride()[0]; + + vector> data_to_write(height); + for (int y = 0; y < height; ++y) { + data_to_write[y].resize(stride); + } + + switch (image->pixel_format()) { + case AV_PIX_FMT_RGB24: + for (int y = 0; y < height; ++y) { + memcpy(data_to_write[y].data(), image->data()[0] + y * stride, stride); + } + break; + case AV_PIX_FMT_XYZ12LE: + /* 16-bit pixel values must be written MSB first */ + for (int y = 0; y < height; ++y) { + data_to_write[y].resize(stride); + uint8_t* original = image->data()[0] + y * stride; + for (int x = 0; x < width * 3; ++x) { + data_to_write[y][x * 2] = original[1]; + data_to_write[y][x * 2 + 1] = original[0]; + original += 2; + } + } + break; + default: + break; + } + + png_byte ** row_pointers = reinterpret_cast(png_malloc(png_ptr, image->size().height * sizeof(png_byte *))); + for (int y = 0; y < height; ++y) { + row_pointers[y] = reinterpret_cast(data_to_write[y].data()); } png_write_info (png_ptr, info_ptr); @@ -807,13 +836,9 @@ dcp_file (shared_ptr film, string prefix) boost::filesystem::path subtitle_file (shared_ptr film) { - for (auto i: boost::filesystem::directory_iterator(film->directory().get() / film->dcp_name (false))) { - if (boost::filesystem::is_directory(i.path())) { - for (auto j: boost::filesystem::directory_iterator(i.path())) { - if (boost::algorithm::starts_with(j.path().leaf().string(), "sub_")) { - return j.path(); - } - } + for (auto i: boost::filesystem::recursive_directory_iterator(film->directory().get() / film->dcp_name(false))) { + if (boost::algorithm::starts_with(i.path().leaf().string(), "sub_")) { + return i.path(); } }