blob: e2cbfc8d6a46ad7993cf5496c24a490e1a761a03 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MEDIA_BUFFER_BASE_H_
#define MEDIA_BUFFER_BASE_H_
#include <media/MediaExtractorPluginApi.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/NdkMediaFormatPriv.h>
namespace android {
class MediaBufferBase;
class MetaDataBase;
class MediaBufferObserver {
public:
MediaBufferObserver() {}
virtual ~MediaBufferObserver() {}
virtual void signalBufferReturned(MediaBufferBase *buffer) = 0;
private:
MediaBufferObserver(const MediaBufferObserver &);
MediaBufferObserver &operator=(const MediaBufferObserver &);
};
class MediaBufferBase {
public:
static MediaBufferBase *Create(size_t size);
// If MediaBufferGroup is set, decrement the local reference count;
// if the local reference count drops to 0, return the buffer to the
// associated MediaBufferGroup.
//
// If no MediaBufferGroup is set, the local reference count must be zero
// when called, whereupon the MediaBuffer is deleted.
virtual void release() = 0;
// Increments the local reference count.
// Use only when MediaBufferGroup is set.
virtual void add_ref() = 0;
virtual void *data() const = 0;
virtual size_t size() const = 0;
virtual size_t range_offset() const = 0;
virtual size_t range_length() const = 0;
virtual void set_range(size_t offset, size_t length) = 0;
virtual MetaDataBase& meta_data() = 0;
// Clears meta data and resets the range to the full extent.
virtual void reset() = 0;
virtual void setObserver(MediaBufferObserver *group) = 0;
virtual int refcount() const = 0;
virtual int localRefcount() const = 0;
virtual int remoteRefcount() const = 0;
virtual ~MediaBufferBase() {
delete mWrapper;
delete mFormat;
};
CMediaBuffer *wrap() {
if (mWrapper) {
return mWrapper;
}
mWrapper = new CMediaBuffer;
mWrapper->handle = this;
mWrapper->release = [](void *handle) -> void {
((MediaBufferBase*)handle)->release();
};
mWrapper->data = [](void *handle) -> void * {
return ((MediaBufferBase*)handle)->data();
};
mWrapper->size = [](void *handle) -> size_t {
return ((MediaBufferBase*)handle)->size();
};
mWrapper->range_offset = [](void *handle) -> size_t {
return ((MediaBufferBase*)handle)->range_offset();
};
mWrapper->range_length = [](void *handle) -> size_t {
return ((MediaBufferBase*)handle)->range_length();
};
mWrapper->set_range = [](void *handle, size_t offset, size_t length) -> void {
return ((MediaBufferBase*)handle)->set_range(offset, length);
};
mWrapper->meta_data = [](void *handle) -> AMediaFormat* {
if (((MediaBufferBase*)handle)->mFormat == nullptr) {
sp<AMessage> msg = new AMessage();
((MediaBufferBase*)handle)->mFormat = AMediaFormat_fromMsg(&msg);
}
return ((MediaBufferBase*)handle)->mFormat;
};
return mWrapper;
}
protected:
MediaBufferBase() {
mWrapper = nullptr;
mFormat = nullptr;
}
private:
CMediaBuffer *mWrapper;
AMediaFormat *mFormat;
};
} // namespace android
#endif // MEDIA_BUFFER_BASE_H_