2024-09-11 12:43:56 +02:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2024, Jelle Raaijmakers <jelle@ladybird.org>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "Loader.h"
|
2024-09-30 14:33:08 +02:00
|
|
|
#include <AK/Error.h>
|
|
|
|
|
#include <AK/NonnullOwnPtr.h>
|
2025-03-06 14:30:41 +00:00
|
|
|
#include <LibMedia/FFmpeg/FFmpegIOContext.h>
|
2024-09-11 12:43:56 +02:00
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
#include <libavcodec/avcodec.h>
|
|
|
|
|
#include <libavformat/avformat.h>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace Audio {
|
|
|
|
|
|
2024-09-30 14:33:08 +02:00
|
|
|
class FFmpegLoaderPlugin : public LoaderPlugin {
|
|
|
|
|
public:
|
2025-03-06 14:30:41 +00:00
|
|
|
explicit FFmpegLoaderPlugin(NonnullOwnPtr<SeekableStream>, NonnullOwnPtr<Media::FFmpeg::FFmpegIOContext>);
|
2024-09-30 14:33:08 +02:00
|
|
|
virtual ~FFmpegLoaderPlugin();
|
2024-09-11 12:43:56 +02:00
|
|
|
|
|
|
|
|
static bool sniff(SeekableStream& stream);
|
2024-11-21 20:06:00 +01:00
|
|
|
static ErrorOr<NonnullOwnPtr<LoaderPlugin>> create(NonnullOwnPtr<SeekableStream>);
|
2024-09-11 12:43:56 +02:00
|
|
|
|
2024-11-21 20:06:00 +01:00
|
|
|
virtual ErrorOr<Vector<FixedArray<Sample>>> load_chunks(size_t samples_to_read_from_input) override;
|
2024-09-11 12:43:56 +02:00
|
|
|
|
2024-11-21 20:06:00 +01:00
|
|
|
virtual ErrorOr<void> reset() override;
|
|
|
|
|
virtual ErrorOr<void> seek(int sample_index) override;
|
2024-09-11 12:43:56 +02:00
|
|
|
|
|
|
|
|
virtual int loaded_samples() override { return m_loaded_samples; }
|
|
|
|
|
virtual int total_samples() override { return m_total_samples; }
|
|
|
|
|
virtual u32 sample_rate() override;
|
|
|
|
|
virtual u16 num_channels() override;
|
|
|
|
|
virtual PcmSampleFormat pcm_format() override;
|
2024-09-30 14:33:08 +02:00
|
|
|
virtual ByteString format_name() override;
|
2024-09-11 12:43:56 +02:00
|
|
|
|
|
|
|
|
private:
|
2024-11-21 20:06:00 +01:00
|
|
|
ErrorOr<void> initialize();
|
2024-09-11 12:43:56 +02:00
|
|
|
double time_base() const;
|
|
|
|
|
|
2024-09-30 14:33:08 +02:00
|
|
|
AVStream* m_audio_stream;
|
2024-09-11 12:43:56 +02:00
|
|
|
AVCodecContext* m_codec_context { nullptr };
|
|
|
|
|
AVFormatContext* m_format_context { nullptr };
|
2024-09-30 14:33:08 +02:00
|
|
|
AVFrame* m_frame { nullptr };
|
2025-03-06 14:30:41 +00:00
|
|
|
NonnullOwnPtr<Media::FFmpeg::FFmpegIOContext> m_io_context;
|
2024-09-11 12:43:56 +02:00
|
|
|
int m_loaded_samples { 0 };
|
2024-09-30 14:33:08 +02:00
|
|
|
AVPacket* m_packet { nullptr };
|
2024-09-11 12:43:56 +02:00
|
|
|
int m_total_samples { 0 };
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|