Skip to content

Commit fa23302

Browse files
committed
可能な限り音声形式に単精度小数を選択するように。
downmix時に、音量が下がってしまう問題を解消する。
1 parent d1e19ad commit fa23302

File tree

2 files changed

+23
-26
lines changed

2 files changed

+23
-26
lines changed

VCECore/rgy_output_avcodec.cpp

+22-25
Original file line numberDiff line numberDiff line change
@@ -417,10 +417,30 @@ int RGYOutputAvcodec::AutoSelectSamplingRate(const int *samplingRateList, int sr
417417
}
418418

419419
AVSampleFormat RGYOutputAvcodec::AutoSelectSampleFmt(const AVSampleFormat *samplefmtList, const AVCodecContext *srcAudioCtx) {
420-
AVSampleFormat srcFormat = srcAudioCtx->sample_fmt;
420+
const AVSampleFormat srcFormat = srcAudioCtx->sample_fmt;
421421
if (samplefmtList == nullptr) {
422422
return srcFormat;
423423
}
424+
425+
static const auto sampleFmtLevel = make_array<AVSampleFormat>(
426+
AV_SAMPLE_FMT_DBLP,
427+
AV_SAMPLE_FMT_DBL,
428+
AV_SAMPLE_FMT_FLTP,
429+
AV_SAMPLE_FMT_FLT,
430+
AV_SAMPLE_FMT_S32P,
431+
AV_SAMPLE_FMT_S32,
432+
AV_SAMPLE_FMT_S16P,
433+
AV_SAMPLE_FMT_S16,
434+
AV_SAMPLE_FMT_U8P,
435+
AV_SAMPLE_FMT_U8
436+
);
437+
for (const auto fmt : sampleFmtLevel) {
438+
for (int i = 0; samplefmtList[i] >= 0; i++) {
439+
if (fmt == samplefmtList[i]) {
440+
return fmt;
441+
}
442+
}
443+
}
424444
if (srcFormat == AV_SAMPLE_FMT_NONE) {
425445
return samplefmtList[0];
426446
}
@@ -429,29 +449,6 @@ AVSampleFormat RGYOutputAvcodec::AutoSelectSampleFmt(const AVSampleFormat *sampl
429449
return samplefmtList[i];
430450
}
431451
}
432-
static const auto sampleFmtLevel = make_array<std::pair<AVSampleFormat, int>>(
433-
std::make_pair(AV_SAMPLE_FMT_DBLP, 8),
434-
std::make_pair(AV_SAMPLE_FMT_DBL, 8),
435-
std::make_pair(AV_SAMPLE_FMT_FLTP, 6),
436-
std::make_pair(AV_SAMPLE_FMT_FLT, 6),
437-
std::make_pair(AV_SAMPLE_FMT_S32P, 4),
438-
std::make_pair(AV_SAMPLE_FMT_S32, 4),
439-
std::make_pair(AV_SAMPLE_FMT_S16P, 2),
440-
std::make_pair(AV_SAMPLE_FMT_S16, 2),
441-
std::make_pair(AV_SAMPLE_FMT_U8P, 1),
442-
std::make_pair(AV_SAMPLE_FMT_U8, 1)
443-
);
444-
int srcFormatLevel = std::find_if(sampleFmtLevel.begin(), sampleFmtLevel.end(),
445-
[srcFormat](const std::pair<AVSampleFormat, int>& targetFormat) { return targetFormat.first == srcFormat;})->second;
446-
auto foundFormat = std::find_if(sampleFmtLevel.begin(), sampleFmtLevel.end(),
447-
[srcFormatLevel](const std::pair<AVSampleFormat, int>& targetFormat) { return targetFormat.second == srcFormatLevel; });
448-
for (; foundFormat != sampleFmtLevel.end(); foundFormat++) {
449-
for (int i = 0; samplefmtList[i] >= 0; i++) {
450-
if (foundFormat->first == samplefmtList[i]) {
451-
return samplefmtList[i];
452-
}
453-
}
454-
}
455452
return samplefmtList[0];
456453
}
457454

@@ -1321,7 +1318,7 @@ RGY_ERR RGYOutputAvcodec::InitAudio(AVMuxAudio *muxAudio, AVOutputStreamPrm *inp
13211318
// そのときにはとりあえずAV_SAMPLE_FMT_S16で適当にフィルタを初期化しておく
13221319
// 実際のsample_fmtはAVFrameに設定されており、フィルタ実行前の再度のInitAudioFilterで
13231320
// 必要に応じて再初期化されるので、ここでは仮の値でも問題はない
1324-
av_get_sample_fmt_name(muxAudio->outCodecDecodeCtx->sample_fmt) ? muxAudio->outCodecDecodeCtx->sample_fmt : AV_SAMPLE_FMT_S16);
1321+
av_get_sample_fmt_name(muxAudio->outCodecDecodeCtx->sample_fmt) ? muxAudio->outCodecDecodeCtx->sample_fmt : AV_SAMPLE_FMT_FLTP);
13251322
if (sts != RGY_ERR_NONE) return sts;
13261323
} else if (muxAudio->bsfc == nullptr && muxAudio->streamIn->codecpar->codec_id == AV_CODEC_ID_AAC && muxAudio->streamIn->codecpar->extradata == NULL && m_Mux.video.streamOut) {
13271324
muxAudio->bsfc = InitStreamBsf(_T("aac_adtstoasc"), muxAudio->streamIn);

VCEEnc/VCEEnc_readme.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ Radeon RX460
167167
- --pa �ɐV���ȃI�v�V������lj��B
168168
taq, paq, ltr, lookahead, motion-quality
169169
- H.264�G���R�[�h�� --vbrhq, --cbrhq ��lj��B
170-
170+
- downmix���ɉ��ʂ��������Ȃ��Ă��܂��̂�����B
171171

172172
2022.08.04 (7.02)
173173
[VCEEnc.auo]

0 commit comments

Comments
 (0)