123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // Copyright (c) Kuba Szczodrzyński 2022-1-16.
- #pragma once
- #include "BaseContainer.h"
- enum class ElementId;
- class WebmContainer : public BaseContainer {
- public:
- ~WebmContainer();
- bool parse() override;
- int32_t getLoadingOffset(uint32_t timeMs) override;
- bool seekTo(uint32_t timeMs) override;
- int32_t getCurrentTimeMs() override;
- uint8_t *readSample(uint32_t &len) override;
- uint8_t *getSetupData(uint32_t &len, AudioCodec matchCodec) override;
- void feed(const std::shared_ptr<bell::ByteStream> &stream, uint32_t position) override;
- private:
- typedef struct {
- uint32_t time;
- uint32_t offset;
- } CuePoint;
- private:
- // used while parsing
- uint32_t esize;
- ElementId eid;
- // container parameters
- char *docType = nullptr;
- uint8_t audioTrackId = 255;
- float timescale = 0.0f;
- char *codecId = nullptr;
- uint8_t *codecPrivate = nullptr;
- uint32_t codecPrivateLen = 0;
- // container state
- CuePoint *cues = nullptr;
- uint16_t cuesLen = 0;
- uint32_t clusterEnd = 0;
- uint32_t clusterTime = 0;
- uint32_t currentTime = 0;
- bool isParsed = false;
- // buffer
- uint8_t *sampleData = nullptr;
- uint32_t sampleLen = 0;
- // lacing parameters
- uint32_t *laceSizes = nullptr;
- uint32_t *laceCurrent = nullptr;
- uint8_t laceLeft = 0;
- // set to read the current buffer instead of loading new frames
- uint16_t readOutFrameSize = 0;
- private:
- uint32_t readVarNum32(bool raw = false);
- uint64_t readVarNum64();
- uint32_t readUint(uint8_t len);
- uint64_t readUlong(uint8_t len);
- float readFloat(uint8_t len);
- void readElem();
- void parseSegment(uint32_t start);
- void parseTrack(uint32_t end);
- void parseCuePoint(uint16_t idx, uint32_t end, uint32_t segmentStart);
- /**
- * Continue reading elements until a block is encountered.
- *
- * If [untilTime] is set, the method will keep reading until [currentTime]
- * is less than [untilTime]. Because of how WebM works, [pos] will be one frame later
- * than the requested time, although the container will report the correct position.
- *
- * @return size of the frame pointed by [pos]
- */
- uint32_t readCluster(uint32_t untilTime = 0);
- /**
- * Parse a single block within a cluster. This method will populate lacing parameters if needed.
- * @param end offset of the next byte after this block
- * @return size of the frame pointed by [pos]
- */
- uint32_t readBlock(uint32_t end);
- uint8_t *readFrame(uint32_t size, uint32_t &outLen);
- };
|