diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/media/AudioTrack.h | 2 | ||||
-rw-r--r-- | include/media/IOMX.h | 7 | ||||
-rw-r--r-- | include/media/SingleStateQueue.h | 97 | ||||
-rw-r--r-- | include/media/stagefright/ACodec.h | 9 | ||||
-rw-r--r-- | include/media/stagefright/BufferProducerWrapper.h | 46 | ||||
-rw-r--r-- | include/media/stagefright/MediaCodec.h | 8 | ||||
-rw-r--r-- | include/private/media/StaticAudioTrackState.h | 35 |
7 files changed, 203 insertions, 1 deletions
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 9d07ed5..db5a7ab 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -226,7 +226,7 @@ public: * This includes the latency due to AudioTrack buffer size, AudioMixer (if any) * and audio hardware driver. */ - uint32_t latency() const { return mLatency; } + uint32_t latency() const { return mLatency; } /* getters, see constructors and set() */ diff --git a/include/media/IOMX.h b/include/media/IOMX.h index be1b2fc..0b1d1e4 100644 --- a/include/media/IOMX.h +++ b/include/media/IOMX.h @@ -19,6 +19,7 @@ #define ANDROID_IOMX_H_ #include <binder/IInterface.h> +#include <gui/IGraphicBufferProducer.h> #include <ui/GraphicBuffer.h> #include <utils/List.h> #include <utils/String8.h> @@ -96,6 +97,12 @@ public: node_id node, OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0; + virtual status_t createInputSurface( + node_id node, OMX_U32 port_index, + sp<IGraphicBufferProducer> *bufferProducer) = 0; + + virtual status_t signalEndOfInputStream(node_id node) = 0; + // This API clearly only makes sense if the caller lives in the // same process as the callee, i.e. is the media_server, as the // returned "buffer_data" pointer is just that, a pointer into local diff --git a/include/media/SingleStateQueue.h b/include/media/SingleStateQueue.h new file mode 100644 index 0000000..04c5fd0 --- /dev/null +++ b/include/media/SingleStateQueue.h @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2012 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 SINGLE_STATE_QUEUE_H +#define SINGLE_STATE_QUEUE_H + +// Non-blocking single element state queue, or +// Non-blocking single-reader / single-writer multi-word atomic load / store + +#include <stdint.h> + +namespace android { + +template<typename T> class SingleStateQueue { + +public: + + class Mutator; + class Observer; + + struct Shared { + // needs to be part of a union so don't define constructor or destructor + + friend class Mutator; + friend class Observer; + +private: + void init() { mAck = 0; mSequence = 0; } + + volatile int32_t mAck; +#if 0 + int mPad[7]; + // cache line boundary +#endif + volatile int32_t mSequence; + T mValue; + }; + + class Mutator { + public: + Mutator(Shared *shared); + /*virtual*/ ~Mutator() { } + + // push new value onto state queue, overwriting previous value; + // returns a sequence number which can be used with ack() + int32_t push(const T& value); + + // return true if most recent push has been observed + bool ack(); + + // return true if a push with specified sequence number or later has been observed + bool ack(int32_t sequence); + + private: + int32_t mSequence; + Shared * const mShared; + }; + + class Observer { + public: + Observer(Shared *shared); + /*virtual*/ ~Observer() { } + + // return true if value has changed + bool poll(T& value); + + private: + int32_t mSequence; + int mSeed; // for PRNG + Shared * const mShared; + }; + +#if 0 + SingleStateQueue(void /*Shared*/ *shared); + /*virtual*/ ~SingleStateQueue() { } + + static size_t size() { return sizeof(Shared); } +#endif + +}; + +} // namespace android + +#endif // SINGLE_STATE_QUEUE_H diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index 317b6f0..96baf34 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -43,6 +43,8 @@ struct ACodec : public AHierarchicalStateMachine { kWhatError = 'erro', kWhatComponentAllocated = 'cAll', kWhatComponentConfigured = 'cCon', + kWhatInputSurfaceCreated = 'isfc', + kWhatSignaledInputEOS = 'seos', kWhatBuffersAllocated = 'allc', }; @@ -55,9 +57,11 @@ struct ACodec : public AHierarchicalStateMachine { void initiateShutdown(bool keepComponentAllocated = false); void signalSetParameters(const sp<AMessage> &msg); + void signalEndOfInputStream(); void initiateAllocateComponent(const sp<AMessage> &msg); void initiateConfigureComponent(const sp<AMessage> &msg); + void initiateCreateInputSurface(); void initiateStart(); void signalRequestIDRFrame(); @@ -105,6 +109,8 @@ private: kWhatDrainDeferredMessages = 'drai', kWhatAllocateComponent = 'allo', kWhatConfigureComponent = 'conf', + kWhatCreateInputSurface = 'cisf', + kWhatSignalEndOfInputStream = 'eois', kWhatStart = 'star', kWhatRequestIDRFrame = 'ridr', kWhatSetParameters = 'setP', @@ -275,6 +281,9 @@ private: status_t requestIDRFrame(); status_t setParameters(const sp<AMessage> ¶ms); + // Send EOS on input stream. + void onSignalEndOfInputStream(); + DISALLOW_EVIL_CONSTRUCTORS(ACodec); }; diff --git a/include/media/stagefright/BufferProducerWrapper.h b/include/media/stagefright/BufferProducerWrapper.h new file mode 100644 index 0000000..d8acf30 --- /dev/null +++ b/include/media/stagefright/BufferProducerWrapper.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2013 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 BUFFER_PRODUCER_WRAPPER_H_ + +#define BUFFER_PRODUCER_WRAPPER_H_ + +#include <gui/IGraphicBufferProducer.h> + +namespace android { + +// Can't use static_cast to cast a RefBase back to an IGraphicBufferProducer, +// because IGBP's parent (IInterface) uses virtual inheritance. This class +// wraps IGBP while we pass it through AMessage. + +struct BufferProducerWrapper : RefBase { + BufferProducerWrapper( + const sp<IGraphicBufferProducer>& bufferProducer) : + mBufferProducer(bufferProducer) { } + + sp<IGraphicBufferProducer> getBufferProducer() const { + return mBufferProducer; + } + +private: + const sp<IGraphicBufferProducer> mBufferProducer; + + DISALLOW_EVIL_CONSTRUCTORS(BufferProducerWrapper); +}; + +} // namespace android + +#endif // BUFFER_PRODUCER_WRAPPER_H_ diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h index 1002663..35f46dc 100644 --- a/include/media/stagefright/MediaCodec.h +++ b/include/media/stagefright/MediaCodec.h @@ -56,6 +56,8 @@ struct MediaCodec : public AHandler { const sp<ICrypto> &crypto, uint32_t flags); + status_t createInputSurface(sp<IGraphicBufferProducer>* bufferProducer); + status_t start(); // Returns to a state in which the component remains allocated but @@ -101,6 +103,8 @@ struct MediaCodec : public AHandler { status_t renderOutputBufferAndRelease(size_t index); status_t releaseOutputBuffer(size_t index); + status_t signalEndOfInputStream(); + status_t getOutputFormat(sp<AMessage> *format) const; status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const; @@ -143,6 +147,7 @@ private: enum { kWhatInit = 'init', kWhatConfigure = 'conf', + kWhatCreateInputSurface = 'cisf', kWhatStart = 'strt', kWhatStop = 'stop', kWhatRelease = 'rele', @@ -150,6 +155,7 @@ private: kWhatQueueInputBuffer = 'queI', kWhatDequeueOutputBuffer = 'deqO', kWhatReleaseOutputBuffer = 'relO', + kWhatSignalEndOfInputStream = 'eois', kWhatGetBuffers = 'getB', kWhatFlush = 'flus', kWhatGetOutputFormat = 'getO', @@ -206,6 +212,8 @@ private: sp<AMessage> mActivityNotify; + bool mHaveInputSurface; + MediaCodec(const sp<ALooper> &looper); static status_t PostAndAwaitResponse( diff --git a/include/private/media/StaticAudioTrackState.h b/include/private/media/StaticAudioTrackState.h new file mode 100644 index 0000000..46a5946 --- /dev/null +++ b/include/private/media/StaticAudioTrackState.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2012 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 STATIC_AUDIO_TRACK_STATE_H +#define STATIC_AUDIO_TRACK_STATE_H + +namespace android { + +// Represents a single state of an AudioTrack that was created in static mode (shared memory buffer +// supplied by the client). This state needs to be communicated from the client to server. As this +// state is too large to be updated atomically without a mutex, and mutexes aren't allowed here, the +// state is wrapped by a SingleStateQueue. +struct StaticAudioTrackState { + // do not define constructors, destructors, or virtual methods + size_t mLoopStart; + size_t mLoopEnd; + int mLoopCount; +}; + +} // namespace android + +#endif // STATIC_AUDIO_TRACK_STATE_H |