/* * Copyright (c) 2020 Amlogic, Inc. All rights reserved. * * This source code is subject to the terms and conditions defined in the * file 'LICENSE' which is part of this source code package. * * Description: */ #include #include namespace aml_mp { struct AmlMpBuffer; struct ElementaryStreamQueue : public AmlMpRefBase { enum Mode { INVALID = 0, H264, H265, AAC, AC3, EAC3, AC4, MPEG_AUDIO, MPEG_VIDEO, MPEG4_VIDEO, PCM_AUDIO, METADATA, }; explicit ElementaryStreamQueue(Mode mode); int appendData(const void* data, size_t size, int64_t pts, int32_t payloadOffset); void clear(); sptr dequeueAccessUnit(); private: struct RangeInfo { int64_t mPts; size_t mLength; int32_t mPesOffset; }; Mode mMode; sptr mBuffer; std::list mRangeInfos; sptr mFormat; int mAUIndex = 0; sptr dequeueAccessUnitH264(); sptr dequeueAccessUnitH265(); sptr dequeueAccessUnitAAC(); sptr dequeueAccessUnitEAC3(); sptr dequeueAccessUnitAC4(); sptr dequeueAccessUnitMPEGAudio(); sptr dequeueAccessUnitMPEGVideo(); sptr dequeueAccessUnitMPEG4Video(); sptr dequeueAccessUnitPCMAudio(); sptr dequeueAccessUnitMetadata(); int64_t fetchTimestamp(size_t size, int32_t *pesOffset = NULL); size_t makePESHeader(uint8_t* data, size_t size, size_t frameLength, int64_t pts); private: ElementaryStreamQueue(const ElementaryStreamQueue&) = delete; ElementaryStreamQueue& operator=(const ElementaryStreamQueue&) = delete; }; }