blob: 07e932ed4a3e302663a7831ed11f42917072ad2b [file] [log] [blame]
Cody Schuffelen134ff032019-11-22 00:25:32 -08001// Copyright 2018 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// https://github.com/google/opuscpp
16
17#ifndef OPUSCPP_OPUS_WRAPPER_H_
18#define OPUSCPP_OPUS_WRAPPER_H_
19
20#include <memory>
21#include <string>
22#include <vector>
23
24#include "opus.h"
25
26namespace opus {
27
28std::string ErrorToString(int error);
29
30namespace internal {
31// Deleter for OpusEncoders and OpusDecoders
32struct OpusDestroyer {
33 void operator()(OpusEncoder* encoder) const noexcept;
34 void operator()(OpusDecoder* decoder) const noexcept;
35};
36template <typename T>
37using opus_uptr = std::unique_ptr<T, OpusDestroyer>;
38} // namespace internal
39
40class Encoder {
41 public:
42 // see documentation at:
43 // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__encoder.html#gaa89264fd93c9da70362a0c9b96b9ca88
44 // Fs corresponds to sample_rate
45 //
46 // If expected_loss_percent is positive, FEC will be enabled
47 Encoder(opus_int32 sample_rate, int num_channels, int application,
48 int expected_loss_percent = 0);
49
50 // Resets internal state of encoder. This should be called between encoding
51 // different streams so that back-to-back decoding and one-at-a-time decoding
52 // give the same result. Returns true on success.
53 bool ResetState();
54
55 // Sets the desired bitrate. Rates from 500 to 512000 are meaningful as well
56 // as the special values OPUS_AUTO and OPUS_BITRATE_MAX. If this method
57 // is not called, the default value of OPUS_AUTO is used.
58 // Returns true on success.
59 bool SetBitrate(int bitrate);
60
61 // Enables or disables variable bitrate in the encoder. By default, variable
62 // bitrate is enabled. Returns true on success.
63 bool SetVariableBitrate(int vbr);
64
65 // Sets the computational complexity of the encoder, in the range of 0 to 10,
66 // inclusive, with 10 being the highest complexity. Returns true on success.
67 bool SetComplexity(int complexity);
68
69 // Gets the total samples of delay added by the entire codec. This value
70 // is the minimum amount of 'preskip' that has to be specified in an
71 // ogg-stream that encapsulates the encoded audio.
72 int GetLookahead();
73
74 // Takes audio data and encodes it. Returns a sequence of encoded packets.
75 // pcm.size() must be divisible by frame_size * (number of channels);
76 // pcm must not contain any incomplete packets.
77 // see documentation for pcm and frame_size at:
78 // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__encoder.html#gad2d6bf6a9ffb6674879d7605ed073e25
79 std::vector<std::vector<unsigned char>> Encode(
80 const std::vector<opus_int16>& pcm, int frame_size);
81
82 int valid() const { return valid_; }
83
84 private:
85 std::vector<unsigned char> EncodeFrame(
86 const std::vector<opus_int16>::const_iterator& frame_start,
87 int frame_size);
88
89 template <typename... Ts>
90 int Ctl(int request, Ts... args) const {
91 return opus_encoder_ctl(encoder_.get(), request, args...);
92 }
93
94 int num_channels_{};
95 bool valid_{};
96 internal::opus_uptr<OpusEncoder> encoder_;
97};
98
99class Decoder {
100 public:
101 // see documentation at:
102 // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__decoder.html#ga753f6fe0b699c81cfd47d70c8e15a0bd
103 // Fs corresponds to sample_rate
104 Decoder(opus_uint32 sample_rate, int num_channels);
105
106 // Takes a sequence of encoded packets and decodes them. Returns the decoded
107 // audio.
108 // see documentation at:
109 // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__decoder.html#ga7d1111f64c36027ddcb81799df9b3fc9
110 std::vector<opus_int16> Decode(
111 const std::vector<std::vector<unsigned char>>& packets, int frame_size,
112 bool decode_fec);
113
114 int valid() const { return valid_; }
115
116 // Takes an encoded packet and decodes it. Returns the decoded audio
117 // see documentation at:
118 // https://mf4.xiph.org/jenkins/view/opus/job/opus/ws/doc/html/group__opus__decoder.html#ga7d1111f64c36027ddcb81799df9b3fc9
119 std::vector<opus_int16> Decode(const std::vector<unsigned char>& packet,
120 int frame_size, bool decode_fec);
121
122 // Generates a dummy frame by passing nullptr to the underlying opus decode.
123 std::vector<opus_int16> DecodeDummy(int frame_size);
124
125 private:
126 int num_channels_{};
127 bool valid_{};
128 internal::opus_uptr<OpusDecoder> decoder_;
129};
130
131} // namespace opus
132
133#endif