| // 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. |
| |
| #include "base/logging.h" |
| #include "services/media/framework/packet.h" |
| #include "services/media/framework/payload_allocator.h" |
| |
| namespace mojo { |
| namespace media { |
| |
| Packet::Packet(int64_t pts, bool end_of_stream, size_t size, void* payload) |
| : pts_(pts), end_of_stream_(end_of_stream), size_(size), payload_(payload) { |
| DCHECK((size == 0) == (payload == nullptr)); |
| } |
| |
| class PacketImpl : public Packet { |
| public: |
| PacketImpl(int64_t pts, |
| bool end_of_stream, |
| size_t size, |
| void* payload, |
| PayloadAllocator* allocator) |
| : Packet(pts, end_of_stream, size, payload), allocator_(allocator) {} |
| |
| protected: |
| ~PacketImpl() override{}; |
| |
| void Release() override { |
| // In the default implementation, payload() will be nullptr if and only if |
| // allocator_ is nullptr. Subclasses have the option of having a non-null |
| // payload() and handling deallocation themselves, so allocator_ can be |
| // nullptr even when payload() is not. |
| if (payload() != nullptr && allocator_ != nullptr) { |
| allocator_->ReleasePayloadBuffer(payload()); |
| } |
| delete this; |
| } |
| |
| private: |
| PayloadAllocator* allocator_; |
| }; |
| |
| // static |
| PacketPtr Packet::Create(int64_t pts, |
| bool end_of_stream, |
| size_t size, |
| void* payload, |
| PayloadAllocator* allocator) { |
| DCHECK(payload == nullptr || allocator != nullptr); |
| return PacketPtr( |
| new PacketImpl(pts, end_of_stream, size, payload, allocator)); |
| } |
| |
| // static |
| PacketPtr Packet::CreateNoAllocator(int64_t pts, |
| bool end_of_stream, |
| size_t size, |
| void* payload) { |
| return PacketPtr(new PacketImpl(pts, end_of_stream, size, payload, nullptr)); |
| } |
| |
| // static |
| PacketPtr Packet::CreateEndOfStream(int64_t pts) { |
| return PacketPtr(new PacketImpl(pts, |
| true, // end_of_stream |
| 0, // size |
| nullptr, // payload |
| nullptr)); // allocator |
| } |
| |
| } // namespace media |
| } // namespace mojo |