#ifndef MEDIA_FORMATS_WEBCODECS_WEBCODECS_ENCODED_CHUNK_STREAM_PARSER_H_
#define MEDIA_FORMATS_WEBCODECS_WEBCODECS_ENCODED_CHUNK_STREAM_PARSER_H_
#include <stdint.h>
#include <memory>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "media/base/audio_decoder_config.h"
#include "media/base/media_export.h"
#include "media/base/stream_parser.h"
#include "media/base/video_decoder_config.h"
namespace media {
class MEDIA_EXPORT WebCodecsEncodedChunkStreamParser : public StreamParser {
public:
explicit WebCodecsEncodedChunkStreamParser(
std::unique_ptr<AudioDecoderConfig> audio_config);
explicit WebCodecsEncodedChunkStreamParser(
std::unique_ptr<VideoDecoderConfig> video_config);
WebCodecsEncodedChunkStreamParser(const WebCodecsEncodedChunkStreamParser&) =
delete;
WebCodecsEncodedChunkStreamParser& operator=(
const WebCodecsEncodedChunkStreamParser&) = delete;
~WebCodecsEncodedChunkStreamParser() override;
void Init(InitCB init_cb,
NewConfigCB config_cb,
NewBuffersCB new_buffers_cb,
EncryptedMediaInitDataCB encrypted_media_init_data_cb,
NewMediaSegmentCB new_segment_cb,
EndMediaSegmentCB end_of_segment_cb,
MediaLog* media_log) override;
void Flush() override;
bool GetGenerateTimestampsFlag() const override;
[[nodiscard]] bool AppendToParseBuffer(
base::span<const uint8_t> buf) override;
[[nodiscard]] ParseStatus Parse(int max_pending_bytes_to_expect) override;
bool ProcessChunks(std::unique_ptr<BufferQueue> buffer_queue) override;
private:
enum State {
kWaitingForInit,
kWaitingForConfigEmission,
kWaitingForEncodedChunks,
kError
};
void ChangeState(State new_state);
State state_;
std::unique_ptr<AudioDecoderConfig> audio_config_;
std::unique_ptr<VideoDecoderConfig> video_config_;
InitCB init_cb_;
NewConfigCB config_cb_;
NewBuffersCB new_buffers_cb_;
NewMediaSegmentCB new_segment_cb_;
EndMediaSegmentCB end_of_segment_cb_;
raw_ptr<MediaLog> media_log_;
};
}
#endif