mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-31 19:47:32 +09:00
dom/media: add S16 support code to audio decoders
This commit is contained in:
parent
edeec38e07
commit
28f55eb5c4
2 changed files with 49 additions and 0 deletions
|
|
@ -46,7 +46,11 @@ FFmpegAudioDecoder<LIBAV_VER>::InitCodecContext()
|
||||||
// FFmpeg takes this as a suggestion for what format to use for audio samples.
|
// FFmpeg takes this as a suggestion for what format to use for audio samples.
|
||||||
// LibAV 0.8 produces rubbish float interleaved samples, request 16 bits audio.
|
// LibAV 0.8 produces rubbish float interleaved samples, request 16 bits audio.
|
||||||
mCodecContext->request_sample_fmt =
|
mCodecContext->request_sample_fmt =
|
||||||
|
#ifdef MOZ_SAMPLE_TYPE_FLOAT32
|
||||||
(mLib->mVersion == 53) ? AV_SAMPLE_FMT_S16 : AV_SAMPLE_FMT_FLT;
|
(mLib->mVersion == 53) ? AV_SAMPLE_FMT_S16 : AV_SAMPLE_FMT_FLT;
|
||||||
|
#else
|
||||||
|
AV_SAMPLE_FMT_S16;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static AlignedAudioBuffer
|
static AlignedAudioBuffer
|
||||||
|
|
@ -60,11 +64,23 @@ CopyAndPackAudio(AVFrame* aFrame, uint32_t aNumChannels, uint32_t aNumAFrames)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aFrame->format == AV_SAMPLE_FMT_FLT) {
|
if (aFrame->format == AV_SAMPLE_FMT_FLT) {
|
||||||
|
#ifdef MOZ_SAMPLE_TYPE_FLOAT32
|
||||||
// Audio data already packed. No need to do anything other than copy it
|
// Audio data already packed. No need to do anything other than copy it
|
||||||
// into a buffer we own.
|
// into a buffer we own.
|
||||||
memcpy(audio.get(), aFrame->data[0],
|
memcpy(audio.get(), aFrame->data[0],
|
||||||
aNumChannels * aNumAFrames * sizeof(AudioDataValue));
|
aNumChannels * aNumAFrames * sizeof(AudioDataValue));
|
||||||
|
#else
|
||||||
|
// Audio data already packed. Need to convert from 32 bits Float to S16
|
||||||
|
AudioDataValue* tmp = audio.get();
|
||||||
|
float* data = reinterpret_cast<float**>(aFrame->data)[0];
|
||||||
|
for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
|
||||||
|
for (uint32_t channel = 0; channel < aNumChannels; channel++) {
|
||||||
|
*tmp++ = FloatToAudioSample<int16_t>(*data++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else if (aFrame->format == AV_SAMPLE_FMT_FLTP) {
|
} else if (aFrame->format == AV_SAMPLE_FMT_FLTP) {
|
||||||
|
#ifdef MOZ_SAMPLE_TYPE_FLOAT32
|
||||||
// Planar audio data. Pack it into something we can understand.
|
// Planar audio data. Pack it into something we can understand.
|
||||||
AudioDataValue* tmp = audio.get();
|
AudioDataValue* tmp = audio.get();
|
||||||
AudioDataValue** data = reinterpret_cast<AudioDataValue**>(aFrame->data);
|
AudioDataValue** data = reinterpret_cast<AudioDataValue**>(aFrame->data);
|
||||||
|
|
@ -73,7 +89,19 @@ CopyAndPackAudio(AVFrame* aFrame, uint32_t aNumChannels, uint32_t aNumAFrames)
|
||||||
*tmp++ = data[channel][frame];
|
*tmp++ = data[channel][frame];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
// Planar audio data. Convert it from 32 bits Float to S16
|
||||||
|
// and pack it into something we can understand.
|
||||||
|
AudioDataValue* tmp = audio.get();
|
||||||
|
float** data = reinterpret_cast<float**>(aFrame->data);
|
||||||
|
for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
|
||||||
|
for (uint32_t channel = 0; channel < aNumChannels; channel++) {
|
||||||
|
*tmp++ = FloatToAudioSample<int16_t>(data[channel][frame]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else if (aFrame->format == AV_SAMPLE_FMT_S16) {
|
} else if (aFrame->format == AV_SAMPLE_FMT_S16) {
|
||||||
|
#ifdef MOZ_SAMPLE_TYPE_FLOAT32
|
||||||
// Audio data already packed. Need to convert from S16 to 32 bits Float
|
// Audio data already packed. Need to convert from S16 to 32 bits Float
|
||||||
AudioDataValue* tmp = audio.get();
|
AudioDataValue* tmp = audio.get();
|
||||||
int16_t* data = reinterpret_cast<int16_t**>(aFrame->data)[0];
|
int16_t* data = reinterpret_cast<int16_t**>(aFrame->data)[0];
|
||||||
|
|
@ -82,7 +110,14 @@ CopyAndPackAudio(AVFrame* aFrame, uint32_t aNumChannels, uint32_t aNumAFrames)
|
||||||
*tmp++ = AudioSampleToFloat(*data++);
|
*tmp++ = AudioSampleToFloat(*data++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
// Audio data already packed. No need to do anything other than copy it
|
||||||
|
// into a buffer we own.
|
||||||
|
memcpy(audio.get(), aFrame->data[0],
|
||||||
|
aNumChannels * aNumAFrames * sizeof(AudioDataValue));
|
||||||
|
#endif
|
||||||
} else if (aFrame->format == AV_SAMPLE_FMT_S16P) {
|
} else if (aFrame->format == AV_SAMPLE_FMT_S16P) {
|
||||||
|
#ifdef MOZ_SAMPLE_TYPE_FLOAT32
|
||||||
// Planar audio data. Convert it from S16 to 32 bits float
|
// Planar audio data. Convert it from S16 to 32 bits float
|
||||||
// and pack it into something we can understand.
|
// and pack it into something we can understand.
|
||||||
AudioDataValue* tmp = audio.get();
|
AudioDataValue* tmp = audio.get();
|
||||||
|
|
@ -111,6 +146,16 @@ CopyAndPackAudio(AVFrame* aFrame, uint32_t aNumChannels, uint32_t aNumAFrames)
|
||||||
*tmp++ = AudioSampleToFloat(data[channel][frame]);
|
*tmp++ = AudioSampleToFloat(data[channel][frame]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
// Planar audio data. Pack it into something we can understand.
|
||||||
|
AudioDataValue* tmp = audio.get();
|
||||||
|
AudioDataValue** data = reinterpret_cast<AudioDataValue**>(aFrame->data);
|
||||||
|
for (uint32_t frame = 0; frame < aNumAFrames; frame++) {
|
||||||
|
for (uint32_t channel = 0; channel < aNumChannels; channel++) {
|
||||||
|
*tmp++ = data[channel][frame];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return audio;
|
return audio;
|
||||||
|
|
|
||||||
|
|
@ -312,7 +312,11 @@ WMFAudioMFTManager::Output(int64_t aStreamOffset,
|
||||||
|
|
||||||
int16_t* pcm = (int16_t*)data;
|
int16_t* pcm = (int16_t*)data;
|
||||||
for (int32_t i = 0; i < numSamples; ++i) {
|
for (int32_t i = 0; i < numSamples; ++i) {
|
||||||
|
#ifdef MOZ_SAMPLE_TYPE_FLOAT32
|
||||||
audioData[i] = AudioSampleToFloat(pcm[i]);
|
audioData[i] = AudioSampleToFloat(pcm[i]);
|
||||||
|
#else
|
||||||
|
audioData[i] = pcm[i];
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->Unlock();
|
buffer->Unlock();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue