int FileEXR::write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit) { EXRUnit *exr_unit = (EXRUnit*)unit; int result = 0; VFrame *output_frame; data->set_compressed_size(0); int native_cmodel = asset->exr_use_alpha ? BC_RGBA_FLOAT : BC_RGB_FLOAT; int components = BC_CModels::components(native_cmodel); if(frame->get_color_model() != native_cmodel) { if(!exr_unit->temp_frame) exr_unit->temp_frame = new VFrame(0, asset->width, asset->height, native_cmodel); exr_unit->temp_frame->transfer_from(frame); output_frame = exr_unit->temp_frame; } else output_frame = frame; Imf::Header header(output_frame->get_w(), output_frame->get_h()); header.compression() = (Imf::Compression)compression_to_exr( asset->exr_compression); header.channels().insert("R", Imf::Channel(Imf::FLOAT)); header.channels().insert("G", Imf::Channel(Imf::FLOAT)); header.channels().insert("B", Imf::Channel(Imf::FLOAT)); if(asset->exr_use_alpha) header.channels().insert("A", Imf::Channel(Imf::FLOAT)); EXROStream exr_stream(data); Imf::OutputFile file(exr_stream, header); Imf::FrameBuffer framebuffer; float **rows = (float**)output_frame->get_rows(); framebuffer.insert("R", Imf::Slice(Imf::FLOAT, (char*)(rows[0]), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); framebuffer.insert("G", Imf::Slice(Imf::FLOAT, (char*)(rows[0] + 1), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); framebuffer.insert("B", Imf::Slice(Imf::FLOAT, (char*)(rows[0] + 2), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); if(asset->exr_use_alpha) framebuffer.insert("A", Imf::Slice(Imf::FLOAT, (char*)(rows[0] + 3), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); file.setFrameBuffer(framebuffer); file.writePixels(asset->height); return 0; }
int FileEXR::write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit) { EXRUnit *exr_unit = (EXRUnit*)unit; VFrame *output_frame; data->set_compressed_size(0); int native_cmodel = asset->exr_use_alpha ? BC_RGBA_FLOAT : BC_RGB_FLOAT; int components = cmodel_components(native_cmodel); if(frame->get_color_model() != native_cmodel) { if(!exr_unit->temp_frame) exr_unit->temp_frame = new VFrame(0, -1, asset->width, asset->height, native_cmodel, -1); BC_CModels::transfer(exr_unit->temp_frame->get_rows(), /* Leave NULL if non existent */ frame->get_rows(), exr_unit->temp_frame->get_y(), /* Leave NULL if non existent */ exr_unit->temp_frame->get_u(), exr_unit->temp_frame->get_v(), frame->get_y(), /* Leave NULL if non existent */ frame->get_u(), frame->get_v(), 0, /* Dimensions to capture from input frame */ 0, asset->width, asset->height, 0, /* Dimensions to project on output frame */ 0, asset->width, asset->height, frame->get_color_model(), native_cmodel, 0, /* When transfering BC_RGBA8888 to non-alpha this is the background color in 0xRRGGBB hex */ asset->width, /* For planar use the luma rowspan */ asset->height); output_frame = exr_unit->temp_frame; } else output_frame = frame; Imf::Header header(output_frame->get_w(), output_frame->get_h()); header.compression() = (Imf::Compression)compression_to_exr( asset->exr_compression); header.channels().insert("R", Imf::Channel(Imf::FLOAT)); header.channels().insert("G", Imf::Channel(Imf::FLOAT)); header.channels().insert("B", Imf::Channel(Imf::FLOAT)); if(asset->exr_use_alpha) header.channels().insert("A", Imf::Channel(Imf::FLOAT)); EXROStream exr_stream(data); Imf::OutputFile file(exr_stream, header); Imf::FrameBuffer framebuffer; float **rows = (float**)output_frame->get_rows(); framebuffer.insert("R", Imf::Slice(Imf::FLOAT, (char*)(rows[0]), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); framebuffer.insert("G", Imf::Slice(Imf::FLOAT, (char*)(rows[0] + 1), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); framebuffer.insert("B", Imf::Slice(Imf::FLOAT, (char*)(rows[0] + 2), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); if(asset->exr_use_alpha) framebuffer.insert("A", Imf::Slice(Imf::FLOAT, (char*)(rows[0] + 3), sizeof(float) * components, sizeof(float) * components * output_frame->get_w())); file.setFrameBuffer(framebuffer); file.writePixels(asset->height); return 0; }