Preserving sound is added
Working on less mem allocs if possible 🥺
This commit is contained in:
@@ -218,9 +218,7 @@ void Video::continueVideo() {
|
|||||||
// ======================== HELPERS ========================
|
// ======================== HELPERS ========================
|
||||||
std::pair<double, Containers::Array<char>> Video::loadNextFrame() {
|
std::pair<double, Containers::Array<char>> Video::loadNextFrame() {
|
||||||
av_frame_unref(convertedFrame);
|
av_frame_unref(convertedFrame);
|
||||||
av_frame_unref(convertedAudioFrame);
|
|
||||||
av_frame_unref(frame);
|
av_frame_unref(frame);
|
||||||
av_frame_unref(audioFrame);
|
|
||||||
|
|
||||||
// A hard stop if we are out of frames to read
|
// A hard stop if we are out of frames to read
|
||||||
while (av_read_frame(ctx, packet) >= 0) {
|
while (av_read_frame(ctx, packet) >= 0) {
|
||||||
@@ -230,6 +228,10 @@ std::pair<double, Containers::Array<char>> Video::loadNextFrame() {
|
|||||||
avcodec_receive_frame(aCodecCtx, audioFrame);
|
avcodec_receive_frame(aCodecCtx, audioFrame);
|
||||||
|
|
||||||
if (audioFrame->format != -1 && audioEngine) {
|
if (audioFrame->format != -1 && audioEngine) {
|
||||||
|
// Putting a pin on here, shouldn't we be able to rewrite on top of the
|
||||||
|
// same buffer?
|
||||||
|
//
|
||||||
|
// At least with image frames the size is always constant
|
||||||
convertedAudioFrame->format = sampleFormat;
|
convertedAudioFrame->format = sampleFormat;
|
||||||
convertedAudioFrame->sample_rate = audioEngine->GetSampleRate();
|
convertedAudioFrame->sample_rate = audioEngine->GetSampleRate();
|
||||||
convertedAudioFrame->ch_layout = outLayout;
|
convertedAudioFrame->ch_layout = outLayout;
|
||||||
@@ -241,6 +243,10 @@ std::pair<double, Containers::Array<char>> Video::loadNextFrame() {
|
|||||||
|
|
||||||
Sound->WriteToRingBuffer(convertedAudioFrame->data[0],
|
Sound->WriteToRingBuffer(convertedAudioFrame->data[0],
|
||||||
convertedAudioFrame->linesize[0]);
|
convertedAudioFrame->linesize[0]);
|
||||||
|
|
||||||
|
// Just due to a small memory leak this needs to be here
|
||||||
|
av_frame_unref(convertedAudioFrame);
|
||||||
|
av_frame_unref(audioFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,6 +267,9 @@ std::pair<double, Containers::Array<char>> Video::loadNextFrame() {
|
|||||||
av_packet_unref(packet);
|
av_packet_unref(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Definetly need to calculate this once and then make a list of
|
||||||
|
// preallocated frames in the framebuffer that we can constantly
|
||||||
|
// cycle
|
||||||
size_t dataSize = av_image_get_buffer_size(
|
size_t dataSize = av_image_get_buffer_size(
|
||||||
static_cast<AVPixelFormat>(convertedFrame->format), Dimensions.x(),
|
static_cast<AVPixelFormat>(convertedFrame->format), Dimensions.x(),
|
||||||
Dimensions.y(), 3);
|
Dimensions.y(), 3);
|
||||||
@@ -389,7 +398,15 @@ void Video::dumpAndRefillBuffer() {
|
|||||||
|
|
||||||
void Video::reinitSound() {
|
void Video::reinitSound() {
|
||||||
if (audioStreamNum != -1) {
|
if (audioStreamNum != -1) {
|
||||||
delete Sound.release();
|
// TO DO: we need a way to easily pass sound configs between two instances
|
||||||
|
auto oldSound = Sound.release();
|
||||||
|
oldSound->Pause();
|
||||||
Sound = std::move(audioEngine->CreateSound(10));
|
Sound = std::move(audioEngine->CreateSound(10));
|
||||||
|
|
||||||
|
// This is very much temparory
|
||||||
|
Sound->SetVolume(oldSound->GetVolume());
|
||||||
|
Sound->SetPosition(oldSound->GetPosition());
|
||||||
|
|
||||||
|
delete oldSound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user