mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-08 07:28:22 -10:00
This allows to directly display RGB(A) movies without transcoding them to YUV first. This allows the movie player to support APNG files (which are supported natively by FFmpeg) with an alpha channel and without converting them to YUV first.
93 lines
2.0 KiB
C++
93 lines
2.0 KiB
C++
#include "cutscene/Decoder.h"
|
|
|
|
#include <memory>
|
|
|
|
namespace cutscene {
|
|
FrameSize::FrameSize(size_t in_width, size_t in_height, size_t in_stride)
|
|
: width(in_width), height(in_height), stride(in_stride)
|
|
{
|
|
}
|
|
FrameSize::FrameSize() = default;
|
|
|
|
Decoder::Decoder() : m_decoding(true) {
|
|
}
|
|
|
|
Decoder::~Decoder() {
|
|
}
|
|
|
|
bool Decoder::tryPopAudioData(AudioFramePtr& out) {
|
|
auto res = m_audioQueue->try_pull_front(out);
|
|
return res == queue_op_status::success;
|
|
}
|
|
|
|
bool Decoder::tryPopSubtitleData(SubtitleFramePtr& out) {
|
|
auto res = m_subtitleQueue->try_pull_front(out);
|
|
return res == queue_op_status::success;
|
|
}
|
|
|
|
bool Decoder::tryPopVideoFrame(VideoFramePtr& out) {
|
|
auto res = m_videoQueue->try_pull_front(out);
|
|
return res == queue_op_status::success;
|
|
}
|
|
|
|
void Decoder::initializeQueues(size_t queueSize) {
|
|
m_queueSize = queueSize;
|
|
|
|
m_videoQueue.reset(new sync_bounded_queue<VideoFramePtr>(m_queueSize));
|
|
m_audioQueue.reset(new sync_bounded_queue<AudioFramePtr>(m_queueSize));
|
|
m_subtitleQueue.reset(new sync_bounded_queue<SubtitleFramePtr>(m_queueSize));
|
|
}
|
|
|
|
void Decoder::stopDecoder() {
|
|
m_decoding = false;
|
|
|
|
m_videoQueue->close();
|
|
m_audioQueue->close();
|
|
m_subtitleQueue->close();
|
|
}
|
|
|
|
bool Decoder::canPushAudioData() {
|
|
return !isAudioQueueFull();
|
|
}
|
|
|
|
void Decoder::pushAudioData(AudioFramePtr&& data) {
|
|
Assertion(data, "Invalid audio data passed!");
|
|
|
|
try {
|
|
m_audioQueue->push_back(std::move(data));
|
|
}
|
|
catch (sync_queue_is_closed&) {
|
|
// Ignore
|
|
}
|
|
}
|
|
|
|
bool Decoder::canPushSubtitleData() {
|
|
return !isSubtitleQueueFull();
|
|
}
|
|
void Decoder::pushSubtitleData(SubtitleFramePtr&& data) {
|
|
Assertion(data, "Invalid audio data passed!");
|
|
|
|
try {
|
|
m_subtitleQueue->push_back(std::move(data));
|
|
}
|
|
catch (sync_queue_is_closed&) {
|
|
// Ignore
|
|
}
|
|
}
|
|
|
|
bool Decoder::canPushVideoData() {
|
|
return !isVideoQueueFull();
|
|
}
|
|
|
|
void Decoder::pushFrameData(VideoFramePtr&& frame) {
|
|
Assertion(frame, "Invalid video data passed!");
|
|
|
|
try {
|
|
m_videoQueue->push_back(std::move(frame));
|
|
}
|
|
catch (sync_queue_is_closed&) {
|
|
// Ignore
|
|
}
|
|
}
|
|
}
|