ESQueue.h revision bc7aae4ff7e72e5bf0fa888f946835840a4357bb
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() const; 69 70 void setCasInfo(int32_t systemId, const std::vector<uint8_t> &sessionId); 71 72private: 73 struct RangeInfo { 74 int64_t mTimestampUs; 75 size_t mLength; 76 int32_t mPesOffset; 77 uint32_t mPesScramblingControl; 78 }; 79 80 struct ScrambledRangeInfo { 81 //int64_t mTimestampUs; 82 size_t mLength; 83 int32_t mKeyId; 84 int32_t mIsSync; 85 sp<ABuffer> mClearSizes; 86 sp<ABuffer> mEncSizes; 87 }; 88 89 Mode mMode; 90 uint32_t mFlags; 91 bool mEOSReached; 92 93 sp<ABuffer> mBuffer; 94 List<RangeInfo> mRangeInfos; 95 96 sp<ABuffer> mScrambledBuffer; 97 List<ScrambledRangeInfo> mScrambledRangeInfos; 98 int32_t mCASystemId; 99 std::vector<uint8_t> mCasSessionId; 100 101 sp<MetaData> mFormat; 102 103 sp<ABuffer> dequeueAccessUnitH264(); 104 sp<ABuffer> dequeueAccessUnitAAC(); 105 sp<ABuffer> dequeueAccessUnitAC3(); 106 sp<ABuffer> dequeueAccessUnitMPEGAudio(); 107 sp<ABuffer> dequeueAccessUnitMPEGVideo(); 108 sp<ABuffer> dequeueAccessUnitMPEG4Video(); 109 sp<ABuffer> dequeueAccessUnitPCMAudio(); 110 sp<ABuffer> dequeueAccessUnitMetadata(); 111 112 // consume a logical (compressed) access unit of size "size", 113 // returns its timestamp in us (or -1 if no time information). 114 int64_t fetchTimestamp(size_t size, 115 int32_t *pesOffset = NULL, 116 int32_t *pesScramblingControl = NULL); 117 118 sp<ABuffer> dequeueScrambledAccessUnit(); 119 120 DISALLOW_EVIL_CONSTRUCTORS(ElementaryStreamQueue); 121}; 122 123} // namespace android 124 125#endif // ES_QUEUE_H_ 126