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 20d91dc5a0602f54fc0d4d2187f37b5b8169bb62c3Dongwon Kang#include <media/MediaSource.h> 2100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <media/stagefright/foundation/AString.h> 2200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <media/stagefright/foundation/Mutexed.h> 2300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 2400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <utils/Condition.h> 2500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#include <utils/StrongPointer.h> 2600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 27defb1b0b7e082621a10763d1bd7a4a01e280fdf0Mathias Agopianstruct ANativeWindow; 28defb1b0b7e082621a10763d1bd7a4a01e280fdf0Mathias Agopian 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( 48ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang const sp<MediaSource> &source, uint32_t flags, 49defb1b0b7e082621a10763d1bd7a4a01e280fdf0Mathias Agopian const sp<ANativeWindow> &nativeWindow, 504f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim const char *desiredCodec = NULL, 514f87426e12f5f12e0724519e77f8237a6b2d5dacWonsik Kim bool skipMediaCodecList = false); 5200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 53defb1b0b7e082621a10763d1bd7a4a01e280fdf0Mathias Agopian static sp<SimpleDecodingSource> Create( 54ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang const sp<MediaSource> &source, uint32_t flags = 0); 55defb1b0b7e082621a10763d1bd7a4a01e280fdf0Mathias Agopian 5600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual ~SimpleDecodingSource(); 5700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 5800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // starts this source (and it's underlying source). |params| is ignored. 5900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t start(MetaData *params = NULL); 6000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 6100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // stops this source (and it's underlying source). 6200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t stop(); 6300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 6400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // returns the output format of this source. 6500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual sp<MetaData> getFormat(); 6600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 6700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // reads from the source. This call always blocks. 681889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang virtual status_t read(MediaBufferBase **buffer, const ReadOptions *options); 6900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 7000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // unsupported methods 7100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar virtual status_t pause() { return INVALID_OPERATION; } 7200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 7300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnarprivate: 7400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // Construct this using a codec, source and looper. 7500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar SimpleDecodingSource( 76ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang const sp<MediaCodec> &codec, const sp<MediaSource> &source, const sp<ALooper> &looper, 774278ba02628d915b52d59dcf5477880cf99f39cdMarco Nelissen bool usingSurface, bool isVorbis, const sp<AMessage> &format); 7800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 7900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar sp<MediaCodec> mCodec; 80ba8128f9db82da66f28c6e6740d4721d80da954eDongwon Kang sp<MediaSource> mSource; 8100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar sp<ALooper> mLooper; 8200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mUsingSurface; 834278ba02628d915b52d59dcf5477880cf99f39cdMarco Nelissen bool mIsVorbis; 8400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar enum State { 8500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar INIT, 8600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar STARTED, 8700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar STOPPING, 8800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar STOPPED, 8900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar ERROR, 9000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar }; 9100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar AString mComponentName; 9200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 9300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar struct ProtectedState { 9400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar ProtectedState(const sp<AMessage> &format); 9500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mReading; 9600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar Condition mReadCondition; 9700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 9800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar sp<AMessage> mFormat; 9900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar State mState; 10000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mQueuedInputEOS; 10100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar bool mGotOutputEOS; 10200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar }; 10300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar Mutexed<ProtectedState> mProtectedState; 10400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 10500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar // do the actual reading 10600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar status_t doRead( 1071889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang Mutexed<ProtectedState>::Locked &me, MediaBufferBase **buffer, 1081889c3edad32995c0cf26ae2248fe7c957b7ec84Dongwon Kang const ReadOptions *options); 10900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar}; 11000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 11100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar} // namespace android 11200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar 11300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#endif 114