#ifndef MEDIA_CAST_OPENSCREEN_DECODER_BUFFER_READER_H_
#define MEDIA_CAST_OPENSCREEN_DECODER_BUFFER_READER_H_
#include "base/containers/circular_deque.h"
#include "base/functional/callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "media/base/decoder_buffer.h"
#include "media/mojo/common/mojo_decoder_buffer_converter.h"
#include "mojo/public/cpp/system/data_pipe.h"
namespace media::cast {
class DecoderBufferReader {
public:
using NewBufferCb =
base::RepeatingCallback<void(scoped_refptr<media::DecoderBuffer>)>;
DecoderBufferReader(NewBufferCb new_buffer_cb,
mojo::ScopedDataPipeConsumerHandle data_pipe);
DecoderBufferReader(DecoderBufferReader&& other,
mojo::ScopedDataPipeConsumerHandle data_pipe);
~DecoderBufferReader();
void ProvideBuffer(media::mojom::DecoderBufferPtr buffer);
void ReadBufferAsync();
void ClearReadPending();
bool is_queue_empty() const { return pending_buffer_metadata_.empty(); }
bool is_read_pending() const { return is_read_pending_; }
private:
void TryGetNextBuffer();
void OnBufferReadFromDataPipe(scoped_refptr<media::DecoderBuffer> buffer);
void CompletePendingRead();
bool is_read_pending_ = false;
NewBufferCb new_buffer_cb_;
media::MojoDecoderBufferReader mojo_buffer_reader_;
base::circular_deque<media::mojom::DecoderBufferPtr> pending_buffer_metadata_;
scoped_refptr<media::DecoderBuffer> current_buffer_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<DecoderBufferReader> weak_factory_;
};
}
#endif