File: Decoder.cpp

package info (click to toggle)
freespace2 24.2.0%2Brepack-1
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,716 kB
  • sloc: cpp: 595,001; ansic: 21,741; python: 1,174; sh: 457; makefile: 248; xml: 181
file content (81 lines) | stat: -rw-r--r-- 1,816 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#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();
}

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
	}
}

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
	}
}

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
	}
}
}