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