M3UParser.h revision 404fced9bfa8fa423ee210a271ca051ffd1bec13
16f56ab789cb470620554d624c37f488285b3b04eDan Albert/*
26f56ab789cb470620554d624c37f488285b3b04eDan Albert * Copyright (C) 2010 The Android Open Source Project
36f56ab789cb470620554d624c37f488285b3b04eDan Albert *
46f56ab789cb470620554d624c37f488285b3b04eDan Albert * Licensed under the Apache License, Version 2.0 (the "License");
56f56ab789cb470620554d624c37f488285b3b04eDan Albert * you may not use this file except in compliance with the License.
66f56ab789cb470620554d624c37f488285b3b04eDan Albert * You may obtain a copy of the License at
76f56ab789cb470620554d624c37f488285b3b04eDan Albert *
86f56ab789cb470620554d624c37f488285b3b04eDan Albert *      http://www.apache.org/licenses/LICENSE-2.0
96f56ab789cb470620554d624c37f488285b3b04eDan Albert *
106f56ab789cb470620554d624c37f488285b3b04eDan Albert * Unless required by applicable law or agreed to in writing, software
116f56ab789cb470620554d624c37f488285b3b04eDan Albert * distributed under the License is distributed on an "AS IS" BASIS,
126f56ab789cb470620554d624c37f488285b3b04eDan Albert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f56ab789cb470620554d624c37f488285b3b04eDan Albert * See the License for the specific language governing permissions and
146f56ab789cb470620554d624c37f488285b3b04eDan Albert * limitations under the License.
156f56ab789cb470620554d624c37f488285b3b04eDan Albert */
166f56ab789cb470620554d624c37f488285b3b04eDan Albert
176f56ab789cb470620554d624c37f488285b3b04eDan Albert#ifndef M3U_PARSER_H_
186f56ab789cb470620554d624c37f488285b3b04eDan Albert
196f56ab789cb470620554d624c37f488285b3b04eDan Albert#define M3U_PARSER_H_
206f56ab789cb470620554d624c37f488285b3b04eDan Albert
216f56ab789cb470620554d624c37f488285b3b04eDan Albert#include <media/stagefright/foundation/ABase.h>
226f56ab789cb470620554d624c37f488285b3b04eDan Albert#include <media/stagefright/foundation/AMessage.h>
236f56ab789cb470620554d624c37f488285b3b04eDan Albert#include <media/stagefright/foundation/AString.h>
246f56ab789cb470620554d624c37f488285b3b04eDan Albert#include <utils/Vector.h>
256f56ab789cb470620554d624c37f488285b3b04eDan Albert
266f56ab789cb470620554d624c37f488285b3b04eDan Albertnamespace android {
276f56ab789cb470620554d624c37f488285b3b04eDan Albert
286f56ab789cb470620554d624c37f488285b3b04eDan Albertstruct M3UParser : public RefBase {
296f56ab789cb470620554d624c37f488285b3b04eDan Albert    M3UParser(const char *baseURI, const void *data, size_t size);
306f56ab789cb470620554d624c37f488285b3b04eDan Albert
316f56ab789cb470620554d624c37f488285b3b04eDan Albert    status_t initCheck() const;
326f56ab789cb470620554d624c37f488285b3b04eDan Albert
336f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool isExtM3U() const;
346f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool isVariantPlaylist() const;
356f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool isComplete() const;
366f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool isEvent() const;
376f56ab789cb470620554d624c37f488285b3b04eDan Albert
386f56ab789cb470620554d624c37f488285b3b04eDan Albert    sp<AMessage> meta();
396f56ab789cb470620554d624c37f488285b3b04eDan Albert
406f56ab789cb470620554d624c37f488285b3b04eDan Albert    size_t size();
416f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool itemAt(size_t index, AString *uri, sp<AMessage> *meta = NULL);
426f56ab789cb470620554d624c37f488285b3b04eDan Albert
436f56ab789cb470620554d624c37f488285b3b04eDan Albert    void pickRandomMediaItems();
446f56ab789cb470620554d624c37f488285b3b04eDan Albert    status_t selectTrack(size_t index, bool select);
456f56ab789cb470620554d624c37f488285b3b04eDan Albert    size_t getTrackCount() const;
466f56ab789cb470620554d624c37f488285b3b04eDan Albert    sp<AMessage> getTrackInfo(size_t index) const;
476f56ab789cb470620554d624c37f488285b3b04eDan Albert    ssize_t getSelectedIndex() const;
486f56ab789cb470620554d624c37f488285b3b04eDan Albert
496f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool getTypeURI(size_t index, const char *key, AString *uri) const;
506f56ab789cb470620554d624c37f488285b3b04eDan Albert
516f56ab789cb470620554d624c37f488285b3b04eDan Albertprotected:
526f56ab789cb470620554d624c37f488285b3b04eDan Albert    virtual ~M3UParser();
536f56ab789cb470620554d624c37f488285b3b04eDan Albert
546f56ab789cb470620554d624c37f488285b3b04eDan Albertprivate:
556f56ab789cb470620554d624c37f488285b3b04eDan Albert    struct MediaGroup;
566f56ab789cb470620554d624c37f488285b3b04eDan Albert
576f56ab789cb470620554d624c37f488285b3b04eDan Albert    struct Item {
586f56ab789cb470620554d624c37f488285b3b04eDan Albert        AString mURI;
596f56ab789cb470620554d624c37f488285b3b04eDan Albert        sp<AMessage> mMeta;
606f56ab789cb470620554d624c37f488285b3b04eDan Albert    };
616f56ab789cb470620554d624c37f488285b3b04eDan Albert
626f56ab789cb470620554d624c37f488285b3b04eDan Albert    status_t mInitCheck;
636f56ab789cb470620554d624c37f488285b3b04eDan Albert
646f56ab789cb470620554d624c37f488285b3b04eDan Albert    AString mBaseURI;
656f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool mIsExtM3U;
666f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool mIsVariantPlaylist;
676f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool mIsComplete;
686f56ab789cb470620554d624c37f488285b3b04eDan Albert    bool mIsEvent;
696f56ab789cb470620554d624c37f488285b3b04eDan Albert
706f56ab789cb470620554d624c37f488285b3b04eDan Albert    sp<AMessage> mMeta;
716f56ab789cb470620554d624c37f488285b3b04eDan Albert    Vector<Item> mItems;
726f56ab789cb470620554d624c37f488285b3b04eDan Albert    ssize_t mSelectedIndex;
736f56ab789cb470620554d624c37f488285b3b04eDan Albert
746f56ab789cb470620554d624c37f488285b3b04eDan Albert    // Media groups keyed by group ID.
756f56ab789cb470620554d624c37f488285b3b04eDan Albert    KeyedVector<AString, sp<MediaGroup> > mMediaGroups;
766f56ab789cb470620554d624c37f488285b3b04eDan Albert
776f56ab789cb470620554d624c37f488285b3b04eDan Albert    status_t parse(const void *data, size_t size);
786f56ab789cb470620554d624c37f488285b3b04eDan Albert
796f56ab789cb470620554d624c37f488285b3b04eDan Albert    static status_t parseMetaData(
806f56ab789cb470620554d624c37f488285b3b04eDan Albert            const AString &line, sp<AMessage> *meta, const char *key);
816f56ab789cb470620554d624c37f488285b3b04eDan Albert
826f56ab789cb470620554d624c37f488285b3b04eDan Albert    static status_t parseMetaDataDuration(
836f56ab789cb470620554d624c37f488285b3b04eDan Albert            const AString &line, sp<AMessage> *meta, const char *key);
846f56ab789cb470620554d624c37f488285b3b04eDan Albert
856f56ab789cb470620554d624c37f488285b3b04eDan Albert    status_t parseStreamInf(
866f56ab789cb470620554d624c37f488285b3b04eDan Albert            const AString &line, sp<AMessage> *meta) const;
876f56ab789cb470620554d624c37f488285b3b04eDan Albert
886f56ab789cb470620554d624c37f488285b3b04eDan Albert    static status_t parseCipherInfo(
896f56ab789cb470620554d624c37f488285b3b04eDan Albert            const AString &line, sp<AMessage> *meta, const AString &baseURI);
906f56ab789cb470620554d624c37f488285b3b04eDan Albert
916f56ab789cb470620554d624c37f488285b3b04eDan Albert    static status_t parseByteRange(
926f56ab789cb470620554d624c37f488285b3b04eDan Albert            const AString &line, uint64_t curOffset,
936f56ab789cb470620554d624c37f488285b3b04eDan Albert            uint64_t *length, uint64_t *offset);
946f56ab789cb470620554d624c37f488285b3b04eDan Albert
956f56ab789cb470620554d624c37f488285b3b04eDan Albert    status_t parseMedia(const AString &line);
966f56ab789cb470620554d624c37f488285b3b04eDan Albert
976f56ab789cb470620554d624c37f488285b3b04eDan Albert    static status_t ParseInt32(const char *s, int32_t *x);
986f56ab789cb470620554d624c37f488285b3b04eDan Albert    static status_t ParseDouble(const char *s, double *x);
996f56ab789cb470620554d624c37f488285b3b04eDan Albert
1006f56ab789cb470620554d624c37f488285b3b04eDan Albert    static bool isQuotedString(const AString &str);
1016f56ab789cb470620554d624c37f488285b3b04eDan Albert    static AString unquoteString(const AString &str);
1026f56ab789cb470620554d624c37f488285b3b04eDan Albert    static bool codecIsType(const AString &codec, const char *type);
1036f56ab789cb470620554d624c37f488285b3b04eDan Albert
1046f56ab789cb470620554d624c37f488285b3b04eDan Albert    DISALLOW_EVIL_CONSTRUCTORS(M3UParser);
1056f56ab789cb470620554d624c37f488285b3b04eDan Albert};
1066f56ab789cb470620554d624c37f488285b3b04eDan Albert
1076f56ab789cb470620554d624c37f488285b3b04eDan Albert}  // namespace android
1086f56ab789cb470620554d624c37f488285b3b04eDan Albert
1096f56ab789cb470620554d624c37f488285b3b04eDan Albert#endif  // M3U_PARSER_H_
1106f56ab789cb470620554d624c37f488285b3b04eDan Albert