torchaudio/csrc/ffmpeg/streamer.h (63 lines of code) (raw):
#pragma once
#include <torchaudio/csrc/ffmpeg/decoder.h>
#include <torchaudio/csrc/ffmpeg/filter_graph.h>
#include <torchaudio/csrc/ffmpeg/stream_processor.h>
#include <torchaudio/csrc/ffmpeg/typedefs.h>
#include <vector>
namespace torchaudio {
namespace ffmpeg {
class Streamer {
AVFormatContextPtr pFormatContext;
AVPacketPtr pPacket;
std::vector<std::unique_ptr<StreamProcessor>> processors;
// Mapping from user-facing stream index to internal index.
// The first one is processor index,
// the second is the map key inside of processor.
std::vector<std::pair<int, int>> stream_indices;
public:
// Open the input and allocate the resource
Streamer(
const std::string& src,
const std::string& device,
const std::map<std::string, std::string>& option);
~Streamer() = default;
// Non-copyable
Streamer(const Streamer&) = delete;
Streamer& operator=(const Streamer&) = delete;
// Movable
Streamer(Streamer&&) = default;
Streamer& operator=(Streamer&&) = default;
//////////////////////////////////////////////////////////////////////////////
// Helper methods
//////////////////////////////////////////////////////////////////////////////
private:
void validate_open_stream() const;
void validate_src_stream_index(int i) const;
void validate_output_stream_index(int i) const;
void validate_src_stream_type(int i, AVMediaType type);
//////////////////////////////////////////////////////////////////////////////
// Query methods
//////////////////////////////////////////////////////////////////////////////
public:
// Find a suitable audio/video streams using heuristics from ffmpeg
int find_best_audio_stream() const;
int find_best_video_stream() const;
// Fetch information about source streams
int num_src_streams() const;
SrcStreamInfo get_src_stream_info(int i) const;
// Fetch information about output streams
int num_out_streams() const;
OutputStreamInfo get_out_stream_info(int i) const;
// Check if all the buffers of the output streams are ready.
bool is_buffer_ready() const;
//////////////////////////////////////////////////////////////////////////////
// Configure methods
//////////////////////////////////////////////////////////////////////////////
void seek(double timestamp);
void add_audio_stream(
int i,
int frames_per_chunk,
int num_chunks,
std::string filter_desc);
void add_video_stream(
int i,
int frames_per_chunk,
int num_chunks,
std::string filter_desc);
void remove_stream(int i);
private:
void add_stream(
int i,
AVMediaType media_type,
int frames_per_chunk,
int num_chunks,
std::string filter_desc);
public:
//////////////////////////////////////////////////////////////////////////////
// Stream methods
//////////////////////////////////////////////////////////////////////////////
int process_packet();
int process_packet_block(double timeout, double backoff);
int drain();
//////////////////////////////////////////////////////////////////////////////
// Retrieval
//////////////////////////////////////////////////////////////////////////////
std::vector<c10::optional<torch::Tensor>> pop_chunks();
};
} // namespace ffmpeg
} // namespace torchaudio