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>
2295d7e994c73c17b27c7134ba3cc3acbb5889aa87Mathias Agopian#include <utils/Errors.h>
236a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include <utils/List.h>
246a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#include <utils/RefBase.h>
256a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
266a63a939601645404fd98f58c19cc38ca818d99eAndreas Hubernamespace android {
276a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
286a63a939601645404fd98f58c19cc38ca818d99eAndreas Huberstruct ABuffer;
2986a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass MetaData;
306a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
316a63a939601645404fd98f58c19cc38ca818d99eAndreas Huberstruct ElementaryStreamQueue {
326a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    enum Mode {
336a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber        H264,
34386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        AAC,
35d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu        AC3,
36386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        MPEG_AUDIO,
37386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        MPEG_VIDEO,
38386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber        MPEG4_VIDEO,
3990a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber        PCM_AUDIO,
400852843d304006e3ab333081fddda13b07193de8Robert Shih        METADATA,
416a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    };
42f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber
43f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber    enum Flags {
44f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber        // Data appended to the queue is always at access unit boundaries.
45f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber        kFlag_AlignedData = 1,
46f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber    };
47f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber    ElementaryStreamQueue(Mode mode, uint32_t flags = 0);
486a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
496a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    status_t appendData(const void *data, size_t size, int64_t timeUs);
50be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    void signalEOS();
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void clear(bool clearFormat);
526a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
536a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> dequeueAccessUnit();
546a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
556a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<MetaData> getFormat();
566a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
576a63a939601645404fd98f58c19cc38ca818d99eAndreas Huberprivate:
58a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    struct RangeInfo {
59a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber        int64_t mTimestampUs;
60a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber        size_t mLength;
61a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    };
62a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber
636a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    Mode mMode;
64f56afa4878694803a44d1b0e9a54762d1d5ab652Andreas Huber    uint32_t mFlags;
65be9634d071e79b72a42a4504f64eda9e2a0bceb8Marco Nelissen    bool mEOSReached;
666a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
676a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> mBuffer;
68a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    List<RangeInfo> mRangeInfos;
696a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
706a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<MetaData> mFormat;
716a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
726a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> dequeueAccessUnitH264();
736a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    sp<ABuffer> dequeueAccessUnitAAC();
74d3c079ae9859011d118f94616d0069c2987013edChangwan Ryu    sp<ABuffer> dequeueAccessUnitAC3();
75386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    sp<ABuffer> dequeueAccessUnitMPEGAudio();
76386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    sp<ABuffer> dequeueAccessUnitMPEGVideo();
77386d609dc513e838c7e7c4c46c604493ccd560beAndreas Huber    sp<ABuffer> dequeueAccessUnitMPEG4Video();
7890a92053219ae50ddf4bb54e3d54db2d309e2b8dAndreas Huber    sp<ABuffer> dequeueAccessUnitPCMAudio();
790852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<ABuffer> dequeueAccessUnitMetadata();
806a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
81a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    // consume a logical (compressed) access unit of size "size",
82a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    // returns its timestamp in us (or -1 if no time information).
83a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber    int64_t fetchTimestamp(size_t size);
84a093f92042cf65060d1474c0fe116c12f8981717Andreas Huber
856a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(ElementaryStreamQueue);
866a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber};
876a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
886a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber}  // namespace android
896a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber
906a63a939601645404fd98f58c19cc38ca818d99eAndreas Huber#endif  // ES_QUEUE_H_
91