\r
struct audio_mixer::implementation\r
{\r
- std::deque<std::vector<short>> audio_data_;\r
+ std::vector<int16_t> audio_data_;\r
std::stack<core::audio_transform> transform_stack_;\r
\r
std::map<int, core::audio_transform> prev_audio_transforms_;\r
implementation()\r
{\r
transform_stack_.push(core::audio_transform());\r
-\r
- // frame delay\r
- audio_data_.push_back(std::vector<short>());\r
}\r
\r
void begin(const core::basic_frame& frame)\r
auto& audio_data = frame.audio_data();\r
auto tag = frame.tag(); // Get the identifier for the audio-stream.\r
\r
- if(audio_data_.back().empty())\r
- audio_data_.back().resize(audio_data.size(), 0);\r
+ if(audio_data_.empty())\r
+ audio_data_.resize(audio_data.size(), 0);\r
\r
auto next = transform_stack_.top();\r
auto prev = next;\r
\r
static const int BASE = 1<<15;\r
\r
- auto next_gain = static_cast<int>(next.get_gain()*BASE);\r
- auto prev_gain = static_cast<int>(prev.get_gain()*BASE);\r
+ auto next_gain = static_cast<int32_t>(next.get_gain()*BASE);\r
+ auto prev_gain = static_cast<int32_t>(prev.get_gain()*BASE);\r
\r
- int n_samples = audio_data_.back().size();\r
+ int n_samples = audio_data_.size();\r
\r
tbb::parallel_for\r
(\r
{\r
int sample_gain = (prev_gain - (prev_gain * n)/n_samples) + (next_gain * n)/n_samples;\r
\r
- int sample = (static_cast<int>(audio_data[n])*sample_gain)/BASE;\r
+ int sample = (static_cast<int32_t>(audio_data[n])*sample_gain)/BASE;\r
\r
- audio_data_.back()[n] = static_cast<short>((static_cast<int>(audio_data_.back()[n]) + sample) & 0xFFFF);\r
+ audio_data_[n] = static_cast<int16_t>((static_cast<int32_t>(audio_data_[n]) + sample) & 0xFFFF);\r
}\r
}\r
);\r
transform_stack_.pop();\r
}\r
\r
- void begin_pass()\r
- {\r
- audio_data_.push_back(std::vector<short>());\r
- }\r
\r
- std::vector<short> end_pass()\r
+ std::vector<short> mix()\r
{\r
- prev_audio_transforms_ = std::move(next_audio_transforms_);\r
-\r
- auto result = std::move(audio_data_.front());\r
- audio_data_.pop_front(); \r
- return result;\r
+ prev_audio_transforms_ = std::move(next_audio_transforms_); \r
+ return std::move(audio_data_);\r
}\r
};\r
\r
void audio_mixer::begin(const core::basic_frame& frame){impl_->begin(frame);}\r
void audio_mixer::visit(core::write_frame& frame){impl_->visit(frame);}\r
void audio_mixer::end(){impl_->end();}\r
-void audio_mixer::begin_pass(){ impl_->begin_pass();} \r
-std::vector<short> audio_mixer::end_pass(){return impl_->end_pass();}\r
+std::vector<short> audio_mixer::mix(){return impl_->mix();}\r
\r
}}
\ No newline at end of file
virtual void visit(core::write_frame& frame);\r
virtual void end();\r
\r
- void begin_pass();\r
- std::vector<short> end_pass();\r
+ std::vector<short> mix();\r
\r
private:\r
struct implementation;\r
auto& root_audio_transform = boost::fusion::at_key<core::audio_transform>(root_transforms_);\r
auto& audio_transforms = boost::fusion::at_key<core::audio_transform>(transforms_);\r
\r
- audio_mixer_.begin_pass();\r
BOOST_FOREACH(auto& frame, frames)\r
{\r
- int num = format_desc_.mode == core::video_mode::progressive ? 1 : 2;\r
+ const unsigned int num = format_desc_.mode == core::video_mode::progressive ? 1 : 2;\r
\r
auto frame1 = make_safe<core::basic_frame>(frame.second);\r
frame1->get_audio_transform() = root_audio_transform.fetch_and_tick(num)*audio_transforms[frame.first].fetch_and_tick(num);\r
frame1->accept(audio_mixer_);\r
}\r
- return audio_mixer_.end_pass();\r
+\r
+ return audio_mixer_.mix();\r
}\r
\r
void send(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
}\r
\r
template<typename T> \r
- void set_transform(const T& transform, int mix_duration, const std::wstring& tween)\r
+ void set_transform(const T& transform, unsigned int mix_duration, const std::wstring& tween)\r
{\r
executor_.invoke([&]\r
{\r
}\r
\r
template<typename T>\r
- void set_transform(int index, const T& transform, int mix_duration, const std::wstring& tween)\r
+ void set_transform(int index, const T& transform, unsigned int mix_duration, const std::wstring& tween)\r
{\r
executor_.invoke([&]\r
{\r
}\r
\r
template<typename T>\r
- void apply_transform(const std::function<T(const T&)>& transform, int mix_duration, const std::wstring& tween)\r
+ void apply_transform(const std::function<T(const T&)>& transform, unsigned int mix_duration, const std::wstring& tween)\r
{\r
return executor_.invoke([&]\r
{\r
}\r
\r
template<typename T>\r
- void apply_transform(int index, const std::function<T(T)>& transform, int mix_duration, const std::wstring& tween)\r
+ void apply_transform(int index, const std::function<T(T)>& transform, unsigned int mix_duration, const std::wstring& tween)\r
{\r
executor_.invoke([&]\r
{\r
}\r
\r
template<typename T>\r
- void reset_transform(int mix_duration, const std::wstring& tween)\r
+ void reset_transform(unsigned int mix_duration, const std::wstring& tween)\r
{\r
executor_.invoke([&]\r
{\r
}\r
\r
template<typename T>\r
- void reset_transform(int index, int mix_duration, const std::wstring& tween)\r
+ void reset_transform(int index, unsigned int mix_duration, const std::wstring& tween)\r
{\r
executor_.invoke([&]\r
{ \r
desc.planes.push_back( core::pixel_format_desc::plane(get_video_format_desc().width, get_video_format_desc().height, 4));\r
return create_frame(tag, desc);\r
}\r
-void frame_mixer_device::set_image_transform(const core::image_transform& transform, int mix_duration, const std::wstring& tween){impl_->set_transform<core::image_transform>(transform, mix_duration, tween);}\r
-void frame_mixer_device::set_image_transform(int index, const core::image_transform& transform, int mix_duration, const std::wstring& tween){impl_->set_transform<core::image_transform>(index, transform, mix_duration, tween);}\r
-void frame_mixer_device::set_audio_transform(const core::audio_transform& transform, int mix_duration, const std::wstring& tween){impl_->set_transform<core::audio_transform>(transform, mix_duration, tween);}\r
-void frame_mixer_device::set_audio_transform(int index, const core::audio_transform& transform, int mix_duration, const std::wstring& tween){impl_->set_transform<core::audio_transform>(index, transform, mix_duration, tween);}\r
-void frame_mixer_device::apply_image_transform(const std::function<core::image_transform(core::image_transform)>& transform, int mix_duration, const std::wstring& tween){impl_->apply_transform<core::image_transform>(transform, mix_duration, tween);}\r
-void frame_mixer_device::apply_image_transform(int index, const std::function<core::image_transform(core::image_transform)>& transform, int mix_duration, const std::wstring& tween){impl_->apply_transform<core::image_transform>(index, transform, mix_duration, tween);}\r
-void frame_mixer_device::apply_audio_transform(const std::function<core::audio_transform(core::audio_transform)>& transform, int mix_duration, const std::wstring& tween){impl_->apply_transform<core::audio_transform>(transform, mix_duration, tween);}\r
-void frame_mixer_device::apply_audio_transform(int index, const std::function<core::audio_transform(core::audio_transform)>& transform, int mix_duration, const std::wstring& tween){impl_->apply_transform<core::audio_transform>(index, transform, mix_duration, tween);}\r
-void frame_mixer_device::reset_image_transform(int mix_duration, const std::wstring& tween){impl_->reset_transform<core::image_transform>(mix_duration, tween);}\r
-void frame_mixer_device::reset_image_transform(int index, int mix_duration, const std::wstring& tween){impl_->reset_transform<core::image_transform>(index, mix_duration, tween);}\r
-void frame_mixer_device::reset_audio_transform(int mix_duration, const std::wstring& tween){impl_->reset_transform<core::audio_transform>(mix_duration, tween);}\r
-void frame_mixer_device::reset_audio_transform(int index, int mix_duration, const std::wstring& tween){impl_->reset_transform<core::audio_transform>(index, mix_duration, tween);}\r
+void frame_mixer_device::set_image_transform(const core::image_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::image_transform>(transform, mix_duration, tween);}\r
+void frame_mixer_device::set_image_transform(int index, const core::image_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::image_transform>(index, transform, mix_duration, tween);}\r
+void frame_mixer_device::set_audio_transform(const core::audio_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::audio_transform>(transform, mix_duration, tween);}\r
+void frame_mixer_device::set_audio_transform(int index, const core::audio_transform& transform, unsigned int mix_duration, const std::wstring& tween){impl_->set_transform<core::audio_transform>(index, transform, mix_duration, tween);}\r
+void frame_mixer_device::apply_image_transform(const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::image_transform>(transform, mix_duration, tween);}\r
+void frame_mixer_device::apply_image_transform(int index, const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::image_transform>(index, transform, mix_duration, tween);}\r
+void frame_mixer_device::apply_audio_transform(const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::audio_transform>(transform, mix_duration, tween);}\r
+void frame_mixer_device::apply_audio_transform(int index, const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration, const std::wstring& tween){impl_->apply_transform<core::audio_transform>(index, transform, mix_duration, tween);}\r
+void frame_mixer_device::reset_image_transform(unsigned int mix_duration, const std::wstring& tween){impl_->reset_transform<core::image_transform>(mix_duration, tween);}\r
+void frame_mixer_device::reset_image_transform(int index, unsigned int mix_duration, const std::wstring& tween){impl_->reset_transform<core::image_transform>(index, mix_duration, tween);}\r
+void frame_mixer_device::reset_audio_transform(unsigned int mix_duration, const std::wstring& tween){impl_->reset_transform<core::audio_transform>(mix_duration, tween);}\r
+void frame_mixer_device::reset_audio_transform(int index, unsigned int mix_duration, const std::wstring& tween){impl_->reset_transform<core::audio_transform>(index, mix_duration, tween);}\r
\r
}}
\ No newline at end of file
\r
const core::video_format_desc& get_video_format_desc() const; // nothrow\r
\r
- void set_image_transform(const core::image_transform& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
- void set_image_transform(int index, const core::image_transform& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void set_image_transform(const core::image_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void set_image_transform(int index, const core::image_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
\r
- void set_audio_transform(const core::audio_transform& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
- void set_audio_transform(int index, const core::audio_transform& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void set_audio_transform(const core::audio_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void set_audio_transform(int index, const core::audio_transform& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
\r
- void apply_image_transform(const std::function<core::image_transform(core::image_transform)>& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
- void apply_image_transform(int index, const std::function<core::image_transform(core::image_transform)>& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void apply_image_transform(const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void apply_image_transform(int index, const std::function<core::image_transform(core::image_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
\r
- void apply_audio_transform(const std::function<core::audio_transform(core::audio_transform)>& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
- void apply_audio_transform(int index, const std::function<core::audio_transform(core::audio_transform)>& transform, int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void apply_audio_transform(const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void apply_audio_transform(int index, const std::function<core::audio_transform(core::audio_transform)>& transform, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
\r
- void reset_image_transform(int mix_duration = 0, const std::wstring& tween = L"linear");\r
- void reset_image_transform(int index, int mix_duration = 0, const std::wstring& tween = L"linear");\r
- void reset_audio_transform(int mix_duration = 0, const std::wstring& tween = L"linear");\r
- void reset_audio_transform(int index, int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void reset_image_transform(unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void reset_image_transform(int index, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void reset_audio_transform(unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
+ void reset_audio_transform(int index, unsigned int mix_duration = 0, const std::wstring& tween = L"linear");\r
\r
private:\r
struct implementation;\r
struct read_frame::implementation : boost::noncopyable\r
{\r
boost::unique_future<safe_ptr<const host_buffer>> image_data_;\r
- std::vector<short> audio_data_;\r
+ std::vector<int16_t> audio_data_;\r
\r
public:\r
- implementation(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<short>&& audio_data) \r
+ implementation(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<int16_t>&& audio_data) \r
: image_data_(std::move(image_data))\r
, audio_data_(std::move(audio_data)){} \r
};\r
\r
-read_frame::read_frame(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<short>&& audio_data) \r
+read_frame::read_frame(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<int16_t>&& audio_data) \r
: impl_(new implementation(std::move(image_data), std::move(audio_data))){}\r
-read_frame::read_frame(safe_ptr<const host_buffer>&& image_data, std::vector<short>&& audio_data) \r
+read_frame::read_frame(safe_ptr<const host_buffer>&& image_data, std::vector<int16_t>&& audio_data) \r
{\r
boost::promise<safe_ptr<const host_buffer>> p;\r
p.set_value(std::move(image_data));\r
impl_.reset(new implementation(std::move(p.get_future()), std::move(audio_data)));\r
}\r
\r
-const boost::iterator_range<const unsigned char*> read_frame::image_data() const\r
+const boost::iterator_range<const uint8_t*> read_frame::image_data() const\r
{\r
try\r
{\r
if(!impl_->image_data_.get()->data())\r
- return boost::iterator_range<const unsigned char*>();\r
- auto ptr = static_cast<const unsigned char*>(impl_->image_data_.get()->data());\r
- return boost::iterator_range<const unsigned char*>(ptr, ptr + impl_->image_data_.get()->size());\r
+ return boost::iterator_range<const uint8_t*>();\r
+ auto ptr = static_cast<const uint8_t*>(impl_->image_data_.get()->data());\r
+ return boost::iterator_range<const uint8_t*>(ptr, ptr + impl_->image_data_.get()->size());\r
}\r
catch(...) // image_data_ future might store exception.\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- return boost::iterator_range<const unsigned char*>();\r
+ return boost::iterator_range<const uint8_t*>();\r
}\r
}\r
-const boost::iterator_range<const short*> read_frame::audio_data() const\r
+const boost::iterator_range<const int16_t*> read_frame::audio_data() const\r
{\r
- return boost::iterator_range<const short*>(impl_->audio_data_.data(), impl_->audio_data_.data() + impl_->audio_data_.size());\r
+ return boost::iterator_range<const int16_t*>(impl_->audio_data_.data(), impl_->audio_data_.data() + impl_->audio_data_.size());\r
}\r
\r
}}
\ No newline at end of file
{\r
read_frame(){}\r
public:\r
- read_frame(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<short>&& audio_data);\r
- read_frame(safe_ptr<const host_buffer>&& image_data, std::vector<short>&& audio_data);\r
+ read_frame(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<int16_t>&& audio_data);\r
+ read_frame(safe_ptr<const host_buffer>&& image_data, std::vector<int16_t>&& audio_data);\r
\r
- virtual const boost::iterator_range<const unsigned char*> image_data() const;\r
- virtual const boost::iterator_range<const short*> audio_data() const;\r
+ virtual const boost::iterator_range<const uint8_t*> image_data() const;\r
+ virtual const boost::iterator_range<const int16_t*> audio_data() const;\r
\r
static safe_ptr<const read_frame> empty()\r
{\r
struct empty : public read_frame\r
{ \r
- virtual const boost::iterator_range<const unsigned char*> image_data() const {return boost::iterator_range<const unsigned char*>();}\r
- virtual const boost::iterator_range<const short*> audio_data() const {return boost::iterator_range<const short*>();}\r
+ virtual const boost::iterator_range<const uint8_t*> image_data() const {return boost::iterator_range<const uint8_t*>();}\r
+ virtual const boost::iterator_range<const int16_t*> audio_data() const {return boost::iterator_range<const int16_t*>();}\r
};\r
static safe_ptr<const empty> frame;\r
return frame;\r
{ \r
std::vector<safe_ptr<host_buffer>> buffers_;\r
std::vector<safe_ptr<device_buffer>> textures_;\r
- std::vector<short> audio_data_;\r
+ std::vector<int16_t> audio_data_;\r
const core::pixel_format_desc desc_;\r
- int tag_;\r
+ int32_t tag_;\r
\r
public:\r
- implementation(int tag, const core::pixel_format_desc& desc, const std::vector<safe_ptr<host_buffer>>& buffers, const std::vector<safe_ptr<device_buffer>>& textures) \r
+ implementation(int32_t tag, const core::pixel_format_desc& desc, const std::vector<safe_ptr<host_buffer>>& buffers, const std::vector<safe_ptr<device_buffer>>& textures) \r
: desc_(desc)\r
, buffers_(buffers)\r
, textures_(textures)\r
visitor.end();\r
}\r
\r
- boost::iterator_range<unsigned char*> image_data(size_t index)\r
+ boost::iterator_range<uint8_t*> image_data(size_t index)\r
{\r
if(index >= buffers_.size() || !buffers_[index]->data())\r
- return boost::iterator_range<const unsigned char*>();\r
- auto ptr = static_cast<unsigned char*>(buffers_[index]->data());\r
- return boost::iterator_range<unsigned char*>(ptr, ptr+buffers_[index]->size());\r
+ return boost::iterator_range<const uint8_t*>();\r
+ auto ptr = static_cast<uint8_t*>(buffers_[index]->data());\r
+ return boost::iterator_range<uint8_t*>(ptr, ptr+buffers_[index]->size());\r
}\r
\r
- const boost::iterator_range<const unsigned char*> image_data(size_t index) const\r
+ const boost::iterator_range<const uint8_t*> image_data(size_t index) const\r
{\r
if(index >= buffers_.size() || !buffers_[index]->data())\r
- return boost::iterator_range<const unsigned char*>();\r
- auto ptr = static_cast<const unsigned char*>(buffers_[index]->data());\r
- return boost::iterator_range<const unsigned char*>(ptr, ptr+buffers_[index]->size());\r
+ return boost::iterator_range<const uint8_t*>();\r
+ auto ptr = static_cast<const uint8_t*>(buffers_[index]->data());\r
+ return boost::iterator_range<const uint8_t*>(ptr, ptr+buffers_[index]->size());\r
}\r
\r
void commit()\r
}\r
};\r
\r
-write_frame::write_frame(int tag, const core::pixel_format_desc& desc, const std::vector<safe_ptr<host_buffer>>& buffers, const std::vector<safe_ptr<device_buffer>>& textures) : impl_(new implementation(tag, desc, buffers, textures)){}\r
+write_frame::write_frame(int32_t tag, const core::pixel_format_desc& desc, const std::vector<safe_ptr<host_buffer>>& buffers, const std::vector<safe_ptr<device_buffer>>& textures) : impl_(new implementation(tag, desc, buffers, textures)){}\r
void write_frame::accept(core::frame_visitor& visitor){impl_->accept(*this, visitor);}\r
\r
-boost::iterator_range<unsigned char*> write_frame::image_data(size_t index){return impl_->image_data(index);}\r
-std::vector<short>& write_frame::audio_data() { return impl_->audio_data_; }\r
-const boost::iterator_range<const unsigned char*> write_frame::image_data(size_t index) const\r
+boost::iterator_range<uint8_t*> write_frame::image_data(size_t index){return impl_->image_data(index);}\r
+std::vector<int16_t>& write_frame::audio_data() { return impl_->audio_data_; }\r
+const boost::iterator_range<const uint8_t*> write_frame::image_data(size_t index) const\r
{\r
- return boost::iterator_range<const unsigned char*>(impl_->image_data(index).begin(), impl_->image_data(index).end());\r
+ return boost::iterator_range<const uint8_t*>(impl_->image_data(index).begin(), impl_->image_data(index).end());\r
}\r
-const boost::iterator_range<const short*> write_frame::audio_data() const\r
+const boost::iterator_range<const int16_t*> write_frame::audio_data() const\r
{\r
- return boost::iterator_range<const short*>(impl_->audio_data_.data(), impl_->audio_data_.data() + impl_->audio_data_.size());\r
+ return boost::iterator_range<const int16_t*>(impl_->audio_data_.data(), impl_->audio_data_.data() + impl_->audio_data_.size());\r
}\r
-int write_frame::tag() const {return impl_->tag_;}\r
+int32_t write_frame::tag() const {return impl_->tag_;}\r
const core::pixel_format_desc& write_frame::get_pixel_format_desc() const{return impl_->desc_;}\r
const std::vector<safe_ptr<device_buffer>>& write_frame::get_textures() const{return impl_->textures_;}\r
const std::vector<safe_ptr<host_buffer>>& write_frame::get_buffers() const{return impl_->buffers_;}\r
explicit write_frame(int tag, const core::pixel_format_desc& desc, const std::vector<safe_ptr<host_buffer>>& buffers, const std::vector<safe_ptr<device_buffer>>& textures);\r
\r
// core::write_frame\r
- virtual boost::iterator_range<unsigned char*> image_data(size_t plane_index = 0); \r
- virtual std::vector<short>& audio_data();\r
+ virtual boost::iterator_range<uint8_t*> image_data(size_t plane_index = 0); \r
+ virtual std::vector<int16_t>& audio_data();\r
\r
- virtual const boost::iterator_range<const unsigned char*> image_data(size_t plane_index = 0) const;\r
- virtual const boost::iterator_range<const short*> audio_data() const;\r
+ virtual const boost::iterator_range<const uint8_t*> image_data(size_t plane_index = 0) const;\r
+ virtual const boost::iterator_range<const int16_t*> audio_data() const;\r
\r
- void commit(size_t plane_index);\r
+ void commit(uint32_t plane_index);\r
void commit();\r
\r
virtual void accept(core::frame_visitor& visitor);\r
auto frame = frame_factory->create_frame(this, 1, 1, pixel_format::bgra);\r
\r
// Read color from hex-string and write to frame pixel.\r
- auto& value = *reinterpret_cast<unsigned long*>(frame->image_data().begin());\r
+ auto& value = *reinterpret_cast<uint32_t*>(frame->image_data().begin());\r
std::wstringstream str(color_str_.substr(1));\r
str >> std::hex >> value;\r
\r
return producer;\r
} \r
\r
-safe_ptr<basic_frame> frame_producer::receive_w_last()\r
+safe_ptr<basic_frame> frame_producer::receive_save_last()\r
{\r
auto frame = receive();\r
if(frame != core::basic_frame::late())\r
\r
safe_ptr<basic_frame> receive(const safe_ptr<frame_producer>& producer)\r
{\r
- return producer->receive_w_last();\r
+ return producer->receive_save_last();\r
}\r
\r
safe_ptr<basic_frame> receive_and_follow(safe_ptr<frame_producer>& producer)\r
safe_ptr<core::basic_frame> last_frame() const {return last_frame_;}\r
\r
private:\r
- virtual safe_ptr<basic_frame> receive() = 0;\r
friend safe_ptr<basic_frame> receive(const safe_ptr<frame_producer>& producer);\r
\r
- safe_ptr<basic_frame> receive_w_last();\r
+ virtual safe_ptr<basic_frame> receive() = 0;\r
+\r
+ safe_ptr<basic_frame> receive_save_last();\r
\r
safe_ptr<core::basic_frame> last_frame_;\r
};\r
#include <boost/timer.hpp>\r
\r
#include <tbb/parallel_for.h>\r
-#include <tbb/mutex.h>\r
\r
#include <array>\r
#include <memory>\r
\r
struct frame_producer_device::implementation : boost::noncopyable\r
{ \r
- std::map<int, layer> layers_; \r
- \r
- const video_format_desc format_desc_;\r
- \r
+ std::map<int, layer> layers_; \r
+ const video_format_desc format_desc_; \r
safe_ptr<diagnostics::graph> diag_;\r
+ const output_t output_;\r
\r
- const std::function<void(const std::map<int, safe_ptr<basic_frame>>&)> output_;\r
-\r
- boost::timer frame_timer_;\r
- boost::timer tick_timer_;\r
- boost::timer output_timer_;\r
+ boost::timer frame_timer_;\r
+ boost::timer tick_timer_;\r
+ boost::timer output_timer_;\r
\r
- mutable executor executor_;\r
+ mutable executor executor_;\r
public:\r
- implementation(const video_format_desc& format_desc, const std::function<void(const std::map<int, safe_ptr<basic_frame>>&)>& output) \r
+ implementation(const video_format_desc& format_desc, const output_t& output) \r
: format_desc_(format_desc)\r
, diag_(diagnostics::create_graph(std::string("frame_producer_device")))\r
, executor_(L"frame_producer_device")\r
}\r
};\r
\r
-frame_producer_device::frame_producer_device(const video_format_desc& format_desc, const std::function<void(const std::map<int, safe_ptr<basic_frame>>&)>& output) : impl_(new implementation(format_desc, output)){}\r
+frame_producer_device::frame_producer_device(const video_format_desc& format_desc, const output_t& output) : impl_(new implementation(format_desc, output)){}\r
frame_producer_device::frame_producer_device(frame_producer_device&& other) : impl_(std::move(other.impl_)){}\r
void frame_producer_device::swap(frame_producer_device& other){impl_->swap(other);}\r
void frame_producer_device::load(int index, const safe_ptr<frame_producer>& producer, bool preview){impl_->load(index, producer, preview);}\r
class frame_producer_device : boost::noncopyable\r
{\r
public:\r
- explicit frame_producer_device(const video_format_desc& format_desc, const std::function<void(const std::map<int, safe_ptr<basic_frame>>&)>& output);\r
+ typedef std::function<void(const std::map<int, safe_ptr<basic_frame>>&)> output_t;\r
+\r
+ explicit frame_producer_device(const video_format_desc& format_desc, const output_t& output);\r
frame_producer_device(frame_producer_device&& other);\r
\r
void swap(frame_producer_device& other);\r
input& input_;\r
AVCodecContext& codec_context_; \r
const core::video_format_desc format_desc_;\r
- std::vector<short> current_chunk_;\r
- std::vector<std::vector<short>> chunks_; \r
+ std::vector<int16_t> current_chunk_; \r
size_t frame_number_;\r
bool restarting_;\r
public:\r
return result;\r
}\r
\r
- std::deque<std::pair<int, std::vector<short>>> decode(const std::shared_ptr<AVPacket>& audio_packet)\r
+ std::deque<std::pair<int, std::vector<int16_t>>> decode(const std::shared_ptr<AVPacket>& audio_packet)\r
{ \r
- std::deque<std::pair<int, std::vector<short>>> result;\r
+ std::deque<std::pair<int, std::vector<int16_t>>> result;\r
\r
if(!audio_packet)\r
{ \r
const auto last = current_chunk_.end() - current_chunk_.size() % format_desc_.audio_samples_per_frame;\r
\r
for(auto it = current_chunk_.begin(); it != last; it += format_desc_.audio_samples_per_frame) \r
- result.push_back(std::make_pair(frame_number_++, std::vector<short>(it, it + format_desc_.audio_samples_per_frame))); \r
+ result.push_back(std::make_pair(frame_number_++, std::vector<int16_t>(it, it + format_desc_.audio_samples_per_frame))); \r
\r
current_chunk_.erase(current_chunk_.begin(), last);\r
\r
};\r
\r
audio_decoder::audio_decoder(input& input, const core::video_format_desc& format_desc) : impl_(new implementation(input, format_desc)){}\r
-std::deque<std::pair<int, std::vector<short>>> audio_decoder::receive(){return impl_->receive();}\r
+std::deque<std::pair<int, std::vector<int16_t>>> audio_decoder::receive(){return impl_->receive();}\r
void audio_decoder::restart(){impl_->restart();}\r
}
\ No newline at end of file
public:\r
explicit audio_decoder(input& input, const core::video_format_desc& format_desc);\r
\r
- std::deque<std::pair<int, std::vector<short>>> receive();\r
+ std::deque<std::pair<int, std::vector<int16_t>>> receive();\r
\r
void restart();\r
private:\r
#include <crtdbg.h>\r
#endif\r
\r
+#include <cstdint>\r
#include <winsock2.h>\r
#include <tchar.h>\r
#include <sstream>\r
</bluefish>-->\r
</consumers>\r
</channel>\r
- <channel>\r
- <videomode>1080i5000</videomode>\r
- <consumers>\r
- <audio/>\r
- <ogl>\r
- <device>1</device>\r
- <stretch>uniform</stretch>\r
- <windowed>true</windowed>\r
- <output>key_only</output>\r
- </ogl>\r
- </consumers>\r
- </channel>\r
</channels>\r
<controllers>\r
<tcp>\r
// Set console title.\r
std::wstringstream str;\r
str << "CasparCG Server " << caspar::env::version();\r
+#ifdef COMPILE_RELEASE\r
+ str << " Release";\r
+#elif COMPILE_PROFILE\r
+ str << " Profile";\r
+#elif COMPILE_DEVELOP\r
+ str << " Develop";\r
+#elif COMPILE_DEBUG\r
+ str << " Debug";\r
+#endif\r
SetConsoleTitle(str.str().c_str());\r
}\r
\r
<BrowseInformation>true</BrowseInformation>\r
<WarningLevel>Level4</WarningLevel>\r
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
- <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;TBB_USE_ASSERT=1;TBB_USE_DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;TBB_USE_ASSERT=1;TBB_USE_DEBUG;_DEBUG;_CRT_SECURE_NO_WARNINGS;COMPILE_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<TreatWarningAsError>true</TreatWarningAsError>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
<FloatingPointModel>Fast</FloatingPointModel>\r
<WarningLevel>Level4</WarningLevel>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;NDEBUG;_VC80_UPGRADE=0x0710;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;NDEBUG;_VC80_UPGRADE=0x0710;COMPILE_RELEASE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<WholeProgramOptimization>true</WholeProgramOptimization>\r
<TreatWarningAsError>true</TreatWarningAsError>\r
<FloatingPointModel>Fast</FloatingPointModel>\r
<WarningLevel>Level4</WarningLevel>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;TBB_USE_THREADING_TOOLS=1;NDEBUG;_VC80_UPGRADE=0x0710;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;TBB_USE_THREADING_TOOLS=1;NDEBUG;_VC80_UPGRADE=0x0710;COMPILE_PROFILE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<TreatWarningAsError>true</TreatWarningAsError>\r
<FloatingPointModel>Fast</FloatingPointModel>\r
<WarningLevel>Level4</WarningLevel>\r
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
<MultiProcessorCompilation>true</MultiProcessorCompilation>\r
- <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;TBB_USE_ASSERT=1;TBB_USE_PERFORMANCE_WARNINGS=1;NDEBUG;_VC80_UPGRADE=0x0710;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ <PreprocessorDefinitions>TBB_USE_CAPTURED_EXCEPTION=0;TBB_USE_ASSERT=1;TBB_USE_PERFORMANCE_WARNINGS=1;NDEBUG;_VC80_UPGRADE=0x0710;COMPILE_DEVELOP;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
<WholeProgramOptimization>false</WholeProgramOptimization>\r
<TreatWarningAsError>true</TreatWarningAsError>\r
<FloatingPointModel>Fast</FloatingPointModel>\r