StormByte C++ Library: Multimedia module 0.0.9999
StormByte-Multimedia is a StormByte library module for parsing configuration files
Loading...
Searching...
No Matches
upmix.hxx
Go to the documentation of this file.
1/*
2 * Copyright (C) 2024-2026 David C. Manuelda (StormBytePP)
3 *
4 * This file is part of StormByte-Multimedia.
5 *
6 * StormByte-Multimedia original source is dual-licensed:
7 *
8 * 1. GNU Lesser General Public License v3.0 (or later)
9 * You may redistribute and/or modify this file under the terms of the
10 * GNU Lesser General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option)
12 * any later version.
13 *
14 * 2. Commercial license
15 * Alternatively, this file may be used under the terms of a commercial
16 * license agreement with the copyright holder
17 * (David C. Manuelda <StormByte@gmail.com>).
18 *
19 * Both licenses apply only to original StormByte-Multimedia source in this
20 * file. Third-party components — including FFmpeg and embedded trained data —
21 * remain under their own licenses and are not covered by the commercial grant.
22 *
23 * Neither license grants any patent rights. Any patent licenses required
24 * to use this software or third-party components must be obtained separately
25 * from the patent holders.
26 *
27 * StormByte-Multimedia is distributed in the hope that it will be useful,
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 * GNU Lesser General Public License for more details.
31 *
32 * You should have received a copy of the GNU Lesser General Public License
33 * version 3 along with StormByte-Multimedia. If not, see
34 * <https://www.gnu.org/licenses/lgpl-3.0.html>.
35 *
36 * SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-StormByte-Commercial
37 */
38
39#pragma once
40
41#include <StormByte/logger/log.hxx>
46
47#include <memory>
48#include <string>
49#include <string_view>
50
84 public:
90 Upmix(std::shared_ptr<StormByte::Logger::Log> log,
91 Property::ChannelLayout target) noexcept;
92
96 Upmix(const Upmix& other) = delete;
97
101 Upmix(Upmix&& other) noexcept = delete;
102
106 ~Upmix() noexcept override = default;
107
111 Upmix& operator=(const Upmix& other) = delete;
112
116 Upmix& operator=(Upmix&& other) noexcept = delete;
117
122 enum StormByte::Multimedia::Type Media() const noexcept override;
123
127 void Clean() noexcept override;
128
132 void Setup() noexcept override;
133
138 void Process(const Pipeline::Frame& frame) noexcept override;
139
143 void Eof() noexcept override;
144
145 private:
149 enum class Mode: std::uint8_t {
150 None,
151 Surround,
152 Aformat,
153 Pan
154 };
155
160 std::string_view LayoutName() const noexcept;
161
166 bool TargetHasLfe() const noexcept;
167
173 std::string SurroundChain(const StormByte::Multimedia::FFmpeg::AVFrame& src) const noexcept;
174
179 std::string AformatChain() const noexcept;
180
185 std::string PanChain() const noexcept;
186
193 bool EnsureGraph(const StormByte::Multimedia::FFmpeg::AVFrame& src,
194 std::string_view chain) noexcept;
195
196 Property::ChannelLayout m_target;
197 std::unique_ptr<StormByte::Multimedia::FFmpeg::AVFilterGraph> m_graph;
198 Mode m_mode = Mode::None;
199 };
200}
Upmix(std::shared_ptr< StormByte::Logger::Log > log, Property::ChannelLayout target) noexcept
Upmix toward target.
void Setup() noexcept override
Resets the graph before the first frame.
void Eof() noexcept override
Drains frames still held by the graph, if any.
void Clean() noexcept override
Drops the cached graph.
Upmix(const Upmix &other)=delete
Copy is not allowed.
Upmix(Upmix &&other) noexcept=delete
Move is not allowed.
void Process(const Pipeline::Frame &frame) noexcept override
Pushes one audio frame through surround/aformat/pan and Save.
~Upmix() noexcept override=default
Drops the cached graph.
enum StormByte::Multimedia::Type Media() const noexcept override
Media this filter handles.
Abstract base for every StormByte Multimedia filter.
Definition ffmpeg.hxx:253
One-pass filter that mutates decoded frames.
Definition ffmpeg.hxx:753
One decoded access unit.
Definition frame.hxx:81
Demux / decode / filter / encode / mux types.
Media property value types.
ChannelLayout
Curated speaker layouts.
Definition channel_layout.hxx:52
Public multimedia types: codecs, containers, streams and files.
Type
Kind of media stream or codec.
Definition type.hxx:55
@ None
Definition feature.hxx:59
#define STORMBYTE_MULTIMEDIA_PUBLIC
Imported symbol.
Definition visibility.h:47