100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar/* 200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * Copyright 2016, The Android Open Source Project 300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * 400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * you may not use this file except in compliance with the License. 600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * You may obtain a copy of the License at 700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * 800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * 1000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * Unless required by applicable law or agreed to in writing, software 1100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 1200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * See the License for the specific language governing permissions and 1400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar * limitations under the License. 1500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar */ 1600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 1700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#ifndef SIMPLE_DECODING_SOURCE_H_ 1800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#define SIMPLE_DECODING_SOURCE_H_ 1900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 2000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <system/window.h> 2100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 2200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <media/stagefright/MediaSource.h> 2300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <media/stagefright/foundation/AString.h> 2400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <media/stagefright/foundation/Mutexed.h> 2500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 2600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <utils/Condition.h> 2700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <utils/StrongPointer.h> 2800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 2900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarnamespace android { 3000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 3100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarstruct ALooper; 3200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarstruct AMessage; 3300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarclass MediaBuffer; 3400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarstruct MediaCodec; 3500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarclass MetaData; 3600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 3700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarclass SimpleDecodingSource : public MediaSource { 3800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarpublic: 3900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // Creates a MediaSource that uses MediaCodec to decode a compressed input |source|. 4000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // The selected codec can be influenced using |flags|. This source only supports the 4100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // kPreferGoogleCodec and kNonGoogleCodecsOnly |flags| - MediaCodecList. 4200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // You can pass in a target |nativeWindow| to render video directly onto a surface. In this 4300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // case the source will return empty buffers. 4400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // This source cannot be restarted (hence the name "Simple"), all reads are blocking, and 4500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // does not support secure input or pausing. 46963f181c57a26dd23bd9dff263614bbb38960888Lajos Molnar // if |desiredCodec| is given, use this specific codec. 4700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar static sp<SimpleDecodingSource> Create( 4800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar const sp<IMediaSource> &source, uint32_t flags = 0, 49963f181c57a26dd23bd9dff263614bbb38960888Lajos Molnar const sp<ANativeWindow> &nativeWindow = NULL, 50963f181c57a26dd23bd9dff263614bbb38960888Lajos Molnar const char *desiredCodec = NULL); 5100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 5200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual ~SimpleDecodingSource(); 5300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 5400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // starts this source (and it's underlying source). |params| is ignored. 5500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t start(MetaData *params = NULL); 5600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 5700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // stops this source (and it's underlying source). 5800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t stop(); 5900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 6000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // returns the output format of this source. 6100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual sp<MetaData> getFormat(); 6200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 6300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // reads from the source. This call always blocks. 6400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t read(MediaBuffer **buffer, const ReadOptions *options); 6500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 6600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // unsupported methods 6700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t pause() { return INVALID_OPERATION; } 6800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t setBuffers(const Vector<MediaBuffer *> &) { return INVALID_OPERATION; } 6900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 7000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarprivate: 7100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // Construct this using a codec, source and looper. 7200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar SimpleDecodingSource( 7300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar const sp<MediaCodec> &codec, const sp<IMediaSource> &source, const sp<ALooper> &looper, 7400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool usingSurface, const sp<AMessage> &format); 7500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 7600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar sp<MediaCodec> mCodec; 7700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar sp<IMediaSource> mSource; 7800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar sp<ALooper> mLooper; 7900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mUsingSurface; 8000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar enum State { 8100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar INIT, 8200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar STARTED, 8300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar STOPPING, 8400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar STOPPED, 8500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar ERROR, 8600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar }; 8700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar AString mComponentName; 8800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 8900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar struct ProtectedState { 9000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar ProtectedState(const sp<AMessage> &format); 9100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mReading; 9200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar Condition mReadCondition; 9300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 9400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar sp<AMessage> mFormat; 9500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar State mState; 9600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mQueuedInputEOS; 9700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mGotOutputEOS; 9800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar }; 9900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar Mutexed<ProtectedState> mProtectedState; 10000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 10100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // do the actual reading 10200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar status_t doRead( 10300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar Mutexed<ProtectedState>::Locked &me, MediaBuffer **buffer, const ReadOptions *options); 10400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar}; 10500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 10600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar} // namespace android 10700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 10800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#endif 109