blob: b1f39847108cf96fc50aff120a59581a43908248 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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/macros.h"
#include "base/memory/ref_counted.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;
// StreamParser implementation.
void Init(InitCB init_cb,
const NewConfigCB& config_cb,
const NewBuffersCB& new_buffers_cb,
bool ignore_text_tracks /* must be true */,
const EncryptedMediaInitDataCB& encrypted_media_init_data_cb,
const NewMediaSegmentCB& new_segment_cb,
const EndMediaSegmentCB& end_of_segment_cb,
MediaLog* media_log) override;
void Flush() override;
bool GetGenerateTimestampsFlag() const override;
bool Parse(const uint8_t* buf, int size) override;
// Processes and emits buffers from |buffer_queue|. If state is
// kWaitingForConfigEmission, first emit the config.
bool ProcessChunks(std::unique_ptr<BufferQueue> buffer_queue) override;
private:
enum State {
kWaitingForInit,
kWaitingForConfigEmission,
kWaitingForEncodedChunks,
kError
};
void ChangeState(State new_state);
State state_;
// These configs are populated during ctor. A copy of the appropriate config
// is emitted on demand when "parsing" newly appended encoded chunks if that
// append occurs when state is kWaitingForConfigEmission. Note, only one type
// of config can be emitted (not both), for an instance of this parser.
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_;
MediaLog* media_log_;
};
} // namespace media
#endif // MEDIA_FORMATS_WEBCODECS_WEBCODECS_ENCODED_CHUNK_STREAM_PARSER_H_