| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | /** * 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 <fstream>#include <cstring>#ifdef _WIN32#include <winsock2.h>#else#include <arpa/inet.h>#endifusing 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<rtc::NalUnitHeader *>(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<std::byte> H264FileParser::initialNALUS() {    vector<std::byte> 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;}
 |