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,
744278ba02628d915b52d59dcf5477880cf99f39cdMarco Nelissen            bool usingSurface, bool isVorbis, 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;
804278ba02628d915b52d59dcf5477880cf99f39cdMarco Nelissen    bool mIsVorbis;
8100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    enum State {
8200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        INIT,
8300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        STARTED,
8400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        STOPPING,
8500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        STOPPED,
8600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        ERROR,
8700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    };
8800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    AString mComponentName;
8900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar
9000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    struct ProtectedState {
9100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        ProtectedState(const sp<AMessage> &format);
9200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        bool mReading;
9300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        Condition mReadCondition;
9400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar
9500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        sp<AMessage> mFormat;
9600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        State mState;
9700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        bool mQueuedInputEOS;
9800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar        bool mGotOutputEOS;
9900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    };
10000eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    Mutexed<ProtectedState> mProtectedState;
10100eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar
10200eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    // do the actual reading
10300eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar    status_t doRead(
10400eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar            Mutexed<ProtectedState>::Locked &me, MediaBuffer **buffer, const ReadOptions *options);
10500eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar};
10600eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar
10700eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar} // namespace android
10800eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar
10900eb2fdb2b8f108e74c32e03b2a0e5bab3f107b6Lajos Molnar#endif
110