| Index: services/media/framework/models/lpcm_frames.h
|
| diff --git a/services/media/framework/models/lpcm_frames.h b/services/media/framework/models/lpcm_frames.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a905c63b8818d295787eae15cac5800a38b0db21
|
| --- /dev/null
|
| +++ b/services/media/framework/models/lpcm_frames.h
|
| @@ -0,0 +1,91 @@
|
| +// Copyright 2016 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 MOJO_MEDIA_MODELS_LPCM_FRAMES_H_
|
| +#define MOJO_MEDIA_MODELS_LPCM_FRAMES_H_
|
| +
|
| +#include <cstdint>
|
| +
|
| +#include "base/logging.h"
|
| +#include "services/media/framework/packet.h"
|
| +
|
| +namespace mojo {
|
| +namespace media {
|
| +
|
| +// References an LPCM frame buffer and implements advancement through it.
|
| +class LpcmFrames {
|
| + public:
|
| + LpcmFrames() :
|
| + bytes_per_frame_(0),
|
| + remaining_buffer_(nullptr),
|
| + remaining_frame_count_(0) {}
|
| +
|
| + void set_bytes_per_frame(uint32_t bytes_per_frame) {
|
| + bytes_per_frame_ = bytes_per_frame;
|
| + }
|
| +
|
| + uint32_t bytes_per_frame() {
|
| + return bytes_per_frame_;
|
| + }
|
| +
|
| + // The remaining frame buffer.
|
| + void* buffer() {
|
| + return remaining_buffer_;
|
| + }
|
| +
|
| + // The remaining number of frames accommodated by the frame buffer.
|
| + uint64_t frame_count() {
|
| + return remaining_frame_count_;
|
| + }
|
| +
|
| + // Resets the buffer and frame.
|
| + void reset() {
|
| + remaining_buffer_ = nullptr;
|
| + remaining_frame_count_ = 0;
|
| + reset_when_exhausted_ = nullptr;
|
| + }
|
| +
|
| + // Sets the buffer and frame count.
|
| + void set(void* buffer, uint64_t frame_count) {
|
| + remaining_buffer_ = buffer;
|
| + remaining_frame_count_ = frame_count;
|
| + reset_when_exhausted_ = nullptr;
|
| + }
|
| +
|
| + void set(PacketPtr* packet) {
|
| + DCHECK(packet);
|
| + DCHECK(*packet);
|
| + remaining_buffer_ = (*packet)->payload();
|
| + remaining_frame_count_ = (*packet)->duration();
|
| + if (remaining_frame_count_ == 0) {
|
| + packet->reset();
|
| + reset_when_exhausted_ = nullptr;
|
| + } else {
|
| + reset_when_exhausted_ = packet;
|
| + }
|
| + }
|
| +
|
| + // Updates buffer and frame_count to reflect use of the buffer.
|
| + void advance(uint64_t frame_count) {
|
| + DCHECK(remaining_buffer_);
|
| + DCHECK(frame_count <= remaining_frame_count_);
|
| + remaining_buffer_ = reinterpret_cast<uint8_t*>(remaining_buffer_) +
|
| + (frame_count * bytes_per_frame_);
|
| + remaining_frame_count_ -= frame_count;
|
| + if (remaining_frame_count_ == 0 && reset_when_exhausted_ != nullptr) {
|
| + (*reset_when_exhausted_).reset();
|
| + }
|
| + }
|
| +
|
| + private:
|
| + uint32_t bytes_per_frame_;
|
| + void* remaining_buffer_;
|
| + uint64_t remaining_frame_count_;
|
| + PacketPtr* reset_when_exhausted_;
|
| +};
|
| +
|
| +} // namespace media
|
| +} // namespace mojo
|
| +
|
| +#endif // MOJO_MEDIA_MODELS_LPCM_FRAMES_H_
|
|
|