#ifndef MEDIA_MUXERS_MUXER_H_
#define MEDIA_MUXERS_MUXER_H_
#include <optional>
#include <string>
#include <string_view>
#include <variant>
#include "base/time/time.h"
#include "media/base/audio_encoder.h"
#include "media/base/decoder_buffer.h"
#include "media/base/media_export.h"
#include "media/base/video_codecs.h"
#include "media/base/video_encoder.h"
#include "media/base/video_frame.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h"
namespace media {
class AudioParameters;
class MEDIA_EXPORT Muxer {
public:
static constexpr base::TimeDelta kMinimumForcedOutputDuration =
base::Milliseconds(100);
using WriteDataCB = base::RepeatingCallback<void(base::span<const uint8_t>)>;
struct MEDIA_EXPORT VideoParameters {
explicit VideoParameters(const VideoFrame& frame);
VideoParameters(gfx::Size visible_rect_size,
double frame_rate,
VideoCodec codec,
std::optional<gfx::ColorSpace> color_space,
std::optional<VideoTransformation> transformation);
VideoParameters(const VideoParameters&);
~VideoParameters();
std::string AsHumanReadableString() const;
gfx::Size visible_rect_size;
double frame_rate;
VideoCodec codec;
std::optional<gfx::ColorSpace> color_space;
std::optional<VideoTransformation> transformation;
};
struct MEDIA_EXPORT EncodedFrame {
EncodedFrame();
EncodedFrame(
std::variant<AudioParameters, VideoParameters> params,
std::optional<media::AudioEncoder::CodecDescription> codec_description,
scoped_refptr<DecoderBuffer> data);
EncodedFrame(EncodedFrame&&);
EncodedFrame(const EncodedFrame&) = delete;
EncodedFrame& operator=(const EncodedFrame&) = delete;
~EncodedFrame();
std::variant<AudioParameters, VideoParameters> params;
std::optional<media::AudioEncoder::CodecDescription> codec_description;
scoped_refptr<DecoderBuffer> data;
};
virtual ~Muxer() = default;
virtual bool Flush() = 0;
virtual bool PutFrame(EncodedFrame frame,
base::TimeDelta relative_timestamp) = 0;
virtual void OnVideoEnded() {}
};
static_assert(std::is_same<media::AudioEncoder::CodecDescription,
media::VideoEncoder::CodecDescription>::value,
"media::AudioEncoder::CodecDescription and "
"media::VideoEncoder::CodecDescription must currently be the "
"same type. Adjust Muxer::EncodedFrame to allow it.");
}
#endif