16a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber/*
26a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * Copyright (C) 2010 The Android Open Source Project
36a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber *
46a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
56a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * you may not use this file except in compliance with the License.
66a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * You may obtain a copy of the License at
76a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber *
86a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
96a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber *
106a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * Unless required by applicable law or agreed to in writing, software
116a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
126a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * See the License for the specific language governing permissions and
146a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber * limitations under the License.
156a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber */
166a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
176a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#ifndef ES_QUEUE_H_
186a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
196a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#define ES_QUEUE_H_
206a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
216a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include <media/stagefright/foundation/ABase.h>
223a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania#include <media/stagefright/foundation/AMessage.h>
2395d7e994c73c17b27c7134ba3cc3acbb5889aa87Mathias Agopian#include <utils/Errors.h>
246a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include <utils/List.h>
256a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include <utils/RefBase.h>
263b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang#include <vector>
276a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
283a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania#include "HlsSampleDecryptor.h"
293a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
306a63a939601645404fd98f58c19cc38ca818d99eAndreas Hubernamespace android {
316a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
326a63a939601645404fd98f58c19cc38ca818d99eAndreas Huberstruct ABuffer;
3386a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass MetaData;
346a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
356a63a939601645404fd98f58c19cc38ca818d99eAndreas Huberstruct ElementaryStreamQueue {
366a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    enum Mode {
373b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        INVALID = 0,
386a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        H264,
39386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        AAC,
40d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        AC3,
41386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        MPEG_AUDIO,
42386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        MPEG_VIDEO,
43386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        MPEG4_VIDEO,
4490a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber        PCM_AUDIO,
450852843d304006e3ab333081fddda13b07193de8Robert Shih        METADATA,
466a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    };
47f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber
48f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber    enum Flags {
49f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber        // Data appended to the queue is always at access unit boundaries.
50f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber        kFlag_AlignedData = 1,
513b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        kFlag_ScrambledData = 2,
523a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        kFlag_SampleEncryptedData = 4,
53f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber    };
5440d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh    explicit ElementaryStreamQueue(Mode mode, uint32_t flags = 0);
556a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
563b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    status_t appendData(const void *data, size_t size,
573b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            int64_t timeUs, int32_t payloadOffset = 0,
583b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            uint32_t pesScramblingControl = 0);
593b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
603b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    void appendScrambledData(
613b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            const void *data, size_t size,
623b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            int32_t keyId, bool isSync,
633b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            sp<ABuffer> clearSizes, sp<ABuffer> encSizes);
643b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
65be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    void signalEOS();
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void clear(bool clearFormat);
676a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
686a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> dequeueAccessUnit();
696a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
706a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<MetaData> getFormat();
716a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
72bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang    bool isScrambled() const;
733b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
74bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang    void setCasInfo(int32_t systemId, const std::vector<uint8_t> &sessionId);
753b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
763a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    void signalNewSampleAesKey(const sp<AMessage> &keyItem);
773a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
786a63a939601645404fd98f58c19cc38ca818d99eAndreas Huberprivate:
79a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    struct RangeInfo {
80a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber        int64_t mTimestampUs;
81a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber        size_t mLength;
823b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t mPesOffset;
833b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        uint32_t mPesScramblingControl;
843b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    };
853b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
863b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    struct ScrambledRangeInfo {
873b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        //int64_t mTimestampUs;
883b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        size_t mLength;
893b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t mKeyId;
903b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        int32_t mIsSync;
913b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> mClearSizes;
923b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang        sp<ABuffer> mEncSizes;
93a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    };
94a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber
956a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    Mode mMode;
96f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber    uint32_t mFlags;
97be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    bool mEOSReached;
986a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
996a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> mBuffer;
100a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    List<RangeInfo> mRangeInfos;
1016a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1023b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> mScrambledBuffer;
1033b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    List<ScrambledRangeInfo> mScrambledRangeInfos;
104bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang    int32_t mCASystemId;
1053b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    std::vector<uint8_t> mCasSessionId;
1063b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1076a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<MetaData> mFormat;
1086a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1093a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    sp<HlsSampleDecryptor> mSampleDecryptor;
1103a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    int mAUIndex;
1113a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
1123a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    bool isSampleEncrypted() const {
1133a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania        return (mFlags & kFlag_SampleEncryptedData) != 0;
1143a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania    }
1153a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania
1166a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> dequeueAccessUnitH264();
1176a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> dequeueAccessUnitAAC();
118d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu    sp<ABuffer> dequeueAccessUnitAC3();
119386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    sp<ABuffer> dequeueAccessUnitMPEGAudio();
120386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    sp<ABuffer> dequeueAccessUnitMPEGVideo();
121386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    sp<ABuffer> dequeueAccessUnitMPEG4Video();
12290a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    sp<ABuffer> dequeueAccessUnitPCMAudio();
1230852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<ABuffer> dequeueAccessUnitMetadata();
1246a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
125a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    // consume a logical (compressed) access unit of size "size",
126a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    // returns its timestamp in us (or -1 if no time information).
1273b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    int64_t fetchTimestamp(size_t size,
1283b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            int32_t *pesOffset = NULL,
1293b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang            int32_t *pesScramblingControl = NULL);
1303b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang
1313b2847fa5506dc265d2e46f067bfbb66ae209f74Chong Zhang    sp<ABuffer> dequeueScrambledAccessUnit();
132a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber
1336a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ElementaryStreamQueue);
1346a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber};
1356a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1366a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber}  // namespace android
1376a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
1386a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#endif  // ES_QUEUE_H_
139