#include "pixelformatconverter.h" extern "C" { #include #include } #include #include PixelFormatConverter* olive::pix_fmt_conv; PixelFormatConverter::PixelFormatConverter() { threads_.resize(qMax(1, QThread::idealThreadCount()-1)); for (int i=0;istart(QThread::HighPriority); } } PixelFormatConverter::~PixelFormatConverter() { for (int i=0;iConvert(input_buffer, input_linesize, width, line_start, qMin(lines_per_thread, height - line_start), input_fmt, output_buffer, output_fmt); } // Wait for each thread to complete for (int i=0;iWaitUntilComplete(); } mutex_.unlock(); delete [] converted_buffer; } int PixelFormatConverter::GetBufferSize(olive::PixelFormat format, const int &width, const int &height) { int rgba_channels = 4; switch (format) { case olive::PIX_FMT_RGBA8: return width * height * rgba_channels; case olive::PIX_FMT_RGBA16: case olive::PIX_FMT_RGBA16F: return 2 * width * height * rgba_channels; case olive::PIX_FMT_RGBA32F: return 4 * width * height * rgba_channels; default: return 0; } } PixFmtConvertThread::PixFmtConvertThread() : cancelled_(false) { } void PixFmtConvertThread::run() { mutex_.lock(); while (!cancelled_) { wait_cond_.wait(&mutex_); if (cancelled_) break; Process(); } mutex_.unlock(); } void PixFmtConvertThread::Convert(uint8_t **input_buffer, int *input_linesize, const int &width, const int &line_start, const int &line_count, AVPixelFormat input_fmt, void *output_buffer, olive::PixelFormat output_fmt) { mutex2_.lock(); mutex_.lock(); input_buffer_ = input_buffer; input_linesize_ = input_linesize; width_ = width; line_start_ = line_start; line_count_ = line_count; input_fmt_ = input_fmt; output_buffer_ = output_buffer; output_fmt_ = output_fmt; wait_cond_.wakeAll(); mutex_.unlock(); } void PixFmtConvertThread::WaitUntilComplete() { mutex2_.lock(); mutex_.lock(); mutex2_.unlock(); mutex_.unlock(); } void PixFmtConvertThread::Cancel() { cancelled_ = true; wait_cond_.wakeAll(); wait(); } void PixFmtConvertThread::Process() { mutex2_.unlock(); switch (input_fmt_) { case AV_PIX_FMT_RGBA: { int channels = 4; // FIXME RGBA magic number int byte_linesize = input_linesize_[0]*channels; int input_start = byte_linesize*line_start_; int output_start = width_*channels*line_start_; for (int i=0;i(output_buffer_)[output_line_start+j] = input_buffer_[0][input_line_start+j] / 255.0f; } } break; } default: qWarning() << "PixFmtConvertThread doesn't yet know how to convert pixel format" << input_fmt_; } }