UNPKG

@remotion/media-parser

Version:

A pure JavaScript library for parsing video files

121 lines (120 loc) 4.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processFinalStreamBuffers = exports.processStreamBuffer = exports.makeTransportStreamPacketBuffer = void 0; const combine_uint8_arrays_1 = require("../../combine-uint8-arrays"); const find_separator_1 = require("./find-separator"); const get_tracks_1 = require("./get-tracks"); const handle_aac_packet_1 = require("./handle-aac-packet"); const handle_avc_packet_1 = require("./handle-avc-packet"); const traversal_1 = require("./traversal"); const makeTransportStreamPacketBuffer = ({ buffers, pesHeader, offset, }) => { let currentBuf = buffers ? [buffers] : []; let subarrayIndex = null; const getBuffer = () => { if (currentBuf.length === 0) { return new Uint8Array(); } if (currentBuf.length === 1) { return currentBuf[0]; } currentBuf = [(0, combine_uint8_arrays_1.combineUint8Arrays)(currentBuf)]; return currentBuf[0]; }; let fastFind = null; return { pesHeader, offset, getBuffer, addBuffer: (buffer) => { currentBuf.push(buffer); subarrayIndex = null; }, get2ndSubArrayIndex: () => { var _a, _b; if (subarrayIndex === null) { const result = (0, find_separator_1.findNthSubarrayIndex)({ array: getBuffer(), subarray: new Uint8Array([0, 0, 1, 9]), n: 2, startIndex: (_a = fastFind === null || fastFind === void 0 ? void 0 : fastFind.index) !== null && _a !== void 0 ? _a : 0, startCount: (_b = fastFind === null || fastFind === void 0 ? void 0 : fastFind.count) !== null && _b !== void 0 ? _b : 0, }); if (result.type === 'found') { subarrayIndex = result.index; fastFind = null; } else { fastFind = result; return -1; } } return subarrayIndex; }, }; }; exports.makeTransportStreamPacketBuffer = makeTransportStreamPacketBuffer; const processStreamBuffer = async ({ streamBuffer, programId, structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, avcState, }) => { const stream = (0, traversal_1.getStreamForId)(structure, programId); if (!stream) { throw new Error('No stream found'); } // 2 = ITU-T Rec. H.262 | ISO/IEC 13818-2 Video or ISO/IEC 11172-2 constrained parameter video stream if (stream.streamType === 2) { throw new Error('H.262 video stream not supported'); } // 27 = AVC / H.264 Video if (stream.streamType === 27) { await (0, handle_avc_packet_1.handleAvcPacket)({ programId, streamBuffer, sampleCallbacks, logLevel, onVideoTrack, offset: streamBuffer.offset, transportStream, makeSamplesStartAtZero, avcState, }); } // 15 = AAC / ADTS else if (stream.streamType === 15) { await (0, handle_aac_packet_1.handleAacPacket)({ streamBuffer, programId, offset: streamBuffer.offset, sampleCallbacks, logLevel, onAudioTrack, transportStream, makeSamplesStartAtZero, }); } if (!sampleCallbacks.tracks.hasAllTracks()) { const tracksRegistered = sampleCallbacks.tracks.getTracks().length; const { streams } = (0, traversal_1.findProgramMapTableOrThrow)(structure); if ((0, get_tracks_1.filterStreamsBySupportedTypes)(streams).length === tracksRegistered) { sampleCallbacks.tracks.setIsDone(logLevel); } } }; exports.processStreamBuffer = processStreamBuffer; const processFinalStreamBuffers = async ({ structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, avcState, }) => { for (const [programId, buffer] of transportStream.streamBuffers) { if (buffer.getBuffer().byteLength > 0) { await (0, exports.processStreamBuffer)({ streamBuffer: buffer, programId, structure, sampleCallbacks, logLevel, onAudioTrack, onVideoTrack, transportStream, makeSamplesStartAtZero, avcState, }); transportStream.streamBuffers.delete(programId); } } }; exports.processFinalStreamBuffers = processFinalStreamBuffers;