#pragma once extern "C" { #include } namespace engine { /** * @brief Selection Priority: * 1. Exact match with sourceRate * 2. Lowest supported rate that is >= sourceRate (upsample as little as possible) * 3. Highest supported rate overall * rates are below sourceRate, eg a low rate phone codec at 8khz */ inline int pickSampleRate(const AVCodec *encoder, int sourceRate) { if (!encoder->supported_samplerates) return sourceRate; // 1: exact match for (const int *r = encoder->supported_samplerates; *r != 0; ++r) if (*r == sourceRate) return sourceRate; // 2: lowest rate >= sourceRate (minimal upsampling) int best = 0; for (const int *r = encoder->supported_samplerates; *r != 0; ++r) { if (*r >= sourceRate) { if (best == 0 || *r < best) best = *r; } } if (best != 0) return best; // 3: all supported rates are below sourceRate for (const int *r = encoder->supported_samplerates; *r != 0; ++r) if (*r > best) best = *r; return best; } } // namespace engine