| Index: services/media/framework_ffmpeg/ffmpeg_decoder_base.h
|
| diff --git a/services/media/framework_ffmpeg/ffmpeg_decoder_base.h b/services/media/framework_ffmpeg/ffmpeg_decoder_base.h
|
| index 3cb4afe3bec466bd301d3b6555443417e3014fde..63dd2ed3dd3f271e4975fcb7d34c42b337c65ede 100644
|
| --- a/services/media/framework_ffmpeg/ffmpeg_decoder_base.h
|
| +++ b/services/media/framework_ffmpeg/ffmpeg_decoder_base.h
|
| @@ -35,6 +35,55 @@ class FfmpegDecoderBase : public Decoder {
|
| PacketPtr* output) override;
|
|
|
| protected:
|
| + // Used to control deallocation of buffers.
|
| + class AvBufferContext {
|
| + public:
|
| + AvBufferContext(size_t size, PayloadAllocator* allocator)
|
| + : size_(size), allocator_(allocator) {
|
| + DCHECK(allocator_);
|
| + if (size_ == 0) {
|
| + buffer_ = nullptr;
|
| + } else {
|
| + buffer_ =
|
| + static_cast<uint8_t*>(allocator_->AllocatePayloadBuffer(size_));
|
| + }
|
| + }
|
| +
|
| + ~AvBufferContext() {
|
| + if (allocator_ == nullptr) {
|
| + // Previously released.
|
| + return;
|
| + }
|
| +
|
| + if (size_ != 0) {
|
| + DCHECK(buffer_ != nullptr);
|
| + allocator_->ReleasePayloadBuffer(size_, buffer_);
|
| + return;
|
| + }
|
| +
|
| + DCHECK(buffer_ == nullptr);
|
| + }
|
| +
|
| + uint8_t* buffer() { return buffer_; }
|
| +
|
| + size_t size() { return size_; }
|
| +
|
| + // Releases ownership of the buffer.
|
| + uint8_t* Release() {
|
| + DCHECK(allocator_) << "AvBufferContext released twice";
|
| + uint8_t* result = buffer_;
|
| + buffer_ = nullptr;
|
| + size_ = 0;
|
| + allocator_ = nullptr;
|
| + return result;
|
| + }
|
| +
|
| + private:
|
| + uint8_t* buffer_;
|
| + size_t size_;
|
| + PayloadAllocator* allocator_;
|
| + };
|
| +
|
| // Decodes from av_packet into av_frame_ptr. The result indicates how many
|
| // bytes were consumed from av_packet_. *frame_decoded_out indicates whether
|
| // av_frame_ptr contains a complete frame.
|
|
|