ESQueue.h revision 3b2847fa5506dc265d2e46f067bfbb66ae209f74
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ES_QUEUE_H_ 18 19#define ES_QUEUE_H_ 20 21#include <media/stagefright/foundation/ABase.h> 22#include <utils/Errors.h> 23#include <utils/List.h> 24#include <utils/RefBase.h> 25#include <vector> 26 27namespace android { 28 29struct ABuffer; 30class MetaData; 31 32struct ElementaryStreamQueue { 33 enum Mode { 34 INVALID = 0, 35 H264, 36 AAC, 37 AC3, 38 MPEG_AUDIO, 39 MPEG_VIDEO, 40 MPEG4_VIDEO, 41 PCM_AUDIO, 42 METADATA, 43 }; 44 45 enum Flags { 46 // Data appended to the queue is always at access unit boundaries. 47 kFlag_AlignedData = 1, 48 kFlag_ScrambledData = 2, 49 }; 50 explicit ElementaryStreamQueue(Mode mode, uint32_t flags = 0); 51 52 status_t appendData(const void *data, size_t size, 53 int64_t timeUs, int32_t payloadOffset = 0, 54 uint32_t pesScramblingControl = 0); 55 56 void appendScrambledData( 57 const void *data, size_t size, 58 int32_t keyId, bool isSync, 59 sp<ABuffer> clearSizes, sp<ABuffer> encSizes); 60 61 void signalEOS(); 62 void clear(bool clearFormat); 63 64 sp<ABuffer> dequeueAccessUnit(); 65 66 sp<MetaData> getFormat(); 67 68 bool isScrambled() { 69 return (mFlags & kFlag_ScrambledData) != 0; 70 } 71 72 void setCasSession(const std::vector<uint8_t> &sessionId) { 73 mCasSessionId = sessionId; 74 } 75 76private: 77 struct RangeInfo { 78 int64_t mTimestampUs; 79 size_t mLength; 80 int32_t mPesOffset; 81 uint32_t mPesScramblingControl; 82 }; 83 84 struct ScrambledRangeInfo { 85 //int64_t mTimestampUs; 86 size_t mLength; 87 int32_t mKeyId; 88 int32_t mIsSync; 89 sp<ABuffer> mClearSizes; 90 sp<ABuffer> mEncSizes; 91 }; 92 93 Mode mMode; 94 uint32_t mFlags; 95 bool mEOSReached; 96 97 sp<ABuffer> mBuffer; 98 List<RangeInfo> mRangeInfos; 99 100 sp<ABuffer> mScrambledBuffer; 101 List<ScrambledRangeInfo> mScrambledRangeInfos; 102 std::vector<uint8_t> mCasSessionId; 103 104 sp<MetaData> mFormat; 105 106 sp<ABuffer> dequeueAccessUnitH264(); 107 sp<ABuffer> dequeueAccessUnitAAC(); 108 sp<ABuffer> dequeueAccessUnitAC3(); 109 sp<ABuffer> dequeueAccessUnitMPEGAudio(); 110 sp<ABuffer> dequeueAccessUnitMPEGVideo(); 111 sp<ABuffer> dequeueAccessUnitMPEG4Video(); 112 sp<ABuffer> dequeueAccessUnitPCMAudio(); 113 sp<ABuffer> dequeueAccessUnitMetadata(); 114 115 // consume a logical (compressed) access unit of size "size", 116 // returns its timestamp in us (or -1 if no time information). 117 int64_t fetchTimestamp(size_t size, 118 int32_t *pesOffset = NULL, 119 int32_t *pesScramblingControl = NULL); 120 121 sp<ABuffer> dequeueScrambledAccessUnit(); 122 123 DISALLOW_EVIL_CONSTRUCTORS(ElementaryStreamQueue); 124}; 125 126} // namespace android 127 128#endif // ES_QUEUE_H_ 129