/** * libdatachannel streamer example * Copyright (c) 2020 Filip Klembara (in2core) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "h264fileparser.hpp" #include "rtc/rtc.hpp" #include #include #ifdef _WIN32 #include #else #include #endif using namespace std; H264FileParser::H264FileParser(string directory, uint32_t fps, bool loop): FileParser(directory, ".h264", fps, loop) { } void H264FileParser::loadNextSample() { FileParser::loadNextSample(); size_t i = 0; while (i < sample.size()) { assert(i + 4 < sample.size()); auto lengthPtr = (uint32_t *) (sample.data() + i); uint32_t length; std::memcpy(&length, lengthPtr, sizeof(uint32_t)); length = ntohl(length); auto naluStartIndex = i + 4; auto naluEndIndex = naluStartIndex + length; assert(naluEndIndex <= sample.size()); auto header = reinterpret_cast(sample.data() + naluStartIndex); auto type = header->unitType(); switch (type) { case 7: previousUnitType7 = {sample.begin() + i, sample.begin() + naluEndIndex}; break; case 8: previousUnitType8 = {sample.begin() + i, sample.begin() + naluEndIndex};; break; case 5: previousUnitType5 = {sample.begin() + i, sample.begin() + naluEndIndex};; break; } i = naluEndIndex; } } vector H264FileParser::initialNALUS() { vector units{}; if (previousUnitType7.has_value()) { auto nalu = previousUnitType7.value(); units.insert(units.end(), nalu.begin(), nalu.end()); } if (previousUnitType8.has_value()) { auto nalu = previousUnitType8.value(); units.insert(units.end(), nalu.begin(), nalu.end()); } if (previousUnitType5.has_value()) { auto nalu = previousUnitType5.value(); units.insert(units.end(), nalu.begin(), nalu.end()); } return units; }