Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Unified Diff: services/media/framework_ffmpeg/ffmpeg_decoder_base.h

Issue 1923763002: Motown: Ffmpeg video decoder (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698