#ifndef MEDIA_MUXERS_MP4_BOX_WRITER_H_
#define MEDIA_MUXERS_MP4_BOX_WRITER_H_
#include <memory>
#include <optional>
#include <vector>
#include "base/memory/raw_ptr_exclusion.h"
#include "base/memory/raw_ref.h"
#include "base/sequence_checker.h"
#include "media/base/media_export.h"
#include "media/formats/mp4/fourccs.h"
namespace media {
class BoxByteStream;
class Mp4MuxerContext;
#define DECLARE_MP4_BOX_WRITER_CLASS_NO_DATA(class_name) \
class MEDIA_EXPORT class_name : public Mp4BoxWriter { \
public: \
explicit class_name(const Mp4MuxerContext& context); \
~class_name() override; \
class_name(const class_name&) = delete; \
class_name& operator=(const class_name&) = delete; \
void Write(BoxByteStream& writer) override; \
\
private: \
SEQUENCE_CHECKER(sequence_checker_); \
}
#define DECLARE_MP4_BOX_WRITER_CLASS(class_name, box_type) \
class MEDIA_EXPORT class_name : public Mp4BoxWriter { \
public: \
class_name(const Mp4MuxerContext& context, const box_type& box); \
~class_name() override; \
class_name(const class_name&) = delete; \
class_name& operator=(const class_name&) = delete; \
void Write(BoxByteStream& writer) override; \
\
private: \
const raw_ref<const box_type> box_; \
SEQUENCE_CHECKER(sequence_checker_); \
}
class MEDIA_EXPORT Mp4BoxWriter {
public:
explicit Mp4BoxWriter(const Mp4MuxerContext& context);
virtual ~Mp4BoxWriter();
Mp4BoxWriter(const Mp4BoxWriter&) = delete;
Mp4BoxWriter& operator=(const Mp4BoxWriter&) = delete;
virtual void Write(BoxByteStream& writer) = 0;
size_t WriteAndFlush();
size_t WriteAndFlush(BoxByteStream& writer);
protected:
void WriteChildren(BoxByteStream& writer);
void AddChildBox(std::unique_ptr<Mp4BoxWriter> box_writer);
const Mp4MuxerContext& context() const { return *context_; }
private:
const raw_ref<const Mp4MuxerContext, DanglingUntriaged> context_;
std::vector<std::unique_ptr<Mp4BoxWriter>> child_boxes_;
SEQUENCE_CHECKER(sequence_checker_);
};
}
#endif